Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index db3193f26adcf690a6f252fba7e0a16914608a2d..0b1cc388f4d8d0148bca94066522b9ed2b06c13a 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -3439,6 +3439,27 @@ void RenderFrameImpl::didStartProvisionalLoad( |
TRACE_EVENT2("navigation,benchmark,rail", |
"RenderFrameImpl::didStartProvisionalLoad", "id", routing_id_, |
"url", data_source->getRequest().url().string().utf8()); |
+ |
+ // PlzNavigate: |
+ // If we have pending navigation to be sent to the browser, do it here. |
+ if (pending_navigation_info_.get()) { |
+ DCHECK(IsBrowserSideNavigationEnabled()); |
+ NavigationPolicyInfo info(data_source->getRequestWritable()); |
+ info.navigationType = pending_navigation_info_->navigation_type; |
+ info.defaultPolicy = pending_navigation_info_->policy; |
+ info.replacesCurrentHistoryItem = |
+ pending_navigation_info_->replaces_current_history_item; |
+ info.isHistoryNavigationInNewChildFrame = |
+ pending_navigation_info_->history_navigation_in_new_child_frame; |
+ info.isClientRedirect = pending_navigation_info_->client_redirect; |
+ info.isCacheDisabled = pending_navigation_info_->cache_disabled; |
+ info.form = pending_navigation_info_->form; |
+ |
+ pending_navigation_info_.reset(nullptr); |
+ |
+ BeginNavigation(info); |
+ } |
+ |
DocumentState* document_state = DocumentState::FromDataSource(data_source); |
NavigationStateImpl* navigation_state = static_cast<NavigationStateImpl*>( |
document_state->navigation_state()); |
@@ -5469,7 +5490,9 @@ WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( |
info.urlRequest.checkForBrowserSideNavigation() && |
ShouldMakeNetworkRequestForURL(url)) { |
if (info.defaultPolicy == blink::WebNavigationPolicyCurrentTab) { |
- BeginNavigation(info); |
+ // The BeginNavigation() call happens in didStartProvisionalLoad(). We |
+ // need to save information about the navigation here. |
+ pending_navigation_info_.reset(new PendingNavigationInfo(info)); |
return blink::WebNavigationPolicyHandledByClient; |
} else { |
LoadURLExternally(info.urlRequest, info.defaultPolicy); |