| 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 18 matching lines...) Expand all Loading... |
| 29 const char kHistogramNameLoad[] = | 29 const char kHistogramNameLoad[] = |
| 30 "PageLoad.Timing2.NavigationToLoadEventFired"; | 30 "PageLoad.Timing2.NavigationToLoadEventFired"; |
| 31 | 31 |
| 32 const char kBGHistogramNameFirstLayout[] = | 32 const char kBGHistogramNameFirstLayout[] = |
| 33 "PageLoad.Timing2.NavigationToFirstLayout.BG"; | 33 "PageLoad.Timing2.NavigationToFirstLayout.BG"; |
| 34 const char kBGHistogramNameDomContent[] = | 34 const char kBGHistogramNameDomContent[] = |
| 35 "PageLoad.Timing2.NavigationToDOMContentLoadedEventFired.BG"; | 35 "PageLoad.Timing2.NavigationToDOMContentLoadedEventFired.BG"; |
| 36 const char kBGHistogramNameLoad[] = | 36 const char kBGHistogramNameLoad[] = |
| 37 "PageLoad.Timing2.NavigationToLoadEventFired.BG"; | 37 "PageLoad.Timing2.NavigationToLoadEventFired.BG"; |
| 38 | 38 |
| 39 const char kHistogramNameEvents[] = "PageLoad.EventCounts"; | 39 const char kProvisionalEvents[] = "PageLoad.Events.Provisional"; |
| 40 const char kCommittedEvents[] = "PageLoad.Events.Committed"; |
| 40 | 41 |
| 41 } // namespace | 42 } // namespace |
| 42 | 43 |
| 43 class MetricsWebContentsObserverTest | 44 class MetricsWebContentsObserverTest |
| 44 : public content::RenderViewHostTestHarness { | 45 : public content::RenderViewHostTestHarness { |
| 45 public: | 46 public: |
| 46 MetricsWebContentsObserverTest() {} | 47 MetricsWebContentsObserverTest() {} |
| 47 | 48 |
| 48 void SetUp() override { | 49 void SetUp() override { |
| 49 RenderViewHostTestHarness::SetUp(); | 50 RenderViewHostTestHarness::SetUp(); |
| 50 observer_ = make_scoped_ptr(new MetricsWebContentsObserver(web_contents())); | 51 observer_ = make_scoped_ptr(new MetricsWebContentsObserver(web_contents())); |
| 51 observer_->WasShown(); | 52 observer_->WasShown(); |
| 53 num_provisional_events_ = 0; |
| 54 num_committed_events_ = 0; |
| 52 } | 55 } |
| 53 | 56 |
| 54 void AssertNoHistogramsLogged() { | 57 void AssertNoHistogramsLogged() { |
| 55 histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 0); | 58 histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 0); |
| 56 histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0); | 59 histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0); |
| 57 histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 0); | 60 histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 0); |
| 58 } | 61 } |
| 59 | 62 |
| 63 void CheckProvisionalEvent(ProvisionalLoadEvent event, int count) { |
| 64 histogram_tester_.ExpectBucketCount(kProvisionalEvents, event, count); |
| 65 num_provisional_events_ += count; |
| 66 } |
| 67 |
| 68 void CheckCommittedEvent(CommittedLoadEvent event, int count) { |
| 69 histogram_tester_.ExpectBucketCount(kCommittedEvents, event, count); |
| 70 num_committed_events_ += count; |
| 71 } |
| 72 |
| 73 void CheckTotalEvents() { |
| 74 histogram_tester_.ExpectTotalCount(kProvisionalEvents, |
| 75 num_provisional_events_); |
| 76 histogram_tester_.ExpectTotalCount(kCommittedEvents, num_committed_events_); |
| 77 } |
| 78 |
| 60 protected: | 79 protected: |
| 61 base::HistogramTester histogram_tester_; | 80 base::HistogramTester histogram_tester_; |
| 62 scoped_ptr<MetricsWebContentsObserver> observer_; | 81 scoped_ptr<MetricsWebContentsObserver> observer_; |
| 82 |
| 83 private: |
| 84 int num_provisional_events_; |
| 85 int num_committed_events_; |
| 63 }; | 86 }; |
| 64 | 87 |
| 65 TEST_F(MetricsWebContentsObserverTest, NoMetrics) { | 88 TEST_F(MetricsWebContentsObserverTest, NoMetrics) { |
| 66 AssertNoHistogramsLogged(); | 89 AssertNoHistogramsLogged(); |
| 67 } | 90 } |
| 68 | 91 |
| 69 TEST_F(MetricsWebContentsObserverTest, NotInMainFrame) { | 92 TEST_F(MetricsWebContentsObserverTest, NotInMainFrame) { |
| 70 base::TimeDelta first_layout = base::TimeDelta::FromMilliseconds(1); | 93 base::TimeDelta first_layout = base::TimeDelta::FromMilliseconds(1); |
| 71 | 94 |
| 72 PageLoadTiming timing; | 95 PageLoadTiming timing; |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 content::WebContentsTester* web_contents_tester = | 365 content::WebContentsTester* web_contents_tester = |
| 343 content::WebContentsTester::For(web_contents()); | 366 content::WebContentsTester::For(web_contents()); |
| 344 | 367 |
| 345 web_contents_tester->StartNavigation(GURL(kDefaultTestUrl)); | 368 web_contents_tester->StartNavigation(GURL(kDefaultTestUrl)); |
| 346 content::RenderFrameHostTester* rfh_tester = | 369 content::RenderFrameHostTester* rfh_tester = |
| 347 content::RenderFrameHostTester::For(main_rfh()); | 370 content::RenderFrameHostTester::For(main_rfh()); |
| 348 rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), | 371 rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), |
| 349 net::ERR_TIMED_OUT); | 372 net::ERR_TIMED_OUT); |
| 350 rfh_tester->SimulateNavigationStop(); | 373 rfh_tester->SimulateNavigationStop(); |
| 351 | 374 |
| 352 histogram_tester_.ExpectTotalCount(kHistogramNameEvents, 3); | 375 CheckProvisionalEvent(PROVISIONAL_LOAD_FAILED_NON_ABORT, 1); |
| 353 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 376 CheckProvisionalEvent(PROVISIONAL_LOAD_ABORTED, 0); |
| 354 PAGE_LOAD_STARTED, 1); | 377 CheckTotalEvents(); |
| 355 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | |
| 356 PAGE_LOAD_FAILED_BEFORE_COMMIT, 1); | |
| 357 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | |
| 358 PAGE_LOAD_ABORTED_BEFORE_FIRST_LAYOUT, 1); | |
| 359 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | |
| 360 PAGE_LOAD_ABORTED_BEFORE_COMMIT, 0); | |
| 361 } | 378 } |
| 362 | 379 |
| 363 TEST_F(MetricsWebContentsObserverTest, AbortProvisionalLoad) { | 380 TEST_F(MetricsWebContentsObserverTest, AbortProvisionalLoad) { |
| 364 content::WebContentsTester* web_contents_tester = | 381 content::WebContentsTester* web_contents_tester = |
| 365 content::WebContentsTester::For(web_contents()); | 382 content::WebContentsTester::For(web_contents()); |
| 366 | 383 |
| 367 web_contents_tester->StartNavigation(GURL(kDefaultTestUrl)); | 384 web_contents_tester->StartNavigation(GURL(kDefaultTestUrl)); |
| 368 content::RenderFrameHostTester* rfh_tester = | 385 content::RenderFrameHostTester* rfh_tester = |
| 369 content::RenderFrameHostTester::For(main_rfh()); | 386 content::RenderFrameHostTester::For(main_rfh()); |
| 370 rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), net::ERR_ABORTED); | 387 rfh_tester->SimulateNavigationError(GURL(kDefaultTestUrl), net::ERR_ABORTED); |
| 371 rfh_tester->SimulateNavigationStop(); | 388 rfh_tester->SimulateNavigationStop(); |
| 372 | 389 |
| 373 histogram_tester_.ExpectTotalCount(kHistogramNameEvents, 4); | 390 CheckProvisionalEvent(PROVISIONAL_LOAD_FAILED_NON_ABORT, 0); |
| 374 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 391 CheckProvisionalEvent(PROVISIONAL_LOAD_ABORTED, 1); |
| 375 PAGE_LOAD_STARTED, 1); | 392 CheckTotalEvents(); |
| 376 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 393 } |
| 377 PAGE_LOAD_FAILED_BEFORE_COMMIT, 1); | 394 |
| 378 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 395 TEST_F(MetricsWebContentsObserverTest, DontLogIrrelevantNavigation) { |
| 379 PAGE_LOAD_ABORTED_BEFORE_FIRST_LAYOUT, 1); | 396 PageLoadTiming timing; |
| 380 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 397 timing.navigation_start = base::Time::FromDoubleT(10); |
| 381 PAGE_LOAD_ABORTED_BEFORE_COMMIT, 1); | 398 |
| 399 content::WebContentsTester* web_contents_tester = |
| 400 content::WebContentsTester::For(web_contents()); |
| 401 |
| 402 GURL about_blank_url = GURL("about:blank"); |
| 403 web_contents_tester->NavigateAndCommit(about_blank_url); |
| 404 |
| 405 observer_->OnMessageReceived( |
| 406 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), |
| 407 main_rfh()); |
| 408 |
| 409 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); |
| 410 |
| 411 CheckProvisionalEvent(PROVISIONAL_LOAD_COMMITTED, 2); |
| 412 CheckCommittedEvent(COMMITTED_LOAD_STARTED_IN_FOREGROUND, 1); |
| 413 CheckTotalEvents(); |
| 382 } | 414 } |
| 383 | 415 |
| 384 TEST_F(MetricsWebContentsObserverTest, AbortCommittedLoadBeforeFirstLayout) { | 416 TEST_F(MetricsWebContentsObserverTest, AbortCommittedLoadBeforeFirstLayout) { |
| 385 PageLoadTiming timing; | 417 PageLoadTiming timing; |
| 386 timing.navigation_start = base::Time::FromDoubleT(10); | 418 timing.navigation_start = base::Time::FromDoubleT(10); |
| 387 | 419 |
| 388 content::WebContentsTester* web_contents_tester = | 420 content::WebContentsTester* web_contents_tester = |
| 389 content::WebContentsTester::For(web_contents()); | 421 content::WebContentsTester::For(web_contents()); |
| 390 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); | 422 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); |
| 391 | 423 |
| 392 observer_->OnMessageReceived( | 424 observer_->OnMessageReceived( |
| 393 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), | 425 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), |
| 394 main_rfh()); | 426 main_rfh()); |
| 395 // Navigate again to force histogram logging. | 427 // Navigate again to force histogram logging. |
| 396 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); | 428 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); |
| 397 | 429 |
| 398 // 3 events: 2 starts and one abort before first layout. | 430 CheckProvisionalEvent(PROVISIONAL_LOAD_COMMITTED, 2); |
| 399 histogram_tester_.ExpectTotalCount(kHistogramNameEvents, 3); | 431 CheckCommittedEvent(COMMITTED_LOAD_STARTED_IN_FOREGROUND, 2); |
| 400 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 432 CheckCommittedEvent(COMMITTED_LOAD_ABORTED_BEFORE_FIRST_LAYOUT, 1); |
| 401 PAGE_LOAD_STARTED, 2); | 433 CheckTotalEvents(); |
| 402 histogram_tester_.ExpectBucketCount( | |
| 403 kHistogramNameEvents, PAGE_LOAD_ABORTED_BEFORE_FIRST_LAYOUT, 1); | |
| 404 } | 434 } |
| 405 | 435 |
| 406 TEST_F(MetricsWebContentsObserverTest, | 436 TEST_F(MetricsWebContentsObserverTest, SuccessfulFirstLayoutInForegroundEvent) { |
| 407 SuccessfulFirstLayoutInForeGroundEvent) { | |
| 408 PageLoadTiming timing; | 437 PageLoadTiming timing; |
| 409 timing.navigation_start = base::Time::FromDoubleT(10); | 438 timing.navigation_start = base::Time::FromDoubleT(10); |
| 410 timing.first_layout = base::TimeDelta::FromMilliseconds(100); | 439 timing.first_layout = base::TimeDelta::FromMilliseconds(100); |
| 411 | 440 |
| 412 content::WebContentsTester* web_contents_tester = | 441 content::WebContentsTester* web_contents_tester = |
| 413 content::WebContentsTester::For(web_contents()); | 442 content::WebContentsTester::For(web_contents()); |
| 414 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); | 443 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); |
| 415 | 444 |
| 416 observer_->OnMessageReceived( | 445 observer_->OnMessageReceived( |
| 417 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), | 446 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), |
| 418 main_rfh()); | 447 main_rfh()); |
| 419 // Navigate again to force histogram logging. | 448 // Navigate again to force histogram logging. |
| 420 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); | 449 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); |
| 421 | 450 |
| 422 // 3 events: 2 starts and one successful first layout. | 451 CheckProvisionalEvent(PROVISIONAL_LOAD_COMMITTED, 2); |
| 423 histogram_tester_.ExpectTotalCount(kHistogramNameEvents, 3); | 452 CheckCommittedEvent(COMMITTED_LOAD_STARTED_IN_FOREGROUND, 2); |
| 424 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 453 CheckCommittedEvent(COMMITTED_LOAD_SUCCESSFUL_FIRST_LAYOUT_FOREGROUND, 1); |
| 425 PAGE_LOAD_STARTED, 2); | 454 CheckTotalEvents(); |
| 426 histogram_tester_.ExpectBucketCount( | |
| 427 kHistogramNameEvents, PAGE_LOAD_SUCCESSFUL_FIRST_LAYOUT_FOREGROUND, 1); | |
| 428 } | 455 } |
| 429 | 456 |
| 430 TEST_F(MetricsWebContentsObserverTest, | 457 TEST_F(MetricsWebContentsObserverTest, |
| 431 SuccessfulFirstLayoutInBackgroundEvent) { | 458 SuccessfulFirstLayoutInBackgroundEvent) { |
| 432 PageLoadTiming timing; | 459 PageLoadTiming timing; |
| 433 timing.navigation_start = base::Time::FromDoubleT( | 460 timing.navigation_start = base::Time::FromDoubleT( |
| 434 (base::TimeTicks::Now() - base::TimeTicks::UnixEpoch()).InSecondsF() - 1); | 461 (base::TimeTicks::Now() - base::TimeTicks::UnixEpoch()).InSecondsF() - 1); |
| 435 | 462 |
| 436 timing.first_layout = base::TimeDelta::FromSeconds(30); | 463 timing.first_layout = base::TimeDelta::FromSeconds(30); |
| 437 | 464 |
| 438 content::WebContentsTester* web_contents_tester = | 465 content::WebContentsTester* web_contents_tester = |
| 439 content::WebContentsTester::For(web_contents()); | 466 content::WebContentsTester::For(web_contents()); |
| 440 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); | 467 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); |
| 441 // Background the tab. | 468 // Background the tab. |
| 442 observer_->WasHidden(); | 469 observer_->WasHidden(); |
| 443 | 470 |
| 444 observer_->OnMessageReceived( | 471 observer_->OnMessageReceived( |
| 445 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), | 472 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), |
| 446 main_rfh()); | 473 main_rfh()); |
| 447 | 474 |
| 448 observer_->WasShown(); | 475 observer_->WasShown(); |
| 449 // Navigate again to force histogram logging. | 476 // Navigate again to force histogram logging. |
| 450 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); | 477 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); |
| 451 | 478 |
| 452 // 3 events: 2 starts and one successful first layout. | 479 CheckProvisionalEvent(PROVISIONAL_LOAD_COMMITTED, 2); |
| 453 histogram_tester_.ExpectTotalCount(kHistogramNameEvents, 3); | 480 CheckCommittedEvent(COMMITTED_LOAD_STARTED_IN_FOREGROUND, 2); |
| 454 histogram_tester_.ExpectBucketCount(kHistogramNameEvents, | 481 CheckCommittedEvent(COMMITTED_LOAD_SUCCESSFUL_FIRST_LAYOUT_BACKGROUND, 1); |
| 455 PAGE_LOAD_STARTED, 2); | 482 CheckTotalEvents(); |
| 456 histogram_tester_.ExpectBucketCount( | |
| 457 kHistogramNameEvents, PAGE_LOAD_SUCCESSFUL_FIRST_LAYOUT_BACKGROUND, 1); | |
| 458 } | 483 } |
| 484 |
| 485 TEST_F(MetricsWebContentsObserverTest, BadIPC) { |
| 486 PageLoadTiming timing; |
| 487 timing.navigation_start = base::Time::FromDoubleT(10); |
| 488 PageLoadTiming timing2; |
| 489 timing2.navigation_start = base::Time::FromDoubleT(100); |
| 490 |
| 491 content::WebContentsTester* web_contents_tester = |
| 492 content::WebContentsTester::For(web_contents()); |
| 493 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); |
| 494 |
| 495 observer_->OnMessageReceived( |
| 496 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), |
| 497 main_rfh()); |
| 498 observer_->OnMessageReceived( |
| 499 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing2), |
| 500 main_rfh()); |
| 501 |
| 502 CheckProvisionalEvent(PROVISIONAL_LOAD_COMMITTED, 1); |
| 503 CheckCommittedEvent(COMMITTED_LOAD_STARTED_IN_FOREGROUND, 1); |
| 504 CheckCommittedEvent(COMMITTED_LOAD_BAD_IPC, 1); |
| 505 CheckTotalEvents(); |
| 506 } |
| 507 |
| 459 } // namespace page_load_metrics | 508 } // namespace page_load_metrics |
| OLD | NEW |