Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index c000e4b1588c415812b3d801c4360ca1d0074e85..3f680a6c000c5940d022046d48c60e60f21fcf57 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -271,11 +271,7 @@ static base::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map = |
typedef std::map<blink::WebFrame*, RenderFrameImpl*> FrameMap; |
base::LazyInstance<FrameMap> g_frame_map = LAZY_INSTANCE_INITIALIZER; |
-int64 ExtractPostId(HistoryEntry* entry) { |
- if (!entry) |
- return -1; |
- |
- const WebHistoryItem& item = entry->root(); |
+int64 ExtractPostId(const WebHistoryItem& item) { |
if (item.isNull() || item.httpBody().isNull()) |
return -1; |
@@ -1277,7 +1273,10 @@ void RenderFrameImpl::OnSwapOut( |
// other active RenderFrames in it. |
// Send an UpdateState message before we get swapped out. |
- render_view_->SendUpdateState(); |
+ if (SiteIsolationPolicy::UseSubframeNavigationEntries()) |
+ SendUpdateState(); |
+ else |
+ render_view_->SendUpdateState(); |
// If we need a proxy to replace this, create it now so its routing id is |
// registered for receiving IPC messages. |
@@ -2539,6 +2538,12 @@ void RenderFrameImpl::loadURLExternally(const blink::WebURLRequest& request, |
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. |
+ if (SiteIsolationPolicy::UseSubframeNavigationEntries()) |
+ return WebHistoryItem(); |
+ |
return render_view_->history_controller()->GetItemForNewChildFrame(this); |
} |
@@ -2739,6 +2744,11 @@ void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame, |
void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad( |
blink::WebLocalFrame* frame) { |
DCHECK(!frame_ || frame_ == frame); |
+ |
+ // We don't use HistoryController in OOPIF enabled modes. |
+ if (SiteIsolationPolicy::UseSubframeNavigationEntries()) |
+ return; |
+ |
render_view_->history_controller()->RemoveChildrenForRedirect(this); |
} |
@@ -2841,11 +2851,15 @@ void RenderFrameImpl::didCommitProvisionalLoad( |
// When we perform a new navigation, we need to update the last committed |
// session history entry with state for the page we are leaving. Do this |
- // before updating the HistoryController state. |
- render_view_->SendUpdateState(); |
- |
- render_view_->history_controller()->UpdateForCommit( |
- this, item, commit_type, navigation_state->WasWithinSamePage()); |
+ // before updating the current history item. |
+ if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { |
+ SendUpdateState(); |
+ current_history_item_ = item; |
+ } else { |
+ render_view_->SendUpdateState(); |
+ render_view_->history_controller()->UpdateForCommit( |
+ this, item, commit_type, navigation_state->WasWithinSamePage()); |
+ } |
InternalDocumentStateData* internal_data = |
InternalDocumentStateData::FromDocumentState(document_state); |
@@ -4136,17 +4150,21 @@ void RenderFrameImpl::SendDidCommitProvisionalLoad( |
// Make navigation state a part of the DidCommitProvisionalLoad message so |
// that committed entry has it at all times. |
- HistoryEntry* entry = render_view_->history_controller()->GetCurrentEntry(); |
+ int64 post_id = -1; |
if (!SiteIsolationPolicy::UseSubframeNavigationEntries()) { |
- if (entry) |
+ HistoryEntry* entry = render_view_->history_controller()->GetCurrentEntry(); |
+ if (entry) { |
params.page_state = HistoryEntryToPageState(entry); |
- else |
+ post_id = ExtractPostId(entry->root()); |
+ } else { |
params.page_state = PageState::CreateFromURL(request.url()); |
+ } |
} else { |
// In --site-per-process, just send a single HistoryItem for this frame, |
// rather than the whole tree. It will be stored in the corresponding |
// FrameNavigationEntry. |
params.page_state = SingleHistoryItemToPageState(item); |
+ post_id = ExtractPostId(item); |
} |
params.item_sequence_number = item.itemSequenceNumber(); |
params.document_sequence_number = item.documentSequenceNumber(); |
@@ -4217,7 +4235,7 @@ void RenderFrameImpl::SendDidCommitProvisionalLoad( |
base::string16 method = request.httpMethod(); |
if (base::EqualsASCII(method, "POST")) { |
params.is_post = true; |
- params.post_id = ExtractPostId(entry); |
+ params.post_id = post_id; |
} |
// Send the user agent override back. |
@@ -4662,7 +4680,11 @@ void RenderFrameImpl::NavigateInternal( |
if (request_params.has_committed_real_load && frame_->parent()) |
frame_->setCommittedFirstRealLoad(); |
- if (is_reload && !render_view_->history_controller()->GetCurrentEntry()) { |
+ bool no_current_entry = |
+ SiteIsolationPolicy::UseSubframeNavigationEntries() |
+ ? current_history_item_.isNull() |
+ : !render_view_->history_controller()->GetCurrentEntry(); |
+ if (is_reload && no_current_entry) { |
// We cannot reload if we do not have any history state. This happens, for |
// example, when recovering from a crash. |
is_reload = false; |
@@ -4743,13 +4765,7 @@ void RenderFrameImpl::NavigateInternal( |
? blink::WebHistorySameDocumentLoad |
: blink::WebHistoryDifferentDocumentLoad; |
- // Let the history controller know the provisional entry, since it is |
- // used at commit time. Otherwise skip GoToEntry and navigate the |
- // frame directly. |
- // TODO(creis): Consider cloning the current entry to handle subframe |
- // cases. Changes to SendUpdateState might affect this. |
- render_view_->history_controller()->set_provisional_entry( |
- entry.Pass()); |
+ // Navigate the frame directly. |
WebURLRequest request = |
frame_->requestFromHistoryItem(history_item, cache_policy); |
frame_->load(request, blink::WebFrameLoadType::BackForward, |
@@ -5075,6 +5091,15 @@ void RenderFrameImpl::LoadDataURL(const CommonNavigationParams& params, |
} |
} |
+void RenderFrameImpl::SendUpdateState() { |
+ DCHECK(SiteIsolationPolicy::UseSubframeNavigationEntries()); |
+ if (current_history_item_.isNull()) |
+ return; |
+ |
+ Send(new FrameHostMsg_UpdateState( |
+ routing_id_, SingleHistoryItemToPageState(current_history_item_))); |
+} |
+ |
void RenderFrameImpl::SendFailedProvisionalLoad( |
const blink::WebURLRequest& request, |
const blink::WebURLError& error, |