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