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 |