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 436f4fbad1ac99df7ec45e782d7218d9f4df1774..89f04c0d20a45e8e6f1934fbe08822f463796288 100644 |
--- a/content/browser/frame_host/render_frame_host_impl.cc |
+++ b/content/browser/frame_host/render_frame_host_impl.cc |
@@ -822,15 +822,6 @@ void RenderFrameHostImpl::OnBeforeUnloadACK( |
const base::TimeTicks& renderer_before_unload_end_time) { |
TRACE_EVENT_ASYNC_END0( |
"navigation", "RenderFrameHostImpl::BeforeUnload", this); |
- // TODO(creis): Support beforeunload on subframes. For now just pretend that |
- // the handler ran and allowed the navigation to proceed. |
- if (GetParent()) { |
- is_waiting_for_beforeunload_ack_ = false; |
- frame_tree_node_->render_manager()->OnBeforeUnloadACK( |
- unload_ack_is_for_cross_site_transition_, proceed, |
- renderer_before_unload_end_time); |
- return; |
- } |
render_view_host_->decrement_in_flight_event_count(); |
render_view_host_->StopHangMonitorTimeout(); |
@@ -849,16 +840,16 @@ void RenderFrameHostImpl::OnBeforeUnloadACK( |
is_waiting_for_beforeunload_ack_ = false; |
base::TimeTicks before_unload_end_time; |
- if (!send_before_unload_start_time_.is_null() && |
carlosk
2014/10/15 12:29:04
This wasn't really working anyway.
|
- !renderer_before_unload_start_time.is_null() && |
+ if (!renderer_before_unload_start_time.is_null() && |
!renderer_before_unload_end_time.is_null()) { |
// When passing TimeTicks across process boundaries, we need to compensate |
// for any skew between the processes. Here we are converting the |
// renderer's notion of before_unload_end_time to TimeTicks in the browser |
// process. See comments in inter_process_time_ticks_converter.h for more. |
+ base::TimeTicks receive_before_unload_ack_time = base::TimeTicks::Now(); |
InterProcessTimeTicksConverter converter( |
LocalTimeTicks::FromTimeTicks(send_before_unload_start_time_), |
- LocalTimeTicks::FromTimeTicks(base::TimeTicks::Now()), |
+ LocalTimeTicks::FromTimeTicks(receive_before_unload_ack_time), |
RemoteTimeTicks::FromTimeTicks(renderer_before_unload_start_time), |
RemoteTimeTicks::FromTimeTicks(renderer_before_unload_end_time)); |
LocalTimeTicks browser_before_unload_end_time = |
@@ -883,6 +874,12 @@ void RenderFrameHostImpl::OnBeforeUnloadACK( |
"InterProcessTimeTicks.IsSkewAdditive_RendererToBrowser", |
is_skew_additive); |
+ base::TimeDelta on_before_unload_overhead_time = |
+ (receive_before_unload_ack_time - send_before_unload_start_time_) - |
+ (renderer_before_unload_end_time - renderer_before_unload_start_time); |
+ UMA_HISTOGRAM_TIMES("Navigation.OnBeforeUnloadOverheadTime", |
+ on_before_unload_overhead_time); |
+ |
frame_tree_node_->navigator()->LogBeforeUnloadTime( |
renderer_before_unload_start_time, renderer_before_unload_end_time); |
} |
@@ -1303,17 +1300,16 @@ void RenderFrameHostImpl::Stop() { |
} |
void RenderFrameHostImpl::DispatchBeforeUnload(bool for_cross_site_transition) { |
- TRACE_EVENT_ASYNC_BEGIN0( |
- "navigation", "RenderFrameHostImpl::BeforeUnload", this); |
- // TODO(creis): Support subframes. |
+ // 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. |
- is_waiting_for_beforeunload_ack_ = true; |
- unload_ack_is_for_cross_site_transition_ = for_cross_site_transition; |
- base::TimeTicks now = base::TimeTicks::Now(); |
- OnBeforeUnloadACK(true, now, now); |
+ frame_tree_node_->render_manager()->OnBeforeUnloadACK( |
+ for_cross_site_transition, true, base::TimeTicks::Now()); |
return; |
} |
+ TRACE_EVENT_ASYNC_BEGIN0( |
+ "navigation", "RenderFrameHostImpl::BeforeUnload", this); |
carlosk
2014/10/15 12:29:04
I moved this trace start down for it doesn't seem
|
// This may be called more than once (if the user clicks the tab close button |
// several times, or if she clicks the tab close button then the browser close |