| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 "components/subresource_filter/content/browser/subresource_filter_safe_
browsing_activation_throttle.h" | 5 #include "components/subresource_filter/content/browser/subresource_filter_safe_
browsing_activation_throttle.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/metrics/histogram_macros.h" | 10 #include "base/metrics/histogram_macros.h" |
| 11 #include "base/timer/timer.h" | 11 #include "base/timer/timer.h" |
| 12 #include "components/subresource_filter/content/browser/content_subresource_filt
er_driver_factory.h" | 12 #include "components/subresource_filter/content/browser/content_subresource_filt
er_driver_factory.h" |
| 13 #include "components/subresource_filter/content/browser/subresource_filter_safe_
browsing_client.h" | 13 #include "components/subresource_filter/content/browser/subresource_filter_safe_
browsing_client.h" |
| 14 #include "content/public/browser/browser_thread.h" | 14 #include "content/public/browser/browser_thread.h" |
| 15 #include "content/public/browser/navigation_handle.h" | 15 #include "content/public/browser/navigation_handle.h" |
| 16 #include "content/public/browser/web_contents.h" | 16 #include "content/public/browser/web_contents.h" |
| 17 | 17 |
| 18 namespace subresource_filter { | 18 namespace subresource_filter { |
| 19 | 19 |
| 20 SubresourceFilterSafeBrowsingActivationThrottle:: | 20 SubresourceFilterSafeBrowsingActivationThrottle:: |
| 21 SubresourceFilterSafeBrowsingActivationThrottle( | 21 SubresourceFilterSafeBrowsingActivationThrottle( |
| 22 content::NavigationHandle* handle, | 22 content::NavigationHandle* handle, |
| 23 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, | 23 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, |
| 24 scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> | 24 scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> |
| 25 database_manager) | 25 database_manager) |
| 26 : NavigationThrottle(handle), | 26 : NavigationThrottle(handle), |
| 27 database_manager_(std::move(database_manager)), | 27 io_task_runner_(std::move(io_task_runner)), |
| 28 io_task_runner_(io_task_runner), | 28 // The throttle can be created without a valid database manager. If so, it |
| 29 database_client_(new SubresourceFilterSafeBrowsingClient( | 29 // becomes a pass-through throttle and should never defer. |
| 30 database_manager_, | 30 database_client_(database_manager |
| 31 AsWeakPtr(), | 31 ? new SubresourceFilterSafeBrowsingClient( |
| 32 io_task_runner, | 32 std::move(database_manager), |
| 33 base::ThreadTaskRunnerHandle::Get()), | 33 AsWeakPtr(), |
| 34 io_task_runner_, |
| 35 base::ThreadTaskRunnerHandle::Get()) |
| 36 : nullptr, |
| 34 base::OnTaskRunnerDeleter(io_task_runner_)) {} | 37 base::OnTaskRunnerDeleter(io_task_runner_)) {} |
| 35 | 38 |
| 36 SubresourceFilterSafeBrowsingActivationThrottle:: | 39 SubresourceFilterSafeBrowsingActivationThrottle:: |
| 37 ~SubresourceFilterSafeBrowsingActivationThrottle() { | 40 ~SubresourceFilterSafeBrowsingActivationThrottle() { |
| 38 // TODO(csharrison): Log metrics based on check_results_. | 41 // TODO(csharrison): Log metrics based on check_results_. |
| 39 } | 42 } |
| 40 | 43 |
| 41 content::NavigationThrottle::ThrottleCheckResult | 44 content::NavigationThrottle::ThrottleCheckResult |
| 42 SubresourceFilterSafeBrowsingActivationThrottle::WillStartRequest() { | 45 SubresourceFilterSafeBrowsingActivationThrottle::WillStartRequest() { |
| 43 CheckCurrentUrl(); | 46 CheckCurrentUrl(); |
| 44 return content::NavigationThrottle::ThrottleCheckResult::PROCEED; | 47 return content::NavigationThrottle::ThrottleCheckResult::PROCEED; |
| 45 } | 48 } |
| 46 | 49 |
| 47 content::NavigationThrottle::ThrottleCheckResult | 50 content::NavigationThrottle::ThrottleCheckResult |
| 48 SubresourceFilterSafeBrowsingActivationThrottle::WillRedirectRequest() { | 51 SubresourceFilterSafeBrowsingActivationThrottle::WillRedirectRequest() { |
| 49 CheckCurrentUrl(); | 52 CheckCurrentUrl(); |
| 50 return content::NavigationThrottle::ThrottleCheckResult::PROCEED; | 53 return content::NavigationThrottle::ThrottleCheckResult::PROCEED; |
| 51 } | 54 } |
| 52 | 55 |
| 53 content::NavigationThrottle::ThrottleCheckResult | 56 content::NavigationThrottle::ThrottleCheckResult |
| 54 SubresourceFilterSafeBrowsingActivationThrottle::WillProcessResponse() { | 57 SubresourceFilterSafeBrowsingActivationThrottle::WillProcessResponse() { |
| 58 if (!database_client_) |
| 59 return content::NavigationThrottle::PROCEED; |
| 60 |
| 55 // No need to defer the navigation if the check already happened. | 61 // No need to defer the navigation if the check already happened. |
| 56 if (check_results_.back().finished) { | 62 if (check_results_.back().finished) { |
| 57 NotifyResult(); | 63 NotifyResult(); |
| 58 return content::NavigationThrottle::ThrottleCheckResult::PROCEED; | 64 return content::NavigationThrottle::ThrottleCheckResult::PROCEED; |
| 59 } | 65 } |
| 60 defer_time_ = base::TimeTicks::Now(); | 66 defer_time_ = base::TimeTicks::Now(); |
| 61 return content::NavigationThrottle::ThrottleCheckResult::DEFER; | 67 return content::NavigationThrottle::ThrottleCheckResult::DEFER; |
| 62 } | 68 } |
| 63 | 69 |
| 64 const char* | 70 const char* |
| (...skipping 10 matching lines...) Expand all Loading... |
| 75 auto& stored_result = check_results_.at(request_id); | 81 auto& stored_result = check_results_.at(request_id); |
| 76 DCHECK(!stored_result.finished); | 82 DCHECK(!stored_result.finished); |
| 77 stored_result = result; | 83 stored_result = result; |
| 78 if (!defer_time_.is_null() && request_id == check_results_.size() - 1) { | 84 if (!defer_time_.is_null() && request_id == check_results_.size() - 1) { |
| 79 NotifyResult(); | 85 NotifyResult(); |
| 80 navigation_handle()->Resume(); | 86 navigation_handle()->Resume(); |
| 81 } | 87 } |
| 82 } | 88 } |
| 83 | 89 |
| 84 void SubresourceFilterSafeBrowsingActivationThrottle::CheckCurrentUrl() { | 90 void SubresourceFilterSafeBrowsingActivationThrottle::CheckCurrentUrl() { |
| 91 if (!database_client_) |
| 92 return; |
| 85 check_results_.emplace_back(); | 93 check_results_.emplace_back(); |
| 86 size_t id = check_results_.size() - 1; | 94 size_t id = check_results_.size() - 1; |
| 87 io_task_runner_->PostTask( | 95 io_task_runner_->PostTask( |
| 88 FROM_HERE, base::Bind(&SubresourceFilterSafeBrowsingClient::CheckUrlOnIO, | 96 FROM_HERE, base::Bind(&SubresourceFilterSafeBrowsingClient::CheckUrlOnIO, |
| 89 base::Unretained(database_client_.get()), | 97 base::Unretained(database_client_.get()), |
| 90 navigation_handle()->GetURL(), id)); | 98 navigation_handle()->GetURL(), id)); |
| 91 } | 99 } |
| 92 | 100 |
| 93 void SubresourceFilterSafeBrowsingActivationThrottle::NotifyResult() { | 101 void SubresourceFilterSafeBrowsingActivationThrottle::NotifyResult() { |
| 94 content::WebContents* web_contents = navigation_handle()->GetWebContents(); | 102 content::WebContents* web_contents = navigation_handle()->GetWebContents(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 116 // speculatively checks URLs on WillStartRequest. This is only different from | 124 // speculatively checks URLs on WillStartRequest. This is only different from |
| 117 // the actual delay if there was at least one redirect. | 125 // the actual delay if there was at least one redirect. |
| 118 base::TimeDelta no_redirect_speculation_delay = | 126 base::TimeDelta no_redirect_speculation_delay = |
| 119 check_results_.size() > 1 ? result.check_time : delay; | 127 check_results_.size() > 1 ? result.check_time : delay; |
| 120 UMA_HISTOGRAM_TIMES( | 128 UMA_HISTOGRAM_TIMES( |
| 121 "SubresourceFilter.PageLoad.SafeBrowsingDelay.NoRedirectSpeculation", | 129 "SubresourceFilter.PageLoad.SafeBrowsingDelay.NoRedirectSpeculation", |
| 122 no_redirect_speculation_delay); | 130 no_redirect_speculation_delay); |
| 123 } | 131 } |
| 124 | 132 |
| 125 } // namespace subresource_filter | 133 } // namespace subresource_filter |
| OLD | NEW |