|  | // Copyright 2017 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "net/reporting/reporting_context.h" | 
|  |  | 
|  | #include <utility> | 
|  |  | 
|  | #include "base/bind.h" | 
|  | #include "base/observer_list.h" | 
|  | #include "base/rand_util.h" | 
|  | #include "base/time/clock.h" | 
|  | #include "base/time/default_clock.h" | 
|  | #include "base/time/default_tick_clock.h" | 
|  | #include "base/time/tick_clock.h" | 
|  | #include "base/time/time.h" | 
|  | #include "net/base/backoff_entry.h" | 
|  | #include "net/base/rand_callback.h" | 
|  | #include "net/reporting/json_parser_delegate.h" | 
|  | #include "net/reporting/reporting_cache.h" | 
|  | #include "net/reporting/reporting_delegate.h" | 
|  | #include "net/reporting/reporting_delivery_agent.h" | 
|  | #include "net/reporting/reporting_endpoint_manager.h" | 
|  | #include "net/reporting/reporting_garbage_collector.h" | 
|  | #include "net/reporting/reporting_network_change_observer.h" | 
|  | #include "net/reporting/reporting_observer.h" | 
|  | #include "net/reporting/reporting_policy.h" | 
|  | #include "net/reporting/reporting_uploader.h" | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | class URLRequestContext; | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | class ReportingContextImpl : public ReportingContext { | 
|  | public: | 
|  | ReportingContextImpl(const ReportingPolicy& policy, | 
|  | std::unique_ptr<JSONParserDelegate> json_parser, | 
|  | URLRequestContext* request_context) | 
|  | : ReportingContext(policy, | 
|  | base::DefaultClock::GetInstance(), | 
|  | base::DefaultTickClock::GetInstance(), | 
|  | base::BindRepeating(&base::RandInt), | 
|  | ReportingUploader::Create(request_context), | 
|  | std::move(json_parser), | 
|  | ReportingDelegate::Create(request_context)) {} | 
|  | }; | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | // static | 
|  | std::unique_ptr<ReportingContext> ReportingContext::Create( | 
|  | const ReportingPolicy& policy, | 
|  | std::unique_ptr<JSONParserDelegate> json_parser, | 
|  | URLRequestContext* request_context) { | 
|  | return std::make_unique<ReportingContextImpl>(policy, std::move(json_parser), | 
|  | request_context); | 
|  | } | 
|  |  | 
|  | ReportingContext::~ReportingContext() = default; | 
|  |  | 
|  | void ReportingContext::AddObserver(ReportingObserver* observer) { | 
|  | DCHECK(!observers_.HasObserver(observer)); | 
|  | observers_.AddObserver(observer); | 
|  | } | 
|  |  | 
|  | void ReportingContext::RemoveObserver(ReportingObserver* observer) { | 
|  | DCHECK(observers_.HasObserver(observer)); | 
|  | observers_.RemoveObserver(observer); | 
|  | } | 
|  |  | 
|  | void ReportingContext::NotifyCacheUpdated() { | 
|  | for (auto& observer : observers_) | 
|  | observer.OnCacheUpdated(); | 
|  | } | 
|  |  | 
|  | ReportingContext::ReportingContext( | 
|  | const ReportingPolicy& policy, | 
|  | base::Clock* clock, | 
|  | const base::TickClock* tick_clock, | 
|  | const RandIntCallback& rand_callback, | 
|  | std::unique_ptr<ReportingUploader> uploader, | 
|  | std::unique_ptr<JSONParserDelegate> json_parser, | 
|  | std::unique_ptr<ReportingDelegate> delegate) | 
|  | : policy_(policy), | 
|  | clock_(clock), | 
|  | tick_clock_(tick_clock), | 
|  | uploader_(std::move(uploader)), | 
|  | json_parser_(std::move(json_parser)), | 
|  | delegate_(std::move(delegate)), | 
|  | cache_(ReportingCache::Create(this)), | 
|  | endpoint_manager_(ReportingEndpointManager::Create(this, rand_callback)), | 
|  | delivery_agent_(ReportingDeliveryAgent::Create(this)), | 
|  | garbage_collector_(ReportingGarbageCollector::Create(this)), | 
|  | network_change_observer_(ReportingNetworkChangeObserver::Create(this)) {} | 
|  |  | 
|  | }  // namespace net |