Index: components/subresource_filter/content/browser/content_subresource_filter_driver_factory.cc |
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_driver_factory.cc b/components/subresource_filter/content/browser/content_subresource_filter_driver_factory.cc |
index 410b37382d6f5b76f56cd82d171adc47089cce45..97f23d1ab8fb7b4476f417638f42d31d412578d5 100644 |
--- a/components/subresource_filter/content/browser/content_subresource_filter_driver_factory.cc |
+++ b/components/subresource_filter/content/browser/content_subresource_filter_driver_factory.cc |
@@ -13,8 +13,10 @@ |
#include "components/subresource_filter/content/common/subresource_filter_messages.h" |
#include "components/subresource_filter/core/browser/subresource_filter_features.h" |
#include "components/subresource_filter/core/common/activation_list.h" |
+#include "components/subresource_filter/core/common/activation_state.h" |
#include "components/subresource_filter/core/common/time_measurements.h" |
#include "content/public/browser/navigation_handle.h" |
+#include "content/public/browser/navigation_throttle.h" |
#include "content/public/browser/render_frame_host.h" |
#include "content/public/browser/web_contents.h" |
#include "ipc/ipc_message_macros.h" |
@@ -90,6 +92,11 @@ ContentSubresourceFilterDriverFactory::ContentSubresourceFilterDriverFactory( |
std::unique_ptr<SubresourceFilterClient> client) |
: content::WebContentsObserver(web_contents), |
client_(std::move(client)), |
+ throttle_manager_( |
+ base::MakeUnique<ContentSubresourceFilterThrottleManager>( |
+ this, |
+ client_->GetRulesetDealer(), |
+ web_contents)), |
activation_level_(ActivationLevel::DISABLED), |
activation_decision_(ActivationDecision::UNKNOWN), |
measure_performance_(false) {} |
@@ -97,14 +104,6 @@ ContentSubresourceFilterDriverFactory::ContentSubresourceFilterDriverFactory( |
ContentSubresourceFilterDriverFactory:: |
~ContentSubresourceFilterDriverFactory() {} |
-void ContentSubresourceFilterDriverFactory::OnFirstSubresourceLoadDisallowed() { |
- if (ShouldSuppressNotifications()) |
- return; |
- |
- client_->ToggleNotificationVisibility(activation_level_ == |
- ActivationLevel::ENABLED); |
-} |
- |
void ContentSubresourceFilterDriverFactory::OnDocumentLoadStatistics( |
const DocumentLoadStatistics& statistics) { |
// Note: Chances of overflow are negligible. |
@@ -184,17 +183,6 @@ ContentSubresourceFilterDriverFactory::ComputeActivationDecisionForMainFrameURL( |
} |
} |
-void ContentSubresourceFilterDriverFactory::ActivateForFrameHostIfNeeded( |
- content::RenderFrameHost* render_frame_host, |
- const GURL& url) { |
- if (activation_level_ != ActivationLevel::DISABLED) { |
- render_frame_host->Send( |
- new SubresourceFilterMsg_ActivateForNextCommittedLoad( |
- render_frame_host->GetRoutingID(), activation_level_, |
- measure_performance_)); |
- } |
-} |
- |
void ContentSubresourceFilterDriverFactory::OnReloadRequested() { |
UMA_HISTOGRAM_BOOLEAN("SubresourceFilter.Prompt.NumReloads", true); |
const GURL& whitelist_url = web_contents()->GetLastCommittedURL(); |
@@ -211,6 +199,56 @@ void ContentSubresourceFilterDriverFactory::OnReloadRequested() { |
web_contents()->GetController().Reload(content::ReloadType::NORMAL, true); |
} |
+void ContentSubresourceFilterDriverFactory::WillProcessResponse( |
+ content::NavigationHandle* navigation_handle) { |
+ DCHECK(!navigation_handle->IsSameDocument()); |
+ if (!navigation_handle->IsInMainFrame() || |
+ navigation_handle->GetNetErrorCode() != net::OK) { |
+ return; |
+ } |
+ |
+ const GURL& url = navigation_handle->GetURL(); |
+ const content::Referrer& referrer = navigation_handle->GetReferrer(); |
+ ui::PageTransition transition = navigation_handle->GetPageTransition(); |
+ |
+ RecordRedirectChainMatchPattern(); |
+ |
+ if (ShouldWhitelistSiteOnReload() && |
+ NavigationIsPageReload(url, referrer, transition)) { |
+ // Whitelist this host for the current as well as subsequent navigations. |
+ AddHostOfURLToWhitelistSet(url); |
+ } |
+ |
+ activation_decision_ = ComputeActivationDecisionForMainFrameURL(url); |
+ DCHECK(activation_decision_ != ActivationDecision::UNKNOWN); |
+ if (activation_decision_ != ActivationDecision::ACTIVATED) { |
+ ResetActivationState(); |
+ return; |
+ } |
+ |
+ activation_level_ = GetMaximumActivationLevel(); |
+ measure_performance_ = activation_level_ != ActivationLevel::DISABLED && |
+ ShouldMeasurePerformanceForPageLoad(); |
+ ActivationState state = ActivationState(activation_level_); |
+ state.measure_performance = measure_performance_; |
+ throttle_manager_->NotifyPageActivationComputed(navigation_handle, state); |
+} |
+ |
+void ContentSubresourceFilterDriverFactory::OnFirstSubresourceLoadDisallowed() { |
+ if (ShouldSuppressNotifications()) |
+ return; |
+ |
+ client_->ToggleNotificationVisibility(activation_level_ == |
+ ActivationLevel::ENABLED); |
+} |
+ |
+bool ContentSubresourceFilterDriverFactory::ShouldSuppressActivation( |
+ content::NavigationHandle* navigation_handle) { |
+ // Never suppress subframe navigations. |
+ return navigation_handle->IsInMainFrame() && |
+ IsWhitelisted(navigation_handle->GetURL()); |
+} |
+ |
void ContentSubresourceFilterDriverFactory::ResetActivationState() { |
navigation_chain_.clear(); |
activation_list_matches_.clear(); |
@@ -237,25 +275,6 @@ void ContentSubresourceFilterDriverFactory::DidRedirectNavigation( |
navigation_chain_.push_back(navigation_handle->GetURL()); |
} |
-void ContentSubresourceFilterDriverFactory::ReadyToCommitNavigation( |
- content::NavigationHandle* navigation_handle) { |
- DCHECK(!navigation_handle->IsSameDocument()); |
- |
- // ReadyToCommitNavigation with browser-side navigation disabled is not called |
- // in production code for failed navigations (e.g. network errors). We don't |
- // want to activate on these pages, so we bail early to guarantee consistent |
- // behavior regardless of whether browser-side navigation is enabled. |
- if (navigation_handle->GetNetErrorCode() != net::OK) |
- return; |
- |
- content::RenderFrameHost* render_frame_host = |
- navigation_handle->GetRenderFrameHost(); |
- GURL url = navigation_handle->GetURL(); |
- const content::Referrer& referrer = navigation_handle->GetReferrer(); |
- ui::PageTransition transition = navigation_handle->GetPageTransition(); |
- ReadyToCommitNavigationInternal(render_frame_host, url, referrer, transition); |
-} |
- |
void ContentSubresourceFilterDriverFactory::DidFinishLoad( |
content::RenderFrameHost* render_frame_host, |
const GURL& validated_url) { |
@@ -302,8 +321,6 @@ bool ContentSubresourceFilterDriverFactory::OnMessageReceived( |
content::RenderFrameHost* render_frame_host) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(ContentSubresourceFilterDriverFactory, message) |
- IPC_MESSAGE_HANDLER(SubresourceFilterHostMsg_DidDisallowFirstSubresource, |
- OnFirstSubresourceLoadDisallowed) |
IPC_MESSAGE_HANDLER(SubresourceFilterHostMsg_DocumentLoadStatistics, |
OnDocumentLoadStatistics) |
IPC_MESSAGE_UNHANDLED(handled = false) |
@@ -311,37 +328,6 @@ bool ContentSubresourceFilterDriverFactory::OnMessageReceived( |
return handled; |
} |
-void ContentSubresourceFilterDriverFactory::ReadyToCommitNavigationInternal( |
- content::RenderFrameHost* render_frame_host, |
- const GURL& url, |
- const content::Referrer& referrer, |
- ui::PageTransition transition) { |
- if (render_frame_host->GetParent()) { |
- ActivateForFrameHostIfNeeded(render_frame_host, url); |
- return; |
- } |
- |
- RecordRedirectChainMatchPattern(); |
- |
- if (ShouldWhitelistSiteOnReload() && |
- NavigationIsPageReload(url, referrer, transition)) { |
- // Whitelist this host for the current as well as subsequent navigations. |
- AddHostOfURLToWhitelistSet(url); |
- } |
- |
- activation_decision_ = ComputeActivationDecisionForMainFrameURL(url); |
- DCHECK(activation_decision_ != ActivationDecision::UNKNOWN); |
- if (activation_decision_ != ActivationDecision::ACTIVATED) { |
- ResetActivationState(); |
- return; |
- } |
- |
- activation_level_ = GetMaximumActivationLevel(); |
- measure_performance_ = activation_level_ != ActivationLevel::DISABLED && |
- ShouldMeasurePerformanceForPageLoad(); |
- ActivateForFrameHostIfNeeded(render_frame_host, url); |
-} |
- |
bool ContentSubresourceFilterDriverFactory::DidURLMatchActivationList( |
const GURL& url, |
ActivationList activation_list) const { |