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

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: Deprecate FirstMeaningfulPaintSignalStatus2 Created 3 years, 7 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";
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 "PageLoad.CoarseTiming.NavigationToFirstContentfulPaint"; 194 "PageLoad.CoarseTiming.NavigationToFirstContentfulPaint";
201 195
202 const char kRapporMetricsNameFirstMeaningfulPaintNotRecorded[] = 196 const char kRapporMetricsNameFirstMeaningfulPaintNotRecorded[] =
203 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintNotRecorded"; 197 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintNotRecorded";
204 198
205 const char kHistogramFirstContentfulPaintUserInitiated[] = 199 const char kHistogramFirstContentfulPaintUserInitiated[] =
206 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint.UserInitiated"; 200 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint.UserInitiated";
207 201
208 const char kHistogramFirstMeaningfulPaintStatus[] = 202 const char kHistogramFirstMeaningfulPaintStatus[] =
209 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintStatus"; 203 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintStatus";
210 const char kHistogramFirstMeaningfulPaintSignalStatus2[] =
211 "PageLoad.Experimental.PaintTiming.FirstMeaningfulPaintSignalStatus2";
212 204
213 const char kHistogramFirstNonScrollInputAfterFirstPaint[] = 205 const char kHistogramFirstNonScrollInputAfterFirstPaint[] =
214 "PageLoad.InputTiming.NavigationToFirstNonScroll.AfterPaint"; 206 "PageLoad.InputTiming.NavigationToFirstNonScroll.AfterPaint";
215 const char kHistogramFirstScrollInputAfterFirstPaint[] = 207 const char kHistogramFirstScrollInputAfterFirstPaint[] =
216 "PageLoad.InputTiming.NavigationToFirstScroll.AfterPaint"; 208 "PageLoad.InputTiming.NavigationToFirstScroll.AfterPaint";
217 209
218 const char kHistogramTotalBytes[] = "PageLoad.Experimental.Bytes.Total"; 210 const char kHistogramTotalBytes[] = "PageLoad.Experimental.Bytes.Total";
219 const char kHistogramNetworkBytes[] = "PageLoad.Experimental.Bytes.Network"; 211 const char kHistogramNetworkBytes[] = "PageLoad.Experimental.Bytes.Network";
220 const char kHistogramCacheBytes[] = "PageLoad.Experimental.Bytes.Cache"; 212 const char kHistogramCacheBytes[] = "PageLoad.Experimental.Bytes.Cache";
221 213
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 timing.paint_timing.first_contentful_paint.value() - 459 timing.paint_timing.first_contentful_paint.value() -
468 timing.parse_timing.parse_start.value()); 460 timing.parse_timing.parse_start.value());
469 } 461 }
470 } 462 }
471 463
472 void CorePageLoadMetricsObserver::OnFirstMeaningfulPaintInMainFrameDocument( 464 void CorePageLoadMetricsObserver::OnFirstMeaningfulPaintInMainFrameDocument(
473 const page_load_metrics::PageLoadTiming& timing, 465 const page_load_metrics::PageLoadTiming& timing,
474 const page_load_metrics::PageLoadExtraInfo& info) { 466 const page_load_metrics::PageLoadExtraInfo& info) {
475 base::TimeTicks paint = info.navigation_start + 467 base::TimeTicks paint = info.navigation_start +
476 timing.paint_timing.first_meaningful_paint.value(); 468 timing.paint_timing.first_meaningful_paint.value();
477 if (first_user_interaction_after_first_paint_.is_null() || 469 if (WasStartedInForegroundOptionalEventInForeground(
478 paint < first_user_interaction_after_first_paint_) { 470 timing.paint_timing.first_meaningful_paint, info)) {
479 if (WasStartedInForegroundOptionalEventInForeground( 471 PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaint,
480 timing.paint_timing.first_meaningful_paint, info)) { 472 timing.paint_timing.first_meaningful_paint.value());
481 PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaint, 473 PAGE_LOAD_HISTOGRAM(internal::kHistogramParseStartToFirstMeaningfulPaint,
482 timing.paint_timing.first_meaningful_paint.value()); 474 timing.paint_timing.first_meaningful_paint.value() -
483 PAGE_LOAD_HISTOGRAM(internal::kHistogramParseStartToFirstMeaningfulPaint, 475 timing.parse_timing.parse_start.value());
484 timing.paint_timing.first_meaningful_paint.value() - 476 PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaintToNetworkStable,
Bryan McQuade 2017/05/17 12:15:16 is this an important histogram to keep recording?
Kunihiko Sakamoto 2017/05/19 08:21:31 This histogram was useful to tune FMPDetector's ne
485 timing.parse_timing.parse_start.value()); 477 base::TimeTicks::Now() - paint);
486 PAGE_LOAD_HISTOGRAM( 478 RecordFirstMeaningfulPaintStatus(internal::FIRST_MEANINGFUL_PAINT_RECORDED);
487 internal::kHistogramFirstMeaningfulPaintToNetworkStable,
488 base::TimeTicks::Now() - paint);
489 RecordFirstMeaningfulPaintStatus(
490 internal::FIRST_MEANINGFUL_PAINT_RECORDED);
491 } else {
492 RecordFirstMeaningfulPaintStatus(
493 internal::FIRST_MEANINGFUL_PAINT_BACKGROUNDED);
494 }
495 } else { 479 } else {
496 RecordFirstMeaningfulPaintStatus( 480 RecordFirstMeaningfulPaintStatus(
497 internal::FIRST_MEANINGFUL_PAINT_USER_INTERACTION_BEFORE_FMP); 481 internal::FIRST_MEANINGFUL_PAINT_BACKGROUNDED);
498 } 482 }
499 } 483 }
500 484
501 void CorePageLoadMetricsObserver::OnParseStart( 485 void CorePageLoadMetricsObserver::OnParseStart(
502 const page_load_metrics::PageLoadTiming& timing, 486 const page_load_metrics::PageLoadTiming& timing,
503 const page_load_metrics::PageLoadExtraInfo& info) { 487 const page_load_metrics::PageLoadExtraInfo& info) {
504 if (WasStartedInForegroundOptionalEventInForeground( 488 if (WasStartedInForegroundOptionalEventInForeground(
505 timing.parse_timing.parse_start, info)) { 489 timing.parse_timing.parse_start, info)) {
506 PAGE_LOAD_HISTOGRAM(internal::kHistogramParseStart, 490 PAGE_LOAD_HISTOGRAM(internal::kHistogramParseStart,
507 timing.parse_timing.parse_start.value()); 491 timing.parse_timing.parse_start.value());
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
633 } 617 }
634 // 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
635 // for failed provisional loads. 619 // for failed provisional loads.
636 RecordForegroundDurationHistograms(page_load_metrics::PageLoadTiming(), 620 RecordForegroundDurationHistograms(page_load_metrics::PageLoadTiming(),
637 extra_info, base::TimeTicks()); 621 extra_info, base::TimeTicks());
638 } 622 }
639 623
640 void CorePageLoadMetricsObserver::OnUserInput( 624 void CorePageLoadMetricsObserver::OnUserInput(
641 const blink::WebInputEvent& event) { 625 const blink::WebInputEvent& event) {
642 base::TimeTicks now; 626 base::TimeTicks now;
643 if (!first_paint_.is_null() &&
644 first_user_interaction_after_first_paint_.is_null() &&
645 event.GetType() != blink::WebInputEvent::kMouseMove) {
646 if (now.is_null())
647 now = base::TimeTicks::Now();
648 first_user_interaction_after_first_paint_ = now;
649 }
650 627
651 if (first_paint_.is_null()) 628 if (first_paint_.is_null())
652 return; 629 return;
653 630
654 if (!received_non_scroll_input_after_first_paint_) { 631 if (!received_non_scroll_input_after_first_paint_) {
655 if (event.GetType() == blink::WebInputEvent::kGestureTap || 632 if (event.GetType() == blink::WebInputEvent::kGestureTap ||
656 event.GetType() == blink::WebInputEvent::kMouseUp) { 633 event.GetType() == blink::WebInputEvent::kMouseUp) {
657 received_non_scroll_input_after_first_paint_ = true; 634 received_non_scroll_input_after_first_paint_ = true;
658 if (now.is_null()) 635 if (now.is_null())
659 now = base::TimeTicks::Now(); 636 now = base::TimeTicks::Now();
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
695 } 672 }
696 673
697 if (timing.paint_timing.first_paint && 674 if (timing.paint_timing.first_paint &&
698 !timing.paint_timing.first_meaningful_paint) { 675 !timing.paint_timing.first_meaningful_paint) {
699 RecordFirstMeaningfulPaintStatus( 676 RecordFirstMeaningfulPaintStatus(
700 timing.paint_timing.first_contentful_paint 677 timing.paint_timing.first_contentful_paint
701 ? internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE 678 ? internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE
702 : internal:: 679 : internal::
703 FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_FIRST_CONTENTFUL_PAINT); 680 FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_FIRST_CONTENTFUL_PAINT);
704 } 681 }
705
706 if (timing.paint_timing.first_paint) {
707 enum FirstMeaningfulPaintSignalStatus {
708 HAD_USER_INPUT = 1 << 0,
709 NETWORK_STABLE = 1 << 1,
710 FIRST_MEANINGFUL_PAINT_SIGNAL_STATUS_LAST_ENTRY = 1 << 2
711 };
712 int signal_status =
713 (first_user_interaction_after_first_paint_.is_null() ? 0
714 : HAD_USER_INPUT) +
715 (timing.paint_timing.first_meaningful_paint ? NETWORK_STABLE : 0);
716 UMA_HISTOGRAM_ENUMERATION(
717 internal::kHistogramFirstMeaningfulPaintSignalStatus2,
718 signal_status, FIRST_MEANINGFUL_PAINT_SIGNAL_STATUS_LAST_ENTRY);
719 }
720 if (timing.paint_timing.first_meaningful_paint) {
721 if (first_user_interaction_after_first_paint_.is_null()) {
722 PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaintNoUserInput,
723 timing.paint_timing.first_meaningful_paint.value());
724 } else {
725 PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstMeaningfulPaintHadUserInput,
726 timing.paint_timing.first_meaningful_paint.value());
727 }
728 }
729 } 682 }
730 683
731 void CorePageLoadMetricsObserver::RecordForegroundDurationHistograms( 684 void CorePageLoadMetricsObserver::RecordForegroundDurationHistograms(
732 const page_load_metrics::PageLoadTiming& timing, 685 const page_load_metrics::PageLoadTiming& timing,
733 const page_load_metrics::PageLoadExtraInfo& info, 686 const page_load_metrics::PageLoadExtraInfo& info,
734 base::TimeTicks app_background_time) { 687 base::TimeTicks app_background_time) {
735 base::Optional<base::TimeDelta> foreground_duration = 688 base::Optional<base::TimeDelta> foreground_duration =
736 GetInitialForegroundDuration(info, app_background_time); 689 GetInitialForegroundDuration(info, app_background_time);
737 if (!foreground_duration) 690 if (!foreground_duration)
738 return; 691 return;
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
849 } 802 }
850 803
851 // 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.
852 if (timing.paint_timing.first_paint && 805 if (timing.paint_timing.first_paint &&
853 !timing.paint_timing.first_meaningful_paint) { 806 !timing.paint_timing.first_meaningful_paint) {
854 rappor::SampleDomainAndRegistryFromGURL( 807 rappor::SampleDomainAndRegistryFromGURL(
855 rappor_service, 808 rappor_service,
856 internal::kRapporMetricsNameFirstMeaningfulPaintNotRecorded, info.url); 809 internal::kRapporMetricsNameFirstMeaningfulPaintNotRecorded, info.url);
857 } 810 }
858 } 811 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698