Chromium Code Reviews| 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 |