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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |