Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index bc07602933782d2a09a2eb9430ac17d2deee2a52..83e7b054a535b02b441956413da6ebf6bf8ce910 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -978,7 +978,6 @@ RenderFrameImpl::RenderFrameImpl(const CreateParams& params) |
in_frame_tree_(false), |
render_view_(params.render_view->AsWeakPtr()), |
routing_id_(params.routing_id), |
- is_swapped_out_(false), |
render_frame_proxy_(NULL), |
is_detaching_(false), |
proxy_routing_id_(MSG_ROUTING_NONE), |
@@ -1097,7 +1096,7 @@ void RenderFrameImpl::Initialize() { |
#endif |
new SharedWorkerRepository(this); |
- if (IsLocalRoot() && !is_swapped_out_) { |
+ if (IsLocalRoot()) { |
// DevToolsAgent is a RenderFrameObserver, and will destruct itself |
// when |this| is deleted. |
devtools_agent_ = new DevToolsAgent(this); |
@@ -1312,12 +1311,6 @@ bool RenderFrameImpl::Send(IPC::Message* message) { |
delete message; |
return false; |
} |
- if (is_swapped_out_) { |
- if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) { |
- delete message; |
- return false; |
- } |
- } |
return RenderThread::Get()->Send(message); |
} |
@@ -1471,19 +1464,6 @@ void RenderFrameImpl::OnNavigate( |
scoped_ptr<StreamOverrideParameters>()); |
} |
-void RenderFrameImpl::NavigateToSwappedOutURL() { |
- // We use loadRequest instead of loadHTMLString because the former commits |
- // synchronously. Otherwise a new navigation can interrupt the navigation |
- // to kSwappedOutURL. If that happens to be to the page we had been |
- // showing, then WebKit will never send a commit and we'll be left spinning. |
- // Set the is_swapped_out_ bit to true, so IPC filtering is in effect and |
- // the navigation to swappedout:// is not announced to the browser side. |
- is_swapped_out_ = true; |
- GURL swappedOutURL(kSwappedOutURL); |
- WebURLRequest request(swappedOutURL); |
- frame_->loadRequest(request); |
-} |
- |
void RenderFrameImpl::BindServiceRegistry( |
mojo::shell::mojom::InterfaceProviderRequest services, |
mojo::shell::mojom::InterfaceProviderPtr exposed_services) { |
@@ -1526,55 +1506,51 @@ void RenderFrameImpl::OnSwapOut( |
// This codepath should only be hit for subframes when in --site-per-process. |
CHECK(is_main_frame_ || SiteIsolationPolicy::AreCrossProcessFramesPossible()); |
- // Only run unload if we're not swapped out yet, but send the ack either way. |
- if (!is_swapped_out_) { |
- // Swap this RenderFrame out so the frame can navigate to a page rendered by |
- // a different process. This involves running the unload handler and |
- // clearing the page. We also allow this process to exit if there are no |
- // other active RenderFrames in it. |
+ // Swap this RenderFrame out so the frame can navigate to a page rendered by |
+ // a different process. This involves running the unload handler and |
+ // clearing the page. We also allow this process to exit if there are no |
+ // other active RenderFrames in it. |
- // Send an UpdateState message before we get swapped out. |
- if (SiteIsolationPolicy::UseSubframeNavigationEntries()) |
- SendUpdateState(); |
- else |
- render_view_->SendUpdateState(); |
+ // Send an UpdateState message before we get deleted. |
+ 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. |
- if (proxy_routing_id != MSG_ROUTING_NONE) { |
- proxy = RenderFrameProxy::CreateProxyToReplaceFrame( |
- this, proxy_routing_id, replicated_frame_state.scope); |
- } |
+ // If we need a proxy to replace this, create it now so its routing id is |
+ // registered for receiving IPC messages. |
+ if (proxy_routing_id != MSG_ROUTING_NONE) { |
+ proxy = RenderFrameProxy::CreateProxyToReplaceFrame( |
+ this, proxy_routing_id, replicated_frame_state.scope); |
+ } |
- // Synchronously run the unload handler before sending the ACK. |
- // TODO(creis): Call dispatchUnloadEvent unconditionally here to support |
- // unload on subframes as well. |
- if (is_main_frame_) |
- frame_->dispatchUnloadEvent(); |
- |
- // Swap out and stop sending any IPC messages that are not ACKs. |
- if (is_main_frame_) |
- render_view_->SetSwappedOut(true); |
- is_swapped_out_ = true; |
- |
- // Set the proxy here, since OnStop() below could cause an onload event |
- // handler to execute, which could trigger code such as |
- // willCheckAndDispatchMessageEvent() that needs the proxy. |
- if (proxy) |
- set_render_frame_proxy(proxy); |
- |
- // Transfer settings such as initial drawing parameters to the remote frame, |
- // if one is created, that will replace this frame. |
- if (!is_main_frame_ && proxy) |
- proxy->web_frame()->initializeFromFrame(frame_); |
- |
- // Let WebKit know that this view is hidden so it can drop resources and |
- // stop compositing. |
- // TODO(creis): Support this for subframes as well. |
- if (is_main_frame_) { |
- render_view_->webview()->setVisibilityState( |
- blink::WebPageVisibilityStateHidden, false); |
- } |
+ // Synchronously run the unload handler before sending the ACK. |
+ // TODO(creis): Call dispatchUnloadEvent unconditionally here to support |
+ // unload on subframes as well. |
+ if (is_main_frame_) |
+ frame_->dispatchUnloadEvent(); |
+ |
+ // Swap out and stop sending any IPC messages that are not ACKs. |
+ if (is_main_frame_) |
+ render_view_->SetSwappedOut(true); |
+ |
+ // Set the proxy here, since OnStop() below could cause an onload event |
+ // handler to execute, which could trigger code such as |
+ // willCheckAndDispatchMessageEvent() that needs the proxy. |
+ if (proxy) |
+ set_render_frame_proxy(proxy); |
+ |
+ // Transfer settings such as initial drawing parameters to the remote frame, |
+ // if one is created, that will replace this frame. |
+ if (!is_main_frame_ && proxy) |
+ proxy->web_frame()->initializeFromFrame(frame_); |
+ |
+ // Let WebKit know that this view is hidden so it can drop resources and |
+ // stop compositing. |
+ // TODO(creis): Support this for subframes as well. |
+ if (is_main_frame_) { |
+ render_view_->webview()->setVisibilityState( |
+ blink::WebPageVisibilityStateHidden, false); |
} |
// It is now safe to show modal dialogs again. |
@@ -2600,8 +2576,7 @@ blink::WebFrame* RenderFrameImpl::createChildFrame( |
Send(new FrameHostMsg_CreateChildFrame(params, &child_routing_id)); |
// Allocation of routing id failed, so we can't create a child frame. This can |
- // happen if this RenderFrameImpl's IPCs are being filtered when in swapped |
- // out state or synchronous IPC message above has failed. |
+ // happen if the synchronous IPC message above has failed. |
if (child_routing_id == MSG_ROUTING_NONE) { |
NOTREACHED() << "Failed to allocate routing id for child frame."; |
return nullptr; |
@@ -2631,10 +2606,6 @@ blink::WebFrame* RenderFrameImpl::createChildFrame( |
} |
void RenderFrameImpl::didChangeOpener(blink::WebFrame* opener) { |
- // Only active frames are able to disown their opener. |
- if (!opener && is_swapped_out_) |
- return; |
- |
// Only a local frame should be able to update another frame's opener. |
DCHECK(!opener || opener->isWebLocalFrame()); |
@@ -2987,9 +2958,8 @@ void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame, |
"url", ds->request().url().string().utf8()); |
DocumentState* document_state = DocumentState::FromDataSource(ds); |
- // We should only navigate to swappedout:// when is_swapped_out_ is true. |
- CHECK(ds->request().url() != GURL(kSwappedOutURL) || is_swapped_out_) |
- << "Heard swappedout:// when not swapped out."; |
+ // We should never navigate to swappedout://. |
+ CHECK(ds->request().url() != GURL(kSwappedOutURL)) << "Heard swappedout://."; |
// Update the request time if WebKit has better knowledge of it. |
if (document_state->request_time().is_null() && |
@@ -3459,10 +3429,6 @@ void RenderFrameImpl::didFinishLoad(blink::WebLocalFrame* frame) { |
DidFinishLoad(frame)); |
FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidFinishLoad()); |
- // Don't send this message while the frame is swapped out. |
- if (is_swapped_out()) |
- return; |
- |
Send(new FrameHostMsg_DidFinishLoad(routing_id_, |
ds->request().url())); |
} |
@@ -3580,12 +3546,6 @@ bool RenderFrameImpl::runModalPromptDialog( |
} |
bool RenderFrameImpl::runModalBeforeUnloadDialog(bool is_reload) { |
- // If we are swapping out, we have already run the beforeunload handler. |
- // TODO(creis): Fix OnSwapOut to clear the frame without running beforeunload |
- // at all, to avoid running it twice. |
- if (is_swapped_out_) |
- return true; |
- |
// Don't allow further dialogs if we are waiting to swap out, since the |
// PageGroupLoadDeferrer in our stack prevents it. |
if (render_view()->suppress_dialogs_until_swap_out_) |
@@ -4093,19 +4053,9 @@ bool RenderFrameImpl::willCheckAndDispatchMessageEvent( |
blink::WebDOMMessageEvent event) { |
DCHECK(!frame_ || frame_ == target_frame); |
- // Currently, a postMessage that targets a cross-process frame can be plumbed |
- // either through this function or RenderFrameProxy::postMessageEvent. This |
- // function is used when the target cross-process frame is a top-level frame |
- // which has been swapped out. In that case, the corresponding WebLocalFrame |
- // currently remains in the frame tree even in site-per-process mode (see |
- // OnSwapOut). RenderFrameProxy::postMessageEvent is used in |
- // --site-per-process mode for all other cases. |
- // |
// TODO(alexmos, nasko): When swapped-out:// disappears, this should be |
// cleaned up so that RenderFrameProxy::postMessageEvent is the only path for |
// cross-process postMessages. |
- if (!is_swapped_out_) |
- return false; |
// It is possible to get here on a swapped-out frame without a |
// |render_frame_proxy_|. This happens when: |
@@ -4411,13 +4361,10 @@ void RenderFrameImpl::SendDidCommitProvisionalLoad( |
// RenderFrameProxies in other processes. |
// TODO(alexmos): Origins for URLs with non-standard schemes are excluded due |
// to https://crbug.com/439608 and will be replicated as unique origins. |
- if (!is_swapped_out_) { |
- std::string scheme = |
- frame->document().getSecurityOrigin().protocol().utf8(); |
- if (url::IsStandard(scheme.c_str(), |
- url::Component(0, static_cast<int>(scheme.length())))) { |
- params.origin = frame->document().getSecurityOrigin(); |
- } |
+ std::string scheme = frame->document().getSecurityOrigin().protocol().utf8(); |
+ if (url::IsStandard(scheme.c_str(), |
+ url::Component(0, static_cast<int>(scheme.length())))) { |
+ params.origin = frame->document().getSecurityOrigin(); |
} |
params.should_enforce_strict_mixed_content_checking = |
@@ -4429,8 +4376,6 @@ void RenderFrameImpl::SendDidCommitProvisionalLoad( |
// Set the URL to be displayed in the browser UI to the user. |
params.url = GetLoadingUrl(); |
- DCHECK(!is_swapped_out_ || params.url == GURL(kSwappedOutURL)); |
- |
if (frame->document().baseURL() != params.url) |
params.base_url = frame->document().baseURL(); |
@@ -4552,12 +4497,6 @@ void RenderFrameImpl::SendDidCommitProvisionalLoad( |
frame->dataSource()->request().inputPerfMetricReportPolicy()); |
params.ui_timestamp = base::TimeTicks() + base::TimeDelta::FromSecondsD( |
frame->dataSource()->request().uiStartTime()); |
- |
- // This message needs to be sent before any of allowScripts(), |
- // allowImages(), allowPlugins() is called for the new page, so that when |
- // these functions send a ViewHostMsg_ContentBlocked message, it arrives |
- // after the FrameHostMsg_DidCommitProvisionalLoad message. |
- Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params)); |
} else { |
// Subframe navigation: the type depends on whether this navigation |
// generated a new session history entry. When they do generate a session |
@@ -4571,12 +4510,14 @@ void RenderFrameImpl::SendDidCommitProvisionalLoad( |
DCHECK(!navigation_state->request_params().should_clear_history_list); |
params.history_list_was_cleared = false; |
params.report_type = FrameMsg_UILoadMetricsReportType::NO_REPORT; |
- |
- // Don't send this message while the subframe is swapped out. |
- if (!is_swapped_out()) |
- Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params)); |
} |
+ // This message needs to be sent before any of allowScripts(), |
+ // allowImages(), allowPlugins() is called for the new page, so that when |
+ // these functions send a ViewHostMsg_ContentBlocked message, it arrives |
+ // after the FrameHostMsg_DidCommitProvisionalLoad message. |
+ Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params)); |
+ |
// If we end up reusing this WebRequest (for example, due to a #ref click), |
// we don't want the transition type to persist. Just clear it. |
navigation_state->set_transition_type(ui::PAGE_TRANSITION_LINK); |
@@ -4728,31 +4669,6 @@ WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( |
Referrer referrer( |
RenderViewImpl::GetReferrerFromRequest(frame_, info.urlRequest)); |
- // TODO(nick): Is consulting |is_main_frame| here correct? |
- if (is_main_frame_ && is_swapped_out_) { |
- if (info.urlRequest.url() != GURL(kSwappedOutURL)) { |
- // Targeted links may try to navigate a swapped out frame. Allow the |
- // browser process to navigate the tab instead. Note that it is also |
- // possible for non-targeted navigations (from this view) to arrive |
- // here just after we are swapped out. It's ok to send them to the |
- // browser, as long as they're for the top level frame. |
- // TODO(creis): Ensure this supports targeted form submissions when |
- // fixing http://crbug.com/101395. |
- if (frame_->parent() == NULL) { |
- OpenURL(info.urlRequest.url(), referrer, info.defaultPolicy, |
- info.replacesCurrentHistoryItem, false); |
- return blink::WebNavigationPolicyIgnore; // Suppress the load here. |
- } |
- |
- // We should otherwise ignore in-process iframe navigations, if they |
- // arrive just after we are swapped out. |
- return blink::WebNavigationPolicyIgnore; |
- } |
- |
- // Allow kSwappedOutURL to complete. |
- return info.defaultPolicy; |
- } |
- |
// Webkit is asking whether to navigate to a new URL. |
// This is fine normally, except if we're showing UI from one security |
// context and they're trying to navigate to a different context. |
@@ -5620,31 +5536,6 @@ void RenderFrameImpl::PrepareRenderViewForNavigation( |
CHECK_EQ(-1, render_view_->history_list_offset_); |
CHECK_EQ(0, render_view_->history_list_length_); |
} |
- |
- if (!is_swapped_out_ || frame_->parent()) |
- return; |
- |
- // This is a swapped out main frame, so swap the renderer back in. |
- // We marked the view as hidden when swapping the view out, so be sure to |
- // reset the visibility state before navigating to the new URL. |
- render_view_->webview()->setVisibilityState( |
- render_view_->visibilityState(), false); |
- |
- // If this is an attempt to reload while we are swapped out, we should not |
- // reload swappedout://, but the previous page, which is stored in |
- // params.state. Setting is_reload to false will treat this like a back |
- // navigation to accomplish that. |
- *is_reload = false; |
- *cache_policy = WebURLRequest::ReloadIgnoringCacheData; |
- |
- // We refresh timezone when a view is swapped in since timezone |
- // can get out of sync when the system timezone is updated while |
- // the view is swapped out. |
- RenderThreadImpl::NotifyTimezoneChange(); |
- |
- render_view_->SetSwappedOut(false); |
- is_swapped_out_ = false; |
- return; |
} |
void RenderFrameImpl::BeginNavigation(blink::WebURLRequest* request, |