OLD | NEW |
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 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 "components/page_load_metrics/browser/metrics_web_contents_observer.h" | 5 #include "components/page_load_metrics/browser/metrics_web_contents_observer.h" |
6 | 6 |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "base/process/kill.h" | 8 #include "base/process/kill.h" |
9 #include "base/test/histogram_tester.h" | 9 #include "base/test/histogram_tester.h" |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
(...skipping 22 matching lines...) Expand all Loading... |
33 | 33 |
34 const char kBGHistogramNameFirstLayout[] = | 34 const char kBGHistogramNameFirstLayout[] = |
35 "PageLoad.Timing2.NavigationToFirstLayout.BG"; | 35 "PageLoad.Timing2.NavigationToFirstLayout.BG"; |
36 const char kBGHistogramNameFirstTextPaint[] = | 36 const char kBGHistogramNameFirstTextPaint[] = |
37 "PageLoad.Timing2.NavigationToFirstTextPaint.BG"; | 37 "PageLoad.Timing2.NavigationToFirstTextPaint.BG"; |
38 const char kBGHistogramNameDomContent[] = | 38 const char kBGHistogramNameDomContent[] = |
39 "PageLoad.Timing2.NavigationToDOMContentLoadedEventFired.BG"; | 39 "PageLoad.Timing2.NavigationToDOMContentLoadedEventFired.BG"; |
40 const char kBGHistogramNameLoad[] = | 40 const char kBGHistogramNameLoad[] = |
41 "PageLoad.Timing2.NavigationToLoadEventFired.BG"; | 41 "PageLoad.Timing2.NavigationToLoadEventFired.BG"; |
42 | 42 |
43 const char kHistogramNameEvents[] = "PageLoad.EventCounts"; | 43 const char kProvisionalEvents[] = "PageLoad.Events.Provisional"; |
| 44 const char kCommittedEvents[] = "PageLoad.Events.Committed"; |
| 45 const char kBGProvisionalEvents[] = "PageLoad.Events.Provisional.BG"; |
| 46 const char kBGCommittedEvents[] = "PageLoad.Events.Committed.BG"; |
44 | 47 |
45 } // namespace | 48 } // namespace |
46 | 49 |
47 class MetricsWebContentsObserverTest | 50 class MetricsWebContentsObserverTest |
48 : public content::RenderViewHostTestHarness { | 51 : public content::RenderViewHostTestHarness { |
49 public: | 52 public: |
50 MetricsWebContentsObserverTest() {} | 53 MetricsWebContentsObserverTest() {} |
51 | 54 |
52 void SetUp() override { | 55 void SetUp() override { |
53 RenderViewHostTestHarness::SetUp(); | 56 RenderViewHostTestHarness::SetUp(); |
54 observer_ = make_scoped_ptr(new MetricsWebContentsObserver(web_contents())); | 57 observer_ = make_scoped_ptr(new MetricsWebContentsObserver(web_contents())); |
55 observer_->WasShown(); | 58 observer_->WasShown(); |
| 59 num_provisional_events_ = 0; |
| 60 num_committed_events_ = 0; |
| 61 num_provisional_events_bg_ = 0; |
| 62 num_committed_events_bg_ = 0; |
56 } | 63 } |
57 | 64 |
58 void AssertNoHistogramsLogged() { | 65 void AssertNoHistogramsLogged() { |
59 histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 0); | 66 histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 0); |
60 histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0); | 67 histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0); |
61 histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 0); | 68 histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 0); |
62 histogram_tester_.ExpectTotalCount(kHistogramNameFirstTextPaint, 0); | 69 histogram_tester_.ExpectTotalCount(kHistogramNameFirstTextPaint, 0); |
63 } | 70 } |
64 | 71 |
| 72 void CheckProvisionalEvent(ProvisionalLoadEvent event, |
| 73 int count, |
| 74 bool background) { |
| 75 if (background) { |
| 76 histogram_tester_.ExpectBucketCount(kBGProvisionalEvents, event, count); |
| 77 num_provisional_events_bg_ += count; |
| 78 } else { |
| 79 histogram_tester_.ExpectBucketCount(kProvisionalEvents, event, count); |
| 80 num_provisional_events_ += count; |
| 81 } |
| 82 } |
| 83 |
| 84 void CheckCommittedEvent(CommittedLoadEvent event, |
| 85 int count, |
| 86 bool background) { |
| 87 if (background) { |
| 88 histogram_tester_.ExpectBucketCount(kBGCommittedEvents, event, count); |
| 89 num_committed_events_bg_ += count; |
| 90 } else { |
| 91 histogram_tester_.ExpectBucketCount(kCommittedEvents, event, count); |
| 92 num_committed_events_ += count; |
| 93 } |
| 94 } |
| 95 |
| 96 void CheckTotalEvents() { |
| 97 histogram_tester_.ExpectTotalCount(kProvisionalEvents, |
| 98 num_provisional_events_); |
| 99 histogram_tester_.ExpectTotalCount(kCommittedEvents, num_committed_events_); |
| 100 histogram_tester_.ExpectTotalCount(kBGProvisionalEvents, |
| 101 num_provisional_events_bg_); |
| 102 histogram_tester_.ExpectTotalCount(kBGCommittedEvents, |
| 103 num_committed_events_bg_); |
| 104 } |
| 105 |
65 protected: | 106 protected: |
66 base::HistogramTester histogram_tester_; | 107 base::HistogramTester histogram_tester_; |
67 scoped_ptr<MetricsWebContentsObserver> observer_; | 108 scoped_ptr<MetricsWebContentsObserver> observer_; |
| 109 |
| 110 private: |
| 111 int num_provisional_events_; |
| 112 int num_provisional_events_bg_; |
| 113 int num_committed_events_; |
| 114 int num_committed_events_bg_; |
68 }; | 115 }; |
69 | 116 |
70 TEST_F(MetricsWebContentsObserverTest, NoMetrics) { | 117 TEST_F(MetricsWebContentsObserverTest, NoMetrics) { |
71 AssertNoHistogramsLogged(); | 118 AssertNoHistogramsLogged(); |
72 } | 119 } |
73 | 120 |
74 TEST_F(MetricsWebContentsObserverTest, NotInMainFrame) { | 121 TEST_F(MetricsWebContentsObserverTest, NotInMainFrame) { |
75 base::TimeDelta first_layout = base::TimeDelta::FromMilliseconds(1); | 122 base::TimeDelta first_layout = base::TimeDelta::FromMilliseconds(1); |
76 | 123 |
77 PageLoadTiming timing; | 124 PageLoadTiming timing; |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
364 content::WebContentsTester* web_contents_tester = | 411 content::WebContentsTester* web_contents_tester = |
365 content::WebContentsTester::For(web_contents()); | 412 content::WebContentsTester::For(web_contents()); |
366 | 413 |
367 web_contents_tester->StartNavigation(GURL(kDefaultTestUrl)); | 414 web_contents_tester->StartNavigation(GURL(kDefaultTestUrl)); |
368 content::RenderFrameHostTester* rfh_tester = | 415 content::RenderFrameHostTester* rfh_tester = |
369 content::RenderFrameHostTester::For(main_rfh()); | 416 content::RenderFrameHostTester::For(main_rfh()); |
370 rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), | 417 rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), |
371 net::ERR_TIMED_OUT); | 418 net::ERR_TIMED_OUT); |
372 rfh_tester->SimulateNavigationStop(); | 419 rfh_tester->SimulateNavigationStop(); |
373 | 420 |
374 histogram_tester_.ExpectTotalCount(kHistogramNameEvents, 3); | 421 CheckProvisionalEvent(PROVISIONAL_LOAD_FAILED_NON_ABORT, 1, false); |
375 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 422 CheckProvisionalEvent(PROVISIONAL_LOAD_ABORTED, 0, false); |
376 PAGE_LOAD_STARTED, 1); | 423 CheckTotalEvents(); |
377 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | |
378 PAGE_LOAD_FAILED_BEFORE_COMMIT, 1); | |
379 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | |
380 PAGE_LOAD_ABORTED_BEFORE_FIRST_LAYOUT, 1); | |
381 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | |
382 PAGE_LOAD_ABORTED_BEFORE_COMMIT, 0); | |
383 } | 424 } |
384 | 425 |
385 TEST_F(MetricsWebContentsObserverTest, AbortProvisionalLoad) { | 426 TEST_F(MetricsWebContentsObserverTest, AbortProvisionalLoad) { |
386 content::WebContentsTester* web_contents_tester = | 427 content::WebContentsTester* web_contents_tester = |
387 content::WebContentsTester::For(web_contents()); | 428 content::WebContentsTester::For(web_contents()); |
388 | 429 |
389 web_contents_tester->StartNavigation(GURL(kDefaultTestUrl)); | 430 web_contents_tester->StartNavigation(GURL(kDefaultTestUrl)); |
390 content::RenderFrameHostTester* rfh_tester = | 431 content::RenderFrameHostTester* rfh_tester = |
391 content::RenderFrameHostTester::For(main_rfh()); | 432 content::RenderFrameHostTester::For(main_rfh()); |
392 rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), net::ERR_ABORTED); | 433 rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), net::ERR_ABORTED); |
393 rfh_tester->SimulateNavigationStop(); | 434 rfh_tester->SimulateNavigationStop(); |
394 | 435 |
395 histogram_tester_.ExpectTotalCount(kHistogramNameEvents, 4); | 436 CheckProvisionalEvent(PROVISIONAL_LOAD_FAILED_NON_ABORT, 0, false); |
396 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 437 CheckProvisionalEvent(PROVISIONAL_LOAD_ABORTED, 1, false); |
397 PAGE_LOAD_STARTED, 1); | 438 CheckTotalEvents(); |
398 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 439 } |
399 PAGE_LOAD_FAILED_BEFORE_COMMIT, 1); | 440 |
400 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 441 TEST_F(MetricsWebContentsObserverTest, AbortProvisionalLoadInBackground) { |
401 PAGE_LOAD_ABORTED_BEFORE_FIRST_LAYOUT, 1); | 442 content::WebContentsTester* web_contents_tester = |
402 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 443 content::WebContentsTester::For(web_contents()); |
403 PAGE_LOAD_ABORTED_BEFORE_COMMIT, 1); | 444 |
| 445 observer_->WasHidden(); |
| 446 web_contents_tester->StartNavigation(GURL(kDefaultTestUrl)); |
| 447 content::RenderFrameHostTester* rfh_tester = |
| 448 content::RenderFrameHostTester::For(main_rfh()); |
| 449 rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), net::ERR_ABORTED); |
| 450 rfh_tester->SimulateNavigationStop(); |
| 451 |
| 452 CheckProvisionalEvent(PROVISIONAL_LOAD_FAILED_NON_ABORT, 0, true); |
| 453 CheckProvisionalEvent(PROVISIONAL_LOAD_ABORTED, 1, true); |
| 454 CheckTotalEvents(); |
| 455 } |
| 456 |
| 457 TEST_F(MetricsWebContentsObserverTest, DontLogIrrelevantNavigation) { |
| 458 PageLoadTiming timing; |
| 459 timing.navigation_start = base::Time::FromDoubleT(10); |
| 460 |
| 461 content::WebContentsTester* web_contents_tester = |
| 462 content::WebContentsTester::For(web_contents()); |
| 463 |
| 464 GURL about_blank_url = GURL("about:blank"); |
| 465 web_contents_tester->NavigateAndCommit(about_blank_url); |
| 466 |
| 467 observer_->OnMessageReceived( |
| 468 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), |
| 469 main_rfh()); |
| 470 |
| 471 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); |
| 472 |
| 473 CheckProvisionalEvent(PROVISIONAL_LOAD_COMMITTED, 2, false); |
| 474 CheckCommittedEvent(COMMITTED_LOAD_STARTED, 1, false); |
| 475 CheckTotalEvents(); |
404 } | 476 } |
405 | 477 |
406 TEST_F(MetricsWebContentsObserverTest, AbortCommittedLoadBeforeFirstLayout) { | 478 TEST_F(MetricsWebContentsObserverTest, AbortCommittedLoadBeforeFirstLayout) { |
407 PageLoadTiming timing; | 479 PageLoadTiming timing; |
408 timing.navigation_start = base::Time::FromDoubleT(10); | 480 timing.navigation_start = base::Time::FromDoubleT(10); |
409 | 481 |
410 content::WebContentsTester* web_contents_tester = | 482 content::WebContentsTester* web_contents_tester = |
411 content::WebContentsTester::For(web_contents()); | 483 content::WebContentsTester::For(web_contents()); |
412 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); | 484 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); |
413 | 485 |
414 observer_->OnMessageReceived( | 486 observer_->OnMessageReceived( |
415 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), | 487 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), |
416 main_rfh()); | 488 main_rfh()); |
417 // Navigate again to force histogram logging. | 489 // Navigate again to force histogram logging. |
418 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); | 490 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); |
419 | 491 |
420 // 3 events: 2 starts and one abort before first layout. | 492 CheckProvisionalEvent(PROVISIONAL_LOAD_COMMITTED, 2, false); |
421 histogram_tester_.ExpectTotalCount(kHistogramNameEvents, 3); | 493 CheckCommittedEvent(COMMITTED_LOAD_STARTED, 2, false); |
422 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 494 CheckCommittedEvent(COMMITTED_LOAD_ABORTED_BEFORE_FIRST_LAYOUT, 1, false); |
423 PAGE_LOAD_STARTED, 2); | 495 CheckTotalEvents(); |
424 histogram_tester_.ExpectBucketCount( | |
425 kHistogramNameEvents, PAGE_LOAD_ABORTED_BEFORE_FIRST_LAYOUT, 1); | |
426 } | 496 } |
427 | 497 |
428 TEST_F(MetricsWebContentsObserverTest, | 498 TEST_F(MetricsWebContentsObserverTest, SuccessfulFirstLayoutInForegroundEvent) { |
429 SuccessfulFirstLayoutInForeGroundEvent) { | |
430 PageLoadTiming timing; | 499 PageLoadTiming timing; |
431 timing.navigation_start = base::Time::FromDoubleT(10); | 500 timing.navigation_start = base::Time::FromDoubleT(10); |
432 timing.first_layout = base::TimeDelta::FromMilliseconds(100); | 501 timing.first_layout = base::TimeDelta::FromMilliseconds(100); |
433 | 502 |
434 content::WebContentsTester* web_contents_tester = | 503 content::WebContentsTester* web_contents_tester = |
435 content::WebContentsTester::For(web_contents()); | 504 content::WebContentsTester::For(web_contents()); |
436 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); | 505 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); |
437 | 506 |
438 observer_->OnMessageReceived( | 507 observer_->OnMessageReceived( |
439 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), | 508 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), |
440 main_rfh()); | 509 main_rfh()); |
441 // Navigate again to force histogram logging. | 510 // Navigate again to force histogram logging. |
442 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); | 511 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); |
443 | 512 |
444 // 3 events: 2 starts and one successful first layout. | 513 CheckProvisionalEvent(PROVISIONAL_LOAD_COMMITTED, 2, false); |
445 histogram_tester_.ExpectTotalCount(kHistogramNameEvents, 3); | 514 CheckCommittedEvent(COMMITTED_LOAD_STARTED, 2, false); |
446 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 515 CheckCommittedEvent(COMMITTED_LOAD_SUCCESSFUL_FIRST_LAYOUT, 1, false); |
447 PAGE_LOAD_STARTED, 2); | 516 CheckTotalEvents(); |
448 histogram_tester_.ExpectBucketCount( | |
449 kHistogramNameEvents, PAGE_LOAD_SUCCESSFUL_FIRST_LAYOUT_FOREGROUND, 1); | |
450 } | 517 } |
451 | 518 |
452 TEST_F(MetricsWebContentsObserverTest, | 519 TEST_F(MetricsWebContentsObserverTest, |
453 SuccessfulFirstLayoutInBackgroundEvent) { | 520 SuccessfulFirstLayoutInBackgroundEvent) { |
454 PageLoadTiming timing; | 521 PageLoadTiming timing; |
455 timing.navigation_start = base::Time::FromDoubleT( | 522 timing.navigation_start = base::Time::FromDoubleT( |
456 (base::TimeTicks::Now() - base::TimeTicks::UnixEpoch()).InSecondsF() - 1); | 523 (base::TimeTicks::Now() - base::TimeTicks::UnixEpoch()).InSecondsF() - 1); |
457 | 524 |
458 timing.first_layout = base::TimeDelta::FromSeconds(30); | 525 timing.first_layout = base::TimeDelta::FromSeconds(30); |
459 | 526 |
460 content::WebContentsTester* web_contents_tester = | 527 content::WebContentsTester* web_contents_tester = |
461 content::WebContentsTester::For(web_contents()); | 528 content::WebContentsTester::For(web_contents()); |
462 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); | |
463 // Background the tab. | 529 // Background the tab. |
464 observer_->WasHidden(); | 530 observer_->WasHidden(); |
| 531 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); |
465 | 532 |
466 observer_->OnMessageReceived( | 533 observer_->OnMessageReceived( |
467 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), | 534 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), |
468 main_rfh()); | 535 main_rfh()); |
469 | 536 |
470 observer_->WasShown(); | 537 observer_->WasShown(); |
471 // Navigate again to force histogram logging. | 538 // Navigate again to force histogram logging. |
472 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); | 539 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); |
473 | 540 |
474 // 3 events: 2 starts and one successful first layout. | 541 CheckProvisionalEvent(PROVISIONAL_LOAD_COMMITTED, 1, true); |
475 histogram_tester_.ExpectTotalCount(kHistogramNameEvents, 3); | 542 CheckProvisionalEvent(PROVISIONAL_LOAD_COMMITTED, 1, false); |
476 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 543 CheckCommittedEvent(COMMITTED_LOAD_STARTED, 1, true); |
477 PAGE_LOAD_STARTED, 2); | 544 CheckCommittedEvent(COMMITTED_LOAD_STARTED, 1, false); |
478 histogram_tester_.ExpectBucketCount( | 545 CheckCommittedEvent(COMMITTED_LOAD_SUCCESSFUL_FIRST_LAYOUT, 1, true); |
479 kHistogramNameEvents, PAGE_LOAD_SUCCESSFUL_FIRST_LAYOUT_BACKGROUND, 1); | 546 CheckTotalEvents(); |
480 } | 547 } |
| 548 |
| 549 TEST_F(MetricsWebContentsObserverTest, BadIPC) { |
| 550 PageLoadTiming timing; |
| 551 timing.navigation_start = base::Time::FromDoubleT(10); |
| 552 PageLoadTiming timing2; |
| 553 timing2.navigation_start = base::Time::FromDoubleT(100); |
| 554 |
| 555 content::WebContentsTester* web_contents_tester = |
| 556 content::WebContentsTester::For(web_contents()); |
| 557 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); |
| 558 |
| 559 observer_->OnMessageReceived( |
| 560 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), |
| 561 main_rfh()); |
| 562 observer_->OnMessageReceived( |
| 563 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing2), |
| 564 main_rfh()); |
| 565 |
| 566 CheckProvisionalEvent(PROVISIONAL_LOAD_COMMITTED, 1, false); |
| 567 CheckCommittedEvent(COMMITTED_LOAD_STARTED, 1, false); |
| 568 CheckCommittedEvent(COMMITTED_LOAD_BAD_IPC, 1, false); |
| 569 CheckTotalEvents(); |
| 570 } |
| 571 |
481 } // namespace page_load_metrics | 572 } // namespace page_load_metrics |
OLD | NEW |