xref: /aosp_15_r20/external/cronet/net/reporting/reporting_context.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2017 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/reporting/reporting_context.h"
6 
7 #include <utility>
8 
9 #include "base/functional/bind.h"
10 #include "base/observer_list.h"
11 #include "base/rand_util.h"
12 #include "base/time/clock.h"
13 #include "base/time/default_clock.h"
14 #include "base/time/default_tick_clock.h"
15 #include "base/time/tick_clock.h"
16 #include "base/time/time.h"
17 #include "net/base/backoff_entry.h"
18 #include "net/base/rand_callback.h"
19 #include "net/reporting/reporting_cache_observer.h"
20 #include "net/reporting/reporting_delegate.h"
21 #include "net/reporting/reporting_delivery_agent.h"
22 #include "net/reporting/reporting_garbage_collector.h"
23 #include "net/reporting/reporting_network_change_observer.h"
24 #include "net/reporting/reporting_policy.h"
25 #include "net/reporting/reporting_uploader.h"
26 
27 namespace net {
28 
29 class URLRequestContext;
30 
31 namespace {
32 
33 class ReportingContextImpl : public ReportingContext {
34  public:
ReportingContextImpl(const ReportingPolicy & policy,URLRequestContext * request_context,ReportingCache::PersistentReportingStore * store)35   ReportingContextImpl(const ReportingPolicy& policy,
36                        URLRequestContext* request_context,
37                        ReportingCache::PersistentReportingStore* store)
38       : ReportingContext(policy,
39                          base::DefaultClock::GetInstance(),
40                          base::DefaultTickClock::GetInstance(),
41                          base::BindRepeating(&base::RandInt),
42                          ReportingUploader::Create(request_context),
43                          ReportingDelegate::Create(request_context),
44                          store) {}
45 };
46 
47 }  // namespace
48 
49 // static
Create(const ReportingPolicy & policy,URLRequestContext * request_context,ReportingCache::PersistentReportingStore * store)50 std::unique_ptr<ReportingContext> ReportingContext::Create(
51     const ReportingPolicy& policy,
52     URLRequestContext* request_context,
53     ReportingCache::PersistentReportingStore* store) {
54   return std::make_unique<ReportingContextImpl>(policy, request_context, store);
55 }
56 
57 ReportingContext::~ReportingContext() = default;
58 
AddCacheObserver(ReportingCacheObserver * observer)59 void ReportingContext::AddCacheObserver(ReportingCacheObserver* observer) {
60   DCHECK(!cache_observers_.HasObserver(observer));
61   cache_observers_.AddObserver(observer);
62 }
63 
RemoveCacheObserver(ReportingCacheObserver * observer)64 void ReportingContext::RemoveCacheObserver(ReportingCacheObserver* observer) {
65   DCHECK(cache_observers_.HasObserver(observer));
66   cache_observers_.RemoveObserver(observer);
67 }
68 
NotifyCachedReportsUpdated()69 void ReportingContext::NotifyCachedReportsUpdated() {
70   for (auto& observer : cache_observers_)
71     observer.OnReportsUpdated();
72 }
73 
NotifyReportAdded(const ReportingReport * report)74 void ReportingContext::NotifyReportAdded(const ReportingReport* report) {
75   for (auto& observer : cache_observers_)
76     observer.OnReportAdded(report);
77 }
78 
NotifyReportUpdated(const ReportingReport * report)79 void ReportingContext::NotifyReportUpdated(const ReportingReport* report) {
80   for (auto& observer : cache_observers_)
81     observer.OnReportUpdated(report);
82 }
83 
NotifyCachedClientsUpdated()84 void ReportingContext::NotifyCachedClientsUpdated() {
85   for (auto& observer : cache_observers_)
86     observer.OnClientsUpdated();
87 }
88 
NotifyEndpointsUpdatedForOrigin(const std::vector<ReportingEndpoint> & endpoints)89 void ReportingContext::NotifyEndpointsUpdatedForOrigin(
90     const std::vector<ReportingEndpoint>& endpoints) {
91   for (auto& observer : cache_observers_)
92     observer.OnEndpointsUpdatedForOrigin(endpoints);
93 }
94 
IsReportDataPersisted() const95 bool ReportingContext::IsReportDataPersisted() const {
96   return store_ && policy_.persist_reports_across_restarts;
97 }
98 
IsClientDataPersisted() const99 bool ReportingContext::IsClientDataPersisted() const {
100   return store_ && policy_.persist_clients_across_restarts;
101 }
102 
OnShutdown()103 void ReportingContext::OnShutdown() {
104   uploader_->OnShutdown();
105 }
106 
ReportingContext(const ReportingPolicy & policy,base::Clock * clock,const base::TickClock * tick_clock,const RandIntCallback & rand_callback,std::unique_ptr<ReportingUploader> uploader,std::unique_ptr<ReportingDelegate> delegate,ReportingCache::PersistentReportingStore * store)107 ReportingContext::ReportingContext(
108     const ReportingPolicy& policy,
109     base::Clock* clock,
110     const base::TickClock* tick_clock,
111     const RandIntCallback& rand_callback,
112     std::unique_ptr<ReportingUploader> uploader,
113     std::unique_ptr<ReportingDelegate> delegate,
114     ReportingCache::PersistentReportingStore* store)
115     : policy_(policy),
116       clock_(clock),
117       tick_clock_(tick_clock),
118       uploader_(std::move(uploader)),
119       delegate_(std::move(delegate)),
120       cache_(ReportingCache::Create(this)),
121       store_(store),
122       delivery_agent_(ReportingDeliveryAgent::Create(this, rand_callback)),
123       garbage_collector_(ReportingGarbageCollector::Create(this)),
124       network_change_observer_(ReportingNetworkChangeObserver::Create(this)) {}
125 
126 }  // namespace net
127