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