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 020b42f8bf4d5e85601f6447fe5b3c873804a383..c3e65b4e49fd54ea8356f1cfe1b3435c79d2f7b8 100644 |
--- a/components/subresource_filter/content/browser/subframe_navigation_filtering_throttle.cc |
+++ b/components/subresource_filter/content/browser/subframe_navigation_filtering_throttle.cc |
@@ -7,6 +7,7 @@ |
#include "base/bind.h" |
#include "base/logging.h" |
#include "content/public/browser/navigation_handle.h" |
+#include "content/public/common/browser_side_navigation_policy.h" |
namespace subresource_filter { |
@@ -24,12 +25,12 @@ SubframeNavigationFilteringThrottle::~SubframeNavigationFilteringThrottle() {} |
content::NavigationThrottle::ThrottleCheckResult |
SubframeNavigationFilteringThrottle::WillStartRequest() { |
- return DeferToCalculateLoadPolicy(); |
+ return DeferToCalculateLoadPolicy(false /* is_redirect */); |
} |
content::NavigationThrottle::ThrottleCheckResult |
SubframeNavigationFilteringThrottle::WillRedirectRequest() { |
- return DeferToCalculateLoadPolicy(); |
+ return DeferToCalculateLoadPolicy(true /* is_redirect */); |
} |
const char* SubframeNavigationFilteringThrottle::GetNameForLogging() { |
@@ -37,22 +38,29 @@ const char* SubframeNavigationFilteringThrottle::GetNameForLogging() { |
} |
content::NavigationThrottle::ThrottleCheckResult |
-SubframeNavigationFilteringThrottle::DeferToCalculateLoadPolicy() { |
+SubframeNavigationFilteringThrottle::DeferToCalculateLoadPolicy( |
+ bool is_redirect) { |
parent_frame_filter_->GetLoadPolicyForSubdocument( |
navigation_handle()->GetURL(), |
base::Bind(&SubframeNavigationFilteringThrottle::OnCalculatedLoadPolicy, |
- weak_ptr_factory_.GetWeakPtr())); |
+ weak_ptr_factory_.GetWeakPtr(), is_redirect)); |
return content::NavigationThrottle::ThrottleCheckResult::DEFER; |
} |
void SubframeNavigationFilteringThrottle::OnCalculatedLoadPolicy( |
+ bool was_deferring_redirect, |
LoadPolicy policy) { |
// 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) { |
parent_frame_filter_->ReportDisallowedLoad(); |
+ |
+ const bool block_and_collapse_is_supported = |
+ content::IsBrowserSideNavigationEnabled() || !was_deferring_redirect; |
navigation_handle()->CancelDeferredNavigation( |
- content::NavigationThrottle::CANCEL); |
+ block_and_collapse_is_supported |
+ ? content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE |
+ : content::NavigationThrottle::CANCEL); |
} else { |
navigation_handle()->Resume(); |
} |