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