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 "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 Loading... | |
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 Loading... | |
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 Loading... | |
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(¶ms); | 602 chrome::Navigate(¶ms); |
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(¶ms2); | 611 chrome::Navigate(¶ms2); |
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(¶ms); | 626 chrome::Navigate(¶ms); |
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(¶ms2); | 633 chrome::Navigate(¶ms2); |
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 Loading... | |
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(¶ms2); | 680 chrome::Navigate(¶ms2); |
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(¶ms3); | 690 chrome::Navigate(¶ms3); |
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(¶ms); | 711 chrome::Navigate(¶ms); |
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 } |
OLD | NEW |