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

Side by Side Diff: chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc

Issue 2868213003: Various cleanups for page_load_metrics_browsertest (Closed)
Patch Set: cleanup Created 3 years, 7 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 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 "base/files/scoped_temp_dir.h" 5 #include "base/files/scoped_temp_dir.h"
6 #include "base/macros.h" 6 #include "base/macros.h"
7 #include "base/test/histogram_tester.h" 7 #include "base/test/histogram_tester.h"
8 #include "base/threading/thread_restrictions.h" 8 #include "base/threading/thread_restrictions.h"
9 #include "base/time/time.h" 9 #include "base/time/time.h"
10 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" 10 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h"
(...skipping 21 matching lines...) Expand all
32 #include "content/public/test/download_test_observer.h" 32 #include "content/public/test/download_test_observer.h"
33 #include "net/http/failing_http_transaction_factory.h" 33 #include "net/http/failing_http_transaction_factory.h"
34 #include "net/http/http_cache.h" 34 #include "net/http/http_cache.h"
35 #include "net/test/embedded_test_server/embedded_test_server.h" 35 #include "net/test/embedded_test_server/embedded_test_server.h"
36 #include "net/test/url_request/url_request_failed_job.h" 36 #include "net/test/url_request/url_request_failed_job.h"
37 #include "net/url_request/url_request_context.h" 37 #include "net/url_request/url_request_context.h"
38 #include "net/url_request/url_request_context_getter.h" 38 #include "net/url_request/url_request_context_getter.h"
39 39
40 namespace { 40 namespace {
41 41
42 void FailAllNetworkTransactions(net::URLRequestContextGetter* getter) {
43 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
44 net::HttpCache* cache(
45 getter->GetURLRequestContext()->http_transaction_factory()->GetCache());
46 DCHECK(cache);
47 std::unique_ptr<net::FailingHttpTransactionFactory> factory(
48 new net::FailingHttpTransactionFactory(cache->GetSession(),
jkarlin 2017/05/10 18:45:05 base::MakeUnique while we're here :)
Bryan McQuade 2017/05/10 19:14:33 Done
49 net::ERR_FAILED));
jkarlin 2017/05/10 18:45:04 Include the net error header
Bryan McQuade 2017/05/10 19:14:33 Done
50 // Throw away old version; since this is a browser test, there is no
51 // need to restore the old state.
52 cache->SetHttpNetworkTransactionFactoryForTesting(std::move(factory));
53 }
54
42 // Waits until specified timing and metadata expectations are satisfied. 55 // Waits until specified timing and metadata expectations are satisfied.
43 class PageLoadMetricsWaiter 56 class PageLoadMetricsWaiter
44 : public page_load_metrics::MetricsWebContentsObserver::TestingObserver { 57 : public page_load_metrics::MetricsWebContentsObserver::TestingObserver {
45 public: 58 public:
46 // A bitvector to express which timing fields to match on. 59 // A bitvector to express which timing fields to match on.
47 enum ExpectedTimingFields { 60 enum class ExpectedTimingField : int {
48 FIRST_PAINT = 1 << 0, 61 FIRST_LAYOUT = 1 << 0,
49 FIRST_CONTENTFUL_PAINT = 1 << 1, 62 FIRST_PAINT = 1 << 1,
50 STYLE_UPDATE_BEFORE_FCP = 1 << 2 63 FIRST_CONTENTFUL_PAINT = 1 << 2,
64 FIRST_MEANINGFUL_PAINT = 1 << 3,
65 STYLE_UPDATE_BEFORE_FCP = 1 << 4,
66 DOCUMENT_WRITE_BLOCK_RELOAD = 1 << 5,
67 LOAD_EVENT = 1 << 6
51 }; 68 };
52 69
53 explicit PageLoadMetricsWaiter(content::WebContents* web_contents) 70 explicit PageLoadMetricsWaiter(content::WebContents* web_contents)
54 : TestingObserver(web_contents) {} 71 : TestingObserver(web_contents) {}
55 72
56 ~PageLoadMetricsWaiter() override { DCHECK_EQ(nullptr, run_loop_.get()); } 73 ~PageLoadMetricsWaiter() override { DCHECK_EQ(nullptr, run_loop_.get()); }
57 74
58 // Add the given expectation to match on. 75 // Add the given expectation to match on.
59 void AddExpectation(ExpectedTimingFields fields) { 76 void AddMainFrameExpectation(ExpectedTimingField field) {
60 matching_fields_ |= fields; 77 main_frame_expected_fields_.set(field);
61 } 78 }
62 79 void AddSubFrameExpectation(ExpectedTimingField field) {
63 // Instructs observer to also watch for |count| 80 child_frame_expected_fields_.set(field);
64 // WebLoadingBehaviorDocumentWriteBlockReload events.
65 void ExpectDocumentWriteBlockReload(int count) {
66 match_document_write_block_reload_ = count;
67 } 81 }
68 82
69 // Waits for a TimingUpdated IPC that matches the fields set by 83 // Waits for a TimingUpdated IPC that matches the fields set by
70 // |AddExpectation|. All matching fields must be set in a TimingUpdated 84 // |AddMainFrameExpectation| and |AddSubFrameExpectation|. All matching fields
71 // IPC for it to end this wait. 85 // must be set in a TimingUpdated IPC for it to end this wait.
72 void Wait() { 86 void Wait() {
73 if (expectations_satisfied_) 87 if (expectations_satisfied())
74 return; 88 return;
75 89
76 run_loop_.reset(new base::RunLoop()); 90 run_loop_.reset(new base::RunLoop());
77 run_loop_->Run(); 91 run_loop_->Run();
78 run_loop_.reset(nullptr); 92 run_loop_.reset(nullptr);
79 93
80 EXPECT_TRUE(expectations_satisfied_); 94 EXPECT_TRUE(expectations_satisfied());
81 } 95 }
82 96
83 private: 97 private:
98 // Manages a bitset of ExpectedTimingFields.
99 class ExpectedTimingFieldBitSet {
100 public:
101 ExpectedTimingFieldBitSet() {}
102
103 // Returns whether this bitset has all bits unset.
104 bool empty() const { return bitmask_ == 0; }
jkarlin 2017/05/10 18:45:04 Empty
Bryan McQuade 2017/05/10 19:14:32 Done. I interpreted the style guide as indicating
jkarlin 2017/05/11 14:04:05 I mostly agree with you that they could be lowerca
105
106 // Sets the bit for the given |field|.
107 void set(ExpectedTimingField field) { bitmask_ |= static_cast<int>(field); }
jkarlin 2017/05/10 18:45:05 Set
Bryan McQuade 2017/05/10 19:14:32 Done
108
109 // Clears all bits set in the |other| bitset.
110 void clear(const ExpectedTimingFieldBitSet& other) {
jkarlin 2017/05/10 18:45:04 Typically I think of clear as clearing everything.
Bryan McQuade 2017/05/10 19:14:33 changed to ClearMatching.
111 bitmask_ &= ~other.bitmask_;
112 }
113
114 private:
115 int bitmask_ = 0;
116 };
117
118 static ExpectedTimingFieldBitSet GetMatchedBits(
119 const page_load_metrics::PageLoadTiming& timing,
120 const page_load_metrics::PageLoadMetadata& metadata) {
121 ExpectedTimingFieldBitSet matched_bits;
122 if (timing.document_timing.first_layout)
123 matched_bits.set(ExpectedTimingField::FIRST_LAYOUT);
124 if (timing.document_timing.load_event_start)
125 matched_bits.set(ExpectedTimingField::LOAD_EVENT);
126 if (timing.paint_timing.first_paint)
127 matched_bits.set(ExpectedTimingField::FIRST_PAINT);
128 if (timing.paint_timing.first_contentful_paint)
129 matched_bits.set(ExpectedTimingField::FIRST_CONTENTFUL_PAINT);
130 if (timing.paint_timing.first_meaningful_paint)
131 matched_bits.set(ExpectedTimingField::FIRST_MEANINGFUL_PAINT);
132 if (timing.style_sheet_timing.update_style_duration_before_fcp)
133 matched_bits.set(ExpectedTimingField::STYLE_UPDATE_BEFORE_FCP);
134 if (metadata.behavior_flags &
135 blink::WebLoadingBehaviorFlag::
136 kWebLoadingBehaviorDocumentWriteBlockReload)
137 matched_bits.set(ExpectedTimingField::DOCUMENT_WRITE_BLOCK_RELOAD);
138
139 return matched_bits;
140 }
141
84 void OnTimingUpdated( 142 void OnTimingUpdated(
143 bool is_main_frame,
85 const page_load_metrics::PageLoadTiming& timing, 144 const page_load_metrics::PageLoadTiming& timing,
86 const page_load_metrics::PageLoadMetadata& metadata) override { 145 const page_load_metrics::PageLoadMetadata& metadata) override {
87 if (match_document_write_block_reload_ > 0 && 146 if (expectations_satisfied())
88 metadata.behavior_flags & 147 return;
89 blink::WebLoadingBehaviorFlag::
90 kWebLoadingBehaviorDocumentWriteBlockReload) {
91 --match_document_write_block_reload_;
92 }
93 148
94 if (match_document_write_block_reload_ > 0) { 149 ExpectedTimingFieldBitSet matched_bits = GetMatchedBits(timing, metadata);
95 return; 150 if (is_main_frame)
96 } 151 main_frame_expected_fields_.clear(matched_bits);
152 else
153 child_frame_expected_fields_.clear(matched_bits);
97 154
98 if ((!(matching_fields_ & FIRST_PAINT) || 155 if (expectations_satisfied() && run_loop_)
99 timing.paint_timing.first_paint) && 156 run_loop_->Quit();
100 (!(matching_fields_ & FIRST_CONTENTFUL_PAINT) || 157 }
101 timing.paint_timing.first_contentful_paint) && 158
102 (!(matching_fields_ & STYLE_UPDATE_BEFORE_FCP) || 159 bool expectations_satisfied() const {
103 timing.style_sheet_timing.update_style_duration_before_fcp)) { 160 return child_frame_expected_fields_.empty() &&
104 expectations_satisfied_ = true; 161 main_frame_expected_fields_.empty();
105 if (run_loop_)
106 run_loop_->Quit();
107 }
108 } 162 }
109 163
110 std::unique_ptr<base::RunLoop> run_loop_; 164 std::unique_ptr<base::RunLoop> run_loop_;
111 int matching_fields_ = 0; // A bitvector composed from ExpectedTimingFields. 165
112 bool expectations_satisfied_ = false; 166 ExpectedTimingFieldBitSet child_frame_expected_fields_;
113 int match_document_write_block_reload_ = 0; 167 ExpectedTimingFieldBitSet main_frame_expected_fields_;
114 }; 168 };
115 169
170 using ExpectedTimingField = PageLoadMetricsWaiter::ExpectedTimingField;
171
116 } // namespace 172 } // namespace
117 173
118 class PageLoadMetricsBrowserTest : public InProcessBrowserTest { 174 class PageLoadMetricsBrowserTest : public InProcessBrowserTest {
119 public: 175 public:
120 PageLoadMetricsBrowserTest() {} 176 PageLoadMetricsBrowserTest() {}
121 ~PageLoadMetricsBrowserTest() override {} 177 ~PageLoadMetricsBrowserTest() override {}
122 178
123 protected: 179 protected:
180 // Force navigation to a new page, so the currently tracked page load runs its
181 // OnComplete callback. You should prefer to use PageLoadMetricsWaiter, and
182 // only use NavigateToUntrackedUrl for cases where the waiter isn't
183 // sufficient.
124 void NavigateToUntrackedUrl() { 184 void NavigateToUntrackedUrl() {
125 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); 185 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
126 } 186 }
127 187
128 bool NoPageLoadMetricsRecorded() { 188 bool NoPageLoadMetricsRecorded() {
129 // Determine whether any 'public' page load metrics are recorded. We exclude 189 // Determine whether any 'public' page load metrics are recorded. We exclude
130 // 'internal' metrics as these may be recorded for debugging purposes. 190 // 'internal' metrics as these may be recorded for debugging purposes.
131 size_t total_pageload_histograms = 191 size_t total_pageload_histograms =
132 histogram_tester_.GetTotalCountsForPrefix("PageLoad.").size(); 192 histogram_tester_.GetTotalCountsForPrefix("PageLoad.").size();
133 size_t total_internal_histograms = 193 size_t total_internal_histograms =
134 histogram_tester_.GetTotalCountsForPrefix("PageLoad.Internal.").size(); 194 histogram_tester_.GetTotalCountsForPrefix("PageLoad.Internal.").size();
135 DCHECK_GE(total_pageload_histograms, total_internal_histograms); 195 DCHECK_GE(total_pageload_histograms, total_internal_histograms);
136 return total_pageload_histograms - total_internal_histograms == 0; 196 return total_pageload_histograms - total_internal_histograms == 0;
137 } 197 }
138 198
139 std::unique_ptr<PageLoadMetricsWaiter> CreatePageLoadMetricsWaiter() { 199 std::unique_ptr<PageLoadMetricsWaiter> CreatePageLoadMetricsWaiter() {
140 content::WebContents* web_contents = 200 content::WebContents* web_contents =
141 browser()->tab_strip_model()->GetActiveWebContents(); 201 browser()->tab_strip_model()->GetActiveWebContents();
142 return base::MakeUnique<PageLoadMetricsWaiter>(web_contents); 202 return base::MakeUnique<PageLoadMetricsWaiter>(web_contents);
143 } 203 }
144 204
145 base::HistogramTester histogram_tester_; 205 base::HistogramTester histogram_tester_;
146 206
147 private: 207 private:
148 DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsBrowserTest); 208 DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsBrowserTest);
149 }; 209 };
150 210
151 void FailAllNetworkTransactions(net::URLRequestContextGetter* getter) {
152 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
153 net::HttpCache* cache(
154 getter->GetURLRequestContext()->http_transaction_factory()->GetCache());
155 DCHECK(cache);
156 std::unique_ptr<net::FailingHttpTransactionFactory> factory(
157 new net::FailingHttpTransactionFactory(cache->GetSession(),
158 net::ERR_FAILED));
159 // Throw away old version; since this is a browser test, there is no
160 // need to restore the old state.
161 cache->SetHttpNetworkTransactionFactoryForTesting(std::move(factory));
162 }
163
164 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoNavigation) { 211 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoNavigation) {
165 ASSERT_TRUE(embedded_test_server()->Start()); 212 ASSERT_TRUE(embedded_test_server()->Start());
166 EXPECT_TRUE(NoPageLoadMetricsRecorded()); 213 EXPECT_TRUE(NoPageLoadMetricsRecorded());
167 } 214 }
168 215
169 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NewPage) { 216 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NewPage) {
170 ASSERT_TRUE(embedded_test_server()->Start()); 217 ASSERT_TRUE(embedded_test_server()->Start());
171 218
219 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
jkarlin 2017/05/10 18:45:05 optional: auto seems reasonable here
Bryan McQuade 2017/05/10 19:14:32 done
220 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_PAINT);
jkarlin 2017/05/10 18:45:04 Seems like it would be useful to have a constructo
Bryan McQuade 2017/05/10 19:14:32 I'm disinclined to do this since we have main and
jkarlin 2017/05/11 14:04:05 Fair point. The constructor could take two values,
172 ui_test_utils::NavigateToURL(browser(), 221 ui_test_utils::NavigateToURL(browser(),
173 embedded_test_server()->GetURL("/title1.html")); 222 embedded_test_server()->GetURL("/title1.html"));
174 NavigateToUntrackedUrl(); 223 waiter->Wait();
175 224
176 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); 225 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1);
177 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); 226 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1);
178 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); 227 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1);
228 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1);
179 histogram_tester_.ExpectTotalCount(internal::kHistogramParseDuration, 1); 229 histogram_tester_.ExpectTotalCount(internal::kHistogramParseDuration, 1);
180 histogram_tester_.ExpectTotalCount( 230 histogram_tester_.ExpectTotalCount(
181 internal::kHistogramParseBlockedOnScriptLoad, 1); 231 internal::kHistogramParseBlockedOnScriptLoad, 1);
182 histogram_tester_.ExpectTotalCount( 232 histogram_tester_.ExpectTotalCount(
183 internal::kHistogramParseBlockedOnScriptExecution, 1); 233 internal::kHistogramParseBlockedOnScriptExecution, 1);
234
235 // Force navigation to another page, which should force logging of histograms
236 // persisted at the end of the page load lifetime.
237 NavigateToUntrackedUrl();
184 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); 238 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1);
185 histogram_tester_.ExpectTotalCount( 239 histogram_tester_.ExpectTotalCount(
186 internal::kHistogramPageTimingForegroundDuration, 1); 240 internal::kHistogramPageTimingForegroundDuration, 1);
187 241
188 // Verify that NoPageLoadMetricsRecorded returns false when PageLoad metrics 242 // Verify that NoPageLoadMetricsRecorded returns false when PageLoad metrics
189 // have been recorded. 243 // have been recorded.
190 EXPECT_FALSE(NoPageLoadMetricsRecorded()); 244 EXPECT_FALSE(NoPageLoadMetricsRecorded());
191 } 245 }
192 246
247 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPaintForEmptyDocument) {
248 ASSERT_TRUE(embedded_test_server()->Start());
249
250 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
jkarlin 2017/05/10 18:45:05 What if you could also create a set of unexpected
Bryan McQuade 2017/05/10 19:14:33 Sure, I added an API for this.
251 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_LAYOUT);
252 waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT);
253 ui_test_utils::NavigateToURL(browser(),
254 embedded_test_server()->GetURL("/empty.html"));
255 waiter->Wait();
256
257 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1);
258 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1);
259 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0);
260 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint,
261 0);
262 }
263
193 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameDocumentNavigation) { 264 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameDocumentNavigation) {
194 ASSERT_TRUE(embedded_test_server()->Start()); 265 ASSERT_TRUE(embedded_test_server()->Start());
195 266
267 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
268 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_LAYOUT);
269 waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT);
196 ui_test_utils::NavigateToURL(browser(), 270 ui_test_utils::NavigateToURL(browser(),
197 embedded_test_server()->GetURL("/title1.html")); 271 embedded_test_server()->GetURL("/title1.html"));
272 waiter->Wait();
273
274 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1);
275 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1);
276 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1);
277
278 // Perform a same-document navigation. No additional metrics should be logged.
198 ui_test_utils::NavigateToURL( 279 ui_test_utils::NavigateToURL(
199 browser(), embedded_test_server()->GetURL("/title1.html#hash")); 280 browser(), embedded_test_server()->GetURL("/title1.html#hash"));
200 NavigateToUntrackedUrl(); 281 NavigateToUntrackedUrl();
201 282
202 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); 283 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1);
203 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); 284 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1);
204 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); 285 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1);
205 } 286 }
206 287
207 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameUrlNavigation) { 288 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameUrlNavigation) {
208 ASSERT_TRUE(embedded_test_server()->Start()); 289 ASSERT_TRUE(embedded_test_server()->Start());
209 290
291 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
292 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_LAYOUT);
293 waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT);
210 ui_test_utils::NavigateToURL(browser(), 294 ui_test_utils::NavigateToURL(browser(),
211 embedded_test_server()->GetURL("/title1.html")); 295 embedded_test_server()->GetURL("/title1.html"));
296 waiter->Wait();
297
298 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1);
299 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1);
300 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1);
301
302 waiter = CreatePageLoadMetricsWaiter();
303 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_LAYOUT);
304 waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT);
212 ui_test_utils::NavigateToURL(browser(), 305 ui_test_utils::NavigateToURL(browser(),
213 embedded_test_server()->GetURL("/title1.html")); 306 embedded_test_server()->GetURL("/title1.html"));
214 NavigateToUntrackedUrl(); 307 waiter->Wait();
215 308
216 // We expect one histogram sample for each navigation to title1.html. 309 // We expect one histogram sample for each navigation to title1.html.
217 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 2); 310 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 2);
218 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 2); 311 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 2);
219 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 2); 312 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 2);
220 } 313 }
221 314
222 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NonHtmlMainResource) { 315 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NonHtmlMainResource) {
223 ASSERT_TRUE(embedded_test_server()->Start()); 316 ASSERT_TRUE(embedded_test_server()->Start());
224 317
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 browser(), embedded_test_server()->GetURL("/download-test3.gif")); 382 browser(), embedded_test_server()->GetURL("/download-test3.gif"));
290 downloads_observer.WaitForFinished(); 383 downloads_observer.WaitForFinished();
291 384
292 NavigateToUntrackedUrl(); 385 NavigateToUntrackedUrl();
293 EXPECT_TRUE(NoPageLoadMetricsRecorded()); 386 EXPECT_TRUE(NoPageLoadMetricsRecorded());
294 } 387 }
295 388
296 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PreloadDocumentWrite) { 389 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PreloadDocumentWrite) {
297 ASSERT_TRUE(embedded_test_server()->Start()); 390 ASSERT_TRUE(embedded_test_server()->Start());
298 391
299 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = 392 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
300 CreatePageLoadMetricsWaiter(); 393 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT);
301 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT);
302 394
303 ui_test_utils::NavigateToURL( 395 ui_test_utils::NavigateToURL(
304 browser(), embedded_test_server()->GetURL( 396 browser(), embedded_test_server()->GetURL(
305 "/page_load_metrics/document_write_external_script.html")); 397 "/page_load_metrics/document_write_external_script.html"));
306 fcp_waiter->Wait(); 398 waiter->Wait();
307 399
308 histogram_tester_.ExpectTotalCount( 400 histogram_tester_.ExpectTotalCount(
309 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 1); 401 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 1);
310 } 402 }
311 403
312 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPreloadDocumentWrite) { 404 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPreloadDocumentWrite) {
313 ASSERT_TRUE(embedded_test_server()->Start()); 405 ASSERT_TRUE(embedded_test_server()->Start());
314 406
407 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
408 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT);
315 ui_test_utils::NavigateToURL( 409 ui_test_utils::NavigateToURL(
316 browser(), embedded_test_server()->GetURL( 410 browser(), embedded_test_server()->GetURL(
317 "/page_load_metrics/document_write_no_script.html")); 411 "/page_load_metrics/document_write_no_script.html"));
318 NavigateToUntrackedUrl(); 412 waiter->Wait();
319 413
414 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint,
415 1);
320 histogram_tester_.ExpectTotalCount( 416 histogram_tester_.ExpectTotalCount(
321 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0); 417 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0);
322 } 418 }
323 419
324 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWrite) { 420 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWrite) {
325 ASSERT_TRUE(embedded_test_server()->Start()); 421 ASSERT_TRUE(embedded_test_server()->Start());
326 422
327 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = 423 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
328 CreatePageLoadMetricsWaiter(); 424 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT);
329 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT);
330 425
331 ui_test_utils::NavigateToURL(browser(), 426 ui_test_utils::NavigateToURL(browser(),
332 embedded_test_server()->GetURL("/title1.html")); 427 embedded_test_server()->GetURL("/title1.html"));
333 fcp_waiter->Wait(); 428 waiter->Wait();
334 429
430 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint,
431 1);
335 histogram_tester_.ExpectTotalCount( 432 histogram_tester_.ExpectTotalCount(
336 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0); 433 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0);
337 histogram_tester_.ExpectTotalCount( 434 histogram_tester_.ExpectTotalCount(
338 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); 435 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0);
339 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); 436 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0);
340 } 437 }
341 438
342 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteBlock) { 439 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteBlock) {
343 ASSERT_TRUE(embedded_test_server()->Start()); 440 ASSERT_TRUE(embedded_test_server()->Start());
344 441
345 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = 442 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
346 CreatePageLoadMetricsWaiter(); 443 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT);
347 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT);
348 444
349 ui_test_utils::NavigateToURL( 445 ui_test_utils::NavigateToURL(
350 browser(), embedded_test_server()->GetURL( 446 browser(), embedded_test_server()->GetURL(
351 "/page_load_metrics/document_write_script_block.html")); 447 "/page_load_metrics/document_write_script_block.html"));
352 fcp_waiter->Wait(); 448 waiter->Wait();
353 449
354 histogram_tester_.ExpectTotalCount( 450 histogram_tester_.ExpectTotalCount(
355 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); 451 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1);
356 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1); 452 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1);
357 } 453 }
358 454
359 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) { 455 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) {
360 ASSERT_TRUE(embedded_test_server()->Start()); 456 ASSERT_TRUE(embedded_test_server()->Start());
361 457
362 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = 458 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
363 CreatePageLoadMetricsWaiter(); 459 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT);
364 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT);
365 std::unique_ptr<PageLoadMetricsWaiter> reload_waiter =
366 CreatePageLoadMetricsWaiter();
367 reload_waiter->ExpectDocumentWriteBlockReload(2);
368
369 ui_test_utils::NavigateToURL( 460 ui_test_utils::NavigateToURL(
370 browser(), embedded_test_server()->GetURL( 461 browser(), embedded_test_server()->GetURL(
371 "/page_load_metrics/document_write_script_block.html")); 462 "/page_load_metrics/document_write_script_block.html"));
463 waiter->Wait();
464
465 histogram_tester_.ExpectTotalCount(
466 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1);
467 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1);
372 468
373 // Reload should not log the histogram as the script is not blocked. 469 // Reload should not log the histogram as the script is not blocked.
470 std::unique_ptr<PageLoadMetricsWaiter> reload_waiter =
471 CreatePageLoadMetricsWaiter();
472 reload_waiter->AddMainFrameExpectation(
473 ExpectedTimingField::DOCUMENT_WRITE_BLOCK_RELOAD);
474 reload_waiter->AddMainFrameExpectation(
475 ExpectedTimingField::FIRST_CONTENTFUL_PAINT);
374 ui_test_utils::NavigateToURL( 476 ui_test_utils::NavigateToURL(
375 browser(), embedded_test_server()->GetURL( 477 browser(), embedded_test_server()->GetURL(
376 "/page_load_metrics/document_write_script_block.html")); 478 "/page_load_metrics/document_write_script_block.html"));
479 reload_waiter->Wait();
377 480
481 histogram_tester_.ExpectTotalCount(
482 internal::kHistogramDocWriteBlockReloadCount, 1);
483
484 reload_waiter = CreatePageLoadMetricsWaiter();
485 reload_waiter->AddMainFrameExpectation(
486 ExpectedTimingField::DOCUMENT_WRITE_BLOCK_RELOAD);
487 reload_waiter->AddMainFrameExpectation(
488 ExpectedTimingField::FIRST_CONTENTFUL_PAINT);
378 ui_test_utils::NavigateToURL( 489 ui_test_utils::NavigateToURL(
379 browser(), embedded_test_server()->GetURL( 490 browser(), embedded_test_server()->GetURL(
380 "/page_load_metrics/document_write_script_block.html")); 491 "/page_load_metrics/document_write_script_block.html"));
381
382 histogram_tester_.ExpectTotalCount(
383 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1);
384
385 fcp_waiter->Wait();
386 reload_waiter->Wait(); 492 reload_waiter->Wait();
387 493
388 histogram_tester_.ExpectTotalCount( 494 histogram_tester_.ExpectTotalCount(
389 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); 495 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1);
390 496
391 histogram_tester_.ExpectTotalCount( 497 histogram_tester_.ExpectTotalCount(
392 internal::kHistogramDocWriteBlockReloadCount, 2); 498 internal::kHistogramDocWriteBlockReloadCount, 2);
393 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1); 499 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1);
394 } 500 }
395 501
396 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteAsync) { 502 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteAsync) {
397 ASSERT_TRUE(embedded_test_server()->Start()); 503 ASSERT_TRUE(embedded_test_server()->Start());
398 504
505 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
506 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT);
399 ui_test_utils::NavigateToURL( 507 ui_test_utils::NavigateToURL(
400 browser(), embedded_test_server()->GetURL( 508 browser(), embedded_test_server()->GetURL(
401 "/page_load_metrics/document_write_script_async.html")); 509 "/page_load_metrics/document_write_async_script.html"));
402 NavigateToUntrackedUrl(); 510 waiter->Wait();
403 511
512 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint,
513 1);
404 histogram_tester_.ExpectTotalCount( 514 histogram_tester_.ExpectTotalCount(
405 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); 515 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0);
406 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); 516 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0);
407 } 517 }
408 518
409 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteSameDomain) { 519 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteSameDomain) {
410 ASSERT_TRUE(embedded_test_server()->Start()); 520 ASSERT_TRUE(embedded_test_server()->Start());
411 521
522 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
523 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT);
412 ui_test_utils::NavigateToURL( 524 ui_test_utils::NavigateToURL(
413 browser(), embedded_test_server()->GetURL( 525 browser(), embedded_test_server()->GetURL(
414 "/page_load_metrics/document_write_external_script.html")); 526 "/page_load_metrics/document_write_external_script.html"));
415 NavigateToUntrackedUrl(); 527 waiter->Wait();
416 528
529 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint,
530 1);
417 histogram_tester_.ExpectTotalCount( 531 histogram_tester_.ExpectTotalCount(
418 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); 532 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0);
419 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); 533 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0);
420 } 534 }
421 535
422 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWriteScript) { 536 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWriteScript) {
423 ASSERT_TRUE(embedded_test_server()->Start()); 537 ASSERT_TRUE(embedded_test_server()->Start());
424 538
539 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
540 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT);
425 ui_test_utils::NavigateToURL( 541 ui_test_utils::NavigateToURL(
426 browser(), embedded_test_server()->GetURL( 542 browser(), embedded_test_server()->GetURL(
427 "/page_load_metrics/document_write_no_script.html")); 543 "/page_load_metrics/document_write_no_script.html"));
428 NavigateToUntrackedUrl(); 544 waiter->Wait();
429 545
546 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint,
547 1);
430 histogram_tester_.ExpectTotalCount( 548 histogram_tester_.ExpectTotalCount(
431 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); 549 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0);
432 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); 550 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0);
433 } 551 }
434 552
435 // TODO(crbug.com/712935): Flaky on Linux dbg. 553 // TODO(crbug.com/712935): Flaky on Linux dbg.
436 #if defined(OS_LINUX) && !defined(NDEBUG) 554 #if defined(OS_LINUX) && !defined(NDEBUG)
437 #define MAYBE_BadXhtml DISABLED_BadXhtml 555 #define MAYBE_BadXhtml DISABLED_BadXhtml
438 #else 556 #else
439 #define MAYBE_BadXhtml BadXhtml 557 #define MAYBE_BadXhtml BadXhtml
440 #endif 558 #endif
441 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, MAYBE_BadXhtml) { 559 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, MAYBE_BadXhtml) {
442 ASSERT_TRUE(embedded_test_server()->Start()); 560 ASSERT_TRUE(embedded_test_server()->Start());
443 561
444 std::unique_ptr<PageLoadMetricsWaiter> timing_waiter = 562 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
445 CreatePageLoadMetricsWaiter(); 563 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_PAINT);
446 timing_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_PAINT);
447 564
448 // When an XHTML page contains invalid XML, it causes a paint of the error 565 // When an XHTML page contains invalid XML, it causes a paint of the error
449 // message without a layout. Page load metrics currently treats this as an 566 // message without a layout. Page load metrics currently treats this as an
450 // error. Eventually, we'll fix this by special casing the handling of 567 // error. Eventually, we'll fix this by special casing the handling of
451 // documents with non-well-formed XML on the blink side. See crbug.com/627607 568 // documents with non-well-formed XML on the blink side. See crbug.com/627607
452 // for more. 569 // for more.
453 ui_test_utils::NavigateToURL( 570 ui_test_utils::NavigateToURL(
454 browser(), 571 browser(),
455 embedded_test_server()->GetURL("/page_load_metrics/badxml.xhtml")); 572 embedded_test_server()->GetURL("/page_load_metrics/badxml.xhtml"));
456 573
457 timing_waiter->Wait(); 574 waiter->Wait();
458 575
459 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 0); 576 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 0);
460 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); 577 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0);
461 histogram_tester_.ExpectTotalCount(page_load_metrics::internal::kErrorEvents, 578 histogram_tester_.ExpectTotalCount(page_load_metrics::internal::kErrorEvents,
462 1); 579 1);
463 histogram_tester_.ExpectBucketCount( 580 histogram_tester_.ExpectBucketCount(
464 page_load_metrics::internal::kErrorEvents, 581 page_load_metrics::internal::kErrorEvents,
465 page_load_metrics::ERR_BAD_TIMING_IPC_INVALID_TIMING, 1); 582 page_load_metrics::ERR_BAD_TIMING_IPC_INVALID_TIMING, 1);
466 583
467 histogram_tester_.ExpectTotalCount( 584 histogram_tester_.ExpectTotalCount(
(...skipping 13 matching lines...) Expand all
481 chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK); 598 chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK);
482 content::TestNavigationManager manager( 599 content::TestNavigationManager manager(
483 browser()->tab_strip_model()->GetActiveWebContents(), url); 600 browser()->tab_strip_model()->GetActiveWebContents(), url);
484 601
485 chrome::Navigate(&params); 602 chrome::Navigate(&params);
486 EXPECT_TRUE(manager.WaitForRequestStart()); 603 EXPECT_TRUE(manager.WaitForRequestStart());
487 604
488 GURL url2(embedded_test_server()->GetURL("/title2.html")); 605 GURL url2(embedded_test_server()->GetURL("/title2.html"));
489 chrome::NavigateParams params2(browser(), url2, 606 chrome::NavigateParams params2(browser(), url2,
490 ui::PAGE_TRANSITION_FROM_ADDRESS_BAR); 607 ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
491 content::TestNavigationManager manager2( 608
492 browser()->tab_strip_model()->GetActiveWebContents(), url2); 609 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
610 waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT);
493 chrome::Navigate(&params2); 611 chrome::Navigate(&params2);
612 waiter->Wait();
494 613
495 manager2.WaitForNavigationFinished();
496 histogram_tester_.ExpectTotalCount( 614 histogram_tester_.ExpectTotalCount(
497 internal::kHistogramAbortNewNavigationBeforeCommit, 1); 615 internal::kHistogramAbortNewNavigationBeforeCommit, 1);
498 } 616 }
499 617
500 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortReload) { 618 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortReload) {
501 ASSERT_TRUE(embedded_test_server()->Start()); 619 ASSERT_TRUE(embedded_test_server()->Start());
502 620
503 GURL url(embedded_test_server()->GetURL("/title1.html")); 621 GURL url(embedded_test_server()->GetURL("/title1.html"));
504 chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK); 622 chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK);
505 content::TestNavigationManager manager( 623 content::TestNavigationManager manager(
506 browser()->tab_strip_model()->GetActiveWebContents(), url); 624 browser()->tab_strip_model()->GetActiveWebContents(), url);
507 625
508 chrome::Navigate(&params); 626 chrome::Navigate(&params);
509 EXPECT_TRUE(manager.WaitForRequestStart()); 627 EXPECT_TRUE(manager.WaitForRequestStart());
510 628
511 chrome::NavigateParams params2(browser(), url, ui::PAGE_TRANSITION_RELOAD); 629 chrome::NavigateParams params2(browser(), url, ui::PAGE_TRANSITION_RELOAD);
512 content::TestNavigationManager manager2( 630
513 browser()->tab_strip_model()->GetActiveWebContents(), url); 631 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
632 waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT);
514 chrome::Navigate(&params2); 633 chrome::Navigate(&params2);
634 waiter->Wait();
515 635
516 manager2.WaitForNavigationFinished();
517 histogram_tester_.ExpectTotalCount( 636 histogram_tester_.ExpectTotalCount(
518 internal::kHistogramAbortReloadBeforeCommit, 1); 637 internal::kHistogramAbortReloadBeforeCommit, 1);
519 } 638 }
520 639
521 // TODO(crbug.com/675061): Flaky on Win7 dbg. 640 // TODO(crbug.com/675061): Flaky on Win7 dbg.
522 #if defined(OS_WIN) 641 #if defined(OS_WIN)
523 #define MAYBE_AbortClose DISABLED_AbortClose 642 #define MAYBE_AbortClose DISABLED_AbortClose
524 #else 643 #else
525 #define MAYBE_AbortClose AbortClose 644 #define MAYBE_AbortClose AbortClose
526 #endif 645 #endif
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 chrome::NavigateParams params2(browser(), url2, ui::PAGE_TRANSITION_TYPED); 677 chrome::NavigateParams params2(browser(), url2, ui::PAGE_TRANSITION_TYPED);
559 content::TestNavigationManager manager2( 678 content::TestNavigationManager manager2(
560 browser()->tab_strip_model()->GetActiveWebContents(), url2); 679 browser()->tab_strip_model()->GetActiveWebContents(), url2);
561 chrome::Navigate(&params2); 680 chrome::Navigate(&params2);
562 681
563 EXPECT_TRUE(manager2.WaitForRequestStart()); 682 EXPECT_TRUE(manager2.WaitForRequestStart());
564 manager.WaitForNavigationFinished(); 683 manager.WaitForNavigationFinished();
565 684
566 GURL url3(embedded_test_server()->GetURL("/title3.html")); 685 GURL url3(embedded_test_server()->GetURL("/title3.html"));
567 chrome::NavigateParams params3(browser(), url3, ui::PAGE_TRANSITION_TYPED); 686 chrome::NavigateParams params3(browser(), url3, ui::PAGE_TRANSITION_TYPED);
568 content::TestNavigationManager manager3( 687
569 browser()->tab_strip_model()->GetActiveWebContents(), url3); 688 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
689 waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT);
570 chrome::Navigate(&params3); 690 chrome::Navigate(&params3);
691 waiter->Wait();
571 692
572 EXPECT_TRUE(manager3.WaitForRequestStart());
573 manager2.WaitForNavigationFinished(); 693 manager2.WaitForNavigationFinished();
574 694
575 manager3.WaitForNavigationFinished();
576
577 histogram_tester_.ExpectTotalCount( 695 histogram_tester_.ExpectTotalCount(
578 internal::kHistogramAbortNewNavigationBeforeCommit, 2); 696 internal::kHistogramAbortNewNavigationBeforeCommit, 2);
579 } 697 }
580 698
581 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, 699 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
582 NoAbortMetricsOnClientRedirect) { 700 NoAbortMetricsOnClientRedirect) {
583 ASSERT_TRUE(embedded_test_server()->Start()); 701 ASSERT_TRUE(embedded_test_server()->Start());
584 702
585 GURL first_url(embedded_test_server()->GetURL("/title1.html")); 703 GURL first_url(embedded_test_server()->GetURL("/title1.html"));
586 ui_test_utils::NavigateToURL(browser(), first_url); 704 ui_test_utils::NavigateToURL(browser(), first_url);
587 705
588 GURL second_url(embedded_test_server()->GetURL("/title2.html")); 706 GURL second_url(embedded_test_server()->GetURL("/title2.html"));
589 chrome::NavigateParams params(browser(), second_url, 707 chrome::NavigateParams params(browser(), second_url,
590 ui::PAGE_TRANSITION_LINK); 708 ui::PAGE_TRANSITION_LINK);
591 content::TestNavigationManager manager( 709 content::TestNavigationManager manager(
592 browser()->tab_strip_model()->GetActiveWebContents(), second_url); 710 browser()->tab_strip_model()->GetActiveWebContents(), second_url);
593 chrome::Navigate(&params); 711 chrome::Navigate(&params);
594 EXPECT_TRUE(manager.WaitForRequestStart()); 712 EXPECT_TRUE(manager.WaitForRequestStart());
595 713
596 { 714 {
715 std::unique_ptr<PageLoadMetricsWaiter> waiter =
716 CreatePageLoadMetricsWaiter();
717 waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT);
597 content::TestNavigationManager reload_manager( 718 content::TestNavigationManager reload_manager(
598 browser()->tab_strip_model()->GetActiveWebContents(), first_url); 719 browser()->tab_strip_model()->GetActiveWebContents(), first_url);
599 EXPECT_TRUE(content::ExecuteScript( 720 EXPECT_TRUE(content::ExecuteScript(
600 browser()->tab_strip_model()->GetActiveWebContents(), 721 browser()->tab_strip_model()->GetActiveWebContents(),
601 "window.location.reload();")); 722 "window.location.reload();"));
723 waiter->Wait();
602 } 724 }
603 725
604 manager.WaitForNavigationFinished(); 726 manager.WaitForNavigationFinished();
605 727
606 EXPECT_TRUE(histogram_tester_ 728 EXPECT_TRUE(histogram_tester_
607 .GetTotalCountsForPrefix("PageLoad.Experimental.AbortTiming.") 729 .GetTotalCountsForPrefix("PageLoad.Experimental.AbortTiming.")
608 .empty()); 730 .empty());
609 } 731 }
610 732
611 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, 733 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
612 FirstMeaningfulPaintRecorded) { 734 FirstMeaningfulPaintRecorded) {
613 ASSERT_TRUE(embedded_test_server()->Start()); 735 ASSERT_TRUE(embedded_test_server()->Start());
614 736
737 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
738 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_MEANINGFUL_PAINT);
615 ui_test_utils::NavigateToURL(browser(), 739 ui_test_utils::NavigateToURL(browser(),
616 embedded_test_server()->GetURL("/title1.html")); 740 embedded_test_server()->GetURL("/title1.html"));
741 waiter->Wait();
617 742
743 #if 0
618 // Wait until the renderer finishes observing layouts. 744 // Wait until the renderer finishes observing layouts.
619 const int kNetworkIdleTime = 3000; 745 const int kNetworkIdleTime = 3000;
620 const int kMargin = 500; 746 const int kMargin = 500;
621 const std::string javascript = base::StringPrintf( 747 const std::string javascript = base::StringPrintf(
622 "setTimeout(() => window.domAutomationController.send(true), %d)", 748 "setTimeout(() => window.domAutomationController.send(true), %d)",
623 kNetworkIdleTime + kMargin); 749 kNetworkIdleTime + kMargin);
624 bool result; 750 bool result;
625 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( 751 EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
626 browser()->tab_strip_model()->GetActiveWebContents(), 752 browser()->tab_strip_model()->GetActiveWebContents(),
627 javascript, &result)); 753 javascript, &result));
628 EXPECT_TRUE(result); 754 EXPECT_TRUE(result);
755 #endif
629 756
630 NavigateToUntrackedUrl();
631 histogram_tester_.ExpectUniqueSample( 757 histogram_tester_.ExpectUniqueSample(
632 internal::kHistogramFirstMeaningfulPaintStatus, 758 internal::kHistogramFirstMeaningfulPaintStatus,
633 internal::FIRST_MEANINGFUL_PAINT_RECORDED, 1); 759 internal::FIRST_MEANINGFUL_PAINT_RECORDED, 1);
634 histogram_tester_.ExpectTotalCount( 760 histogram_tester_.ExpectTotalCount(
635 internal::kHistogramFirstMeaningfulPaint, 1); 761 internal::kHistogramFirstMeaningfulPaint, 1);
636 histogram_tester_.ExpectTotalCount( 762 histogram_tester_.ExpectTotalCount(
637 internal::kHistogramParseStartToFirstMeaningfulPaint, 1); 763 internal::kHistogramParseStartToFirstMeaningfulPaint, 1);
638 } 764 }
639 765
640 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, 766 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
641 FirstMeaningfulPaintNotRecorded) { 767 FirstMeaningfulPaintNotRecorded) {
642 ASSERT_TRUE(embedded_test_server()->Start()); 768 ASSERT_TRUE(embedded_test_server()->Start());
643 769
644 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = 770 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
645 CreatePageLoadMetricsWaiter(); 771 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT);
646 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT);
647 772
648 ui_test_utils::NavigateToURL( 773 ui_test_utils::NavigateToURL(
649 browser(), embedded_test_server()->GetURL( 774 browser(), embedded_test_server()->GetURL(
650 "/page_load_metrics/page_with_active_connections.html")); 775 "/page_load_metrics/page_with_active_connections.html"));
651 fcp_waiter->Wait(); 776 waiter->Wait();
652 777
653 // Navigate away before a FMP is reported. 778 // Navigate away before a FMP is reported.
654 NavigateToUntrackedUrl(); 779 NavigateToUntrackedUrl();
655 780
781 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint,
782 1);
656 histogram_tester_.ExpectUniqueSample( 783 histogram_tester_.ExpectUniqueSample(
657 internal::kHistogramFirstMeaningfulPaintStatus, 784 internal::kHistogramFirstMeaningfulPaintStatus,
658 internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE, 1); 785 internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE, 1);
659 histogram_tester_.ExpectTotalCount( 786 histogram_tester_.ExpectTotalCount(
660 internal::kHistogramFirstMeaningfulPaint, 0); 787 internal::kHistogramFirstMeaningfulPaint, 0);
661 histogram_tester_.ExpectTotalCount( 788 histogram_tester_.ExpectTotalCount(
662 internal::kHistogramParseStartToFirstMeaningfulPaint, 0); 789 internal::kHistogramParseStartToFirstMeaningfulPaint, 0);
663 } 790 }
664 791
665 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, 792 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
666 NoStatePrefetchObserverCacheable) { 793 NoStatePrefetchObserverCacheable) {
667 ASSERT_TRUE(embedded_test_server()->Start()); 794 ASSERT_TRUE(embedded_test_server()->Start());
668 795
669 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = 796 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
670 CreatePageLoadMetricsWaiter(); 797 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT);
671 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT);
672 798
673 ui_test_utils::NavigateToURL(browser(), 799 ui_test_utils::NavigateToURL(browser(),
674 embedded_test_server()->GetURL("/title1.html")); 800 embedded_test_server()->GetURL("/title1.html"));
675 801
676 fcp_waiter->Wait(); 802 waiter->Wait();
677 803
678 histogram_tester_.ExpectTotalCount( 804 histogram_tester_.ExpectTotalCount(
679 "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 0); 805 "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 0);
680 histogram_tester_.ExpectTotalCount( 806 histogram_tester_.ExpectTotalCount(
681 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 1); 807 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 1);
682 } 808 }
683 809
684 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, 810 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
685 NoStatePrefetchObserverNoStore) { 811 NoStatePrefetchObserverNoStore) {
686 ASSERT_TRUE(embedded_test_server()->Start()); 812 ASSERT_TRUE(embedded_test_server()->Start());
687 813
688 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = 814 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
689 CreatePageLoadMetricsWaiter(); 815 waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT);
690 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT);
691 816
692 ui_test_utils::NavigateToURL(browser(), 817 ui_test_utils::NavigateToURL(browser(),
693 embedded_test_server()->GetURL("/nostore.html")); 818 embedded_test_server()->GetURL("/nostore.html"));
694 819
695 fcp_waiter->Wait(); 820 waiter->Wait();
696 821
697 histogram_tester_.ExpectTotalCount( 822 histogram_tester_.ExpectTotalCount(
698 "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 1); 823 "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 1);
699 histogram_tester_.ExpectTotalCount( 824 histogram_tester_.ExpectTotalCount(
700 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 0); 825 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 0);
701 } 826 }
702 827
703 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, CSSTiming) { 828 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, CSSTiming) {
704 ASSERT_TRUE(embedded_test_server()->Start()); 829 ASSERT_TRUE(embedded_test_server()->Start());
705 830
706 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = 831 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
707 CreatePageLoadMetricsWaiter(); 832 waiter->AddMainFrameExpectation(ExpectedTimingField::STYLE_UPDATE_BEFORE_FCP);
708 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::STYLE_UPDATE_BEFORE_FCP);
709 833
710 // Careful: Blink code clamps timestamps to 5us, so any CSS parsing we do here 834 // Careful: Blink code clamps timestamps to 5us, so any CSS parsing we do here
711 // must take >> 5us, otherwise we'll log 0 for the value and it will remain 835 // must take >> 5us, otherwise we'll log 0 for the value and it will remain
712 // unset here. 836 // unset here.
713 ui_test_utils::NavigateToURL( 837 ui_test_utils::NavigateToURL(
714 browser(), 838 browser(),
715 embedded_test_server()->GetURL("/page_load_metrics/page_with_css.html")); 839 embedded_test_server()->GetURL("/page_load_metrics/page_with_css.html"));
716 NavigateToUntrackedUrl(); 840 waiter->Wait();
717 fcp_waiter->Wait();
718 841
719 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, 842 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint,
720 1); 843 1);
721 histogram_tester_.ExpectTotalCount( 844 histogram_tester_.ExpectTotalCount(
722 "PageLoad.CSSTiming.Parse.BeforeFirstContentfulPaint", 1); 845 "PageLoad.CSSTiming.Parse.BeforeFirstContentfulPaint", 1);
723 histogram_tester_.ExpectTotalCount( 846 histogram_tester_.ExpectTotalCount(
724 "PageLoad.CSSTiming.Update.BeforeFirstContentfulPaint", 1); 847 "PageLoad.CSSTiming.Update.BeforeFirstContentfulPaint", 1);
725 histogram_tester_.ExpectTotalCount( 848 histogram_tester_.ExpectTotalCount(
726 "PageLoad.CSSTiming.ParseAndUpdate.BeforeFirstContentfulPaint", 1); 849 "PageLoad.CSSTiming.ParseAndUpdate.BeforeFirstContentfulPaint", 1);
727 } 850 }
728 851
729 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PayloadSize) { 852 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PayloadSize) {
730 ASSERT_TRUE(embedded_test_server()->Start()); 853 ASSERT_TRUE(embedded_test_server()->Start());
731 854
855 std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter();
856 waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT);
732 ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL( 857 ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL(
733 "/page_load_metrics/large.html")); 858 "/page_load_metrics/large.html"));
859 waiter->Wait();
860
861 // Payload histograms are only logged when a page load terminates, so force
862 // navigation to another page.
734 NavigateToUntrackedUrl(); 863 NavigateToUntrackedUrl();
735 864
736 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); 865 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1);
737 866
738 // Verify that there is a single sample recorded in the 10kB bucket (the size 867 // Verify that there is a single sample recorded in the 10kB bucket (the size
739 // of the main HTML response). 868 // of the main HTML response).
740 histogram_tester_.ExpectBucketCount(internal::kHistogramTotalBytes, 10, 1); 869 histogram_tester_.ExpectBucketCount(internal::kHistogramTotalBytes, 10, 1);
741 } 870 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698