OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |