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

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: add testcase Created 3 years, 6 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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 "PageLoad.CoarseTiming.NavigationToFirstContentfulPaint"; 192 "PageLoad.CoarseTiming.NavigationToFirstContentfulPaint";
201 193
202 const char kRapporMetricsNameFirstMeaningfulPaintNotRecorded[] = 194 const char kRapporMetricsNameFirstMeaningfulPaintNotRecorded[] =
203 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintNotRecorded"; 195 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintNotRecorded";
204 196
205 const char kHistogramFirstContentfulPaintUserInitiated[] = 197 const char kHistogramFirstContentfulPaintUserInitiated[] =
206 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint.UserInitiated"; 198 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint.UserInitiated";
207 199
208 const char kHistogramFirstMeaningfulPaintStatus[] = 200 const char kHistogramFirstMeaningfulPaintStatus[] =
209 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintStatus"; 201 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintStatus";
210 const char kHistogramFirstMeaningfulPaintSignalStatus2[] =
211 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintSignalStatus2";
212 202
213 const char kHistogramFirstNonScrollInputAfterFirstPaint[] = 203 const char kHistogramFirstNonScrollInputAfterFirstPaint[] =
214 "PageLoad.InputTiming.NavigationToFirstNonScroll.AfterPaint"; 204 "PageLoad.InputTiming.NavigationToFirstNonScroll.AfterPaint";
215 const char kHistogramFirstScrollInputAfterFirstPaint[] = 205 const char kHistogramFirstScrollInputAfterFirstPaint[] =
216 "PageLoad.InputTiming.NavigationToFirstScroll.AfterPaint"; 206 "PageLoad.InputTiming.NavigationToFirstScroll.AfterPaint";
217 207
218 const char kHistogramTotalBytes[] = "PageLoad.Experimental.Bytes.Total"; 208 const char kHistogramTotalBytes[] = "PageLoad.Experimental.Bytes.Total";
219 const char kHistogramNetworkBytes[] = "PageLoad.Experimental.Bytes.Network"; 209 const char kHistogramNetworkBytes[] = "PageLoad.Experimental.Bytes.Network";
220 const char kHistogramCacheBytes[] = "PageLoad.Experimental.Bytes.Cache"; 210 const char kHistogramCacheBytes[] = "PageLoad.Experimental.Bytes.Cache";
221 211
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 PAGE_LOAD_HISTOGRAM( 458 PAGE_LOAD_HISTOGRAM(
469 internal::kBackgroundHistogramParseStartToFirstContentfulPaint, 459 internal::kBackgroundHistogramParseStartToFirstContentfulPaint,
470 timing.paint_timing->first_contentful_paint.value() - 460 timing.paint_timing->first_contentful_paint.value() -
471 timing.parse_timing->parse_start.value()); 461 timing.parse_timing->parse_start.value());
472 } 462 }
473 } 463 }
474 464
475 void CorePageLoadMetricsObserver::OnFirstMeaningfulPaintInMainFrameDocument( 465 void CorePageLoadMetricsObserver::OnFirstMeaningfulPaintInMainFrameDocument(
476 const page_load_metrics::mojom::PageLoadTiming& timing, 466 const page_load_metrics::mojom::PageLoadTiming& timing,
477 const page_load_metrics::PageLoadExtraInfo& info) { 467 const page_load_metrics::PageLoadExtraInfo& info) {
478 base::TimeTicks paint = info.navigation_start + 468 if (WasStartedInForegroundOptionalEventInForeground(
479 timing.paint_timing->first_meaningful_paint.value(); 469 timing.paint_timing->first_meaningful_paint, info)) {
480 if (first_user_interaction_after_first_paint_.is_null() || 470 PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaint,
481 paint < first_user_interaction_after_first_paint_) { 471 timing.paint_timing->first_meaningful_paint.value());
482 if (WasStartedInForegroundOptionalEventInForeground( 472 PAGE_LOAD_HISTOGRAM(internal::kHistogramParseStartToFirstMeaningfulPaint,
483 timing.paint_timing->first_meaningful_paint, info)) { 473 timing.paint_timing->first_meaningful_paint.value() -
484 PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaint, 474 timing.parse_timing->parse_start.value());
485 timing.paint_timing->first_meaningful_paint.value()); 475 RecordFirstMeaningfulPaintStatus(internal::FIRST_MEANINGFUL_PAINT_RECORDED);
486 PAGE_LOAD_HISTOGRAM(internal::kHistogramParseStartToFirstMeaningfulPaint,
487 timing.paint_timing->first_meaningful_paint.value() -
488 timing.parse_timing->parse_start.value());
489 PAGE_LOAD_HISTOGRAM(
490 internal::kHistogramFirstMeaningfulPaintToNetworkStable,
491 base::TimeTicks::Now() - paint);
492 RecordFirstMeaningfulPaintStatus(
493 internal::FIRST_MEANINGFUL_PAINT_RECORDED);
494 } else {
495 RecordFirstMeaningfulPaintStatus(
496 internal::FIRST_MEANINGFUL_PAINT_BACKGROUNDED);
497 }
498 } else { 476 } else {
499 RecordFirstMeaningfulPaintStatus( 477 RecordFirstMeaningfulPaintStatus(
500 internal::FIRST_MEANINGFUL_PAINT_USER_INTERACTION_BEFORE_FMP); 478 internal::FIRST_MEANINGFUL_PAINT_BACKGROUNDED);
Bryan McQuade 2017/06/08 17:47:12 if the status now only has 2 values, should we get
Kunihiko Sakamoto 2017/06/09 05:48:16 It has two more values, "User left the page before
501 } 479 }
502 } 480 }
503 481
504 void CorePageLoadMetricsObserver::OnParseStart( 482 void CorePageLoadMetricsObserver::OnParseStart(
505 const page_load_metrics::mojom::PageLoadTiming& timing, 483 const page_load_metrics::mojom::PageLoadTiming& timing,
506 const page_load_metrics::PageLoadExtraInfo& info) { 484 const page_load_metrics::PageLoadExtraInfo& info) {
507 if (WasStartedInForegroundOptionalEventInForeground( 485 if (WasStartedInForegroundOptionalEventInForeground(
508 timing.parse_timing->parse_start, info)) { 486 timing.parse_timing->parse_start, info)) {
509 PAGE_LOAD_HISTOGRAM(internal::kHistogramParseStart, 487 PAGE_LOAD_HISTOGRAM(internal::kHistogramParseStart,
510 timing.parse_timing->parse_start.value()); 488 timing.parse_timing->parse_start.value());
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 } 617 }
640 // Provide an empty PageLoadTiming, since we don't have any timing metrics 618 // Provide an empty PageLoadTiming, since we don't have any timing metrics
641 // for failed provisional loads. 619 // for failed provisional loads.
642 RecordForegroundDurationHistograms(page_load_metrics::mojom::PageLoadTiming(), 620 RecordForegroundDurationHistograms(page_load_metrics::mojom::PageLoadTiming(),
643 extra_info, base::TimeTicks()); 621 extra_info, base::TimeTicks());
644 } 622 }
645 623
646 void CorePageLoadMetricsObserver::OnUserInput( 624 void CorePageLoadMetricsObserver::OnUserInput(
647 const blink::WebInputEvent& event) { 625 const blink::WebInputEvent& event) {
648 base::TimeTicks now; 626 base::TimeTicks now;
649 if (!first_paint_.is_null() &&
650 first_user_interaction_after_first_paint_.is_null() &&
651 event.GetType() != blink::WebInputEvent::kMouseMove) {
652 if (now.is_null())
653 now = base::TimeTicks::Now();
654 first_user_interaction_after_first_paint_ = now;
655 }
656 627
657 if (first_paint_.is_null()) 628 if (first_paint_.is_null())
658 return; 629 return;
659 630
660 if (!received_non_scroll_input_after_first_paint_) { 631 if (!received_non_scroll_input_after_first_paint_) {
661 if (event.GetType() == blink::WebInputEvent::kGestureTap || 632 if (event.GetType() == blink::WebInputEvent::kGestureTap ||
662 event.GetType() == blink::WebInputEvent::kMouseUp) { 633 event.GetType() == blink::WebInputEvent::kMouseUp) {
663 received_non_scroll_input_after_first_paint_ = true; 634 received_non_scroll_input_after_first_paint_ = true;
664 if (now.is_null()) 635 if (now.is_null())
665 now = base::TimeTicks::Now(); 636 now = base::TimeTicks::Now();
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
701 } 672 }
702 673
703 if (timing.paint_timing->first_paint && 674 if (timing.paint_timing->first_paint &&
704 !timing.paint_timing->first_meaningful_paint) { 675 !timing.paint_timing->first_meaningful_paint) {
705 RecordFirstMeaningfulPaintStatus( 676 RecordFirstMeaningfulPaintStatus(
706 timing.paint_timing->first_contentful_paint 677 timing.paint_timing->first_contentful_paint
707 ? internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE 678 ? internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE
708 : internal:: 679 : internal::
709 FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_FIRST_CONTENTFUL_PAINT); 680 FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_FIRST_CONTENTFUL_PAINT);
710 } 681 }
711
712 if (timing.paint_timing->first_paint) {
713 enum FirstMeaningfulPaintSignalStatus {
714 HAD_USER_INPUT = 1 << 0,
715 NETWORK_STABLE = 1 << 1,
716 FIRST_MEANINGFUL_PAINT_SIGNAL_STATUS_LAST_ENTRY = 1 << 2
717 };
718 int signal_status =
719 (first_user_interaction_after_first_paint_.is_null() ? 0
720 : HAD_USER_INPUT) +
721 (timing.paint_timing->first_meaningful_paint ? NETWORK_STABLE : 0);
722 UMA_HISTOGRAM_ENUMERATION(
723 internal::kHistogramFirstMeaningfulPaintSignalStatus2,
724 signal_status, FIRST_MEANINGFUL_PAINT_SIGNAL_STATUS_LAST_ENTRY);
725 }
726 if (timing.paint_timing->first_meaningful_paint) {
727 if (first_user_interaction_after_first_paint_.is_null()) {
728 PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaintNoUserInput,
729 timing.paint_timing->first_meaningful_paint.value());
730 } else {
731 PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaintHadUserInput,
732 timing.paint_timing->first_meaningful_paint.value());
733 }
734 }
735 } 682 }
736 683
737 void CorePageLoadMetricsObserver::RecordForegroundDurationHistograms( 684 void CorePageLoadMetricsObserver::RecordForegroundDurationHistograms(
738 const page_load_metrics::mojom::PageLoadTiming& timing, 685 const page_load_metrics::mojom::PageLoadTiming& timing,
739 const page_load_metrics::PageLoadExtraInfo& info, 686 const page_load_metrics::PageLoadExtraInfo& info,
740 base::TimeTicks app_background_time) { 687 base::TimeTicks app_background_time) {
741 base::Optional<base::TimeDelta> foreground_duration = 688 base::Optional<base::TimeDelta> foreground_duration =
742 GetInitialForegroundDuration(info, app_background_time); 689 GetInitialForegroundDuration(info, app_background_time);
743 if (!foreground_duration) 690 if (!foreground_duration)
744 return; 691 return;
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 } 802 }
856 803
857 // Log the eTLD+1 of sites that did not report first meaningful paint. 804 // Log the eTLD+1 of sites that did not report first meaningful paint.
858 if (timing.paint_timing->first_paint && 805 if (timing.paint_timing->first_paint &&
859 !timing.paint_timing->first_meaningful_paint) { 806 !timing.paint_timing->first_meaningful_paint) {
860 rappor::SampleDomainAndRegistryFromGURL( 807 rappor::SampleDomainAndRegistryFromGURL(
861 rappor_service, 808 rappor_service,
862 internal::kRapporMetricsNameFirstMeaningfulPaintNotRecorded, info.url); 809 internal::kRapporMetricsNameFirstMeaningfulPaintNotRecorded, info.url);
863 } 810 }
864 } 811 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698