Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9986)

Unified Diff: content/renderer/render_frame_impl.cc

Issue 1807893002: Remove swapped out state from RenderFrameImpl. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove stale comment. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_view_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_view_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698