Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index 361093328fa14c5bef4a6bdd64d30120784e44be..15df435d5671f3f1cf8873cef03cd8172129ad12 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -3423,8 +3423,8 @@ void RenderFrameImpl::didCreateDataSource(blink::WebLocalFrame* frame, |
content_initiated)); |
} |
-void RenderFrameImpl::didStartProvisionalLoad( |
- blink::WebDataSource* data_source) { |
+void RenderFrameImpl::didStartProvisionalLoad(blink::WebDataSource* data_source, |
+ blink::WebURLRequest& request) { |
// In fast/loader/stop-provisional-loads.html, we abort the load before this |
// callback is invoked. |
if (!data_source) |
@@ -3433,6 +3433,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 a pending navigation to be sent to the browser send it here. |
+ if (pending_navigation_info_.get()) { |
+ DCHECK(IsBrowserSideNavigationEnabled()); |
+ NavigationPolicyInfo info(request); |
+ 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()); |
@@ -5477,7 +5498,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); |
@@ -5855,6 +5878,11 @@ void RenderFrameImpl::NavigateInternal( |
std::unique_ptr<StreamOverrideParameters> stream_params) { |
bool browser_side_navigation = IsBrowserSideNavigationEnabled(); |
+ // PlzNavigate |
+ // Clear pending navigations which weren't sent to the browser because we |
+ // did not get a didStartProvisionalLoad() notification for them. |
+ pending_navigation_info_.reset(nullptr); |
+ |
// Lower bound for browser initiated navigation start time. |
base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); |
bool is_reload = |