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

Unified Diff: content/browser/renderer_host/render_view_host_impl.cc

Issue 88503002: Have the unload event execute in background on cross-site navigations (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Keeping the old rvh alive for up to 1s Created 7 years 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/renderer_host/render_view_host_impl.cc
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index a51fa198d876c3bb60fac511c9fd277f022276a7..8902988114763feedb1b1a9115c685fee5856dd9 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -182,6 +182,8 @@ RenderViewHostImpl::RenderViewHostImpl(
run_modal_opener_id_(MSG_ROUTING_NONE),
is_waiting_for_beforeunload_ack_(false),
is_waiting_for_unload_ack_(false),
+ should_be_preserved_on_swap_out_(false),
+ need_to_perform_clean_up_on_swapped_out_(false),
has_timed_out_on_unload_(false),
unload_ack_is_for_cross_site_transition_(false),
are_javascript_messages_suppressed_(false),
@@ -698,35 +700,60 @@ void RenderViewHostImpl::SwapOut() {
// This will be set back to false in OnSwapOutACK, just before we replace
// this RVH with the pending RVH.
is_waiting_for_unload_ack_ = true;
- // Start the hang monitor in case the renderer hangs in the unload handler.
- // Increment the in-flight event count, to ensure that input events won't
- // cancel the timeout timer.
+ // Start a timer to kill the renderer if the unload event takes too long to
+ // execute in the background.
+ // http://crbug.com/323528.
increment_in_flight_event_count();
StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS));
+ // If the RenderViewHost doesn't have a live renderer, the unload event is
+ // skipped. Otherwise, the RenderViewHost will remain alive until the unload
+ // event has finished executing in the background (or timed out).
+ bool preserve_render_view_host = false;
+ bool timed_out = true;
if (IsRenderViewLive()) {
Send(new ViewMsg_SwapOut(GetRoutingID()));
- } else {
- // This RenderViewHost doesn't have a live renderer, so just skip the unload
- // event.
- OnSwappedOut(true);
+ preserve_render_view_host = true;
+ timed_out = false;
}
+ OnSwappedOut(timed_out, preserve_render_view_host);
}
void RenderViewHostImpl::OnSwapOutACK() {
- OnSwappedOut(false);
+ OnSwappedOut(false, false);
}
-void RenderViewHostImpl::OnSwappedOut(bool timed_out) {
- // Stop the hang monitor now that the unload handler has finished.
- decrement_in_flight_event_count();
- StopHangMonitorTimeout();
- is_waiting_for_unload_ack_ = false;
- has_timed_out_on_unload_ = timed_out;
+void RenderViewHostImpl::OnSwappedOut(bool timed_out,
+ bool preserve_render_view_host) {
+
+ should_be_preserved_on_swap_out_ = preserve_render_view_host;
+ if (!preserve_render_view_host) {
+ // Stop the hang monitor now that the unload handler has finished.
+ decrement_in_flight_event_count();
+ StopHangMonitorTimeout();
+ is_waiting_for_unload_ack_ = false;
+ has_timed_out_on_unload_ = timed_out;
+ }
delegate_->SwappedOut(this);
}
void RenderViewHostImpl::WasSwappedOut() {
+ // Now that we're no longer the active RVH in the tab, start filtering out
+ // most IPC messages. Usually the renderer will have stopped sending
+ // messages as of OnSwapOutACK. However, we may have timed out waiting
+ // for that message, and additional IPC messages may keep streaming in.
+ // We filter them out, as long as that won't cause problems (e.g., we
+ // still allow synchronous messages through).
+ SetSwappedOut(true);
+
+ // The RenderView should not exit yet. It still has to execute the unload
Charlie Reis 2013/12/09 20:12:29 This doesn't make sense to me. The renderer won't
+ // event.
+ if (should_be_preserved_on_swap_out_) {
+ need_to_perform_clean_up_on_swapped_out_ = true;
+ return;
+ }
+ need_to_perform_clean_up_on_swapped_out_ = false;
pasko 2013/12/10 19:59:29 when is it the case that (should_be_preserved_on_s
+
// Don't bother reporting hung state anymore.
StopHangMonitorTimeout();
@@ -736,14 +763,6 @@ void RenderViewHostImpl::WasSwappedOut() {
// unresponsive renderer timeout will catch it.
bool hung = has_timed_out_on_unload_;
- // Now that we're no longer the active RVH in the tab, start filtering out
- // most IPC messages. Usually the renderer will have stopped sending
- // messages as of OnSwapOutACK. However, we may have timed out waiting
- // for that message, and additional IPC messages may keep streaming in.
- // We filter them out, as long as that won't cause problems (e.g., we
- // still allow synchronous messages through).
- SetSwappedOut(true);
-
// If we are not running the renderer in process and no other tab is using
// the hung process, consider it eligible to be killed, assuming it is a real
// process (unit tests don't have real processes).

Powered by Google App Engine
This is Rietveld 408576698