| Index: content/renderer/render_frame_impl.cc
|
| diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
|
| index b0ae249653b175721a37a1d5fb2e4f05d457dbad..d4515cef911fdea3e0edbb65145292751e7ca869 100644
|
| --- a/content/renderer/render_frame_impl.cc
|
| +++ b/content/renderer/render_frame_impl.cc
|
| @@ -100,7 +100,7 @@
|
| #include "content/renderer/effective_connection_type_helper.h"
|
| #include "content/renderer/external_popup_menu.h"
|
| #include "content/renderer/gpu/gpu_benchmarking_extension.h"
|
| -#include "content/renderer/history_controller.h"
|
| +#include "content/renderer/history_entry.h"
|
| #include "content/renderer/history_serialization.h"
|
| #include "content/renderer/image_downloader/image_downloader_impl.h"
|
| #include "content/renderer/ime_event_guard.h"
|
| @@ -1689,10 +1689,7 @@ void RenderFrameImpl::OnSwapOut(
|
| // other active RenderFrames in it.
|
|
|
| // Send an UpdateState message before we get deleted.
|
| - if (SiteIsolationPolicy::UseSubframeNavigationEntries())
|
| - SendUpdateState();
|
| - else
|
| - render_view_->SendUpdateState();
|
| + SendUpdateState();
|
|
|
| // There should always be a proxy to replace this RenderFrame. Create it now
|
| // so its routing id is registered for receiving IPC messages.
|
| @@ -3097,8 +3094,7 @@ void RenderFrameImpl::frameDetached(blink::WebLocalFrame* frame,
|
| observer.FrameDetached(frame);
|
|
|
| // Send a state update before the frame is detached.
|
| - if (SiteIsolationPolicy::UseSubframeNavigationEntries())
|
| - SendUpdateState();
|
| + SendUpdateState();
|
|
|
| // We only notify the browser process when the frame is being detached for
|
| // removal and it was initiated from the renderer process.
|
| @@ -3301,12 +3297,9 @@ void RenderFrameImpl::loadURLExternally(const blink::WebURLRequest& request,
|
| }
|
|
|
| blink::WebHistoryItem RenderFrameImpl::historyItemForNewChildFrame() {
|
| - // OOPIF enabled modes will punt this navigation to the browser in
|
| - // decidePolicyForNavigation.
|
| - if (SiteIsolationPolicy::UseSubframeNavigationEntries())
|
| - return WebHistoryItem();
|
| -
|
| - return render_view_->history_controller()->GetItemForNewChildFrame(this);
|
| + // We will punt this navigation to the browser in decidePolicyForNavigation.
|
| + // TODO(creis): Look into cleaning this up.
|
| + return WebHistoryItem();
|
| }
|
|
|
| void RenderFrameImpl::willSendSubmitEvent(const blink::WebFormElement& form) {
|
| @@ -3476,11 +3469,8 @@ void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad(
|
| blink::WebLocalFrame* frame) {
|
| DCHECK_EQ(frame_, frame);
|
|
|
| - // We don't use HistoryController in OOPIF enabled modes.
|
| - if (SiteIsolationPolicy::UseSubframeNavigationEntries())
|
| - return;
|
| -
|
| - render_view_->history_controller()->RemoveChildrenForRedirect(this);
|
| + // TODO(creis): Determine if this can be removed or if we need to clear any
|
| + // local state here to fix https://crbug.com/671276.
|
| }
|
|
|
| void RenderFrameImpl::didFailProvisionalLoad(
|
| @@ -3619,13 +3609,8 @@ 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 current history item.
|
| - if (SiteIsolationPolicy::UseSubframeNavigationEntries()) {
|
| - SendUpdateState();
|
| - } else {
|
| - render_view_->SendUpdateState();
|
| - render_view_->history_controller()->UpdateForCommit(
|
| - this, item, commit_type, navigation_state->WasWithinSamePage());
|
| - }
|
| + SendUpdateState();
|
| +
|
| // Update the current history item for this frame (both in default Chrome and
|
| // subframe FrameNavigationEntry modes).
|
| current_history_item_ = item;
|
| @@ -4884,31 +4869,14 @@ void RenderFrameImpl::SendDidCommitProvisionalLoad(
|
| render_view_->navigation_gesture_ = NavigationGestureUnknown;
|
|
|
| // Make navigation state a part of the DidCommitProvisionalLoad message so
|
| - // that committed entry has it at all times.
|
| - int64_t post_id = -1;
|
| - if (!SiteIsolationPolicy::UseSubframeNavigationEntries()) {
|
| - HistoryEntry* entry = render_view_->history_controller()->GetCurrentEntry();
|
| - if (entry) {
|
| - params.page_state = HistoryEntryToPageState(entry);
|
| - 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);
|
| - }
|
| + // that committed entry has it at all times. 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);
|
|
|
| - // When using subframe navigation entries, method and post id are set for all
|
| - // frames. Otherwise, they are only set for the main frame navigation.
|
| - if (SiteIsolationPolicy::UseSubframeNavigationEntries()) {
|
| - params.method = request.httpMethod().latin1();
|
| - if (params.method == "POST")
|
| - params.post_id = post_id;
|
| - }
|
| + params.method = request.httpMethod().latin1();
|
| + if (params.method == "POST")
|
| + params.post_id = ExtractPostId(item);
|
|
|
| params.frame_unique_name = item.target().utf8();
|
| params.item_sequence_number = item.itemSequenceNumber();
|
| @@ -4982,14 +4950,6 @@ void RenderFrameImpl::SendDidCommitProvisionalLoad(
|
| params.transition | ui::PAGE_TRANSITION_CLIENT_REDIRECT);
|
| }
|
|
|
| - // When using subframe navigation entries, method and post id have already
|
| - // been set.
|
| - if (!SiteIsolationPolicy::UseSubframeNavigationEntries()) {
|
| - params.method = request.httpMethod().latin1();
|
| - if (params.method == "POST")
|
| - params.post_id = post_id;
|
| - }
|
| -
|
| // Send the user agent override back.
|
| params.is_overriding_user_agent = internal_data->is_overriding_user_agent();
|
|
|
| @@ -5298,15 +5258,13 @@ WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation(
|
| return blink::WebNavigationPolicyIgnore; // Suppress the load here.
|
| }
|
|
|
| - // In OOPIF-enabled modes, back/forward navigations in newly created subframes
|
| - // should be sent to the browser if there is a matching FrameNavigationEntry,
|
| - // and if it isn't just staying at about:blank. If this frame isn't in the
|
| - // map of unique names that have history items, or if it's staying at the
|
| - // initial about:blank URL, fall back to loading the default url. (We remove
|
| - // each name as we encounter it, because it will only be used once as the
|
| - // frame is created.)
|
| - if (SiteIsolationPolicy::UseSubframeNavigationEntries() &&
|
| - info.isHistoryNavigationInNewChildFrame && is_content_initiated &&
|
| + // Back/forward navigations in newly created subframes should be sent to the
|
| + // browser if there is a matching FrameNavigationEntry, and if it isn't just
|
| + // staying at about:blank. If this frame isn't in the map of unique names
|
| + // that have history items, or if it's staying at the initial about:blank URL,
|
| + // fall back to loading the default url. (We remove each name as we encounter
|
| + // it, because it will only be used once as the frame is created.)
|
| + if (info.isHistoryNavigationInNewChildFrame && is_content_initiated &&
|
| frame_->parent()) {
|
| // Check whether the browser has a history item for this frame that isn't
|
| // just staying at the initial about:blank document.
|
| @@ -5826,10 +5784,8 @@ void RenderFrameImpl::OpenURL(
|
| WebUserGestureIndicator::consumeUserGesture();
|
| }
|
|
|
| - if (is_history_navigation_in_new_child) {
|
| - DCHECK(SiteIsolationPolicy::UseSubframeNavigationEntries());
|
| + if (is_history_navigation_in_new_child)
|
| params.is_history_navigation_in_new_child = true;
|
| - }
|
|
|
| Send(new FrameHostMsg_OpenURL(routing_id_, params));
|
| }
|
| @@ -5858,11 +5814,7 @@ void RenderFrameImpl::NavigateInternal(
|
| if (request_params.has_committed_real_load && frame_->parent())
|
| frame_->setCommittedFirstRealLoad();
|
|
|
| - bool no_current_entry =
|
| - SiteIsolationPolicy::UseSubframeNavigationEntries()
|
| - ? current_history_item_.isNull()
|
| - : !render_view_->history_controller()->GetCurrentEntry();
|
| - if (is_reload && no_current_entry) {
|
| + if (is_reload && current_history_item_.isNull()) {
|
| // We cannot reload if we do not have any history state. This happens, for
|
| // example, when recovering from a crash.
|
| is_reload = false;
|
| @@ -5944,78 +5896,62 @@ void RenderFrameImpl::NavigateInternal(
|
| std::unique_ptr<HistoryEntry> entry =
|
| PageStateToHistoryEntry(request_params.page_state);
|
| if (entry) {
|
| - if (!SiteIsolationPolicy::UseSubframeNavigationEntries()) {
|
| - // By default, tell the HistoryController to go the deserialized
|
| - // HistoryEntry. This only works if all frames are in the same
|
| - // process.
|
| - DCHECK(!frame_->parent());
|
| - DCHECK(!browser_side_navigation);
|
| - std::unique_ptr<NavigationParams> navigation_params(
|
| - new NavigationParams(*pending_navigation_params_.get()));
|
| - has_history_navigation_in_frame =
|
| - render_view_->history_controller()->GoToEntry(
|
| - frame_, std::move(entry), std::move(navigation_params),
|
| - cache_policy);
|
| - } else {
|
| - // In --site-per-process, the browser process sends a single
|
| - // WebHistoryItem destined for this frame.
|
| - // TODO(creis): Change PageState to FrameState. In the meantime, we
|
| - // store the relevant frame's WebHistoryItem in the root of the
|
| - // PageState.
|
| - item_for_history_navigation = entry->root();
|
| - history_load_type = request_params.is_same_document_history_load
|
| - ? blink::WebHistorySameDocumentLoad
|
| - : blink::WebHistoryDifferentDocumentLoad;
|
| - load_type = request_params.is_history_navigation_in_new_child
|
| - ? blink::WebFrameLoadType::InitialHistoryLoad
|
| - : blink::WebFrameLoadType::BackForward;
|
| - should_load_request = true;
|
| -
|
| - // Keep track of which subframes the browser process has history items
|
| - // for during a history navigation.
|
| - history_subframe_unique_names_ = request_params.subframe_unique_names;
|
| -
|
| - if (history_load_type == blink::WebHistorySameDocumentLoad) {
|
| - // If this is marked as a same document load but we haven't committed
|
| - // anything, treat it as a new load. The browser shouldn't let this
|
| - // happen.
|
| - if (current_history_item_.isNull()) {
|
| + // The browser process sends a single WebHistoryItem for this frame.
|
| + // TODO(creis): Change PageState to FrameState. In the meantime, we
|
| + // store the relevant frame's WebHistoryItem in the root of the
|
| + // PageState.
|
| + item_for_history_navigation = entry->root();
|
| + history_load_type = request_params.is_same_document_history_load
|
| + ? blink::WebHistorySameDocumentLoad
|
| + : blink::WebHistoryDifferentDocumentLoad;
|
| + load_type = request_params.is_history_navigation_in_new_child
|
| + ? blink::WebFrameLoadType::InitialHistoryLoad
|
| + : blink::WebFrameLoadType::BackForward;
|
| + should_load_request = true;
|
| +
|
| + // Keep track of which subframes the browser process has history items
|
| + // for during a history navigation.
|
| + history_subframe_unique_names_ = request_params.subframe_unique_names;
|
| +
|
| + if (history_load_type == blink::WebHistorySameDocumentLoad) {
|
| + // If this is marked as a same document load but we haven't committed
|
| + // anything, treat it as a new load. The browser shouldn't let this
|
| + // happen.
|
| + if (current_history_item_.isNull()) {
|
| + history_load_type = blink::WebHistoryDifferentDocumentLoad;
|
| + NOTREACHED();
|
| + } else {
|
| + // Additionally, if the |current_history_item_|'s document
|
| + // sequence number doesn't match the one sent from the browser, it
|
| + // is possible that this renderer has committed a different
|
| + // document. In such case, don't use WebHistorySameDocumentLoad.
|
| + if (current_history_item_.documentSequenceNumber() !=
|
| + item_for_history_navigation.documentSequenceNumber()) {
|
| history_load_type = blink::WebHistoryDifferentDocumentLoad;
|
| - NOTREACHED();
|
| - } else {
|
| - // Additionally, if the |current_history_item_|'s document
|
| - // sequence number doesn't match the one sent from the browser, it
|
| - // is possible that this renderer has committed a different
|
| - // document. In such case, don't use WebHistorySameDocumentLoad.
|
| - if (current_history_item_.documentSequenceNumber() !=
|
| - item_for_history_navigation.documentSequenceNumber()) {
|
| - history_load_type = blink::WebHistoryDifferentDocumentLoad;
|
| - }
|
| }
|
| }
|
| + }
|
|
|
| - // If this navigation is to a history item for a new child frame, we may
|
| - // want to ignore it in some cases. If a Javascript navigation (i.e.,
|
| - // client redirect) interrupted it and has either been scheduled,
|
| - // started loading, or has committed, we should ignore the history item.
|
| - bool interrupted_by_client_redirect =
|
| - frame_->isNavigationScheduledWithin(0) ||
|
| - frame_->provisionalDataSource() ||
|
| - !current_history_item_.isNull();
|
| - if (request_params.is_history_navigation_in_new_child &&
|
| - interrupted_by_client_redirect) {
|
| - should_load_request = false;
|
| - has_history_navigation_in_frame = false;
|
| - }
|
| + // If this navigation is to a history item for a new child frame, we may
|
| + // want to ignore it in some cases. If a Javascript navigation (i.e.,
|
| + // client redirect) interrupted it and has either been scheduled,
|
| + // started loading, or has committed, we should ignore the history item.
|
| + bool interrupted_by_client_redirect =
|
| + frame_->isNavigationScheduledWithin(0) ||
|
| + frame_->provisionalDataSource() || !current_history_item_.isNull();
|
| + if (request_params.is_history_navigation_in_new_child &&
|
| + interrupted_by_client_redirect) {
|
| + should_load_request = false;
|
| + has_history_navigation_in_frame = false;
|
| + }
|
|
|
| - // Generate the request for the load from the HistoryItem.
|
| - // PlzNavigate: use the data sent by the browser for the url and the
|
| - // HTTP state. The restoration of user state such as scroll position
|
| - // will be done based on the history item during the load.
|
| - if (!browser_side_navigation && should_load_request) {
|
| - request = frame_->requestFromHistoryItem(item_for_history_navigation,
|
| - cache_policy);
|
| - }
|
| + // Generate the request for the load from the HistoryItem.
|
| + // PlzNavigate: use the data sent by the browser for the url and the
|
| + // HTTP state. The restoration of user state such as scroll position
|
| + // will be done based on the history item during the load.
|
| + if (!browser_side_navigation && should_load_request) {
|
| + request = frame_->requestFromHistoryItem(item_for_history_navigation,
|
| + cache_policy);
|
| }
|
| }
|
| } else {
|
| @@ -6076,7 +6012,7 @@ void RenderFrameImpl::NavigateInternal(
|
| // that the load stopped if needed.
|
| // Note: in the case of history navigations, |should_load_request| will be
|
| // false, and the frame may not have been set in a loading state. Do not
|
| - // send a stop message if the HistoryController is loading in this frame
|
| + // send a stop message if a history navigation is loading in this frame
|
| // nonetheless. This behavior will go away with subframe navigation
|
| // entries.
|
| if (frame_ && !frame_->isLoading() && !has_history_navigation_in_frame)
|
| @@ -6354,7 +6290,6 @@ void RenderFrameImpl::LoadDataURL(
|
| }
|
|
|
| void RenderFrameImpl::SendUpdateState() {
|
| - DCHECK(SiteIsolationPolicy::UseSubframeNavigationEntries());
|
| if (current_history_item_.isNull())
|
| return;
|
|
|
|
|