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/command_line.h" | 5 #include "base/command_line.h" |
6 #include "base/feature_list.h" | 6 #include "base/feature_list.h" |
7 #include "base/files/scoped_temp_dir.h" | 7 #include "base/files/scoped_temp_dir.h" |
8 #include "base/macros.h" | 8 #include "base/macros.h" |
9 #include "base/test/histogram_tester.h" | 9 #include "base/test/histogram_tester.h" |
10 #include "base/threading/thread_restrictions.h" | 10 #include "base/threading/thread_restrictions.h" |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 } | 183 } |
184 | 184 |
185 std::unique_ptr<base::RunLoop> run_loop_; | 185 std::unique_ptr<base::RunLoop> run_loop_; |
186 | 186 |
187 TimingFieldBitSet child_frame_expected_fields_; | 187 TimingFieldBitSet child_frame_expected_fields_; |
188 TimingFieldBitSet main_frame_expected_fields_; | 188 TimingFieldBitSet main_frame_expected_fields_; |
189 | 189 |
190 TimingFieldBitSet observed_main_frame_fields_; | 190 TimingFieldBitSet observed_main_frame_fields_; |
191 }; | 191 }; |
192 | 192 |
193 // Due to crbug/705315, paints in subframes are associated with the main frame, | |
194 // unless the subframe is cross-origin and Chrome is running with out of process | |
195 // cross-origin subframes. As a result, some tests wait for different behavior | |
196 // to be observed depending on which mode we are in. TODO(crbug/705315): remove | |
197 // this method once the bug is addressed. | |
198 static bool AreCrossOriginSubFramesOutOfProcess() { | |
199 return base::CommandLine::ForCurrentProcess()->HasSwitch( | |
200 switches::kSitePerProcess) || | |
201 base::FeatureList::IsEnabled(features::kTopDocumentIsolation); | |
202 } | |
203 | |
204 using TimingField = PageLoadMetricsWaiter::TimingField; | 193 using TimingField = PageLoadMetricsWaiter::TimingField; |
205 | 194 |
206 } // namespace | 195 } // namespace |
207 | 196 |
208 class PageLoadMetricsBrowserTest : public InProcessBrowserTest { | 197 class PageLoadMetricsBrowserTest : public InProcessBrowserTest { |
209 public: | 198 public: |
210 PageLoadMetricsBrowserTest() {} | 199 PageLoadMetricsBrowserTest() {} |
211 ~PageLoadMetricsBrowserTest() override {} | 200 ~PageLoadMetricsBrowserTest() override {} |
212 | 201 |
213 protected: | 202 protected: |
214 // Force navigation to a new page, so the currently tracked page load runs its | 203 // Force navigation to a new page, so the currently tracked page load runs its |
215 // OnComplete callback. You should prefer to use PageLoadMetricsWaiter, and | 204 // OnComplete callback. You should prefer to use PageLoadMetricsWaiter, and |
216 // only use NavigateToUntrackedUrl for cases where the waiter isn't | 205 // only use NavigateToUntrackedUrl for cases where the waiter isn't |
217 // sufficient. | 206 // sufficient. |
218 void NavigateToUntrackedUrl() { | 207 void NavigateToUntrackedUrl() { |
219 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); | 208 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); |
220 } | 209 } |
221 | 210 |
222 // TODO(crbug/705315): remove this method once the bug is addressed. | |
223 void SetUpOnMainThread() override { | |
224 InProcessBrowserTest::SetUpOnMainThread(); | |
225 host_resolver()->AddRule("a.com", "127.0.0.1"); | |
226 host_resolver()->AddRule("b.com", "127.0.0.1"); | |
227 host_resolver()->AddRule("c.com", "127.0.0.1"); | |
228 content::SetupCrossSiteRedirector(embedded_test_server()); | |
229 } | |
230 | |
231 bool NoPageLoadMetricsRecorded() { | 211 bool NoPageLoadMetricsRecorded() { |
232 // Determine whether any 'public' page load metrics are recorded. We exclude | 212 // Determine whether any 'public' page load metrics are recorded. We exclude |
233 // 'internal' metrics as these may be recorded for debugging purposes. | 213 // 'internal' metrics as these may be recorded for debugging purposes. |
234 size_t total_pageload_histograms = | 214 size_t total_pageload_histograms = |
235 histogram_tester_.GetTotalCountsForPrefix("PageLoad.").size(); | 215 histogram_tester_.GetTotalCountsForPrefix("PageLoad.").size(); |
236 size_t total_internal_histograms = | 216 size_t total_internal_histograms = |
237 histogram_tester_.GetTotalCountsForPrefix("PageLoad.Internal.").size(); | 217 histogram_tester_.GetTotalCountsForPrefix("PageLoad.Internal.").size(); |
238 DCHECK_GE(total_pageload_histograms, total_internal_histograms); | 218 DCHECK_GE(total_pageload_histograms, total_internal_histograms); |
239 return total_pageload_histograms - total_internal_histograms == 0; | 219 return total_pageload_histograms - total_internal_histograms == 0; |
240 } | 220 } |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | 282 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
303 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); | 283 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); |
304 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, | 284 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, |
305 0); | 285 0); |
306 } | 286 } |
307 | 287 |
308 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 288 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
309 NoPaintForEmptyDocumentInChildFrame) { | 289 NoPaintForEmptyDocumentInChildFrame) { |
310 ASSERT_TRUE(embedded_test_server()->Start()); | 290 ASSERT_TRUE(embedded_test_server()->Start()); |
311 | 291 |
312 // TODO(crbug/705315): remove the a.com domain once the bug is addressed. | 292 GURL a_url( |
313 GURL a_url(embedded_test_server()->GetURL( | 293 embedded_test_server()->GetURL("/page_load_metrics/empty_iframe.html")); |
314 "a.com", "/page_load_metrics/empty_iframe.html")); | |
315 | 294 |
316 auto waiter = CreatePageLoadMetricsWaiter(); | 295 auto waiter = CreatePageLoadMetricsWaiter(); |
317 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); | 296 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); |
318 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | 297 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); |
319 waiter->AddSubFrameExpectation(TimingField::FIRST_LAYOUT); | 298 waiter->AddSubFrameExpectation(TimingField::FIRST_LAYOUT); |
320 waiter->AddSubFrameExpectation(TimingField::LOAD_EVENT); | 299 waiter->AddSubFrameExpectation(TimingField::LOAD_EVENT); |
321 ui_test_utils::NavigateToURL(browser(), a_url); | 300 ui_test_utils::NavigateToURL(browser(), a_url); |
322 waiter->Wait(); | 301 waiter->Wait(); |
323 EXPECT_FALSE(waiter->DidObserveInMainFrame(TimingField::FIRST_PAINT)); | 302 EXPECT_FALSE(waiter->DidObserveInMainFrame(TimingField::FIRST_PAINT)); |
324 | 303 |
325 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | 304 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
326 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | 305 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
327 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); | 306 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); |
328 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, | 307 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, |
329 0); | 308 0); |
330 } | 309 } |
331 | 310 |
332 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PaintInChildFrame) { | 311 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PaintInChildFrame) { |
333 ASSERT_TRUE(embedded_test_server()->Start()); | 312 ASSERT_TRUE(embedded_test_server()->Start()); |
334 | 313 |
335 // TODO(crbug/705315): remove the a.com domain once the bug is addressed. | 314 GURL a_url(embedded_test_server()->GetURL("/page_load_metrics/iframe.html")); |
336 GURL a_url(embedded_test_server()->GetURL("a.com", | |
337 "/page_load_metrics/iframe.html")); | |
338 auto waiter = CreatePageLoadMetricsWaiter(); | 315 auto waiter = CreatePageLoadMetricsWaiter(); |
339 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); | 316 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); |
340 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | 317 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); |
341 // TODO(crbug/705315): Once the bug is fixed, remove the else case and make | 318 waiter->AddSubFrameExpectation(TimingField::FIRST_PAINT); |
342 // the if case the default behavior. | 319 waiter->AddSubFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); |
343 if (AreCrossOriginSubFramesOutOfProcess()) { | |
344 waiter->AddSubFrameExpectation(TimingField::FIRST_PAINT); | |
345 waiter->AddSubFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | |
346 } else { | |
347 waiter->AddMainFrameExpectation(TimingField::FIRST_PAINT); | |
348 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | |
349 } | |
350 ui_test_utils::NavigateToURL(browser(), a_url); | 320 ui_test_utils::NavigateToURL(browser(), a_url); |
351 waiter->Wait(); | 321 waiter->Wait(); |
352 | 322 |
353 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | 323 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
354 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | 324 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
355 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1); | 325 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1); |
356 } | 326 } |
357 | 327 |
358 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PaintInMultipleChildFrames) { | 328 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PaintInMultipleChildFrames) { |
359 ASSERT_TRUE(embedded_test_server()->Start()); | 329 ASSERT_TRUE(embedded_test_server()->Start()); |
360 | 330 |
361 // TODO(crbug/705315): remove the a.com domain once the bug is addressed. | 331 GURL a_url(embedded_test_server()->GetURL("/page_load_metrics/iframes.html")); |
362 GURL a_url(embedded_test_server()->GetURL("a.com", | |
363 "/page_load_metrics/iframes.html")); | |
364 | 332 |
365 auto waiter = CreatePageLoadMetricsWaiter(); | 333 auto waiter = CreatePageLoadMetricsWaiter(); |
366 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); | 334 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); |
367 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | 335 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); |
368 // TODO(crbug/705315): Once the bug is fixed, remove the else case and make | 336 waiter->AddSubFrameExpectation(TimingField::FIRST_PAINT); |
369 // the if case the default behavior. | 337 waiter->AddSubFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); |
370 if (AreCrossOriginSubFramesOutOfProcess()) { | |
371 waiter->AddSubFrameExpectation(TimingField::FIRST_PAINT); | |
372 waiter->AddSubFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | |
373 } else { | |
374 waiter->AddMainFrameExpectation(TimingField::FIRST_PAINT); | |
375 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | |
376 } | |
377 ui_test_utils::NavigateToURL(browser(), a_url); | 338 ui_test_utils::NavigateToURL(browser(), a_url); |
378 waiter->Wait(); | 339 waiter->Wait(); |
379 | 340 |
380 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | 341 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
381 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | 342 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
382 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1); | 343 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1); |
383 } | 344 } |
384 | 345 |
385 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PaintInMainAndChildFrame) { | 346 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PaintInMainAndChildFrame) { |
386 ASSERT_TRUE(embedded_test_server()->Start()); | 347 ASSERT_TRUE(embedded_test_server()->Start()); |
387 | 348 |
388 // TODO(crbug/705315): remove the a.com domain once the bug is addressed. | |
389 GURL a_url(embedded_test_server()->GetURL( | 349 GURL a_url(embedded_test_server()->GetURL( |
390 "a.com", "/page_load_metrics/main_frame_with_iframe.html")); | 350 "/page_load_metrics/main_frame_with_iframe.html")); |
391 | 351 |
392 auto waiter = CreatePageLoadMetricsWaiter(); | 352 auto waiter = CreatePageLoadMetricsWaiter(); |
393 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); | 353 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); |
394 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | 354 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); |
395 waiter->AddMainFrameExpectation(TimingField::FIRST_PAINT); | 355 waiter->AddMainFrameExpectation(TimingField::FIRST_PAINT); |
396 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | 356 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); |
397 // TODO(crbug/705315): Once the bug is fixed, make the if case the default | 357 waiter->AddSubFrameExpectation(TimingField::FIRST_PAINT); |
398 // behavior. | 358 waiter->AddSubFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); |
399 if (AreCrossOriginSubFramesOutOfProcess()) { | |
400 waiter->AddSubFrameExpectation(TimingField::FIRST_PAINT); | |
401 waiter->AddSubFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | |
402 } | |
403 ui_test_utils::NavigateToURL(browser(), a_url); | 359 ui_test_utils::NavigateToURL(browser(), a_url); |
404 waiter->Wait(); | 360 waiter->Wait(); |
405 | 361 |
406 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | 362 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
407 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | 363 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
408 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1); | 364 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1); |
409 } | 365 } |
410 | 366 |
411 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameDocumentNavigation) { | 367 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameDocumentNavigation) { |
412 ASSERT_TRUE(embedded_test_server()->Start()); | 368 ASSERT_TRUE(embedded_test_server()->Start()); |
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
990 // Payload histograms are only logged when a page load terminates, so force | 946 // Payload histograms are only logged when a page load terminates, so force |
991 // navigation to another page. | 947 // navigation to another page. |
992 NavigateToUntrackedUrl(); | 948 NavigateToUntrackedUrl(); |
993 | 949 |
994 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); | 950 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); |
995 | 951 |
996 // Verify that there is a single sample recorded in the 10kB bucket (the size | 952 // Verify that there is a single sample recorded in the 10kB bucket (the size |
997 // of the main HTML response). | 953 // of the main HTML response). |
998 histogram_tester_.ExpectBucketCount(internal::kHistogramTotalBytes, 10, 1); | 954 histogram_tester_.ExpectBucketCount(internal::kHistogramTotalBytes, 10, 1); |
999 } | 955 } |
OLD | NEW |