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