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 |
193 using TimingField = PageLoadMetricsWaiter::TimingField; | 204 using TimingField = PageLoadMetricsWaiter::TimingField; |
194 | 205 |
195 } // namespace | 206 } // namespace |
196 | 207 |
197 class PageLoadMetricsBrowserTest : public InProcessBrowserTest { | 208 class PageLoadMetricsBrowserTest : public InProcessBrowserTest { |
198 public: | 209 public: |
199 PageLoadMetricsBrowserTest() {} | 210 PageLoadMetricsBrowserTest() {} |
200 ~PageLoadMetricsBrowserTest() override {} | 211 ~PageLoadMetricsBrowserTest() override {} |
201 | 212 |
202 protected: | 213 protected: |
203 // Force navigation to a new page, so the currently tracked page load runs its | 214 // Force navigation to a new page, so the currently tracked page load runs its |
204 // OnComplete callback. You should prefer to use PageLoadMetricsWaiter, and | 215 // OnComplete callback. You should prefer to use PageLoadMetricsWaiter, and |
205 // only use NavigateToUntrackedUrl for cases where the waiter isn't | 216 // only use NavigateToUntrackedUrl for cases where the waiter isn't |
206 // sufficient. | 217 // sufficient. |
207 void NavigateToUntrackedUrl() { | 218 void NavigateToUntrackedUrl() { |
208 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); | 219 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); |
209 } | 220 } |
210 | 221 |
| 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 |
211 bool NoPageLoadMetricsRecorded() { | 231 bool NoPageLoadMetricsRecorded() { |
212 // Determine whether any 'public' page load metrics are recorded. We exclude | 232 // Determine whether any 'public' page load metrics are recorded. We exclude |
213 // 'internal' metrics as these may be recorded for debugging purposes. | 233 // 'internal' metrics as these may be recorded for debugging purposes. |
214 size_t total_pageload_histograms = | 234 size_t total_pageload_histograms = |
215 histogram_tester_.GetTotalCountsForPrefix("PageLoad.").size(); | 235 histogram_tester_.GetTotalCountsForPrefix("PageLoad.").size(); |
216 size_t total_internal_histograms = | 236 size_t total_internal_histograms = |
217 histogram_tester_.GetTotalCountsForPrefix("PageLoad.Internal.").size(); | 237 histogram_tester_.GetTotalCountsForPrefix("PageLoad.Internal.").size(); |
218 DCHECK_GE(total_pageload_histograms, total_internal_histograms); | 238 DCHECK_GE(total_pageload_histograms, total_internal_histograms); |
219 return total_pageload_histograms - total_internal_histograms == 0; | 239 return total_pageload_histograms - total_internal_histograms == 0; |
220 } | 240 } |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | 302 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
283 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); | 303 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); |
284 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, | 304 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, |
285 0); | 305 0); |
286 } | 306 } |
287 | 307 |
288 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 308 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
289 NoPaintForEmptyDocumentInChildFrame) { | 309 NoPaintForEmptyDocumentInChildFrame) { |
290 ASSERT_TRUE(embedded_test_server()->Start()); | 310 ASSERT_TRUE(embedded_test_server()->Start()); |
291 | 311 |
292 GURL a_url( | 312 // TODO(crbug/705315): remove the a.com domain once the bug is addressed. |
293 embedded_test_server()->GetURL("/page_load_metrics/empty_iframe.html")); | 313 GURL a_url(embedded_test_server()->GetURL( |
| 314 "a.com", "/page_load_metrics/empty_iframe.html")); |
294 | 315 |
295 auto waiter = CreatePageLoadMetricsWaiter(); | 316 auto waiter = CreatePageLoadMetricsWaiter(); |
296 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); | 317 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); |
297 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | 318 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); |
298 waiter->AddSubFrameExpectation(TimingField::FIRST_LAYOUT); | 319 waiter->AddSubFrameExpectation(TimingField::FIRST_LAYOUT); |
299 waiter->AddSubFrameExpectation(TimingField::LOAD_EVENT); | 320 waiter->AddSubFrameExpectation(TimingField::LOAD_EVENT); |
300 ui_test_utils::NavigateToURL(browser(), a_url); | 321 ui_test_utils::NavigateToURL(browser(), a_url); |
301 waiter->Wait(); | 322 waiter->Wait(); |
302 EXPECT_FALSE(waiter->DidObserveInMainFrame(TimingField::FIRST_PAINT)); | 323 EXPECT_FALSE(waiter->DidObserveInMainFrame(TimingField::FIRST_PAINT)); |
303 | 324 |
304 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | 325 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
305 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | 326 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
306 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); | 327 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); |
307 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, | 328 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, |
308 0); | 329 0); |
309 } | 330 } |
310 | 331 |
311 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PaintInChildFrame) { | 332 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PaintInChildFrame) { |
312 ASSERT_TRUE(embedded_test_server()->Start()); | 333 ASSERT_TRUE(embedded_test_server()->Start()); |
313 | 334 |
314 GURL a_url(embedded_test_server()->GetURL("/page_load_metrics/iframe.html")); | 335 // TODO(crbug/705315): remove the a.com domain once the bug is addressed. |
| 336 GURL a_url(embedded_test_server()->GetURL("a.com", |
| 337 "/page_load_metrics/iframe.html")); |
315 auto waiter = CreatePageLoadMetricsWaiter(); | 338 auto waiter = CreatePageLoadMetricsWaiter(); |
316 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); | 339 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); |
317 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | 340 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); |
318 waiter->AddSubFrameExpectation(TimingField::FIRST_PAINT); | 341 // TODO(crbug/705315): Once the bug is fixed, remove the else case and make |
319 waiter->AddSubFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | 342 // the if case the default behavior. |
| 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 } |
320 ui_test_utils::NavigateToURL(browser(), a_url); | 350 ui_test_utils::NavigateToURL(browser(), a_url); |
321 waiter->Wait(); | 351 waiter->Wait(); |
322 | 352 |
323 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | 353 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
324 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | 354 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
325 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1); | 355 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1); |
326 } | 356 } |
327 | 357 |
328 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PaintInMultipleChildFrames) { | 358 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PaintInMultipleChildFrames) { |
329 ASSERT_TRUE(embedded_test_server()->Start()); | 359 ASSERT_TRUE(embedded_test_server()->Start()); |
330 | 360 |
331 GURL a_url(embedded_test_server()->GetURL("/page_load_metrics/iframes.html")); | 361 // TODO(crbug/705315): remove the a.com domain once the bug is addressed. |
| 362 GURL a_url(embedded_test_server()->GetURL("a.com", |
| 363 "/page_load_metrics/iframes.html")); |
332 | 364 |
333 auto waiter = CreatePageLoadMetricsWaiter(); | 365 auto waiter = CreatePageLoadMetricsWaiter(); |
334 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); | 366 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); |
335 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | 367 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); |
336 waiter->AddSubFrameExpectation(TimingField::FIRST_PAINT); | 368 // TODO(crbug/705315): Once the bug is fixed, remove the else case and make |
337 waiter->AddSubFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | 369 // the if case the default behavior. |
| 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 } |
338 ui_test_utils::NavigateToURL(browser(), a_url); | 377 ui_test_utils::NavigateToURL(browser(), a_url); |
339 waiter->Wait(); | 378 waiter->Wait(); |
340 | 379 |
341 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | 380 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
342 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | 381 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
343 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1); | 382 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1); |
344 } | 383 } |
345 | 384 |
346 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PaintInMainAndChildFrame) { | 385 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PaintInMainAndChildFrame) { |
347 ASSERT_TRUE(embedded_test_server()->Start()); | 386 ASSERT_TRUE(embedded_test_server()->Start()); |
348 | 387 |
| 388 // TODO(crbug/705315): remove the a.com domain once the bug is addressed. |
349 GURL a_url(embedded_test_server()->GetURL( | 389 GURL a_url(embedded_test_server()->GetURL( |
350 "/page_load_metrics/main_frame_with_iframe.html")); | 390 "a.com", "/page_load_metrics/main_frame_with_iframe.html")); |
351 | 391 |
352 auto waiter = CreatePageLoadMetricsWaiter(); | 392 auto waiter = CreatePageLoadMetricsWaiter(); |
353 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); | 393 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); |
354 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | 394 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); |
355 waiter->AddMainFrameExpectation(TimingField::FIRST_PAINT); | 395 waiter->AddMainFrameExpectation(TimingField::FIRST_PAINT); |
356 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | 396 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); |
357 waiter->AddSubFrameExpectation(TimingField::FIRST_PAINT); | 397 // TODO(crbug/705315): Once the bug is fixed, make the if case the default |
358 waiter->AddSubFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | 398 // behavior. |
| 399 if (AreCrossOriginSubFramesOutOfProcess()) { |
| 400 waiter->AddSubFrameExpectation(TimingField::FIRST_PAINT); |
| 401 waiter->AddSubFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); |
| 402 } |
359 ui_test_utils::NavigateToURL(browser(), a_url); | 403 ui_test_utils::NavigateToURL(browser(), a_url); |
360 waiter->Wait(); | 404 waiter->Wait(); |
361 | 405 |
362 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | 406 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
363 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | 407 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
364 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1); | 408 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1); |
365 } | 409 } |
366 | 410 |
367 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameDocumentNavigation) { | 411 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameDocumentNavigation) { |
368 ASSERT_TRUE(embedded_test_server()->Start()); | 412 ASSERT_TRUE(embedded_test_server()->Start()); |
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
946 // Payload histograms are only logged when a page load terminates, so force | 990 // Payload histograms are only logged when a page load terminates, so force |
947 // navigation to another page. | 991 // navigation to another page. |
948 NavigateToUntrackedUrl(); | 992 NavigateToUntrackedUrl(); |
949 | 993 |
950 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); | 994 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); |
951 | 995 |
952 // Verify that there is a single sample recorded in the 10kB bucket (the size | 996 // Verify that there is a single sample recorded in the 10kB bucket (the size |
953 // of the main HTML response). | 997 // of the main HTML response). |
954 histogram_tester_.ExpectBucketCount(internal::kHistogramTotalBytes, 10, 1); | 998 histogram_tester_.ExpectBucketCount(internal::kHistogramTotalBytes, 10, 1); |
955 } | 999 } |
OLD | NEW |