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