| 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 |