Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(250)

Side by Side Diff: third_party/WebKit/Source/core/paint/FirstMeaningfulPaintDetector.cpp

Issue 2883273003: Move the user interaction policy for FirstMeaningfulPaint UMA into renderer (Closed)
Patch Set: rebase Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "core/paint/FirstMeaningfulPaintDetector.h" 5 #include "core/paint/FirstMeaningfulPaintDetector.h"
6 6
7 #include "core/css/FontFaceSet.h" 7 #include "core/css/FontFaceSet.h"
8 #include "core/dom/TaskRunnerHelper.h" 8 #include "core/dom/TaskRunnerHelper.h"
9 #include "core/paint/PaintTiming.h" 9 #include "core/paint/PaintTiming.h"
10 #include "platform/Histogram.h" 10 #include "platform/Histogram.h"
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 86
87 void FirstMeaningfulPaintDetector::NotifyPaint() { 87 void FirstMeaningfulPaintDetector::NotifyPaint() {
88 if (!next_paint_is_meaningful_) 88 if (!next_paint_is_meaningful_)
89 return; 89 return;
90 90
91 // Skip document background-only paints. 91 // Skip document background-only paints.
92 if (paint_timing_->FirstPaint() == 0.0) 92 if (paint_timing_->FirstPaint() == 0.0)
93 return; 93 return;
94 94
95 provisional_first_meaningful_paint_ = MonotonicallyIncreasingTime(); 95 provisional_first_meaningful_paint_ = MonotonicallyIncreasingTime();
96 had_user_input_before_provisional_first_meaningful_paint_ = had_user_input_;
96 next_paint_is_meaningful_ = false; 97 next_paint_is_meaningful_ = false;
97 98
98 if (network2_quiet_reached_) 99 if (network2_quiet_reached_)
99 return; 100 return;
100 101
101 TRACE_EVENT_MARK_WITH_TIMESTAMP1( 102 TRACE_EVENT_MARK_WITH_TIMESTAMP1(
102 "loading,devtools.timeline", "firstMeaningfulPaintCandidate", 103 "loading,devtools.timeline", "firstMeaningfulPaintCandidate",
103 TraceEvent::ToTraceTimestamp(provisional_first_meaningful_paint_), 104 TraceEvent::ToTraceTimestamp(provisional_first_meaningful_paint_),
104 "frame", GetDocument()->GetFrame()); 105 "frame", GetDocument()->GetFrame());
105 // Ignore the first meaningful paint candidate as this generally is the first 106 // Ignore the first meaningful paint candidate as this generally is the first
106 // contentful paint itself. 107 // contentful paint itself.
107 if (!seen_first_meaningful_paint_candidate_) { 108 if (!seen_first_meaningful_paint_candidate_) {
108 seen_first_meaningful_paint_candidate_ = true; 109 seen_first_meaningful_paint_candidate_ = true;
109 return; 110 return;
110 } 111 }
111 paint_timing_->SetFirstMeaningfulPaintCandidate( 112 paint_timing_->SetFirstMeaningfulPaintCandidate(
112 provisional_first_meaningful_paint_); 113 provisional_first_meaningful_paint_);
113 } 114 }
114 115
116 // This is called only on FirstMeaningfulPaintDetector for main frame.
117 void FirstMeaningfulPaintDetector::NotifyInputEvent() {
118 // Ignore user inputs before first paint.
119 if (paint_timing_->FirstPaint() == 0.0)
120 return;
121 had_user_input_ = kHadUserInput;
122 }
123
115 int FirstMeaningfulPaintDetector::ActiveConnections() { 124 int FirstMeaningfulPaintDetector::ActiveConnections() {
116 DCHECK(GetDocument()); 125 DCHECK(GetDocument());
117 ResourceFetcher* fetcher = GetDocument()->Fetcher(); 126 ResourceFetcher* fetcher = GetDocument()->Fetcher();
118 return fetcher->BlockingRequestCount() + fetcher->NonblockingRequestCount(); 127 return fetcher->BlockingRequestCount() + fetcher->NonblockingRequestCount();
119 } 128 }
120 129
121 // This function is called when the number of active connections is decreased. 130 // This function is called when the number of active connections is decreased.
122 void FirstMeaningfulPaintDetector::CheckNetworkStable() { 131 void FirstMeaningfulPaintDetector::CheckNetworkStable() {
123 DCHECK(GetDocument()); 132 DCHECK(GetDocument());
124 if (!GetDocument()->HasFinishedParsing()) 133 if (!GetDocument()->HasFinishedParsing())
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 // If there's only been one contentful paint, then there won't have been 178 // If there's only been one contentful paint, then there won't have been
170 // a meaningful paint signalled to the Scheduler, so mark one now. 179 // a meaningful paint signalled to the Scheduler, so mark one now.
171 // This is a no-op if a FMPC has already been marked. 180 // This is a no-op if a FMPC has already been marked.
172 paint_timing_->SetFirstMeaningfulPaintCandidate( 181 paint_timing_->SetFirstMeaningfulPaintCandidate(
173 provisional_first_meaningful_paint_); 182 provisional_first_meaningful_paint_);
174 // Enforce FirstContentfulPaint <= FirstMeaningfulPaint. 183 // Enforce FirstContentfulPaint <= FirstMeaningfulPaint.
175 first_meaningful_paint2_quiet_ = 184 first_meaningful_paint2_quiet_ =
176 std::max(provisional_first_meaningful_paint_, 185 std::max(provisional_first_meaningful_paint_,
177 paint_timing_->FirstContentfulPaint()); 186 paint_timing_->FirstContentfulPaint());
178 // Report FirstMeaningfulPaint when the page reached network 2-quiet. 187 // Report FirstMeaningfulPaint when the page reached network 2-quiet.
179 paint_timing_->SetFirstMeaningfulPaint(first_meaningful_paint2_quiet_); 188 paint_timing_->SetFirstMeaningfulPaint(
189 first_meaningful_paint2_quiet_,
190 had_user_input_before_provisional_first_meaningful_paint_);
180 } 191 }
181 ReportHistograms(); 192 ReportHistograms();
182 } 193 }
183 194
184 void FirstMeaningfulPaintDetector::ReportHistograms() { 195 void FirstMeaningfulPaintDetector::ReportHistograms() {
185 // This enum backs an UMA histogram, and should be treated as append-only. 196 // This enum backs an UMA histogram, and should be treated as append-only.
186 enum HadNetworkQuiet { 197 enum HadNetworkQuiet {
187 kHadNetwork0Quiet, 198 kHadNetwork0Quiet,
188 kHadNetwork2Quiet, 199 kHadNetwork2Quiet,
189 kHadNetworkQuietEnumMax 200 kHadNetworkQuietEnumMax
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 } else if (first_meaningful_paint2_quiet_) { 233 } else if (first_meaningful_paint2_quiet_) {
223 had_network_quiet_histogram.Count(kHadNetwork2Quiet); 234 had_network_quiet_histogram.Count(kHadNetwork2Quiet);
224 } 235 }
225 } 236 }
226 237
227 DEFINE_TRACE(FirstMeaningfulPaintDetector) { 238 DEFINE_TRACE(FirstMeaningfulPaintDetector) {
228 visitor->Trace(paint_timing_); 239 visitor->Trace(paint_timing_);
229 } 240 }
230 241
231 } // namespace blink 242 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698