Create a pure virtual interface for SafeBrowsingService.

The interface is currently minimal, only controlling the factory
function for SafeBrowsingServices. Over time I will port
non-SafeBrowsing code to use this interface, solving our cyclic
dependency problems.

Bug: 925153
Change-Id: I56184ddac8d279abd4b930922e7bedeb99ee7f56
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1490449
Commit-Queue: Daniel Rubery <[email protected]>
Reviewed-by: Lei Zhang <[email protected]>
Reviewed-by: Christian Dullweber <[email protected]>
Reviewed-by: Min Qin <[email protected]>
Reviewed-by: Varun Khaneja <[email protected]>
Cr-Commit-Position: refs/heads/master@{#658228}
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index 5b5cc5b..fcda198 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -111,6 +111,7 @@
 #include "components/previews/core/previews_experiments.h"
 #include "components/rappor/public/rappor_utils.h"
 #include "components/rappor/rappor_service_impl.h"
+#include "components/safe_browsing/safe_browsing_service_interface.h"
 #include "components/sessions/core/session_id_generator.h"
 #include "components/signin/core/browser/account_consistency_method.h"
 #include "components/subresource_filter/content/browser/ruleset_service.h"
@@ -1315,9 +1316,19 @@
   // Set this flag to true so that we don't retry indefinitely to
   // create the service class if there was an error.
   created_safe_browsing_service_ = true;
-  safe_browsing_service_ =
-      safe_browsing::SafeBrowsingService::CreateSafeBrowsingService();
-  safe_browsing_service_->Initialize();
+
+  // The factory can be overridden in tests.
+  if (!safe_browsing::SafeBrowsingServiceInterface::HasFactory()) {
+    safe_browsing::SafeBrowsingServiceInterface::RegisterFactory(
+        safe_browsing::GetSafeBrowsingServiceFactory());
+  }
+
+  // TODO(crbug/925153): Port consumers of the |safe_browsing_service_| to use
+  // the interface in components/safe_browsing, and remove this cast.
+  safe_browsing_service_ = static_cast<safe_browsing::SafeBrowsingService*>(
+      safe_browsing::SafeBrowsingServiceInterface::CreateSafeBrowsingService());
+  if (safe_browsing_service_)
+    safe_browsing_service_->Initialize();
 }
 
 void BrowserProcessImpl::CreateSubresourceFilterRulesetService() {