OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/frame_host/render_frame_host_impl.h" | 5 #include "content/browser/frame_host/render_frame_host_impl.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 1293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1304 if (!is_waiting_for_beforeunload_ack_) { | 1304 if (!is_waiting_for_beforeunload_ack_) { |
1305 return; | 1305 return; |
1306 } | 1306 } |
1307 DCHECK(!send_before_unload_start_time_.is_null()); | 1307 DCHECK(!send_before_unload_start_time_.is_null()); |
1308 | 1308 |
1309 // Sets a default value for before_unload_end_time so that the browser | 1309 // Sets a default value for before_unload_end_time so that the browser |
1310 // survives a hacked renderer. | 1310 // survives a hacked renderer. |
1311 base::TimeTicks before_unload_end_time = renderer_before_unload_end_time; | 1311 base::TimeTicks before_unload_end_time = renderer_before_unload_end_time; |
1312 if (!renderer_before_unload_start_time.is_null() && | 1312 if (!renderer_before_unload_start_time.is_null() && |
1313 !renderer_before_unload_end_time.is_null()) { | 1313 !renderer_before_unload_end_time.is_null()) { |
1314 // When passing TimeTicks across process boundaries, we need to compensate | |
1315 // for any skew between the processes. Here we are converting the | |
1316 // renderer's notion of before_unload_end_time to TimeTicks in the browser | |
1317 // process. See comments in inter_process_time_ticks_converter.h for more. | |
1318 base::TimeTicks receive_before_unload_ack_time = base::TimeTicks::Now(); | 1314 base::TimeTicks receive_before_unload_ack_time = base::TimeTicks::Now(); |
1319 InterProcessTimeTicksConverter converter( | |
1320 LocalTimeTicks::FromTimeTicks(send_before_unload_start_time_), | |
1321 LocalTimeTicks::FromTimeTicks(receive_before_unload_ack_time), | |
1322 RemoteTimeTicks::FromTimeTicks(renderer_before_unload_start_time), | |
1323 RemoteTimeTicks::FromTimeTicks(renderer_before_unload_end_time)); | |
1324 LocalTimeTicks browser_before_unload_end_time = | |
1325 converter.ToLocalTimeTicks( | |
1326 RemoteTimeTicks::FromTimeTicks(renderer_before_unload_end_time)); | |
1327 before_unload_end_time = browser_before_unload_end_time.ToTimeTicks(); | |
1328 | 1315 |
1329 // Collect UMA on the inter-process skew. | 1316 if (!base::TimeTicks::IsConsistentAcrossProcesses()) { |
1330 bool is_skew_additive = false; | 1317 // TimeTicks is not consistent across processes and we are passing |
1331 if (converter.IsSkewAdditiveForMetrics()) { | 1318 // TimeTicks across process boundaries so we need to compensate for any |
1332 is_skew_additive = true; | 1319 // skew between the processes. Here we are converting the renderer's |
1333 base::TimeDelta skew = converter.GetSkewForMetrics(); | 1320 // notion of before_unload_end_time to TimeTicks in the browser process. |
1334 if (skew >= base::TimeDelta()) { | 1321 // See comments in inter_process_time_ticks_converter.h for more. |
1335 UMA_HISTOGRAM_TIMES( | 1322 InterProcessTimeTicksConverter converter( |
1336 "InterProcessTimeTicks.BrowserBehind_RendererToBrowser", skew); | 1323 LocalTimeTicks::FromTimeTicks(send_before_unload_start_time_), |
1337 } else { | 1324 LocalTimeTicks::FromTimeTicks(receive_before_unload_ack_time), |
1338 UMA_HISTOGRAM_TIMES( | 1325 RemoteTimeTicks::FromTimeTicks(renderer_before_unload_start_time), |
1339 "InterProcessTimeTicks.BrowserAhead_RendererToBrowser", -skew); | 1326 RemoteTimeTicks::FromTimeTicks(renderer_before_unload_end_time)); |
| 1327 LocalTimeTicks browser_before_unload_end_time = |
| 1328 converter.ToLocalTimeTicks( |
| 1329 RemoteTimeTicks::FromTimeTicks(renderer_before_unload_end_time)); |
| 1330 before_unload_end_time = browser_before_unload_end_time.ToTimeTicks(); |
| 1331 |
| 1332 // Collect UMA on the inter-process skew. |
| 1333 bool is_skew_additive = false; |
| 1334 if (converter.IsSkewAdditiveForMetrics()) { |
| 1335 is_skew_additive = true; |
| 1336 base::TimeDelta skew = converter.GetSkewForMetrics(); |
| 1337 if (skew >= base::TimeDelta()) { |
| 1338 UMA_HISTOGRAM_TIMES( |
| 1339 "InterProcessTimeTicks.BrowserBehind_RendererToBrowser", skew); |
| 1340 } else { |
| 1341 UMA_HISTOGRAM_TIMES( |
| 1342 "InterProcessTimeTicks.BrowserAhead_RendererToBrowser", -skew); |
| 1343 } |
1340 } | 1344 } |
| 1345 UMA_HISTOGRAM_BOOLEAN( |
| 1346 "InterProcessTimeTicks.IsSkewAdditive_RendererToBrowser", |
| 1347 is_skew_additive); |
1341 } | 1348 } |
1342 UMA_HISTOGRAM_BOOLEAN( | |
1343 "InterProcessTimeTicks.IsSkewAdditive_RendererToBrowser", | |
1344 is_skew_additive); | |
1345 | 1349 |
1346 base::TimeDelta on_before_unload_overhead_time = | 1350 base::TimeDelta on_before_unload_overhead_time = |
1347 (receive_before_unload_ack_time - send_before_unload_start_time_) - | 1351 (receive_before_unload_ack_time - send_before_unload_start_time_) - |
1348 (renderer_before_unload_end_time - renderer_before_unload_start_time); | 1352 (renderer_before_unload_end_time - renderer_before_unload_start_time); |
1349 UMA_HISTOGRAM_TIMES("Navigation.OnBeforeUnloadOverheadTime", | 1353 UMA_HISTOGRAM_TIMES("Navigation.OnBeforeUnloadOverheadTime", |
1350 on_before_unload_overhead_time); | 1354 on_before_unload_overhead_time); |
1351 | 1355 |
1352 frame_tree_node_->navigator()->LogBeforeUnloadTime( | 1356 frame_tree_node_->navigator()->LogBeforeUnloadTime( |
1353 renderer_before_unload_start_time, renderer_before_unload_end_time); | 1357 renderer_before_unload_start_time, renderer_before_unload_end_time); |
1354 } | 1358 } |
(...skipping 1551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2906 // handler after it's destroyed so it can't run after the RFHI is destroyed. | 2910 // handler after it's destroyed so it can't run after the RFHI is destroyed. |
2907 web_bluetooth_service_->SetClientConnectionErrorHandler(base::Bind( | 2911 web_bluetooth_service_->SetClientConnectionErrorHandler(base::Bind( |
2908 &RenderFrameHostImpl::DeleteWebBluetoothService, base::Unretained(this))); | 2912 &RenderFrameHostImpl::DeleteWebBluetoothService, base::Unretained(this))); |
2909 } | 2913 } |
2910 | 2914 |
2911 void RenderFrameHostImpl::DeleteWebBluetoothService() { | 2915 void RenderFrameHostImpl::DeleteWebBluetoothService() { |
2912 web_bluetooth_service_.reset(); | 2916 web_bluetooth_service_.reset(); |
2913 } | 2917 } |
2914 | 2918 |
2915 } // namespace content | 2919 } // namespace content |
OLD | NEW |