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

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

Issue 2872793002: Notify paint for each frame (Closed)
Patch Set: remove one comment Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | chrome/test/data/page_load_metrics/empty_iframe.html » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | chrome/test/data/page_load_metrics/empty_iframe.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698