| Index: chrome/browser/safe_browsing/client_side_detection_host.cc
|
| diff --git a/chrome/browser/safe_browsing/client_side_detection_host.cc b/chrome/browser/safe_browsing/client_side_detection_host.cc
|
| index 4cb448c5a77dc99262b3a93e1b982adf17e73257..cf2d7579bebc43950401ca7a006d11671f685912 100644
|
| --- a/chrome/browser/safe_browsing/client_side_detection_host.cc
|
| +++ b/chrome/browser/safe_browsing/client_side_detection_host.cc
|
| @@ -13,6 +13,7 @@
|
| #include "base/task.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/safe_browsing/browser_feature_extractor.h"
|
| #include "chrome/browser/safe_browsing/client_side_detection_service.h"
|
| #include "chrome/browser/safe_browsing/safe_browsing_service.h"
|
| #include "chrome/common/chrome_switches.h"
|
| @@ -264,18 +265,14 @@ ClientSideDetectionHost* ClientSideDetectionHost::Create(
|
| ClientSideDetectionHost::ClientSideDetectionHost(TabContents* tab)
|
| : TabContentsObserver(tab),
|
| csd_service_(g_browser_process->safe_browsing_detection_service()),
|
| + feature_extractor_(new BrowserFeatureExtractor(tab)),
|
| cb_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
|
| DCHECK(tab);
|
| // Note: csd_service_ and sb_service_ might be NULL.
|
| sb_service_ = g_browser_process->safe_browsing_service();
|
| }
|
|
|
| -ClientSideDetectionHost::~ClientSideDetectionHost() {
|
| - // Tell any pending classification request that it is being canceled.
|
| - if (classification_request_.get()) {
|
| - classification_request_->Cancel();
|
| - }
|
| -}
|
| +ClientSideDetectionHost::~ClientSideDetectionHost() {}
|
|
|
| bool ClientSideDetectionHost::OnMessageReceived(const IPC::Message& message) {
|
| bool handled = true;
|
| @@ -324,6 +321,16 @@ void ClientSideDetectionHost::DidNavigateMainFramePostCommit(
|
| }
|
| }
|
|
|
| +void ClientSideDetectionHost::TabContentsDestroyed(TabContents* tab) {
|
| + DCHECK(tab);
|
| + // Tell any pending classification request that it is being canceled.
|
| + if (classification_request_.get()) {
|
| + classification_request_->Cancel();
|
| + }
|
| + // Cancel all pending feature extractions.
|
| + feature_extractor_.reset();
|
| +}
|
| +
|
| void ClientSideDetectionHost::OnDetectedPhishingSite(
|
| const std::string& verdict_str) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| @@ -340,12 +347,12 @@ void ClientSideDetectionHost::OnDetectedPhishingSite(
|
| // There shouldn't be any pending requests because we revoke them everytime
|
| // we navigate away.
|
| DCHECK(!cb_factory_.HasPendingCallbacks());
|
| - VLOG(2) << "Start sending client phishing request for URL: "
|
| - << verdict->url();
|
| - csd_service_->SendClientReportPhishingRequest(
|
| - verdict.release(), // The service takes ownership of the verdict.
|
| - cb_factory_.NewCallback(
|
| - &ClientSideDetectionHost::MaybeShowPhishingWarning));
|
| +
|
| + // Start browser-side feature extraction. Once we're done it will send
|
| + // the client verdict request.
|
| + feature_extractor_->ExtractFeatures(
|
| + verdict.release(),
|
| + NewCallback(this, &ClientSideDetectionHost::FeatureExtractionDone));
|
| }
|
| }
|
|
|
| @@ -377,6 +384,22 @@ void ClientSideDetectionHost::MaybeShowPhishingWarning(GURL phishing_url,
|
| }
|
| }
|
|
|
| +void ClientSideDetectionHost::FeatureExtractionDone(
|
| + bool success,
|
| + ClientPhishingRequest* request) {
|
| + if (!request) {
|
| + DLOG(FATAL) << "Invalid request object in FeatureExtractionDone";
|
| + return;
|
| + }
|
| + VLOG(2) << "Feature extraction done (success:" << success << ") for URL: "
|
| + << request->url() << ". Start sending client phishing request.";
|
| + // Send ping no matter what - even if the browser feature extraction failed.
|
| + csd_service_->SendClientReportPhishingRequest(
|
| + request, // The service takes ownership of the request object.
|
| + cb_factory_.NewCallback(
|
| + &ClientSideDetectionHost::MaybeShowPhishingWarning));
|
| +}
|
| +
|
| void ClientSideDetectionHost::set_client_side_detection_service(
|
| ClientSideDetectionService* service) {
|
| csd_service_ = service;
|
|
|