Index: components/subresource_filter/content/browser/subframe_navigation_filtering_throttle.cc |
diff --git a/components/subresource_filter/content/browser/subframe_navigation_filtering_throttle.cc b/components/subresource_filter/content/browser/subframe_navigation_filtering_throttle.cc |
index ebb562e5278a6f19584c350ea235efd6285956b8..8254f538d793d7a2c1192d86112381fe1cfb87bc 100644 |
--- a/components/subresource_filter/content/browser/subframe_navigation_filtering_throttle.cc |
+++ b/components/subresource_filter/content/browser/subframe_navigation_filtering_throttle.cc |
@@ -9,6 +9,7 @@ |
#include "base/metrics/histogram_macros.h" |
#include "components/subresource_filter/core/common/time_measurements.h" |
#include "content/public/browser/navigation_handle.h" |
+#include "content/public/common/browser_side_navigation_policy.h" |
namespace subresource_filter { |
@@ -38,12 +39,12 @@ SubframeNavigationFilteringThrottle::~SubframeNavigationFilteringThrottle() { |
content::NavigationThrottle::ThrottleCheckResult |
SubframeNavigationFilteringThrottle::WillStartRequest() { |
- return DeferToCalculateLoadPolicy(); |
+ return DeferToCalculateLoadPolicy(ThrottlingStage::WillStartRequest); |
} |
content::NavigationThrottle::ThrottleCheckResult |
SubframeNavigationFilteringThrottle::WillRedirectRequest() { |
- return DeferToCalculateLoadPolicy(); |
+ return DeferToCalculateLoadPolicy(ThrottlingStage::WillRedirectRequest); |
} |
const char* SubframeNavigationFilteringThrottle::GetNameForLogging() { |
@@ -51,26 +52,34 @@ const char* SubframeNavigationFilteringThrottle::GetNameForLogging() { |
} |
content::NavigationThrottle::ThrottleCheckResult |
-SubframeNavigationFilteringThrottle::DeferToCalculateLoadPolicy() { |
+SubframeNavigationFilteringThrottle::DeferToCalculateLoadPolicy( |
+ ThrottlingStage stage) { |
parent_frame_filter_->GetLoadPolicyForSubdocument( |
navigation_handle()->GetURL(), |
base::Bind(&SubframeNavigationFilteringThrottle::OnCalculatedLoadPolicy, |
- weak_ptr_factory_.GetWeakPtr())); |
+ weak_ptr_factory_.GetWeakPtr(), stage)); |
last_defer_timestamp_ = base::TimeTicks::Now(); |
return content::NavigationThrottle::ThrottleCheckResult::DEFER; |
} |
void SubframeNavigationFilteringThrottle::OnCalculatedLoadPolicy( |
+ ThrottlingStage stage, |
LoadPolicy policy) { |
DCHECK(!last_defer_timestamp_.is_null()); |
total_defer_time_ += base::TimeTicks::Now() - last_defer_timestamp_; |
// TODO(csharrison): Support WouldDisallow pattern and expose the policy for |
- // metrics. Also, cancel with BLOCK_AND_COLLAPSE when it is implemented. |
+ // metrics. |
if (policy == LoadPolicy::DISALLOW) { |
disallowed_ = true; |
parent_frame_filter_->ReportDisallowedLoad(); |
+ |
+ const bool block_and_collapse_is_supported = |
+ content::IsBrowserSideNavigationEnabled() || |
+ stage == ThrottlingStage::WillStartRequest; |
navigation_handle()->CancelDeferredNavigation( |
- content::NavigationThrottle::CANCEL); |
+ block_and_collapse_is_supported |
+ ? content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE |
+ : content::NavigationThrottle::CANCEL); |
} else { |
navigation_handle()->Resume(); |
} |