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

Side by Side Diff: chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc

Issue 2883273003: Move the user interaction policy for FirstMeaningfulPaint UMA into renderer (Closed)
Patch Set: rebase Created 3 years, 5 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 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 "chrome/browser/page_load_metrics/observers/core_page_load_metrics_obse rver.h" 5 #include "chrome/browser/page_load_metrics/observers/core_page_load_metrics_obse rver.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 const char kHistogramFirstImagePaint[] = 97 const char kHistogramFirstImagePaint[] =
98 "PageLoad.PaintTiming.NavigationToFirstImagePaint"; 98 "PageLoad.PaintTiming.NavigationToFirstImagePaint";
99 const char kBackgroundHistogramFirstImagePaint[] = 99 const char kBackgroundHistogramFirstImagePaint[] =
100 "PageLoad.PaintTiming.NavigationToFirstImagePaint.Background"; 100 "PageLoad.PaintTiming.NavigationToFirstImagePaint.Background";
101 const char kHistogramFirstContentfulPaint[] = 101 const char kHistogramFirstContentfulPaint[] =
102 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint"; 102 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint";
103 const char kBackgroundHistogramFirstContentfulPaint[] = 103 const char kBackgroundHistogramFirstContentfulPaint[] =
104 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint.Background"; 104 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint.Background";
105 const char kHistogramFirstMeaningfulPaint[] = 105 const char kHistogramFirstMeaningfulPaint[] =
106 "PageLoad.Experimental.PaintTiming.NavigationToFirstMeaningfulPaint"; 106 "PageLoad.Experimental.PaintTiming.NavigationToFirstMeaningfulPaint";
107 const char kHistogramFirstMeaningfulPaintNoUserInput[] =
108 "PageLoad.Experimental.PaintTiming.NavigationToFirstMeaningfulPaint."
109 "NoUserInput";
110 const char kHistogramFirstMeaningfulPaintHadUserInput[] =
111 "PageLoad.Experimental.PaintTiming.NavigationToFirstMeaningfulPaint."
112 "HadUserInput";
113 const char kHistogramParseStartToFirstMeaningfulPaint[] = 107 const char kHistogramParseStartToFirstMeaningfulPaint[] =
114 "PageLoad.Experimental.PaintTiming.ParseStartToFirstMeaningfulPaint"; 108 "PageLoad.Experimental.PaintTiming.ParseStartToFirstMeaningfulPaint";
115 const char kHistogramParseStartToFirstContentfulPaint[] = 109 const char kHistogramParseStartToFirstContentfulPaint[] =
116 "PageLoad.PaintTiming.ParseStartToFirstContentfulPaint"; 110 "PageLoad.PaintTiming.ParseStartToFirstContentfulPaint";
117 const char kBackgroundHistogramParseStartToFirstContentfulPaint[] = 111 const char kBackgroundHistogramParseStartToFirstContentfulPaint[] =
118 "PageLoad.PaintTiming.ParseStartToFirstContentfulPaint.Background"; 112 "PageLoad.PaintTiming.ParseStartToFirstContentfulPaint.Background";
119 const char kHistogramParseStart[] = 113 const char kHistogramParseStart[] =
120 "PageLoad.ParseTiming.NavigationToParseStart"; 114 "PageLoad.ParseTiming.NavigationToParseStart";
121 const char kBackgroundHistogramParseStart[] = 115 const char kBackgroundHistogramParseStart[] =
122 "PageLoad.ParseTiming.NavigationToParseStart.Background"; 116 "PageLoad.ParseTiming.NavigationToParseStart.Background";
123 const char kHistogramFirstMeaningfulPaintToNetworkStable[] =
124 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintToNetworkStable";
125 const char kHistogramParseDuration[] = "PageLoad.ParseTiming.ParseDuration"; 117 const char kHistogramParseDuration[] = "PageLoad.ParseTiming.ParseDuration";
126 const char kBackgroundHistogramParseDuration[] = 118 const char kBackgroundHistogramParseDuration[] =
127 "PageLoad.ParseTiming.ParseDuration.Background"; 119 "PageLoad.ParseTiming.ParseDuration.Background";
128 const char kHistogramParseBlockedOnScriptLoad[] = 120 const char kHistogramParseBlockedOnScriptLoad[] =
129 "PageLoad.ParseTiming.ParseBlockedOnScriptLoad"; 121 "PageLoad.ParseTiming.ParseBlockedOnScriptLoad";
130 const char kBackgroundHistogramParseBlockedOnScriptLoad[] = 122 const char kBackgroundHistogramParseBlockedOnScriptLoad[] =
131 "PageLoad.ParseTiming.ParseBlockedOnScriptLoad.Background"; 123 "PageLoad.ParseTiming.ParseBlockedOnScriptLoad.Background";
132 const char kHistogramParseBlockedOnScriptLoadDocumentWrite[] = 124 const char kHistogramParseBlockedOnScriptLoadDocumentWrite[] =
133 "PageLoad.ParseTiming.ParseBlockedOnScriptLoadFromDocumentWrite"; 125 "PageLoad.ParseTiming.ParseBlockedOnScriptLoadFromDocumentWrite";
134 const char kBackgroundHistogramParseBlockedOnScriptLoadDocumentWrite[] = 126 const char kBackgroundHistogramParseBlockedOnScriptLoadDocumentWrite[] =
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 "PageLoad.CoarseTiming.NavigationToFirstContentfulPaint"; 196 "PageLoad.CoarseTiming.NavigationToFirstContentfulPaint";
205 197
206 const char kRapporMetricsNameFirstMeaningfulPaintNotRecorded[] = 198 const char kRapporMetricsNameFirstMeaningfulPaintNotRecorded[] =
207 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintNotRecorded"; 199 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintNotRecorded";
208 200
209 const char kHistogramFirstContentfulPaintUserInitiated[] = 201 const char kHistogramFirstContentfulPaintUserInitiated[] =
210 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint.UserInitiated"; 202 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint.UserInitiated";
211 203
212 const char kHistogramFirstMeaningfulPaintStatus[] = 204 const char kHistogramFirstMeaningfulPaintStatus[] =
213 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintStatus"; 205 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintStatus";
214 const char kHistogramFirstMeaningfulPaintSignalStatus2[] =
215 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintSignalStatus2";
216 206
217 const char kHistogramFirstNonScrollInputAfterFirstPaint[] = 207 const char kHistogramFirstNonScrollInputAfterFirstPaint[] =
218 "PageLoad.InputTiming.NavigationToFirstNonScroll.AfterPaint"; 208 "PageLoad.InputTiming.NavigationToFirstNonScroll.AfterPaint";
219 const char kHistogramFirstScrollInputAfterFirstPaint[] = 209 const char kHistogramFirstScrollInputAfterFirstPaint[] =
220 "PageLoad.InputTiming.NavigationToFirstScroll.AfterPaint"; 210 "PageLoad.InputTiming.NavigationToFirstScroll.AfterPaint";
221 211
222 const char kHistogramTotalBytes[] = "PageLoad.Experimental.Bytes.Total"; 212 const char kHistogramTotalBytes[] = "PageLoad.Experimental.Bytes.Total";
223 const char kHistogramNetworkBytes[] = "PageLoad.Experimental.Bytes.Network"; 213 const char kHistogramNetworkBytes[] = "PageLoad.Experimental.Bytes.Network";
224 const char kHistogramCacheBytes[] = "PageLoad.Experimental.Bytes.Cache"; 214 const char kHistogramCacheBytes[] = "PageLoad.Experimental.Bytes.Cache";
225 215
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 timing.paint_timing->first_contentful_paint, info)) { 461 timing.paint_timing->first_contentful_paint, info)) {
472 PAGE_LOAD_HISTOGRAM(internal::kHistogramForegroundToFirstContentfulPaint, 462 PAGE_LOAD_HISTOGRAM(internal::kHistogramForegroundToFirstContentfulPaint,
473 timing.paint_timing->first_contentful_paint.value() - 463 timing.paint_timing->first_contentful_paint.value() -
474 info.first_foreground_time.value()); 464 info.first_foreground_time.value());
475 } 465 }
476 } 466 }
477 467
478 void CorePageLoadMetricsObserver::OnFirstMeaningfulPaintInMainFrameDocument( 468 void CorePageLoadMetricsObserver::OnFirstMeaningfulPaintInMainFrameDocument(
479 const page_load_metrics::mojom::PageLoadTiming& timing, 469 const page_load_metrics::mojom::PageLoadTiming& timing,
480 const page_load_metrics::PageLoadExtraInfo& info) { 470 const page_load_metrics::PageLoadExtraInfo& info) {
481 base::TimeTicks paint = info.navigation_start + 471 if (WasStartedInForegroundOptionalEventInForeground(
482 timing.paint_timing->first_meaningful_paint.value(); 472 timing.paint_timing->first_meaningful_paint, info)) {
483 if (first_user_interaction_after_first_paint_.is_null() || 473 PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaint,
484 paint < first_user_interaction_after_first_paint_) { 474 timing.paint_timing->first_meaningful_paint.value());
485 if (WasStartedInForegroundOptionalEventInForeground( 475 PAGE_LOAD_HISTOGRAM(internal::kHistogramParseStartToFirstMeaningfulPaint,
486 timing.paint_timing->first_meaningful_paint, info)) { 476 timing.paint_timing->first_meaningful_paint.value() -
487 PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaint, 477 timing.parse_timing->parse_start.value());
488 timing.paint_timing->first_meaningful_paint.value()); 478 RecordFirstMeaningfulPaintStatus(internal::FIRST_MEANINGFUL_PAINT_RECORDED);
489 PAGE_LOAD_HISTOGRAM(internal::kHistogramParseStartToFirstMeaningfulPaint,
490 timing.paint_timing->first_meaningful_paint.value() -
491 timing.parse_timing->parse_start.value());
492 PAGE_LOAD_HISTOGRAM(
493 internal::kHistogramFirstMeaningfulPaintToNetworkStable,
494 base::TimeTicks::Now() - paint);
495 RecordFirstMeaningfulPaintStatus(
496 internal::FIRST_MEANINGFUL_PAINT_RECORDED);
497 } else {
498 RecordFirstMeaningfulPaintStatus(
499 internal::FIRST_MEANINGFUL_PAINT_BACKGROUNDED);
500 }
501 479
502 if (WasStartedInBackgroundOptionalEventInForeground( 480 if (WasStartedInBackgroundOptionalEventInForeground(
503 timing.paint_timing->first_meaningful_paint, info)) { 481 timing.paint_timing->first_meaningful_paint, info)) {
504 PAGE_LOAD_HISTOGRAM(internal::kHistogramForegroundToFirstMeaningfulPaint, 482 PAGE_LOAD_HISTOGRAM(internal::kHistogramForegroundToFirstMeaningfulPaint,
505 timing.paint_timing->first_meaningful_paint.value() - 483 timing.paint_timing->first_meaningful_paint.value() -
506 info.first_foreground_time.value()); 484 info.first_foreground_time.value());
507 } 485 }
508 } else { 486 } else {
509 RecordFirstMeaningfulPaintStatus( 487 RecordFirstMeaningfulPaintStatus(
510 internal::FIRST_MEANINGFUL_PAINT_USER_INTERACTION_BEFORE_FMP); 488 internal::FIRST_MEANINGFUL_PAINT_BACKGROUNDED);
511 } 489 }
512 } 490 }
513 491
514 void CorePageLoadMetricsObserver::OnParseStart( 492 void CorePageLoadMetricsObserver::OnParseStart(
515 const page_load_metrics::mojom::PageLoadTiming& timing, 493 const page_load_metrics::mojom::PageLoadTiming& timing,
516 const page_load_metrics::PageLoadExtraInfo& info) { 494 const page_load_metrics::PageLoadExtraInfo& info) {
517 if (WasStartedInForegroundOptionalEventInForeground( 495 if (WasStartedInForegroundOptionalEventInForeground(
518 timing.parse_timing->parse_start, info)) { 496 timing.parse_timing->parse_start, info)) {
519 PAGE_LOAD_HISTOGRAM(internal::kHistogramParseStart, 497 PAGE_LOAD_HISTOGRAM(internal::kHistogramParseStart,
520 timing.parse_timing->parse_start.value()); 498 timing.parse_timing->parse_start.value());
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 } 627 }
650 // Provide an empty PageLoadTiming, since we don't have any timing metrics 628 // Provide an empty PageLoadTiming, since we don't have any timing metrics
651 // for failed provisional loads. 629 // for failed provisional loads.
652 RecordForegroundDurationHistograms(page_load_metrics::mojom::PageLoadTiming(), 630 RecordForegroundDurationHistograms(page_load_metrics::mojom::PageLoadTiming(),
653 extra_info, base::TimeTicks()); 631 extra_info, base::TimeTicks());
654 } 632 }
655 633
656 void CorePageLoadMetricsObserver::OnUserInput( 634 void CorePageLoadMetricsObserver::OnUserInput(
657 const blink::WebInputEvent& event) { 635 const blink::WebInputEvent& event) {
658 base::TimeTicks now; 636 base::TimeTicks now;
659 if (!first_paint_.is_null() &&
660 first_user_interaction_after_first_paint_.is_null() &&
661 event.GetType() != blink::WebInputEvent::kMouseMove) {
662 if (now.is_null())
663 now = base::TimeTicks::Now();
664 first_user_interaction_after_first_paint_ = now;
665 }
666 637
667 if (first_paint_.is_null()) 638 if (first_paint_.is_null())
668 return; 639 return;
669 640
670 if (!received_non_scroll_input_after_first_paint_) { 641 if (!received_non_scroll_input_after_first_paint_) {
671 if (event.GetType() == blink::WebInputEvent::kGestureTap || 642 if (event.GetType() == blink::WebInputEvent::kGestureTap ||
672 event.GetType() == blink::WebInputEvent::kMouseUp) { 643 event.GetType() == blink::WebInputEvent::kMouseUp) {
673 received_non_scroll_input_after_first_paint_ = true; 644 received_non_scroll_input_after_first_paint_ = true;
674 if (now.is_null()) 645 if (now.is_null())
675 now = base::TimeTicks::Now(); 646 now = base::TimeTicks::Now();
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 } 682 }
712 683
713 if (timing.paint_timing->first_paint && 684 if (timing.paint_timing->first_paint &&
714 !timing.paint_timing->first_meaningful_paint) { 685 !timing.paint_timing->first_meaningful_paint) {
715 RecordFirstMeaningfulPaintStatus( 686 RecordFirstMeaningfulPaintStatus(
716 timing.paint_timing->first_contentful_paint 687 timing.paint_timing->first_contentful_paint
717 ? internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE 688 ? internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE
718 : internal:: 689 : internal::
719 FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_FIRST_CONTENTFUL_PAINT); 690 FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_FIRST_CONTENTFUL_PAINT);
720 } 691 }
721
722 if (timing.paint_timing->first_paint) {
723 enum FirstMeaningfulPaintSignalStatus {
724 HAD_USER_INPUT = 1 << 0,
725 NETWORK_STABLE = 1 << 1,
726 FIRST_MEANINGFUL_PAINT_SIGNAL_STATUS_LAST_ENTRY = 1 << 2
727 };
728 int signal_status =
729 (first_user_interaction_after_first_paint_.is_null() ? 0
730 : HAD_USER_INPUT) +
731 (timing.paint_timing->first_meaningful_paint ? NETWORK_STABLE : 0);
732 UMA_HISTOGRAM_ENUMERATION(
733 internal::kHistogramFirstMeaningfulPaintSignalStatus2,
734 signal_status, FIRST_MEANINGFUL_PAINT_SIGNAL_STATUS_LAST_ENTRY);
735 }
736 if (timing.paint_timing->first_meaningful_paint) {
737 if (first_user_interaction_after_first_paint_.is_null()) {
738 PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaintNoUserInput,
739 timing.paint_timing->first_meaningful_paint.value());
740 } else {
741 PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaintHadUserInput,
742 timing.paint_timing->first_meaningful_paint.value());
743 }
744 }
745 } 692 }
746 693
747 void CorePageLoadMetricsObserver::RecordForegroundDurationHistograms( 694 void CorePageLoadMetricsObserver::RecordForegroundDurationHistograms(
748 const page_load_metrics::mojom::PageLoadTiming& timing, 695 const page_load_metrics::mojom::PageLoadTiming& timing,
749 const page_load_metrics::PageLoadExtraInfo& info, 696 const page_load_metrics::PageLoadExtraInfo& info,
750 base::TimeTicks app_background_time) { 697 base::TimeTicks app_background_time) {
751 base::Optional<base::TimeDelta> foreground_duration = 698 base::Optional<base::TimeDelta> foreground_duration =
752 GetInitialForegroundDuration(info, app_background_time); 699 GetInitialForegroundDuration(info, app_background_time);
753 if (!foreground_duration) 700 if (!foreground_duration)
754 return; 701 return;
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
865 } 812 }
866 813
867 // Log the eTLD+1 of sites that did not report first meaningful paint. 814 // Log the eTLD+1 of sites that did not report first meaningful paint.
868 if (timing.paint_timing->first_paint && 815 if (timing.paint_timing->first_paint &&
869 !timing.paint_timing->first_meaningful_paint) { 816 !timing.paint_timing->first_meaningful_paint) {
870 rappor::SampleDomainAndRegistryFromGURL( 817 rappor::SampleDomainAndRegistryFromGURL(
871 rappor_service, 818 rappor_service,
872 internal::kRapporMetricsNameFirstMeaningfulPaintNotRecorded, info.url); 819 internal::kRapporMetricsNameFirstMeaningfulPaintNotRecorded, info.url);
873 } 820 }
874 } 821 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698