blob: 248e5c88af35d8adfe14118444826371b7cc26b9 [file] [log] [blame]
juliatuttle381d77e2017-04-07 18:54:121// Copyright 2017 The Chromium Authors. All rights reserved.
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_service.h"
6
juliatuttlea35bbc82017-05-22 19:25:197#include <utility>
juliatuttle381d77e2017-04-07 18:54:128
juliatuttle1d92f0152017-04-28 17:19:219#include "base/bind.h"
juliatuttle381d77e2017-04-07 18:54:1210#include "base/macros.h"
Julia Tuttleec467a5f2018-02-22 20:22:4511#include "base/memory/weak_ptr.h"
juliatuttle381d77e2017-04-07 18:54:1212#include "base/time/tick_clock.h"
13#include "base/time/time.h"
14#include "base/values.h"
juliatuttleaeb1abc2017-05-04 21:14:3815#include "net/reporting/reporting_browsing_data_remover.h"
juliatuttle381d77e2017-04-07 18:54:1216#include "net/reporting/reporting_cache.h"
17#include "net/reporting/reporting_context.h"
juliatuttle587548912017-05-23 14:17:2118#include "net/reporting/reporting_delegate.h"
juliatuttle381d77e2017-04-07 18:54:1219#include "net/reporting/reporting_header_parser.h"
Julia Tuttle4667c1c2017-12-19 18:27:3820#include "net/reporting/reporting_uploader.h"
juliatuttle381d77e2017-04-07 18:54:1221#include "url/gurl.h"
22
23namespace net {
24
25namespace {
26
27class ReportingServiceImpl : public ReportingService {
28 public:
29 ReportingServiceImpl(std::unique_ptr<ReportingContext> context)
Julia Tuttleec467a5f2018-02-22 20:22:4530 : context_(std::move(context)), weak_factory_(this) {}
juliatuttle381d77e2017-04-07 18:54:1231
Julia Tuttle4667c1c2017-12-19 18:27:3832 // ReportingService implementation:
33
Chris Watkins806691b2017-12-01 06:01:2234 ~ReportingServiceImpl() override = default;
juliatuttle381d77e2017-04-07 18:54:1235
36 void QueueReport(const GURL& url,
37 const std::string& group,
38 const std::string& type,
Julia Tuttle107e30672018-03-29 18:48:4239 std::unique_ptr<const base::Value> body,
40 int depth) override {
Julia Tuttle194e6112017-12-19 19:04:4941 DCHECK(context_);
42 DCHECK(context_->delegate());
43
Daniel Cheng88186bd52017-10-20 08:14:4644 if (!context_->delegate()->CanQueueReport(url::Origin::Create(url)))
juliatuttle587548912017-05-23 14:17:2145 return;
46
Julia Tuttle107e30672018-03-29 18:48:4247 context_->cache()->AddReport(url, group, type, std::move(body), depth,
juliatuttle381d77e2017-04-07 18:54:1248 context_->tick_clock()->NowTicks(), 0);
49 }
50
51 void ProcessHeader(const GURL& url,
52 const std::string& header_value) override {
Julia Tuttleec467a5f2018-02-22 20:22:4553 context_->delegate()->ParseJson(
54 "[" + header_value + "]",
55 base::BindRepeating(&ReportingServiceImpl::ProcessHeaderValue,
56 weak_factory_.GetWeakPtr(), url),
57 base::BindRepeating(
Julia Tuttleef19cb52018-03-16 16:58:3558 &ReportingHeaderParser::RecordHeaderDiscardedForJsonInvalid));
juliatuttle381d77e2017-04-07 18:54:1259 }
60
Julia Tuttle227a6ff2017-12-19 19:44:2461 void RemoveBrowsingData(int data_type_mask,
62 const base::RepeatingCallback<bool(const GURL&)>&
63 origin_filter) override {
juliatuttle91f43db2017-06-05 17:09:4964 ReportingBrowsingDataRemover::RemoveBrowsingData(
65 context_->cache(), data_type_mask, origin_filter);
juliatuttleaeb1abc2017-05-04 21:14:3866 }
67
Julia Tuttle107e30672018-03-29 18:48:4268 int GetUploadDepth(const URLRequest& request) override {
69 return context_->uploader()->GetUploadDepth(request);
Julia Tuttle4667c1c2017-12-19 18:27:3870 }
71
Julia Tuttle91a655d2018-01-26 18:03:0372 const ReportingPolicy& GetPolicy() const override {
73 return context_->policy();
74 }
75
Douglas Creager853b2092018-04-13 23:03:2776 base::Value StatusAsValue() const override {
77 base::Value dict(base::Value::Type::DICTIONARY);
78 dict.SetKey("reportingEnabled", base::Value(true));
79 dict.SetKey("clients", context_->cache()->GetClientsAsValue());
80 dict.SetKey("reports", context_->cache()->GetReportsAsValue());
81 return dict;
82 }
83
juliatuttle381d77e2017-04-07 18:54:1284 private:
Julia Tuttleec467a5f2018-02-22 20:22:4585 void ProcessHeaderValue(const GURL& url, std::unique_ptr<base::Value> value) {
86 ReportingHeaderParser::ParseHeader(context_.get(), url, std::move(value));
87 }
88
juliatuttle381d77e2017-04-07 18:54:1289 std::unique_ptr<ReportingContext> context_;
Julia Tuttleec467a5f2018-02-22 20:22:4590 base::WeakPtrFactory<ReportingServiceImpl> weak_factory_;
juliatuttle381d77e2017-04-07 18:54:1291
92 DISALLOW_COPY_AND_ASSIGN(ReportingServiceImpl);
93};
94
95} // namespace
96
Chris Watkins806691b2017-12-01 06:01:2297ReportingService::~ReportingService() = default;
juliatuttle381d77e2017-04-07 18:54:1298
99// static
100std::unique_ptr<ReportingService> ReportingService::Create(
101 const ReportingPolicy& policy,
juliatuttle42c57312017-04-28 03:01:30102 URLRequestContext* request_context) {
Jeremy Roman0579ed62017-08-29 15:56:19103 return std::make_unique<ReportingServiceImpl>(
juliatuttle42c57312017-04-28 03:01:30104 ReportingContext::Create(policy, request_context));
juliatuttle381d77e2017-04-07 18:54:12105}
106
107// static
108std::unique_ptr<ReportingService> ReportingService::CreateForTesting(
109 std::unique_ptr<ReportingContext> reporting_context) {
Jeremy Roman0579ed62017-08-29 15:56:19110 return std::make_unique<ReportingServiceImpl>(std::move(reporting_context));
juliatuttle381d77e2017-04-07 18:54:12111}
112
Douglas Creager853b2092018-04-13 23:03:27113base::Value ReportingService::StatusAsValue() const {
114 NOTIMPLEMENTED();
115 return base::Value();
116}
117
juliatuttle381d77e2017-04-07 18:54:12118} // namespace net