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_