| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/renderer_host/input/render_widget_host_latency_tracker
.h" | 5 #include "content/browser/renderer_host/input/render_widget_host_latency_tracker
.h" |
| 6 #include "base/metrics/metrics_hashes.h" | 6 #include "base/metrics/metrics_hashes.h" |
| 7 #include "base/test/histogram_tester.h" | 7 #include "base/test/histogram_tester.h" |
| 8 #include "components/metrics/proto/ukm/entry.pb.h" | 8 #include "components/metrics/proto/ukm/entry.pb.h" |
| 9 #include "components/rappor/public/rappor_utils.h" | 9 #include "components/rappor/public/rappor_utils.h" |
| 10 #include "components/rappor/test_rappor_service.h" | 10 #include "components/rappor/test_rappor_service.h" |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 else | 139 else |
| 140 return ::testing::AssertionFailure() << rappor_name | 140 return ::testing::AssertionFailure() << rappor_name |
| 141 << " rappor sample should be null"; | 141 << " rappor sample should be null"; |
| 142 } | 142 } |
| 143 } | 143 } |
| 144 | 144 |
| 145 ::testing::AssertionResult AssertUkmReported(const char* event_name, | 145 ::testing::AssertionResult AssertUkmReported(const char* event_name, |
| 146 const char* metric_name) { | 146 const char* metric_name) { |
| 147 const ukm::TestUkmRecorder* ukm_recoder = | 147 const ukm::TestUkmRecorder* ukm_recoder = |
| 148 test_browser_client_.GetTestUkmRecorder(); | 148 test_browser_client_.GetTestUkmRecorder(); |
| 149 |
| 149 size_t actual_event_count = 0; | 150 size_t actual_event_count = 0; |
| 150 for (size_t i = 0; i < ukm_recoder->entries_count(); ++i) { | 151 for (size_t i = 0; i < ukm_recoder->entries_count(); ++i) { |
| 151 const ukm::mojom::UkmEntry* entry = ukm_recoder->GetEntry(i); | 152 const ukm::mojom::UkmEntry* entry = ukm_recoder->GetEntry(i); |
| 152 if (entry->event_hash != base::HashMetricName(event_name)) | 153 if (entry->event_hash != base::HashMetricName(event_name)) |
| 153 continue; | 154 continue; |
| 154 | 155 |
| 155 const ukm::UkmSource* source = | 156 const ukm::UkmSource* source = |
| 156 ukm_recoder->GetSourceForSourceId(entry->source_id); | 157 ukm_recoder->GetSourceForSourceId(entry->source_id); |
| 157 if (!source) | 158 if (!source) |
| 158 return ::testing::AssertionFailure() << "Source should not be null"; | 159 return ::testing::AssertionFailure() << "Source should not be null"; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 const int kTestRoutingId = 3; | 220 const int kTestRoutingId = 3; |
| 220 const int kTestProcessId = 1; | 221 const int kTestProcessId = 1; |
| 221 std::unique_ptr<base::HistogramTester> histogram_tester_; | 222 std::unique_ptr<base::HistogramTester> histogram_tester_; |
| 222 RenderWidgetHostLatencyTracker tracker_; | 223 RenderWidgetHostLatencyTracker tracker_; |
| 223 RenderWidgetHostLatencyTrackerTestBrowserClient test_browser_client_; | 224 RenderWidgetHostLatencyTrackerTestBrowserClient test_browser_client_; |
| 224 ContentBrowserClient* old_browser_client_; | 225 ContentBrowserClient* old_browser_client_; |
| 225 }; | 226 }; |
| 226 | 227 |
| 227 TEST_F(RenderWidgetHostLatencyTrackerTest, TestWheelToFirstScrollHistograms) { | 228 TEST_F(RenderWidgetHostLatencyTrackerTest, TestWheelToFirstScrollHistograms) { |
| 228 const GURL url(kUrl); | 229 const GURL url(kUrl); |
| 230 size_t total_ukm_entry_count = 0; |
| 229 contents()->NavigateAndCommit(url); | 231 contents()->NavigateAndCommit(url); |
| 230 for (bool rendering_on_main : {false, true}) { | 232 for (bool rendering_on_main : {false, true}) { |
| 231 ResetHistograms(); | 233 ResetHistograms(); |
| 232 { | 234 { |
| 233 auto wheel = SyntheticWebMouseWheelEventBuilder::Build( | 235 auto wheel = SyntheticWebMouseWheelEventBuilder::Build( |
| 234 blink::WebMouseWheelEvent::kPhaseChanged); | 236 blink::WebMouseWheelEvent::kPhaseChanged); |
| 235 base::TimeTicks now = base::TimeTicks::Now(); | 237 base::TimeTicks now = base::TimeTicks::Now(); |
| 236 wheel.SetTimeStampSeconds((now - base::TimeTicks()).InSecondsF()); | 238 wheel.SetTimeStampSeconds((now - base::TimeTicks()).InSecondsF()); |
| 237 ui::LatencyInfo wheel_latency(ui::SourceEventType::WHEEL); | 239 ui::LatencyInfo wheel_latency(ui::SourceEventType::WHEEL); |
| 238 wheel_latency.AddLatencyNumberWithTimestamp( | 240 wheel_latency.AddLatencyNumberWithTimestamp( |
| 239 ui::INPUT_EVENT_LATENCY_FIRST_SCROLL_UPDATE_ORIGINAL_COMPONENT, | 241 ui::INPUT_EVENT_LATENCY_FIRST_SCROLL_UPDATE_ORIGINAL_COMPONENT, |
| 240 tracker()->latency_component_id(), 0, now, 1); | 242 tracker()->latency_component_id(), 0, now, 1); |
| 241 AddFakeComponentsWithTimeStamp(*tracker(), &wheel_latency, now); | 243 AddFakeComponentsWithTimeStamp(*tracker(), &wheel_latency, now); |
| 242 AddRenderingScheduledComponent(&wheel_latency, rendering_on_main, now); | 244 AddRenderingScheduledComponent(&wheel_latency, rendering_on_main, now); |
| 243 tracker()->OnInputEvent(wheel, &wheel_latency); | 245 tracker()->OnInputEvent(wheel, &wheel_latency); |
| 244 EXPECT_TRUE(wheel_latency.FindLatency( | 246 EXPECT_TRUE(wheel_latency.FindLatency( |
| 245 ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT, | 247 ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT, |
| 246 tracker()->latency_component_id(), nullptr)); | 248 tracker()->latency_component_id(), nullptr)); |
| 247 EXPECT_TRUE(wheel_latency.FindLatency( | 249 EXPECT_TRUE(wheel_latency.FindLatency( |
| 248 ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, nullptr)); | 250 ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, nullptr)); |
| 249 tracker()->OnInputEventAck(wheel, &wheel_latency, | 251 tracker()->OnInputEventAck(wheel, &wheel_latency, |
| 250 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 252 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 251 tracker()->OnGpuSwapBuffersCompleted(wheel_latency); | 253 tracker()->OnGpuSwapBuffersCompleted(wheel_latency); |
| 252 | 254 |
| 255 // UKM metrics. |
| 256 total_ukm_entry_count++; |
| 257 EXPECT_TRUE(AssertUkmReported("Event.ScrollBegin.Wheel", |
| 258 "TimeToScrollUpdateSwapBegin")); |
| 253 // Rappor metrics. | 259 // Rappor metrics. |
| 254 EXPECT_TRUE( | 260 EXPECT_TRUE( |
| 255 RapporSampleAssert("Event.Latency.ScrollUpdate.Touch." | 261 RapporSampleAssert("Event.Latency.ScrollUpdate.Touch." |
| 256 "TimeToScrollUpdateSwapBegin2", | 262 "TimeToScrollUpdateSwapBegin2", |
| 257 0)); | 263 0)); |
| 258 EXPECT_TRUE( | 264 EXPECT_TRUE( |
| 259 RapporSampleAssert("Event.Latency.ScrollBegin.Touch." | 265 RapporSampleAssert("Event.Latency.ScrollBegin.Touch." |
| 260 "TimeToScrollUpdateSwapBegin2", | 266 "TimeToScrollUpdateSwapBegin2", |
| 261 0)); | 267 0)); |
| 262 EXPECT_TRUE( | 268 EXPECT_TRUE( |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 "Event.Latency.ScrollUpdate.Wheel.RendererSwapToBrowserNotified2", | 315 "Event.Latency.ScrollUpdate.Wheel.RendererSwapToBrowserNotified2", |
| 310 0)); | 316 0)); |
| 311 EXPECT_TRUE(HistogramSizeEq( | 317 EXPECT_TRUE(HistogramSizeEq( |
| 312 "Event.Latency.ScrollUpdate.Wheel.BrowserNotifiedToBeforeGpuSwap2", | 318 "Event.Latency.ScrollUpdate.Wheel.BrowserNotifiedToBeforeGpuSwap2", |
| 313 0)); | 319 0)); |
| 314 EXPECT_TRUE( | 320 EXPECT_TRUE( |
| 315 HistogramSizeEq("Event.Latency.ScrollUpdate.Wheel.GpuSwap2", 0)); | 321 HistogramSizeEq("Event.Latency.ScrollUpdate.Wheel.GpuSwap2", 0)); |
| 316 | 322 |
| 317 ukm::TestUkmRecorder* test_ukm_recorder = | 323 ukm::TestUkmRecorder* test_ukm_recorder = |
| 318 test_browser_client_.GetTestUkmRecorder(); | 324 test_browser_client_.GetTestUkmRecorder(); |
| 319 EXPECT_EQ(0U, test_ukm_recorder->sources_count()); | 325 EXPECT_EQ(1U, test_ukm_recorder->sources_count()); |
| 320 EXPECT_EQ(0U, test_ukm_recorder->entries_count()); | 326 EXPECT_EQ(total_ukm_entry_count, test_ukm_recorder->entries_count()); |
| 321 } | 327 } |
| 322 } | 328 } |
| 323 } | 329 } |
| 324 | 330 |
| 325 TEST_F(RenderWidgetHostLatencyTrackerTest, TestWheelToScrollHistograms) { | 331 TEST_F(RenderWidgetHostLatencyTrackerTest, TestWheelToScrollHistograms) { |
| 326 for (bool rendering_on_main : {false, true}) { | 332 for (bool rendering_on_main : {false, true}) { |
| 327 ResetHistograms(); | 333 ResetHistograms(); |
| 328 { | 334 { |
| 329 auto wheel = SyntheticWebMouseWheelEventBuilder::Build( | 335 auto wheel = SyntheticWebMouseWheelEventBuilder::Build( |
| 330 blink::WebMouseWheelEvent::kPhaseChanged); | 336 blink::WebMouseWheelEvent::kPhaseChanged); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 1)); | 397 1)); |
| 392 EXPECT_TRUE( | 398 EXPECT_TRUE( |
| 393 HistogramSizeEq("Event.Latency.ScrollUpdate.Wheel.GpuSwap2", 1)); | 399 HistogramSizeEq("Event.Latency.ScrollUpdate.Wheel.GpuSwap2", 1)); |
| 394 } | 400 } |
| 395 } | 401 } |
| 396 } | 402 } |
| 397 | 403 |
| 398 TEST_F(RenderWidgetHostLatencyTrackerTest, TestTouchToFirstScrollHistograms) { | 404 TEST_F(RenderWidgetHostLatencyTrackerTest, TestTouchToFirstScrollHistograms) { |
| 399 const GURL url(kUrl); | 405 const GURL url(kUrl); |
| 400 contents()->NavigateAndCommit(url); | 406 contents()->NavigateAndCommit(url); |
| 407 size_t total_ukm_entry_count = 0; |
| 401 for (bool rendering_on_main : {false, true}) { | 408 for (bool rendering_on_main : {false, true}) { |
| 402 ResetHistograms(); | 409 ResetHistograms(); |
| 403 { | 410 { |
| 404 auto scroll = SyntheticWebGestureEventBuilder::BuildScrollUpdate( | 411 auto scroll = SyntheticWebGestureEventBuilder::BuildScrollUpdate( |
| 405 5.f, -5.f, 0, blink::kWebGestureDeviceTouchscreen); | 412 5.f, -5.f, 0, blink::kWebGestureDeviceTouchscreen); |
| 406 base::TimeTicks now = base::TimeTicks::Now(); | 413 base::TimeTicks now = base::TimeTicks::Now(); |
| 407 scroll.SetTimeStampSeconds((now - base::TimeTicks()).InSecondsF()); | 414 scroll.SetTimeStampSeconds((now - base::TimeTicks()).InSecondsF()); |
| 408 ui::LatencyInfo scroll_latency; | 415 ui::LatencyInfo scroll_latency; |
| 409 scroll_latency.AddLatencyNumberWithTimestamp( | 416 scroll_latency.AddLatencyNumberWithTimestamp( |
| 410 ui::INPUT_EVENT_LATENCY_FIRST_SCROLL_UPDATE_ORIGINAL_COMPONENT, | 417 ui::INPUT_EVENT_LATENCY_FIRST_SCROLL_UPDATE_ORIGINAL_COMPONENT, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 436 EXPECT_TRUE(touch_latency.FindLatency( | 443 EXPECT_TRUE(touch_latency.FindLatency( |
| 437 ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT, | 444 ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT, |
| 438 tracker()->latency_component_id(), nullptr)); | 445 tracker()->latency_component_id(), nullptr)); |
| 439 EXPECT_TRUE(touch_latency.FindLatency( | 446 EXPECT_TRUE(touch_latency.FindLatency( |
| 440 ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, nullptr)); | 447 ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, nullptr)); |
| 441 tracker()->OnInputEventAck(touch, &touch_latency, | 448 tracker()->OnInputEventAck(touch, &touch_latency, |
| 442 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 449 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 443 tracker()->OnGpuSwapBuffersCompleted(touch_latency); | 450 tracker()->OnGpuSwapBuffersCompleted(touch_latency); |
| 444 } | 451 } |
| 445 | 452 |
| 453 // UKM metrics. |
| 454 total_ukm_entry_count++; |
| 455 EXPECT_TRUE(AssertUkmReported("Event.ScrollBegin.Touch", |
| 456 "TimeToScrollUpdateSwapBegin")); |
| 446 // Rappor metrics. | 457 // Rappor metrics. |
| 447 EXPECT_TRUE( | 458 EXPECT_TRUE( |
| 448 RapporSampleAssert("Event.Latency.ScrollUpdate.Touch." | 459 RapporSampleAssert("Event.Latency.ScrollUpdate.Touch." |
| 449 "TimeToScrollUpdateSwapBegin2", | 460 "TimeToScrollUpdateSwapBegin2", |
| 450 0)); | 461 0)); |
| 451 EXPECT_TRUE( | 462 EXPECT_TRUE( |
| 452 RapporSampleAssert("Event.Latency.ScrollBegin.Touch." | 463 RapporSampleAssert("Event.Latency.ScrollBegin.Touch." |
| 453 "TimeToScrollUpdateSwapBegin2", | 464 "TimeToScrollUpdateSwapBegin2", |
| 454 2)); | 465 2)); |
| 455 EXPECT_TRUE( | 466 EXPECT_TRUE( |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 "Event.Latency.ScrollUpdate.Touch.HandledToRendererSwap2_Impl", 0)); | 515 "Event.Latency.ScrollUpdate.Touch.HandledToRendererSwap2_Impl", 0)); |
| 505 EXPECT_TRUE(HistogramSizeEq( | 516 EXPECT_TRUE(HistogramSizeEq( |
| 506 "Event.Latency.ScrollUpdate.Touch.RendererSwapToBrowserNotified2", 0)); | 517 "Event.Latency.ScrollUpdate.Touch.RendererSwapToBrowserNotified2", 0)); |
| 507 EXPECT_TRUE(HistogramSizeEq( | 518 EXPECT_TRUE(HistogramSizeEq( |
| 508 "Event.Latency.ScrollUpdate.Touch.BrowserNotifiedToBeforeGpuSwap2", 0)); | 519 "Event.Latency.ScrollUpdate.Touch.BrowserNotifiedToBeforeGpuSwap2", 0)); |
| 509 EXPECT_TRUE( | 520 EXPECT_TRUE( |
| 510 HistogramSizeEq("Event.Latency.ScrollUpdate.Touch.GpuSwap2", 0)); | 521 HistogramSizeEq("Event.Latency.ScrollUpdate.Touch.GpuSwap2", 0)); |
| 511 | 522 |
| 512 ukm::TestUkmRecorder* test_ukm_recorder = | 523 ukm::TestUkmRecorder* test_ukm_recorder = |
| 513 test_browser_client_.GetTestUkmRecorder(); | 524 test_browser_client_.GetTestUkmRecorder(); |
| 514 EXPECT_EQ(0U, test_ukm_recorder->sources_count()); | 525 EXPECT_EQ(1U, test_ukm_recorder->sources_count()); |
| 515 EXPECT_EQ(0U, test_ukm_recorder->entries_count()); | 526 EXPECT_EQ(total_ukm_entry_count, test_ukm_recorder->entries_count()); |
| 516 } | 527 } |
| 517 } | 528 } |
| 518 | 529 |
| 519 TEST_F(RenderWidgetHostLatencyTrackerTest, TestTouchToScrollHistograms) { | 530 TEST_F(RenderWidgetHostLatencyTrackerTest, TestTouchToScrollHistograms) { |
| 520 const GURL url(kUrl); | 531 const GURL url(kUrl); |
| 521 contents()->NavigateAndCommit(url); | 532 contents()->NavigateAndCommit(url); |
| 522 size_t total_ukm_entry_count = 0; | 533 size_t total_ukm_entry_count = 0; |
| 523 for (bool rendering_on_main : {false, true}) { | 534 for (bool rendering_on_main : {false, true}) { |
| 524 ResetHistograms(); | 535 ResetHistograms(); |
| 525 EXPECT_EQ(0, | 536 EXPECT_EQ(0, |
| (...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1268 | 1279 |
| 1269 tracker()->OnInputEventAck(wheel_event, &latency, ack_state); | 1280 tracker()->OnInputEventAck(wheel_event, &latency, ack_state); |
| 1270 } | 1281 } |
| 1271 | 1282 |
| 1272 EXPECT_THAT(histogram_tester().GetAllSamples( | 1283 EXPECT_THAT(histogram_tester().GetAllSamples( |
| 1273 "Event.Latency.QueueingTime.MouseWheelDefaultAllowed"), | 1284 "Event.Latency.QueueingTime.MouseWheelDefaultAllowed"), |
| 1274 ElementsAre(Bucket(14, 1))); | 1285 ElementsAre(Bucket(14, 1))); |
| 1275 } | 1286 } |
| 1276 | 1287 |
| 1277 } // namespace content | 1288 } // namespace content |
| OLD | NEW |