Componentize SafeBrowsingApi{Bridge,Handler}

Move these classes into components/safe_browsing_db/ and update references

BUG=679018

Review-Url: https://codereview.chromium.org/2622773002
Cr-Commit-Position: refs/heads/master@{#443116}
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 4ee34ea6..85d8ac9 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -2798,8 +2798,6 @@
       "android/resource_mapper.h",
       "android/rlz/revenue_stats.cc",
       "android/rlz/revenue_stats.h",
-      "android/safe_browsing/safe_browsing_api_handler_bridge.cc",
-      "android/safe_browsing/safe_browsing_api_handler_bridge.h",
       "android/search_geolocation/search_geolocation_disclosure_infobar_delegate.cc",
       "android/search_geolocation/search_geolocation_disclosure_infobar_delegate.h",
       "android/search_geolocation/search_geolocation_disclosure_tab_helper.cc",
@@ -2997,7 +2995,7 @@
       "//components/precache/content",
       "//components/precache/core",
       "//components/resources:components_resources",
-      "//components/resources:components_resources",
+      "//components/safe_browsing_db",
       "//components/toolbar",
       "//components/web_contents_delegate_android",
       "//sandbox:sandbox_features",
@@ -4019,7 +4017,6 @@
       "../android/java/src/org/chromium/chrome/browser/push_messaging/PushMessagingServiceObserver.java",
       "../android/java/src/org/chromium/chrome/browser/rappor/RapporServiceBridge.java",
       "../android/java/src/org/chromium/chrome/browser/rlz/RevenueStats.java",
-      "../android/java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingApiBridge.java",
       "../android/java/src/org/chromium/chrome/browser/search_engines/TemplateUrlService.java",
       "../android/java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java",
       "../android/java/src/org/chromium/chrome/browser/signin/AccountManagementScreenHelper.java",
diff --git a/chrome/browser/android/chrome_jni_registrar.cc b/chrome/browser/android/chrome_jni_registrar.cc
index b4fc6c596..8a18442 100644
--- a/chrome/browser/android/chrome_jni_registrar.cc
+++ b/chrome/browser/android/chrome_jni_registrar.cc
@@ -85,7 +85,6 @@
 #include "chrome/browser/android/rappor/rappor_service_bridge.h"
 #include "chrome/browser/android/recently_closed_tabs_bridge.h"
 #include "chrome/browser/android/rlz/revenue_stats.h"
-#include "chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.h"
 #include "chrome/browser/android/search_geolocation/search_geolocation_disclosure_tab_helper.h"
 #include "chrome/browser/android/service_tab_launcher.h"
 #include "chrome/browser/android/sessions/session_tab_helper_android.h"
@@ -170,6 +169,7 @@
 #include "components/invalidation/impl/android/component_jni_registrar.h"
 #include "components/payments/android/payments_jni_registrar.h"
 #include "components/policy/core/browser/android/component_jni_registrar.h"
+#include "components/safe_browsing_db/android/jni_registrar.h"
 #include "components/safe_json/android/component_jni_registrar.h"
 #include "components/signin/core/browser/android/component_jni_registrar.h"
 #include "components/spellcheck/browser/android/component_jni_registrar.h"
@@ -363,7 +363,6 @@
     {"ResourcePrefetchPredictor",
      predictors::RegisterResourcePrefetchPredictor},
     {"RevenueStats", chrome::android::RegisterRevenueStats},
-    {"SafeBrowsingApiBridge", safe_browsing::RegisterSafeBrowsingApiBridge},
     {"SceneLayer", RegisterSceneLayer},
     {"ScreenshotTask", chrome::android::RegisterScreenshotTask},
     {"ServiceTabLauncher", ServiceTabLauncher::Register},
diff --git a/chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.cc b/chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.cc
deleted file mode 100644
index 679521b0..0000000
--- a/chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.cc
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright 2016 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 "chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.h"
-
-#include <memory>
-#include <string>
-
-#include "base/android/context_utils.h"
-#include "base/android/jni_android.h"
-#include "base/android/jni_array.h"
-#include "base/android/jni_string.h"
-#include "base/metrics/histogram_macros.h"
-#include "chrome/browser/safe_browsing/safe_browsing_util.h"
-#include "components/safe_browsing_db/safe_browsing_api_handler_util.h"
-#include "content/public/browser/browser_thread.h"
-#include "jni/SafeBrowsingApiBridge_jni.h"
-
-using base::android::AttachCurrentThread;
-using base::android::ConvertJavaStringToUTF8;
-using base::android::ConvertUTF8ToJavaString;
-using base::android::GetApplicationContext;
-using base::android::JavaParamRef;
-using base::android::ScopedJavaLocalRef;
-using base::android::ToJavaIntArray;
-using content::BrowserThread;
-
-namespace safe_browsing {
-
-namespace {
-// Takes ownership of callback ptr.
-void RunCallbackOnIOThread(
-    SafeBrowsingApiHandler::URLCheckCallbackMeta* callback,
-    SBThreatType threat_type,
-    const ThreatMetadata& metadata) {
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE,
-      base::Bind(&SafeBrowsingApiHandler::URLCheckCallbackMeta::Run,
-                 base::Owned(callback), threat_type, metadata));
-}
-
-void ReportUmaResult(safe_browsing::UmaRemoteCallResult result) {
-  UMA_HISTOGRAM_ENUMERATION("SB2.RemoteCall.Result", result,
-                            safe_browsing::UMA_STATUS_MAX_VALUE);
-}
-
-// Convert a SBThreatType to a Java threat type.  We only support a few.
-int SBThreatTypeToJavaThreatType(const SBThreatType& sb_threat_type) {
-  switch (sb_threat_type) {
-    case SB_THREAT_TYPE_URL_PHISHING:
-      return safe_browsing::JAVA_THREAT_TYPE_SOCIAL_ENGINEERING;
-    case SB_THREAT_TYPE_URL_MALWARE:
-      return safe_browsing::JAVA_THREAT_TYPE_POTENTIALLY_HARMFUL_APPLICATION;
-    default:
-      NOTREACHED();
-      return 0;
-  }
-}
-
-// Convert a vector of SBThreatTypes to JavaIntArray of Java threat types.
-ScopedJavaLocalRef<jintArray> SBThreatTypesToJavaArray(
-    JNIEnv* env,
-    const std::vector<SBThreatType>& threat_types) {
-  DCHECK(threat_types.size() > 0);
-  int int_threat_types[threat_types.size()];
-  int* itr = &int_threat_types[0];
-  for (auto threat_type : threat_types) {
-    *itr++ = SBThreatTypeToJavaThreatType(threat_type);
-  }
-  return ToJavaIntArray(env, int_threat_types, threat_types.size());
-}
-
-}  // namespace
-
-
-bool RegisterSafeBrowsingApiBridge(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
-// Java->Native call, invoked when a check is done.
-//   |callback_id| is an int form of pointer to a URLCheckCallbackMeta
-//                 that will be called and then deleted here.
-//   |result_status| is one of those from SafeBrowsingApiHandler.java
-//   |metadata| is a JSON string classifying the threat if there is one.
-void OnUrlCheckDone(JNIEnv* env,
-                    const JavaParamRef<jclass>& context,
-                    jlong callback_id,
-                    jint result_status,
-                    const JavaParamRef<jstring>& metadata) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK(callback_id);
-
-  const std::string metadata_str =
-      (metadata ? ConvertJavaStringToUTF8(env, metadata) : "");
-
-  DVLOG(1) << "OnURLCheckDone invoked for check " << callback_id
-           << " with status=" << result_status << " and metadata=["
-           << metadata_str << "]";
-
-  // Convert java long long int to c++ pointer, take ownership.
-  std::unique_ptr<SafeBrowsingApiHandler::URLCheckCallbackMeta> callback(
-      reinterpret_cast<SafeBrowsingApiHandlerBridge::URLCheckCallbackMeta*>(
-          callback_id));
-
-  if (result_status != RESULT_STATUS_SUCCESS) {
-    // TODO(nparker): If the API is consistently failing, we might want to
-    // turn it off altogether and retest periodically. This would
-    // alleviate a bad experience if GMSCore is somehow busted.
-    if (result_status == RESULT_STATUS_TIMEOUT) {
-      ReportUmaResult(UMA_STATUS_TIMEOUT);
-      VLOG(1) << "Safe browsing API call timed-out";
-    } else {
-      DCHECK_EQ(result_status, RESULT_STATUS_INTERNAL_ERROR);
-      ReportUmaResult(UMA_STATUS_INTERNAL_ERROR);
-      LOG(WARNING) << "Safe browsing API had internal error";
-    }
-    RunCallbackOnIOThread(callback.release(), SB_THREAT_TYPE_SAFE,
-                          ThreatMetadata());
-    return;
-  }
-
-  // Shortcut for safe, so we don't have to parse JSON.
-  if (metadata_str == "{}") {
-    ReportUmaResult(UMA_STATUS_SAFE);
-    RunCallbackOnIOThread(callback.release(), SB_THREAT_TYPE_SAFE,
-                          ThreatMetadata());
-  } else {
-    // Unsafe, assuming we can parse the JSON.
-    SBThreatType worst_threat;
-    ThreatMetadata threat_metadata;
-    ReportUmaResult(
-        ParseJsonFromGMSCore(metadata_str, &worst_threat, &threat_metadata));
-    if (worst_threat != SB_THREAT_TYPE_SAFE) {
-      DVLOG(1) << "Check " << callback_id << " marked as UNSAFE";
-    }
-
-    RunCallbackOnIOThread(callback.release(), worst_threat, threat_metadata);
-  }
-}
-
-//
-// SafeBrowsingApiHandlerBridge
-//
-SafeBrowsingApiHandlerBridge::SafeBrowsingApiHandlerBridge()
-    : checked_api_support_(false) {}
-
-SafeBrowsingApiHandlerBridge::~SafeBrowsingApiHandlerBridge() {
-}
-
-bool SafeBrowsingApiHandlerBridge::CheckApiIsSupported() {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!checked_api_support_) {
-    DVLOG(1) << "Checking API support.";
-    j_api_handler_ = Java_SafeBrowsingApiBridge_create(
-        AttachCurrentThread(), GetApplicationContext());
-    checked_api_support_ = true;
-  }
-  return j_api_handler_.obj() != nullptr;
-}
-
-void SafeBrowsingApiHandlerBridge::StartURLCheck(
-    const SafeBrowsingApiHandler::URLCheckCallbackMeta& callback,
-    const GURL& url,
-    const std::vector<SBThreatType>& threat_types) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  if (!CheckApiIsSupported()) {
-    // Mark all requests as safe. Only users who have an old, broken GMSCore or
-    // have sideloaded Chrome w/o PlayStore should land here.
-    RunCallbackOnIOThread(new URLCheckCallbackMeta(callback),
-                          SB_THREAT_TYPE_SAFE, ThreatMetadata());
-    ReportUmaResult(UMA_STATUS_UNSUPPORTED);
-    return;
-  }
-
-  // Make copy on the heap so we can pass the pointer through JNI.
-  intptr_t callback_id =
-      reinterpret_cast<intptr_t>(new URLCheckCallbackMeta(callback));
-
-  DVLOG(1) << "Starting check " << callback_id << " for URL " << url;
-
-  // Default threat types, to support upstream code that doesn't yet set them.
-  std::vector<SBThreatType> local_threat_types(threat_types);
-  if (local_threat_types.empty()) {
-    local_threat_types.push_back(SB_THREAT_TYPE_URL_PHISHING);
-    local_threat_types.push_back(SB_THREAT_TYPE_URL_MALWARE);
-  }
-
-  JNIEnv* env = AttachCurrentThread();
-  ScopedJavaLocalRef<jstring> j_url = ConvertUTF8ToJavaString(env, url.spec());
-  ScopedJavaLocalRef<jintArray> j_threat_types =
-      SBThreatTypesToJavaArray(env, local_threat_types);
-
-  Java_SafeBrowsingApiBridge_startUriLookup(env, j_api_handler_, callback_id,
-                                            j_url, j_threat_types);
-}
-
-}  // namespace safe_browsing
diff --git a/chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.h b/chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.h
deleted file mode 100644
index ce5f0c58..0000000
--- a/chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2016 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.
-//
-// Glue to pass Safe Browsing API requests between Chrome and GMSCore
-
-#ifndef CHROME_BROWSER_ANDROID_SAFE_BROWSING_SAFE_BROWSING_API_HANDLER_BRIDGE_H_
-#define CHROME_BROWSER_ANDROID_SAFE_BROWSING_SAFE_BROWSING_API_HANDLER_BRIDGE_H_
-
-#include <jni.h>
-
-#include <string>
-#include <vector>
-
-#include "base/android/jni_android.h"
-#include "base/macros.h"
-#include "components/safe_browsing_db/safe_browsing_api_handler.h"
-#include "url/gurl.h"
-
-namespace safe_browsing {
-bool RegisterSafeBrowsingApiBridge(JNIEnv* env);
-
-class SafeBrowsingApiHandlerBridge : public SafeBrowsingApiHandler {
- public:
-  SafeBrowsingApiHandlerBridge();
-  ~SafeBrowsingApiHandlerBridge() override;
-
-  // Makes Native->Java call to check the URL against Safe Browsing lists.
-  void StartURLCheck(const URLCheckCallbackMeta& callback,
-                     const GURL& url,
-                     const std::vector<SBThreatType>& threat_types) override;
-
- private:
-  // Creates the j_api_handler_ if it hasn't been already.  If the API is not
-  // supported, this will return false and j_api_handler_ will remain NULL.
-  bool CheckApiIsSupported();
-
-  // The Java-side SafeBrowsingApiHandler. Must call CheckApiIsSupported first.
-  base::android::ScopedJavaLocalRef<jobject> j_api_handler_;
-
-  // True if we've once tried to create the above object.
-  bool checked_api_support_;
-
-  DISALLOW_COPY_AND_ASSIGN(SafeBrowsingApiHandlerBridge);
-};
-
-}  // namespace safe_browsing
-#endif  // CHROME_BROWSER_ANDROID_SAFE_BROWSING_SAFE_BROWSING_API_HANDLER_BRIDGE_H_