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

Unified Diff: content/browser/frame_host/render_frame_host_impl.cc

Issue 903043002: Skip BeforeUnload on cross-site navigations when there are no handlers Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments Created 5 years, 10 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
Index: content/browser/frame_host/render_frame_host_impl.cc
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index e6cc05197d3a25613468d2938787f3f54da90757..821be812fce862c4134dec1cc90155f2b13bae1d 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -920,6 +920,9 @@ void RenderFrameHostImpl::SwapOut(
replication_state = proxy->frame_tree_node()->current_replication_state();
}
+ // TODO(clamy): if the frame has no unload handlers and |proxy| is null, it
+ // could be discarded immediately, improving performance. However that means
+ // losing the last sync of PageState.
if (IsRenderFrameLive()) {
Send(new FrameMsg_SwapOut(routing_id_, proxy_routing_id, is_loading,
replication_state));
@@ -1551,10 +1554,17 @@ void RenderFrameHostImpl::Stop() {
}
void RenderFrameHostImpl::DispatchBeforeUnload(bool for_navigation) {
- // TODO(creis): Support beforeunload on subframes. For now just pretend that
+ // Skip running beforeUnload if:
+ // - the renderer is not live.
+ // - the frame is a subframe.
+ // - this is a cross-site navigation and the current frame has no
+ // beforeUnload handler registered.
+ // TODO(creis): Support beforeUnload on subframes. For now just pretend that
// the handler ran and allowed the navigation to proceed.
- if (GetParent() || !IsRenderFrameLive()) {
- // We don't have a live renderer, so just skip running beforeunload.
+ // TODO(clamy): Skip beforeUnload when closing a frame with no registered
+ // beforeUnload handlers.
+ if (GetParent() || !IsRenderFrameLive() ||
+ (!has_beforeunload_handlers_ && for_navigation)) {
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableBrowserSideNavigation)) {
frame_tree_node_->navigator()->OnBeforeUnloadACK(

Powered by Google App Engine
This is Rietveld 408576698