| Index: content/browser/frame_host/navigation_handle_impl.cc
|
| diff --git a/content/browser/frame_host/navigation_handle_impl.cc b/content/browser/frame_host/navigation_handle_impl.cc
|
| index 37f1c0c581746f799c9578ace7b1a76f98236dcb..8f2adbbdba6ee8ad25c09f11885b105ee9244d25 100644
|
| --- a/content/browser/frame_host/navigation_handle_impl.cc
|
| +++ b/content/browser/frame_host/navigation_handle_impl.cc
|
| @@ -371,7 +371,15 @@ void NavigationHandleImpl::CancelDeferredNavigation(
|
| state_ == DEFERRING_REDIRECT ||
|
| state_ == DEFERRING_RESPONSE);
|
| DCHECK(result == NavigationThrottle::CANCEL_AND_IGNORE ||
|
| - result == NavigationThrottle::CANCEL);
|
| + result == NavigationThrottle::CANCEL ||
|
| + result == NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE);
|
| + DCHECK(result != NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE ||
|
| + state_ == DEFERRING_START ||
|
| + (state_ == DEFERRING_REDIRECT && IsBrowserSideNavigationEnabled()));
|
| +
|
| + if (result == NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE)
|
| + frame_tree_node_->SetCollapsed(true);
|
| +
|
| TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
|
| "CancelDeferredNavigation");
|
| state_ = CANCELING;
|
| @@ -723,6 +731,17 @@ void NavigationHandleImpl::DidCommitNavigation(
|
| TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
|
| "DidCommitNavigation");
|
| state_ = DID_COMMIT;
|
| +
|
| + // Getting this far means that the navigation was not blocked, and neither
|
| + // is this the error page navigation following a blocked navigation. Ensure
|
| + // the frame owner element is no longer collapsed as a result of a prior
|
| + // navigation having been blocked with BLOCK_REQUEST_AND_COLLAPSE.
|
| + if (!frame_tree_node()->IsMainFrame()) {
|
| + // Collapsed frames show an error page with |kUnreachableWebDataURL|, so a
|
| + // same-document navigation should not be possible.
|
| + DCHECK(!is_same_page_ || !frame_tree_node()->is_collapsed());
|
| + frame_tree_node()->SetCollapsed(false);
|
| + }
|
| }
|
| }
|
|
|
| @@ -755,6 +774,8 @@ NavigationHandleImpl::CheckWillStartRequest() {
|
| case NavigationThrottle::PROCEED:
|
| continue;
|
|
|
| + case NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE:
|
| + frame_tree_node_->SetCollapsed(true); // Fall through.
|
| case NavigationThrottle::BLOCK_REQUEST:
|
| case NavigationThrottle::CANCEL:
|
| case NavigationThrottle::CANCEL_AND_IGNORE:
|
| @@ -793,9 +814,12 @@ NavigationHandleImpl::CheckWillRedirectRequest() {
|
| case NavigationThrottle::PROCEED:
|
| continue;
|
|
|
| + case NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE:
|
| + frame_tree_node_->SetCollapsed(true); // Fall through.
|
| case NavigationThrottle::BLOCK_REQUEST:
|
| CHECK(IsBrowserSideNavigationEnabled())
|
| - << "BLOCK_REQUEST must not be used on redirect without PlzNavigate";
|
| + << "BLOCK_REQUEST and BLOCK_REQUEST_AND_COLLAPSE must not be used "
|
| + "on redirect without PlzNavigate";
|
| case NavigationThrottle::CANCEL:
|
| case NavigationThrottle::CANCEL_AND_IGNORE:
|
| state_ = CANCELING;
|
| @@ -849,6 +873,7 @@ NavigationHandleImpl::CheckWillProcessResponse() {
|
| return result;
|
|
|
| case NavigationThrottle::BLOCK_REQUEST:
|
| + case NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE:
|
| NOTREACHED();
|
| }
|
| }
|
|
|