Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/loader/safe_browsing_resource_throttle.h" | 5 #include "chrome/browser/loader/safe_browsing_resource_throttle.h" |
| 6 | 6 |
| 7 #include <iterator> | 7 #include <iterator> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/metrics/histogram_macros.h" | 11 #include "base/metrics/histogram_macros.h" |
| 12 #include "base/trace_event/trace_event.h" | 12 #include "base/trace_event/trace_event.h" |
| 13 #include "base/values.h" | 13 #include "base/values.h" |
| 14 #include "chrome/browser/browser_process.h" | 14 #include "chrome/browser/browser_process.h" |
| 15 #include "chrome/browser/prerender/prerender_contents.h" | 15 #include "chrome/browser/prerender/prerender_contents.h" |
| 16 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 16 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| 17 #include "components/safe_browsing_db/util.h" | 17 #include "components/safe_browsing_db/util.h" |
| 18 #include "components/safe_browsing_db/v4_local_database_manager.h" | |
| 18 #include "components/subresource_filter/content/browser/content_subresource_filt er_driver_factory.h" | 19 #include "components/subresource_filter/content/browser/content_subresource_filt er_driver_factory.h" |
| 19 #include "content/public/browser/browser_thread.h" | 20 #include "content/public/browser/browser_thread.h" |
| 20 #include "content/public/browser/render_frame_host.h" | 21 #include "content/public/browser/render_frame_host.h" |
| 21 #include "content/public/browser/resource_controller.h" | 22 #include "content/public/browser/resource_controller.h" |
| 22 #include "content/public/browser/resource_request_info.h" | 23 #include "content/public/browser/resource_request_info.h" |
| 23 #include "content/public/browser/web_contents.h" | 24 #include "content/public/browser/web_contents.h" |
| 24 #include "net/base/load_flags.h" | 25 #include "net/base/load_flags.h" |
| 25 #include "net/log/net_log.h" | 26 #include "net/log/net_log.h" |
| 26 #include "net/log/net_log_source_type.h" | 27 #include "net/log/net_log_source_type.h" |
| 27 #include "net/url_request/redirect_info.h" | 28 #include "net/url_request/redirect_info.h" |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 89 safe_browsing::SafeBrowsingService* sb_service) | 90 safe_browsing::SafeBrowsingService* sb_service) |
| 90 : state_(STATE_NONE), | 91 : state_(STATE_NONE), |
| 91 defer_state_(DEFERRED_NONE), | 92 defer_state_(DEFERRED_NONE), |
| 92 threat_type_(safe_browsing::SB_THREAT_TYPE_SAFE), | 93 threat_type_(safe_browsing::SB_THREAT_TYPE_SAFE), |
| 93 database_manager_(sb_service->database_manager()), | 94 database_manager_(sb_service->database_manager()), |
| 94 ui_manager_(sb_service->ui_manager()), | 95 ui_manager_(sb_service->ui_manager()), |
| 95 request_(request), | 96 request_(request), |
| 96 resource_type_(resource_type), | 97 resource_type_(resource_type), |
| 97 net_log_with_source_( | 98 net_log_with_source_( |
| 98 net::NetLogWithSource::Make(request->net_log().net_log(), | 99 net::NetLogWithSource::Make(request->net_log().net_log(), |
| 99 NetLogSourceType::SAFE_BROWSING)) {} | 100 NetLogSourceType::SAFE_BROWSING)), |
| 101 v4_local_database_manager_(sb_service->v4_local_database_manager()) {} | |
| 100 | 102 |
| 101 SafeBrowsingResourceThrottle::~SafeBrowsingResourceThrottle() { | 103 SafeBrowsingResourceThrottle::~SafeBrowsingResourceThrottle() { |
| 102 if (defer_state_ != DEFERRED_NONE) { | 104 if (defer_state_ != DEFERRED_NONE) { |
| 103 EndNetLogEvent(NetLogEventType::SAFE_BROWSING_DEFERRED, nullptr, nullptr); | 105 EndNetLogEvent(NetLogEventType::SAFE_BROWSING_DEFERRED, nullptr, nullptr); |
| 104 } | 106 } |
| 105 | 107 |
| 106 if (state_ == STATE_CHECKING_URL) { | 108 if (state_ == STATE_CHECKING_URL) { |
| 107 database_manager_->CancelCheck(this); | 109 database_manager_->CancelCheck(this); |
| 108 EndNetLogEvent(NetLogEventType::SAFE_BROWSING_CHECKING_URL, "result", | 110 EndNetLogEvent(NetLogEventType::SAFE_BROWSING_CHECKING_URL, "result", |
| 109 "request_canceled"); | 111 "request_canceled"); |
| 112 | |
| 113 if (v4_local_database_manager_) { | |
| 114 v4_local_database_manager_->CancelCheck(this); | |
| 115 } | |
|
Scott Hess - ex-Googler
2016/09/27 22:24:53
Move this above the log event.
vakh (use Gerrit instead)
2016/09/28 01:24:33
Done.
| |
| 110 } | 116 } |
| 111 } | 117 } |
| 112 | 118 |
| 113 // Note on net_log calls: SAFE_BROWSING_DEFERRED events must be wholly | 119 // Note on net_log calls: SAFE_BROWSING_DEFERRED events must be wholly |
| 114 // nested within SAFE_BROWSING_CHECKING_URL events. Synchronous checks | 120 // nested within SAFE_BROWSING_CHECKING_URL events. Synchronous checks |
| 115 // are not logged at all. | 121 // are not logged at all. |
| 116 void SafeBrowsingResourceThrottle::BeginNetLogEvent(NetLogEventType type, | 122 void SafeBrowsingResourceThrottle::BeginNetLogEvent(NetLogEventType type, |
| 117 const GURL& url, | 123 const GURL& url, |
| 118 const char* name, | 124 const char* name, |
| 119 const char* value) { | 125 const char* value) { |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 366 if (!database_manager_->CanCheckResourceType(resource_type_)) { | 372 if (!database_manager_->CanCheckResourceType(resource_type_)) { |
| 367 UMA_HISTOGRAM_ENUMERATION("SB2.ResourceTypes2.Skipped", resource_type_, | 373 UMA_HISTOGRAM_ENUMERATION("SB2.ResourceTypes2.Skipped", resource_type_, |
| 368 content::RESOURCE_TYPE_LAST_TYPE); | 374 content::RESOURCE_TYPE_LAST_TYPE); |
| 369 return true; | 375 return true; |
| 370 } | 376 } |
| 371 | 377 |
| 372 bool succeeded_synchronously = database_manager_->CheckBrowseUrl(url, this); | 378 bool succeeded_synchronously = database_manager_->CheckBrowseUrl(url, this); |
| 373 UMA_HISTOGRAM_ENUMERATION("SB2.ResourceTypes2.Checked", resource_type_, | 379 UMA_HISTOGRAM_ENUMERATION("SB2.ResourceTypes2.Checked", resource_type_, |
| 374 content::RESOURCE_TYPE_LAST_TYPE); | 380 content::RESOURCE_TYPE_LAST_TYPE); |
| 375 | 381 |
| 382 if (v4_local_database_manager_ && | |
| 383 v4_local_database_manager_->CanCheckResourceType(resource_type_)) { | |
| 384 v4_local_database_manager_->CheckBrowseUrl(url, this); | |
| 385 } | |
| 386 | |
| 376 if (succeeded_synchronously) { | 387 if (succeeded_synchronously) { |
| 377 threat_type_ = safe_browsing::SB_THREAT_TYPE_SAFE; | 388 threat_type_ = safe_browsing::SB_THREAT_TYPE_SAFE; |
| 378 ui_manager_->LogPauseDelay(base::TimeDelta()); // No delay. | 389 ui_manager_->LogPauseDelay(base::TimeDelta()); // No delay. |
| 379 return true; | 390 return true; |
| 380 } | 391 } |
| 381 | 392 |
| 382 state_ = STATE_CHECKING_URL; | 393 state_ = STATE_CHECKING_URL; |
| 383 url_being_checked_ = url; | 394 url_being_checked_ = url; |
| 384 BeginNetLogEvent(NetLogEventType::SAFE_BROWSING_CHECKING_URL, url, nullptr, | 395 BeginNetLogEvent(NetLogEventType::SAFE_BROWSING_CHECKING_URL, url, nullptr, |
| 385 nullptr); | 396 nullptr); |
| 386 | 397 |
| 387 // Start a timer to abort the check if it takes too long. | 398 // Start a timer to abort the check if it takes too long. |
| 388 // TODO(nparker): Set this only when we defer, based on remaining time, | 399 // TODO(nparker): Set this only when we defer, based on remaining time, |
| 389 // so we don't cancel earlier than necessary. | 400 // so we don't cancel earlier than necessary. |
| 390 timer_.Start(FROM_HERE, | 401 timer_.Start(FROM_HERE, |
| 391 base::TimeDelta::FromMilliseconds(kCheckUrlTimeoutMs), | 402 base::TimeDelta::FromMilliseconds(kCheckUrlTimeoutMs), |
| 392 this, &SafeBrowsingResourceThrottle::OnCheckUrlTimeout); | 403 this, &SafeBrowsingResourceThrottle::OnCheckUrlTimeout); |
| 393 | 404 |
| 394 return false; | 405 return false; |
| 395 } | 406 } |
| 396 | 407 |
| 397 void SafeBrowsingResourceThrottle::OnCheckUrlTimeout() { | 408 void SafeBrowsingResourceThrottle::OnCheckUrlTimeout() { |
| 398 CHECK_EQ(state_, STATE_CHECKING_URL); | 409 CHECK_EQ(state_, STATE_CHECKING_URL); |
| 399 | 410 |
| 400 database_manager_->CancelCheck(this); | 411 database_manager_->CancelCheck(this); |
| 401 OnCheckBrowseUrlResult(url_being_checked_, safe_browsing::SB_THREAT_TYPE_SAFE, | 412 OnCheckBrowseUrlResult(url_being_checked_, safe_browsing::SB_THREAT_TYPE_SAFE, |
| 402 safe_browsing::ThreatMetadata()); | 413 safe_browsing::ThreatMetadata()); |
| 414 if (v4_local_database_manager_) { | |
| 415 v4_local_database_manager_->CancelCheck(this); | |
| 416 } | |
|
Scott Hess - ex-Googler
2016/09/27 22:24:53
Probably move this above the response, so that bot
vakh (use Gerrit instead)
2016/09/28 01:24:33
Done.
| |
| 403 } | 417 } |
| 404 | 418 |
| 405 void SafeBrowsingResourceThrottle::ResumeRequest() { | 419 void SafeBrowsingResourceThrottle::ResumeRequest() { |
| 406 CHECK_EQ(state_, STATE_NONE); | 420 CHECK_EQ(state_, STATE_NONE); |
| 407 CHECK_NE(defer_state_, DEFERRED_NONE); | 421 CHECK_NE(defer_state_, DEFERRED_NONE); |
| 408 | 422 |
| 409 bool resume = true; | 423 bool resume = true; |
| 410 if (defer_state_ == DEFERRED_UNCHECKED_REDIRECT) { | 424 if (defer_state_ == DEFERRED_UNCHECKED_REDIRECT) { |
| 411 // Save the redirect urls for possible malware detail reporting later. | 425 // Save the redirect urls for possible malware detail reporting later. |
| 412 redirect_urls_.push_back(unchecked_redirect_url_); | 426 redirect_urls_.push_back(unchecked_redirect_url_); |
| 413 if (!CheckUrl(unchecked_redirect_url_)) { | 427 if (!CheckUrl(unchecked_redirect_url_)) { |
| 414 // We're now waiting for the unchecked_redirect_url_. | 428 // We're now waiting for the unchecked_redirect_url_. |
| 415 defer_state_ = DEFERRED_REDIRECT; | 429 defer_state_ = DEFERRED_REDIRECT; |
| 416 resume = false; | 430 resume = false; |
| 417 BeginNetLogEvent(NetLogEventType::SAFE_BROWSING_DEFERRED, | 431 BeginNetLogEvent(NetLogEventType::SAFE_BROWSING_DEFERRED, |
| 418 unchecked_redirect_url_, "defer_reason", | 432 unchecked_redirect_url_, "defer_reason", |
| 419 "resumed_redirect"); | 433 "resumed_redirect"); |
| 420 } | 434 } |
| 421 } | 435 } |
| 422 | 436 |
| 423 if (resume) { | 437 if (resume) { |
| 424 defer_state_ = DEFERRED_NONE; | 438 defer_state_ = DEFERRED_NONE; |
| 425 controller()->Resume(); | 439 controller()->Resume(); |
| 426 } | 440 } |
| 427 } | 441 } |
| OLD | NEW |