Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(441)

Side by Side Diff: components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc

Issue 1384213002: Page Abort Events for relevant navigations (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Mirror histogram for backgrounded events. New test. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698