Reporting: Plumb from //chrome/browser/browsing_data.

Reporting is a spec for delivering out-of-band reports from various
other parts of the browser. See http://wicg.github.io/reporting/ for
the spec, or https://goo.gl/pygX5I for details of the planned
implementation in Chromium.

This CL plumbs from Chromium's browsing data removal code to Reporting
(and also makes a few tweaks to Reporting's browsing data removal).

BUG=704259

Review-Url: https://codereview.chromium.org/2829683004
Cr-Commit-Position: refs/heads/master@{#469474}
diff --git a/net/reporting/reporting_browsing_data_remover.cc b/net/reporting/reporting_browsing_data_remover.cc
index 5041a47..a10bcf86 100644
--- a/net/reporting/reporting_browsing_data_remover.cc
+++ b/net/reporting/reporting_browsing_data_remover.cc
@@ -6,54 +6,82 @@
 
 #include <vector>
 
+#include "base/memory/ptr_util.h"
 #include "net/reporting/reporting_cache.h"
+#include "net/reporting/reporting_client.h"
 #include "net/reporting/reporting_context.h"
 #include "net/reporting/reporting_report.h"
 
 namespace net {
 
+namespace {
+
+class ReportingBrowsingDataRemoverImpl : public ReportingBrowsingDataRemover {
+ public:
+  ReportingBrowsingDataRemoverImpl(ReportingContext* context)
+      : context_(context) {}
+
+  // ReportingBrowsingDataRemover implementation:
+
+  ~ReportingBrowsingDataRemoverImpl() override {}
+
+  void RemoveBrowsingData(
+      int data_type_mask,
+      base::Callback<bool(const GURL&)> origin_filter) override {
+    ReportingCache* cache = context_->cache();
+    bool remove_reports = (data_type_mask & DATA_TYPE_REPORTS) != 0;
+    bool remove_clients = (data_type_mask & DATA_TYPE_CLIENTS) != 0;
+
+    if (origin_filter.is_null()) {
+      if (remove_reports)
+        cache->RemoveAllReports();
+      if (remove_clients)
+        cache->RemoveAllClients();
+      return;
+    }
+
+    if (remove_reports) {
+      std::vector<const ReportingReport*> all_reports;
+      cache->GetReports(&all_reports);
+
+      std::vector<const ReportingReport*> reports_to_remove;
+      for (const ReportingReport* report : all_reports) {
+        if (origin_filter.Run(report->url))
+          reports_to_remove.push_back(report);
+      }
+
+      cache->RemoveReports(reports_to_remove);
+    }
+
+    if (remove_clients) {
+      std::vector<const ReportingClient*> all_clients;
+      cache->GetClients(&all_clients);
+
+      std::vector<const ReportingClient*> clients_to_remove;
+      for (const ReportingClient* client : all_clients) {
+        // TODO(juliatuttle): Examine client endpoint as well?
+        if (origin_filter.Run(client->origin.GetURL()))
+          clients_to_remove.push_back(client);
+      }
+
+      cache->RemoveClients(clients_to_remove);
+    }
+  }
+
+ private:
+  ReportingContext* context_;
+
+  DISALLOW_COPY_AND_ASSIGN(ReportingBrowsingDataRemoverImpl);
+};
+
+}  // namespace
+
 // static
-void ReportingBrowsingDataRemover::RemoveBrowsingData(
-    ReportingContext* context,
-    int data_type_mask,
-    base::Callback<bool(const GURL&)> origin_filter) {
-  ReportingCache* cache = context->cache();
-  bool remove_reports = (data_type_mask & DATA_TYPE_REPORTS) != 0;
-  bool remove_clients = (data_type_mask & DATA_TYPE_CLIENTS) != 0;
-
-  if (origin_filter.is_null()) {
-    if (remove_reports)
-      cache->RemoveAllReports();
-    if (remove_clients)
-      cache->RemoveAllClients();
-    return;
-  }
-
-  if (remove_reports) {
-    std::vector<const ReportingReport*> all_reports;
-    cache->GetReports(&all_reports);
-
-    std::vector<const ReportingReport*> reports_to_remove;
-    for (const ReportingReport* report : all_reports) {
-      if (origin_filter.Run(report->url))
-        reports_to_remove.push_back(report);
-    }
-
-    cache->RemoveReports(reports_to_remove);
-  }
-
-  if (remove_clients) {
-    std::vector<const ReportingClient*> all_clients;
-    cache->GetClients(&all_clients);
-
-    std::vector<const ReportingClient*> clients_to_remove;
-    for (const ReportingClient* client : all_clients) {
-      if (origin_filter.Run(client->origin.GetURL()))
-        clients_to_remove.push_back(client);
-    }
-
-    cache->RemoveClients(clients_to_remove);
-  }
+std::unique_ptr<ReportingBrowsingDataRemover>
+ReportingBrowsingDataRemover::Create(ReportingContext* context) {
+  return base::MakeUnique<ReportingBrowsingDataRemoverImpl>(context);
 }
 
+ReportingBrowsingDataRemover::~ReportingBrowsingDataRemover() {}
+
 }  // namespace net
diff --git a/net/reporting/reporting_browsing_data_remover.h b/net/reporting/reporting_browsing_data_remover.h
index db2bfb6d..77eda2b 100644
--- a/net/reporting/reporting_browsing_data_remover.h
+++ b/net/reporting/reporting_browsing_data_remover.h
@@ -5,6 +5,8 @@
 #ifndef NET_REPORTING_REPORTING_BROWSING_DATA_REMOVER_H_
 #define NET_REPORTING_REPORTING_BROWSING_DATA_REMOVER_H_
 
+#include <memory>
+
 #include "base/callback.h"
 #include "base/macros.h"
 #include "net/base/net_export.h"
@@ -22,13 +24,20 @@
     DATA_TYPE_CLIENTS = 0x2,
   };
 
-  static void RemoveBrowsingData(
-      ReportingContext* context,
-      int data_type_mask,
-      base::Callback<bool(const GURL&)> origin_filter);
+  // Creates a ReportingBrowsingDataRemover. |context| must outlive the
+  // browsing data remover.
+  static std::unique_ptr<ReportingBrowsingDataRemover> Create(
+      ReportingContext* context);
 
- private:
-  DISALLOW_IMPLICIT_CONSTRUCTORS(ReportingBrowsingDataRemover);
+  virtual ~ReportingBrowsingDataRemover();
+
+  // Removes browsing data from the Reporting system. |data_type_mask| specifies
+  // which types of data to remove: reports queued by browser features and/or
+  // clients (endpoints configured by origins). |origin_filter|, if not null,
+  // specifies which origins' data to remove.
+  virtual void RemoveBrowsingData(
+      int data_type_mask,
+      base::Callback<bool(const GURL&)> origin_filter) = 0;
 };
 
 }  // namespace net
diff --git a/net/reporting/reporting_browsing_data_remover_unittest.cc b/net/reporting/reporting_browsing_data_remover_unittest.cc
index 349c5d53..5b05451 100644
--- a/net/reporting/reporting_browsing_data_remover_unittest.cc
+++ b/net/reporting/reporting_browsing_data_remover_unittest.cc
@@ -35,8 +35,7 @@
           base::Bind(&ReportingBrowsingDataRemoverTest::HostIs, host);
     }
 
-    ReportingBrowsingDataRemover::RemoveBrowsingData(context(), data_type_mask,
-                                                     origin_filter);
+    browsing_data_remover()->RemoveBrowsingData(data_type_mask, origin_filter);
   }
 
   static bool HostIs(std::string host, const GURL& url) {
diff --git a/net/reporting/reporting_context.cc b/net/reporting/reporting_context.cc
index c6f01fd..5111611 100644
--- a/net/reporting/reporting_context.cc
+++ b/net/reporting/reporting_context.cc
@@ -14,6 +14,7 @@
 #include "base/time/tick_clock.h"
 #include "base/time/time.h"
 #include "net/base/backoff_entry.h"
+#include "net/reporting/reporting_browsing_data_remover.h"
 #include "net/reporting/reporting_cache.h"
 #include "net/reporting/reporting_delivery_agent.h"
 #include "net/reporting/reporting_endpoint_manager.h"
@@ -79,6 +80,7 @@
       delivery_agent_(ReportingDeliveryAgent::Create(this)),
       persister_(ReportingPersister::Create(this)),
       garbage_collector_(ReportingGarbageCollector::Create(this)),
-      network_change_observer_(ReportingNetworkChangeObserver::Create(this)) {}
+      network_change_observer_(ReportingNetworkChangeObserver::Create(this)),
+      browsing_data_remover_(ReportingBrowsingDataRemover::Create(this)) {}
 
 }  // namespace net
diff --git a/net/reporting/reporting_context.h b/net/reporting/reporting_context.h
index 34e95d3..f24fc2d7 100644
--- a/net/reporting/reporting_context.h
+++ b/net/reporting/reporting_context.h
@@ -20,6 +20,7 @@
 
 namespace net {
 
+class ReportingBrowsingDataRemover;
 class ReportingCache;
 class ReportingDeliveryAgent;
 class ReportingEndpointManager;
@@ -54,6 +55,9 @@
   ReportingGarbageCollector* garbage_collector() {
     return garbage_collector_.get();
   }
+  ReportingBrowsingDataRemover* browsing_data_remover() {
+    return browsing_data_remover_.get();
+  }
 
   ReportingPersister* persister() { return persister_.get(); }
 
@@ -95,6 +99,9 @@
   // |network_change_observer_| must come after |cache_|.
   std::unique_ptr<ReportingNetworkChangeObserver> network_change_observer_;
 
+  // |browsing_data_remover_| must come after |cache_|.
+  std::unique_ptr<ReportingBrowsingDataRemover> browsing_data_remover_;
+
   DISALLOW_COPY_AND_ASSIGN(ReportingContext);
 };
 
diff --git a/net/reporting/reporting_service.cc b/net/reporting/reporting_service.cc
index 0ba05c0..1da9100 100644
--- a/net/reporting/reporting_service.cc
+++ b/net/reporting/reporting_service.cc
@@ -12,6 +12,7 @@
 #include "base/time/tick_clock.h"
 #include "base/time/time.h"
 #include "base/values.h"
+#include "net/reporting/reporting_browsing_data_remover.h"
 #include "net/reporting/reporting_cache.h"
 #include "net/reporting/reporting_context.h"
 #include "net/reporting/reporting_header_parser.h"
@@ -42,6 +43,13 @@
     ReportingHeaderParser::ParseHeader(context_.get(), url, header_value);
   }
 
+  void RemoveBrowsingData(
+      int data_type_mask,
+      base::Callback<bool(const GURL&)> origin_filter) override {
+    context_->browsing_data_remover()->RemoveBrowsingData(data_type_mask,
+                                                          origin_filter);
+  }
+
  private:
   std::unique_ptr<ReportingContext> context_;
 
diff --git a/net/reporting/reporting_service.h b/net/reporting/reporting_service.h
index 831e0711..2b010bd 100644
--- a/net/reporting/reporting_service.h
+++ b/net/reporting/reporting_service.h
@@ -59,6 +59,12 @@
   virtual void ProcessHeader(const GURL& url,
                              const std::string& header_value) = 0;
 
+  // Removes browsing data from the Reporting system. See
+  // ReportingBrowsingDataRemover for more details.
+  virtual void RemoveBrowsingData(
+      int data_type_mask,
+      base::Callback<bool(const GURL&)> origin_filter) = 0;
+
  protected:
   ReportingService() {}
 
diff --git a/net/reporting/reporting_test_util.h b/net/reporting/reporting_test_util.h
index 48b63d9..6e64870 100644
--- a/net/reporting/reporting_test_util.h
+++ b/net/reporting/reporting_test_util.h
@@ -29,6 +29,7 @@
 
 namespace net {
 
+class ReportingBrowsingDataRemover;
 class ReportingCache;
 struct ReportingClient;
 class ReportingGarbageCollector;
@@ -145,6 +146,9 @@
   ReportingGarbageCollector* garbage_collector() {
     return context_->garbage_collector();
   }
+  ReportingBrowsingDataRemover* browsing_data_remover() {
+    return context_->browsing_data_remover();
+  }
 
   ReportingPersister* persister() { return context_->persister(); }
 
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index 2021906..4e41ba4 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -6657,6 +6657,12 @@
     headers_.push_back({url, header_value});
   }
 
+  void RemoveBrowsingData(
+      int data_type_mask,
+      base::Callback<bool(const GURL&)> origin_filter) override {
+    NOTIMPLEMENTED();
+  }
+
  private:
   std::vector<Header> headers_;
 };