juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 1 | // 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 "content/browser/net/reporting_service_proxy.h" |
| 6 | |
| 7 | #include <memory> |
| 8 | #include <string> |
| 9 | #include <utility> |
| 10 | |
| 11 | #include "base/memory/ref_counted.h" |
| 12 | #include "base/values.h" |
| 13 | #include "content/public/browser/browser_context.h" |
| 14 | #include "content/public/browser/site_instance.h" |
| 15 | #include "content/public/browser/storage_partition.h" |
| 16 | #include "mojo/public/cpp/bindings/strong_binding.h" |
juliatuttle | 667c0bb | 2017-07-06 15:17:13 | [diff] [blame] | 17 | #include "net/reporting/reporting_report.h" |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 18 | #include "net/reporting/reporting_service.h" |
| 19 | #include "net/url_request/url_request_context.h" |
| 20 | #include "net/url_request/url_request_context_getter.h" |
| 21 | #include "third_party/WebKit/public/platform/reporting.mojom.h" |
| 22 | #include "url/gurl.h" |
| 23 | |
| 24 | namespace content { |
| 25 | |
| 26 | namespace { |
| 27 | |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame^] | 28 | class ReportingServiceProxyImpl : public blink::mojom::ReportingServiceProxy { |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 29 | public: |
| 30 | ReportingServiceProxyImpl( |
| 31 | scoped_refptr<net::URLRequestContextGetter> request_context_getter) |
| 32 | : request_context_getter_(std::move(request_context_getter)) {} |
| 33 | |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame^] | 34 | // blink::mojom::ReportingServiceProxy: |
| 35 | |
| 36 | void QueueInterventionReport(const GURL& url, |
| 37 | const std::string& message, |
| 38 | const std::string& source_file, |
| 39 | int line_number) override { |
| 40 | auto body = std::make_unique<base::DictionaryValue>(); |
| 41 | body->SetString("message", message); |
| 42 | body->SetString("sourceFile", source_file); |
| 43 | body->SetInteger("lineNumber", line_number); |
| 44 | QueueReport(url, "default", "intervention", std::move(body)); |
| 45 | } |
| 46 | |
| 47 | void QueueDeprecationReport(const GURL& url, |
| 48 | const std::string& message, |
| 49 | const std::string& source_file, |
| 50 | int line_number) override { |
| 51 | auto body = std::make_unique<base::DictionaryValue>(); |
| 52 | body->SetString("message", message); |
| 53 | body->SetString("sourceFile", source_file); |
| 54 | body->SetInteger("lineNumber", line_number); |
| 55 | QueueReport(url, "default", "deprecation", std::move(body)); |
| 56 | } |
| 57 | |
| 58 | private: |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 59 | void QueueReport(const GURL& url, |
| 60 | const std::string& group, |
| 61 | const std::string& type, |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame^] | 62 | std::unique_ptr<base::Value> body) { |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 63 | net::URLRequestContext* request_context = |
| 64 | request_context_getter_->GetURLRequestContext(); |
juliatuttle | 667c0bb | 2017-07-06 15:17:13 | [diff] [blame] | 65 | if (!request_context) { |
| 66 | net::ReportingReport::RecordReportDiscardedForNoURLRequestContext(); |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 67 | return; |
juliatuttle | 667c0bb | 2017-07-06 15:17:13 | [diff] [blame] | 68 | } |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 69 | |
| 70 | net::ReportingService* reporting_service = |
| 71 | request_context->reporting_service(); |
juliatuttle | 667c0bb | 2017-07-06 15:17:13 | [diff] [blame] | 72 | if (!reporting_service) { |
| 73 | net::ReportingReport::RecordReportDiscardedForNoReportingService(); |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 74 | return; |
juliatuttle | 667c0bb | 2017-07-06 15:17:13 | [diff] [blame] | 75 | } |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 76 | |
Jeremy Roman | d4b4d3d | 2017-09-01 19:12:58 | [diff] [blame] | 77 | reporting_service->QueueReport(url, group, type, std::move(body)); |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 78 | } |
| 79 | |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 80 | scoped_refptr<net::URLRequestContextGetter> request_context_getter_; |
| 81 | }; |
| 82 | |
| 83 | void CreateReportingServiceProxyOnNetworkTaskRunner( |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame^] | 84 | blink::mojom::ReportingServiceProxyRequest request, |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 85 | scoped_refptr<net::URLRequestContextGetter> request_context_getter) { |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame^] | 86 | mojo::MakeStrongBinding(std::make_unique<ReportingServiceProxyImpl>( |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 87 | std::move(request_context_getter)), |
| 88 | std::move(request)); |
| 89 | } |
| 90 | |
| 91 | } // namespace |
| 92 | |
| 93 | // static |
| 94 | void CreateReportingServiceProxy( |
| 95 | StoragePartition* storage_partition, |
Julia Tuttle | 6ae4dcb | 2017-09-08 21:41:26 | [diff] [blame^] | 96 | blink::mojom::ReportingServiceProxyRequest request) { |
juliatuttle | 95fe3cc5 | 2017-06-30 23:05:31 | [diff] [blame] | 97 | scoped_refptr<net::URLRequestContextGetter> request_context_getter( |
| 98 | storage_partition->GetURLRequestContext()); |
| 99 | scoped_refptr<base::SingleThreadTaskRunner> network_task_runner( |
| 100 | request_context_getter->GetNetworkTaskRunner()); |
| 101 | network_task_runner->PostTask( |
| 102 | FROM_HERE, |
| 103 | base::BindOnce(&CreateReportingServiceProxyOnNetworkTaskRunner, |
| 104 | std::move(request), std::move(request_context_getter))); |
| 105 | } |
| 106 | |
| 107 | } // namespace content |