OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/safe_browsing/client_side_detection_host.h" | 5 #include "chrome/browser/safe_browsing/client_side_detection_host.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
283 IPC_END_MESSAGE_MAP() | 283 IPC_END_MESSAGE_MAP() |
284 return handled; | 284 return handled; |
285 } | 285 } |
286 | 286 |
287 void ClientSideDetectionHost::DidNavigateMainFramePostCommit( | 287 void ClientSideDetectionHost::DidNavigateMainFramePostCommit( |
288 const content::LoadCommittedDetails& details, | 288 const content::LoadCommittedDetails& details, |
289 const ViewHostMsg_FrameNavigate_Params& params) { | 289 const ViewHostMsg_FrameNavigate_Params& params) { |
290 // TODO(noelutz): move this DCHECK to TabContents and fix all the unit tests | 290 // TODO(noelutz): move this DCHECK to TabContents and fix all the unit tests |
291 // that don't call this method on the UI thread. | 291 // that don't call this method on the UI thread. |
292 // DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 292 // DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
293 | |
294 if (details.is_in_page) { | 293 if (details.is_in_page) { |
295 // If the navigation is within the same page, the user isn't really | 294 // If the navigation is within the same page, the user isn't really |
296 // navigating away. We don't need to cancel a pending callback or | 295 // navigating away. We don't need to cancel a pending callback or |
297 // begin a new classification. | 296 // begin a new classification. |
298 return; | 297 return; |
299 } | 298 } |
300 | |
301 // If we navigate away and there currently is a pending phishing | 299 // If we navigate away and there currently is a pending phishing |
302 // report request we have to cancel it to make sure we don't display | 300 // report request we have to cancel it to make sure we don't display |
303 // an interstitial for the wrong page. Note that this won't cancel | 301 // an interstitial for the wrong page. Note that this won't cancel |
304 // the server ping back but only cancel the showing of the | 302 // the server ping back but only cancel the showing of the |
305 // interstial. | 303 // interstial. |
306 cb_factory_.RevokeAll(); | 304 cb_factory_.RevokeAll(); |
307 | 305 |
308 if (csd_service_) { | 306 if (!csd_service_) { |
309 // Cancel any pending classification request. | 307 return; |
310 if (classification_request_.get()) { | 308 } |
311 classification_request_->Cancel(); | |
312 } | |
313 | 309 |
314 // Notify the renderer if it should classify this URL. | 310 // Cancel any pending classification request. |
315 classification_request_ = new ShouldClassifyUrlRequest(params, | 311 if (classification_request_.get()) { |
316 tab_contents(), | 312 classification_request_->Cancel(); |
317 csd_service_, | |
318 sb_service_, | |
319 this); | |
320 classification_request_->Start(); | |
321 } | 313 } |
314 browse_info_.reset(new BrowseInfo); | |
315 browse_info_->url = params.url; | |
316 browse_info_->referrer = params.referrer; | |
317 browse_info_->transition = params.transition; | |
318 | |
319 // Notify the renderer if it should classify this URL. | |
320 classification_request_ = new ShouldClassifyUrlRequest(params, | |
321 tab_contents(), | |
322 csd_service_, | |
323 sb_service_, | |
324 this); | |
325 classification_request_->Start(); | |
322 } | 326 } |
323 | 327 |
324 void ClientSideDetectionHost::TabContentsDestroyed(TabContents* tab) { | 328 void ClientSideDetectionHost::TabContentsDestroyed(TabContents* tab) { |
325 DCHECK(tab); | 329 DCHECK(tab); |
326 // Tell any pending classification request that it is being canceled. | 330 // Tell any pending classification request that it is being canceled. |
327 if (classification_request_.get()) { | 331 if (classification_request_.get()) { |
328 classification_request_->Cancel(); | 332 classification_request_->Cancel(); |
329 } | 333 } |
330 // Cancel all pending feature extractions. | 334 // Cancel all pending feature extractions. |
331 feature_extractor_.reset(); | 335 feature_extractor_.reset(); |
332 } | 336 } |
333 | 337 |
334 void ClientSideDetectionHost::OnDetectedPhishingSite( | 338 void ClientSideDetectionHost::OnDetectedPhishingSite( |
335 const std::string& verdict_str) { | 339 const std::string& verdict_str) { |
336 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 340 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
337 // There is something seriously wrong if there is no service class but | 341 // There is something seriously wrong if there is no service class but |
338 // this method is called. The renderer should not start phishing detection | 342 // this method is called. The renderer should not start phishing detection |
339 // if there isn't any service class in the browser. | 343 // if there isn't any service class in the browser. |
340 DCHECK(csd_service_); | 344 DCHECK(csd_service_); |
345 // There shouldn't be any pending requests because we revoke them everytime | |
346 // we navigate away. | |
347 DCHECK(!cb_factory_.HasPendingCallbacks()); | |
348 DCHECK(browse_info_.get()); | |
349 | |
341 // We parse the protocol buffer here. If we're unable to parse it we won't | 350 // We parse the protocol buffer here. If we're unable to parse it we won't |
342 // send the verdict further. | 351 // send the verdict further. |
343 scoped_ptr<ClientPhishingRequest> verdict(new ClientPhishingRequest); | 352 scoped_ptr<ClientPhishingRequest> verdict(new ClientPhishingRequest); |
344 if (csd_service_ && | 353 if (csd_service_ && |
354 browse_info_.get() && | |
345 verdict->ParseFromString(verdict_str) && | 355 verdict->ParseFromString(verdict_str) && |
346 verdict->IsInitialized()) { | 356 verdict->IsInitialized()) { |
347 // There shouldn't be any pending requests because we revoke them everytime | 357 // There shouldn't be any pending requests because we revoke them everytime |
348 // we navigate away. | 358 // we navigate away. |
349 DCHECK(!cb_factory_.HasPendingCallbacks()); | 359 DCHECK(!cb_factory_.HasPendingCallbacks()); |
350 | 360 if (browse_info_->url.spec() != verdict->url()) { |
361 // I'm not sure we can DCHECK on this one so we keep stats around to see | |
362 // whether this actually happens in practice. | |
363 UMA_HISTOGRAM_COUNTS("SBClientPhishing.BrowserRendererUrlMismatch", 1); | |
364 VLOG(2) << "Browser and renderer URL do not match: " | |
365 << browse_info_->url.spec() << " vs. " << verdict->url(); | |
mattm
2011/06/20 22:33:06
should it return or have the ExtractFeatures in an
noelutz
2011/06/20 22:58:12
I would like to fall through for now (which is why
mattm
2011/06/21 00:06:06
Hm, I don't think there should be, dunno. Just ha
| |
366 } | |
351 // Start browser-side feature extraction. Once we're done it will send | 367 // Start browser-side feature extraction. Once we're done it will send |
352 // the client verdict request. | 368 // the client verdict request. |
353 feature_extractor_->ExtractFeatures( | 369 feature_extractor_->ExtractFeatures( |
370 *browse_info_, | |
354 verdict.release(), | 371 verdict.release(), |
355 NewCallback(this, &ClientSideDetectionHost::FeatureExtractionDone)); | 372 NewCallback(this, &ClientSideDetectionHost::FeatureExtractionDone)); |
356 } | 373 } |
374 browse_info_.reset(); | |
357 } | 375 } |
358 | 376 |
359 void ClientSideDetectionHost::MaybeShowPhishingWarning(GURL phishing_url, | 377 void ClientSideDetectionHost::MaybeShowPhishingWarning(GURL phishing_url, |
360 bool is_phishing) { | 378 bool is_phishing) { |
361 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 379 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
362 VLOG(2) << "Received server phishing verdict for URL:" << phishing_url | 380 VLOG(2) << "Received server phishing verdict for URL:" << phishing_url |
363 << " is_phishing:" << is_phishing; | 381 << " is_phishing:" << is_phishing; |
364 if (is_phishing) { | 382 if (is_phishing) { |
365 DCHECK(tab_contents()); | 383 DCHECK(tab_contents()); |
366 if (sb_service_) { | 384 if (sb_service_) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
404 ClientSideDetectionService* service) { | 422 ClientSideDetectionService* service) { |
405 csd_service_ = service; | 423 csd_service_ = service; |
406 } | 424 } |
407 | 425 |
408 void ClientSideDetectionHost::set_safe_browsing_service( | 426 void ClientSideDetectionHost::set_safe_browsing_service( |
409 SafeBrowsingService* service) { | 427 SafeBrowsingService* service) { |
410 sb_service_ = service; | 428 sb_service_ = service; |
411 } | 429 } |
412 | 430 |
413 } // namespace safe_browsing | 431 } // namespace safe_browsing |
OLD | NEW |