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