| 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(
|
|
|