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 cf2d7579bebc43950401ca7a006d11671f685912..0e3eb06bb21881ccf4af1422b2c534875e2981c0 100644 |
--- a/chrome/browser/safe_browsing/client_side_detection_host.cc |
+++ b/chrome/browser/safe_browsing/client_side_detection_host.cc |
@@ -290,14 +290,12 @@ void ClientSideDetectionHost::DidNavigateMainFramePostCommit( |
// TODO(noelutz): move this DCHECK to TabContents and fix all the unit tests |
// that don't call this method on the UI thread. |
// DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
if (details.is_in_page) { |
// If the navigation is within the same page, the user isn't really |
// navigating away. We don't need to cancel a pending callback or |
// begin a new classification. |
return; |
} |
- |
// If we navigate away and there currently is a pending phishing |
// report request we have to cancel it to make sure we don't display |
// an interstitial for the wrong page. Note that this won't cancel |
@@ -305,20 +303,26 @@ void ClientSideDetectionHost::DidNavigateMainFramePostCommit( |
// interstial. |
cb_factory_.RevokeAll(); |
- if (csd_service_) { |
- // Cancel any pending classification request. |
- if (classification_request_.get()) { |
- classification_request_->Cancel(); |
- } |
+ if (!csd_service_) { |
+ return; |
+ } |
- // Notify the renderer if it should classify this URL. |
- classification_request_ = new ShouldClassifyUrlRequest(params, |
- tab_contents(), |
- csd_service_, |
- sb_service_, |
- this); |
- classification_request_->Start(); |
+ // Cancel any pending classification request. |
+ if (classification_request_.get()) { |
+ classification_request_->Cancel(); |
} |
+ browse_info_.reset(new BrowseInfo); |
+ browse_info_->url = params.url; |
+ browse_info_->referrer = params.referrer; |
+ browse_info_->transition = params.transition; |
+ |
+ // Notify the renderer if it should classify this URL. |
+ classification_request_ = new ShouldClassifyUrlRequest(params, |
+ tab_contents(), |
+ csd_service_, |
+ sb_service_, |
+ this); |
+ classification_request_->Start(); |
} |
void ClientSideDetectionHost::TabContentsDestroyed(TabContents* tab) { |
@@ -338,22 +342,34 @@ void ClientSideDetectionHost::OnDetectedPhishingSite( |
// this method is called. The renderer should not start phishing detection |
// if there isn't any service class in the browser. |
DCHECK(csd_service_); |
+ // There shouldn't be any pending requests because we revoke them everytime |
+ // we navigate away. |
+ DCHECK(!cb_factory_.HasPendingCallbacks()); |
+ DCHECK(browse_info_.get()); |
+ |
// We parse the protocol buffer here. If we're unable to parse it we won't |
// send the verdict further. |
scoped_ptr<ClientPhishingRequest> verdict(new ClientPhishingRequest); |
if (csd_service_ && |
+ !cb_factory_.HasPendingCallbacks() && |
+ browse_info_.get() && |
verdict->ParseFromString(verdict_str) && |
verdict->IsInitialized()) { |
- // There shouldn't be any pending requests because we revoke them everytime |
- // we navigate away. |
- DCHECK(!cb_factory_.HasPendingCallbacks()); |
- |
+ if (browse_info_->url.spec() != verdict->url()) { |
+ // I'm not sure we can DCHECK on this one so we keep stats around to see |
+ // whether this actually happens in practice. |
+ UMA_HISTOGRAM_COUNTS("SBClientPhishing.BrowserRendererUrlMismatch", 1); |
+ VLOG(2) << "Browser and renderer URL do not match: " |
+ << browse_info_->url.spec() << " vs. " << verdict->url(); |
+ } |
// Start browser-side feature extraction. Once we're done it will send |
// the client verdict request. |
feature_extractor_->ExtractFeatures( |
+ *browse_info_, |
verdict.release(), |
NewCallback(this, &ClientSideDetectionHost::FeatureExtractionDone)); |
} |
+ browse_info_.reset(); |
} |
void ClientSideDetectionHost::MaybeShowPhishingWarning(GURL phishing_url, |