Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index 9a7edf5b7662435b67377035481f2beda4b444d5..0db8f24e912c0fabcddef7f30b37c8e696090b5a 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -2599,16 +2599,14 @@ void RenderFrameImpl::loadURLExternally(const blink::WebURLRequest& request, |
request.url(), referrer, |
suggested_name)); |
} else { |
- OpenURL(request.url(), referrer, policy, should_replace_current_entry); |
+ OpenURL(request.url(), referrer, policy, should_replace_current_entry, |
+ false); |
} |
} |
-blink::WebHistoryItem RenderFrameImpl::historyItemForNewChildFrame( |
- blink::WebFrame* frame) { |
- DCHECK(!frame_ || frame_ == frame); |
- |
- // TODO(creis): In OOPIF enabled modes, send an IPC to the browser process |
- // telling it to navigate the new frame. See https://crbug.com/502317. |
+blink::WebHistoryItem RenderFrameImpl::historyItemForNewChildFrame() { |
+ // OOPIF enabled modes will punt this navigation to the browser in |
+ // decidePolicyForNavigation. |
if (SiteIsolationPolicy::UseSubframeNavigationEntries()) |
return WebHistoryItem(); |
@@ -4509,7 +4507,7 @@ WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( |
// fixing http://crbug.com/101395. |
if (frame_->parent() == NULL) { |
OpenURL(info.urlRequest.url(), referrer, info.defaultPolicy, |
- info.replacesCurrentHistoryItem); |
+ info.replacesCurrentHistoryItem, false); |
return blink::WebNavigationPolicyIgnore; // Suppress the load here. |
} |
@@ -4532,10 +4530,22 @@ WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( |
if (is_content_initiated && IsTopLevelNavigation(frame_) && |
render_view_->renderer_preferences_ |
.browser_handles_all_top_level_requests) { |
- OpenURL(url, referrer, info.defaultPolicy, info.replacesCurrentHistoryItem); |
+ OpenURL(url, referrer, info.defaultPolicy, info.replacesCurrentHistoryItem, |
+ false); |
return blink::WebNavigationPolicyIgnore; // Suppress the load here. |
} |
+ // In OOPIF-enabled modes, back/forward navigations in newly created subframes |
+ // should be sent to the browser in case there is a matching |
+ // FrameNavigationEntry. If none is found, fall back to the default url. |
+ if (SiteIsolationPolicy::UseSubframeNavigationEntries() && |
+ info.isHistoryNavigationInNewChildFrame && is_content_initiated) { |
+ OpenURL(url, referrer, info.defaultPolicy, info.replacesCurrentHistoryItem, |
+ true); |
+ // Suppress the load in Blink but mark the frame as loading. |
+ return blink::WebNavigationPolicyHandledByClient; |
+ } |
+ |
// Use the frame's original request's URL rather than the document's URL for |
// subsequent checks. For a popup, the document's URL may become the opener |
// window's URL if the opener has called document.write(). |
@@ -4595,7 +4605,7 @@ WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( |
if (should_fork) { |
OpenURL(url, send_referrer ? referrer : Referrer(), info.defaultPolicy, |
- info.replacesCurrentHistoryItem); |
+ info.replacesCurrentHistoryItem, false); |
return blink::WebNavigationPolicyIgnore; // Suppress the load here. |
} |
} |
@@ -4635,7 +4645,7 @@ WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( |
if (is_fork) { |
// Open the URL via the browser, not via WebKit. |
OpenURL(url, Referrer(), info.defaultPolicy, |
- info.replacesCurrentHistoryItem); |
+ info.replacesCurrentHistoryItem, false); |
return blink::WebNavigationPolicyIgnore; |
} |
@@ -4695,7 +4705,8 @@ void RenderFrameImpl::OnGetSerializedHtmlWithLocalLinks( |
void RenderFrameImpl::OpenURL(const GURL& url, |
const Referrer& referrer, |
WebNavigationPolicy policy, |
- bool should_replace_current_entry) { |
+ bool should_replace_current_entry, |
+ bool is_history_navigation_in_new_child) { |
FrameHostMsg_OpenURL_Params params; |
params.url = url; |
params.referrer = referrer; |
@@ -4724,6 +4735,12 @@ void RenderFrameImpl::OpenURL(const GURL& url, |
WebUserGestureIndicator::consumeUserGesture(); |
} |
+ if (is_history_navigation_in_new_child) { |
+ DCHECK(SiteIsolationPolicy::UseSubframeNavigationEntries()); |
+ params.is_history_navigation_in_new_child = true; |
+ params.frame_unique_name = frame_->uniqueName().utf8(); |
+ } |
+ |
Send(new FrameHostMsg_OpenURL(routing_id_, params)); |
} |
@@ -4856,6 +4873,8 @@ void RenderFrameImpl::NavigateInternal( |
: blink::WebHistoryDifferentDocumentLoad; |
// Navigate the frame directly. |
+ // TODO(creis): Use InitialHistoryLoad rather than BackForward for a |
+ // history navigation in a newly created subframe. |
WebURLRequest request = |
frame_->requestFromHistoryItem(history_item, cache_policy); |
frame_->load(request, blink::WebFrameLoadType::BackForward, |