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"; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |