| 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/time/time.h" | 8 #include "base/time/time.h" |
| 9 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" | 9 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" |
| 10 #include "chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_ob
server.h" | 10 #include "chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_ob
server.h" |
| 11 #include "chrome/browser/page_load_metrics/observers/core_page_load_metrics_obse
rver.h" | 11 #include "chrome/browser/page_load_metrics/observers/core_page_load_metrics_obse
rver.h" |
| 12 #include "chrome/browser/page_load_metrics/observers/document_write_page_load_me
trics_observer.h" | 12 #include "chrome/browser/page_load_metrics/observers/document_write_page_load_me
trics_observer.h" |
| 13 #include "chrome/browser/page_load_metrics/observers/no_state_prefetch_page_load
_metrics_observer.h" | 13 #include "chrome/browser/page_load_metrics/observers/no_state_prefetch_page_load
_metrics_observer.h" |
| 14 #include "chrome/browser/page_load_metrics/page_load_tracker.h" | 14 #include "chrome/browser/page_load_metrics/page_load_tracker.h" |
| 15 #include "chrome/browser/prerender/prerender_histograms.h" | 15 #include "chrome/browser/prerender/prerender_histograms.h" |
| 16 #include "chrome/browser/prerender/prerender_origin.h" | 16 #include "chrome/browser/prerender/prerender_origin.h" |
| 17 #include "chrome/browser/profiles/profile.h" | 17 #include "chrome/browser/profiles/profile.h" |
| 18 #include "chrome/browser/ui/browser.h" | 18 #include "chrome/browser/ui/browser.h" |
| 19 #include "chrome/browser/ui/browser_navigator_params.h" | 19 #include "chrome/browser/ui/browser_navigator_params.h" |
| 20 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 20 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 21 #include "chrome/common/page_load_metrics/page_load_metrics_messages.h" |
| 21 #include "chrome/common/pref_names.h" | 22 #include "chrome/common/pref_names.h" |
| 22 #include "chrome/common/url_constants.h" | 23 #include "chrome/common/url_constants.h" |
| 23 #include "chrome/test/base/in_process_browser_test.h" | 24 #include "chrome/test/base/in_process_browser_test.h" |
| 24 #include "chrome/test/base/ui_test_utils.h" | 25 #include "chrome/test/base/ui_test_utils.h" |
| 25 #include "components/prefs/pref_service.h" | 26 #include "components/prefs/pref_service.h" |
| 26 #include "content/public/browser/browser_thread.h" | 27 #include "content/public/browser/browser_thread.h" |
| 28 #include "content/public/browser/render_process_host.h" |
| 29 #include "content/public/browser/render_view_host.h" |
| 27 #include "content/public/test/browser_test_utils.h" | 30 #include "content/public/test/browser_test_utils.h" |
| 28 #include "content/public/test/download_test_observer.h" | 31 #include "content/public/test/download_test_observer.h" |
| 29 #include "net/http/failing_http_transaction_factory.h" | 32 #include "net/http/failing_http_transaction_factory.h" |
| 30 #include "net/http/http_cache.h" | 33 #include "net/http/http_cache.h" |
| 31 #include "net/test/embedded_test_server/embedded_test_server.h" | 34 #include "net/test/embedded_test_server/embedded_test_server.h" |
| 32 #include "net/test/url_request/url_request_failed_job.h" | 35 #include "net/test/url_request/url_request_failed_job.h" |
| 33 #include "net/url_request/url_request_context.h" | 36 #include "net/url_request/url_request_context.h" |
| 34 #include "net/url_request/url_request_context_getter.h" | 37 #include "net/url_request/url_request_context_getter.h" |
| 35 | 38 |
| 39 namespace { |
| 40 |
| 41 // Waits until a PageLoadMetricsMsg_TimingUpdated message IPC is received |
| 42 // matching a PageLoadTiming. See WaitForMatchingIPC for details. |
| 43 class TimingUpdatedObserver : public content::BrowserMessageFilter { |
| 44 public: |
| 45 // A bitvector to express which timing fields to match on. |
| 46 enum ExpectedTimingFields { |
| 47 FIRST_PAINT = 1 << 0, |
| 48 FIRST_CONTENTFUL_PAINT = 1 << 1 |
| 49 }; |
| 50 |
| 51 explicit TimingUpdatedObserver(content::RenderWidgetHost* render_widget_host) |
| 52 : content::BrowserMessageFilter(PageLoadMetricsMsgStart) { |
| 53 render_widget_host->GetProcess()->AddFilter(this); |
| 54 |
| 55 // Roundtrip to the IO thread, to ensure that the filter is properly |
| 56 // installed. |
| 57 content::BrowserThread::PostTaskAndReply( |
| 58 content::BrowserThread::IO, FROM_HERE, base::Bind(&base::DoNothing), |
| 59 base::Bind(&TimingUpdatedObserver::Quit, this)); |
| 60 run_loop_.reset(new base::RunLoop()); |
| 61 run_loop_->Run(); |
| 62 run_loop_.reset(nullptr); |
| 63 } |
| 64 |
| 65 // Add the given timing fields to the set of fields to match on. |
| 66 void AddMatchingFields(ExpectedTimingFields fields) { |
| 67 matching_fields_ |= fields; |
| 68 } |
| 69 |
| 70 // Instructs observer to also watch for |count| |
| 71 // WebLoadingBehaviorDocumentWriteBlockReload events. |
| 72 void MatchDocumentWriteBlockReload(int count) { |
| 73 match_document_write_block_reload_ = count; |
| 74 } |
| 75 |
| 76 // Waits for a TimingUpdated IPC that matches the fields set by |
| 77 // |AddMatchingFields|. All matching fields must be set in a TimingUpdated |
| 78 // IPC for it to end this wait. |
| 79 void WaitForMatchingIPC() { |
| 80 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 81 if (matched_timing_update_) |
| 82 return; |
| 83 |
| 84 run_loop_.reset(new base::RunLoop()); |
| 85 run_loop_->Run(); |
| 86 run_loop_.reset(nullptr); |
| 87 } |
| 88 |
| 89 private: |
| 90 bool OnMessageReceived(const IPC::Message& message) override { |
| 91 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 92 |
| 93 IPC_BEGIN_MESSAGE_MAP(TimingUpdatedObserver, message) |
| 94 IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnTimingUpdated) |
| 95 IPC_END_MESSAGE_MAP() |
| 96 |
| 97 return false; |
| 98 } |
| 99 |
| 100 bool OnTimingUpdated(const page_load_metrics::PageLoadTiming& timing, |
| 101 const page_load_metrics::PageLoadMetadata& metadata) { |
| 102 if (match_document_write_block_reload_ > 0 && |
| 103 metadata.behavior_flags & |
| 104 blink::WebLoadingBehaviorFlag:: |
| 105 WebLoadingBehaviorDocumentWriteBlockReload) { |
| 106 --match_document_write_block_reload_; |
| 107 } |
| 108 |
| 109 if (match_document_write_block_reload_ > 0) { |
| 110 return true; |
| 111 } |
| 112 |
| 113 if ((!(matching_fields_ & FIRST_PAINT) || timing.first_paint) && |
| 114 (!(matching_fields_ & FIRST_CONTENTFUL_PAINT) || |
| 115 timing.first_contentful_paint)) { |
| 116 // Ensure that any other handlers of this message, for example the real |
| 117 // PageLoadMetric observers, get a chance to handle this message before |
| 118 // this waiter unblocks. |
| 119 content::BrowserThread::PostTask( |
| 120 content::BrowserThread::IO, FROM_HERE, |
| 121 base::Bind(&TimingUpdatedObserver::BounceTimingUpdate, this, timing, |
| 122 metadata)); |
| 123 } |
| 124 return true; |
| 125 } |
| 126 |
| 127 void BounceTimingUpdate(const page_load_metrics::PageLoadTiming& timing, |
| 128 const page_load_metrics::PageLoadMetadata& metadata) { |
| 129 content::BrowserThread::PostTask( |
| 130 content::BrowserThread::UI, FROM_HERE, |
| 131 base::Bind(&TimingUpdatedObserver::SetTimingUpdatedAndQuit, this)); |
| 132 } |
| 133 |
| 134 void Quit() { |
| 135 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 136 if (run_loop_) |
| 137 run_loop_->Quit(); |
| 138 } |
| 139 |
| 140 void SetTimingUpdatedAndQuit() { |
| 141 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 142 matched_timing_update_ = true; |
| 143 Quit(); |
| 144 } |
| 145 |
| 146 ~TimingUpdatedObserver() override {} |
| 147 |
| 148 std::unique_ptr<base::RunLoop> run_loop_; |
| 149 int matching_fields_; // A bitvector composed from ExpectedTimingFields. |
| 150 bool matched_timing_update_ = false; |
| 151 int match_document_write_block_reload_ = 0; |
| 152 }; |
| 153 |
| 154 } // namespace |
| 155 |
| 36 class PageLoadMetricsBrowserTest : public InProcessBrowserTest { | 156 class PageLoadMetricsBrowserTest : public InProcessBrowserTest { |
| 37 public: | 157 public: |
| 38 PageLoadMetricsBrowserTest() {} | 158 PageLoadMetricsBrowserTest() {} |
| 39 ~PageLoadMetricsBrowserTest() override {} | 159 ~PageLoadMetricsBrowserTest() override {} |
| 40 | 160 |
| 41 protected: | 161 protected: |
| 42 void NavigateToUntrackedUrl() { | 162 void NavigateToUntrackedUrl() { |
| 43 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); | 163 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); |
| 44 } | 164 } |
| 45 | 165 |
| 46 bool NoPageLoadMetricsRecorded() { | 166 bool NoPageLoadMetricsRecorded() { |
| 47 return histogram_tester_.GetTotalCountsForPrefix("PageLoad.").empty(); | 167 return histogram_tester_.GetTotalCountsForPrefix("PageLoad.").empty(); |
| 48 } | 168 } |
| 49 | 169 |
| 170 scoped_refptr<TimingUpdatedObserver> CreateTimingUpdatedObserver() { |
| 171 content::WebContents* web_contents = |
| 172 browser()->tab_strip_model()->GetActiveWebContents(); |
| 173 scoped_refptr<TimingUpdatedObserver> observer(new TimingUpdatedObserver( |
| 174 web_contents->GetRenderViewHost()->GetWidget())); |
| 175 return observer; |
| 176 } |
| 177 |
| 50 base::HistogramTester histogram_tester_; | 178 base::HistogramTester histogram_tester_; |
| 51 | 179 |
| 52 private: | 180 private: |
| 53 DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsBrowserTest); | 181 DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsBrowserTest); |
| 54 }; | 182 }; |
| 55 | 183 |
| 56 void FailAllNetworkTransactions(net::URLRequestContextGetter* getter) { | 184 void FailAllNetworkTransactions(net::URLRequestContextGetter* getter) { |
| 57 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 185 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 58 net::HttpCache* cache( | 186 net::HttpCache* cache( |
| 59 getter->GetURLRequestContext()->http_transaction_factory()->GetCache()); | 187 getter->GetURLRequestContext()->http_transaction_factory()->GetCache()); |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 browser(), embedded_test_server()->GetURL("/download-test3.gif")); | 319 browser(), embedded_test_server()->GetURL("/download-test3.gif")); |
| 192 downloads_observer.WaitForFinished(); | 320 downloads_observer.WaitForFinished(); |
| 193 | 321 |
| 194 NavigateToUntrackedUrl(); | 322 NavigateToUntrackedUrl(); |
| 195 EXPECT_TRUE(NoPageLoadMetricsRecorded()); | 323 EXPECT_TRUE(NoPageLoadMetricsRecorded()); |
| 196 } | 324 } |
| 197 | 325 |
| 198 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PreloadDocumentWrite) { | 326 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PreloadDocumentWrite) { |
| 199 ASSERT_TRUE(embedded_test_server()->Start()); | 327 ASSERT_TRUE(embedded_test_server()->Start()); |
| 200 | 328 |
| 329 scoped_refptr<TimingUpdatedObserver> fcp_observer = |
| 330 CreateTimingUpdatedObserver(); |
| 331 fcp_observer->AddMatchingFields( |
| 332 TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT); |
| 333 |
| 201 ui_test_utils::NavigateToURL( | 334 ui_test_utils::NavigateToURL( |
| 202 browser(), embedded_test_server()->GetURL( | 335 browser(), embedded_test_server()->GetURL( |
| 203 "/page_load_metrics/document_write_external_script.html")); | 336 "/page_load_metrics/document_write_external_script.html")); |
| 204 NavigateToUntrackedUrl(); | 337 fcp_observer->WaitForMatchingIPC(); |
| 205 | 338 |
| 206 histogram_tester_.ExpectTotalCount( | 339 histogram_tester_.ExpectTotalCount( |
| 207 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 1); | 340 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 1); |
| 208 } | 341 } |
| 209 | 342 |
| 210 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPreloadDocumentWrite) { | 343 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPreloadDocumentWrite) { |
| 211 ASSERT_TRUE(embedded_test_server()->Start()); | 344 ASSERT_TRUE(embedded_test_server()->Start()); |
| 212 | 345 |
| 213 ui_test_utils::NavigateToURL( | 346 ui_test_utils::NavigateToURL( |
| 214 browser(), embedded_test_server()->GetURL( | 347 browser(), embedded_test_server()->GetURL( |
| 215 "/page_load_metrics/document_write_no_script.html")); | 348 "/page_load_metrics/document_write_no_script.html")); |
| 216 NavigateToUntrackedUrl(); | 349 NavigateToUntrackedUrl(); |
| 217 | 350 |
| 218 histogram_tester_.ExpectTotalCount( | 351 histogram_tester_.ExpectTotalCount( |
| 219 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0); | 352 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0); |
| 220 } | 353 } |
| 221 | 354 |
| 222 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWrite) { | 355 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWrite) { |
| 223 ASSERT_TRUE(embedded_test_server()->Start()); | 356 ASSERT_TRUE(embedded_test_server()->Start()); |
| 224 | 357 |
| 358 scoped_refptr<TimingUpdatedObserver> fcp_observer = |
| 359 CreateTimingUpdatedObserver(); |
| 360 fcp_observer->AddMatchingFields( |
| 361 TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT); |
| 362 |
| 225 ui_test_utils::NavigateToURL(browser(), | 363 ui_test_utils::NavigateToURL(browser(), |
| 226 embedded_test_server()->GetURL("/title1.html")); | 364 embedded_test_server()->GetURL("/title1.html")); |
| 227 NavigateToUntrackedUrl(); | 365 fcp_observer->WaitForMatchingIPC(); |
| 366 |
| 228 histogram_tester_.ExpectTotalCount( | 367 histogram_tester_.ExpectTotalCount( |
| 229 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0); | 368 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0); |
| 230 histogram_tester_.ExpectTotalCount( | 369 histogram_tester_.ExpectTotalCount( |
| 231 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); | 370 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); |
| 232 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); | 371 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); |
| 233 } | 372 } |
| 234 | 373 |
| 235 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteBlock) { | 374 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteBlock) { |
| 236 ASSERT_TRUE(embedded_test_server()->Start()); | 375 ASSERT_TRUE(embedded_test_server()->Start()); |
| 237 | 376 |
| 377 scoped_refptr<TimingUpdatedObserver> fcp_observer = |
| 378 CreateTimingUpdatedObserver(); |
| 379 fcp_observer->AddMatchingFields( |
| 380 TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT); |
| 381 |
| 238 ui_test_utils::NavigateToURL( | 382 ui_test_utils::NavigateToURL( |
| 239 browser(), embedded_test_server()->GetURL( | 383 browser(), embedded_test_server()->GetURL( |
| 240 "/page_load_metrics/document_write_script_block.html")); | 384 "/page_load_metrics/document_write_script_block.html")); |
| 241 NavigateToUntrackedUrl(); | 385 fcp_observer->WaitForMatchingIPC(); |
| 242 | 386 |
| 243 histogram_tester_.ExpectTotalCount( | 387 histogram_tester_.ExpectTotalCount( |
| 244 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); | 388 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); |
| 245 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1); | 389 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1); |
| 246 } | 390 } |
| 247 | 391 |
| 248 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) { | 392 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) { |
| 249 ASSERT_TRUE(embedded_test_server()->Start()); | 393 ASSERT_TRUE(embedded_test_server()->Start()); |
| 250 | 394 |
| 395 scoped_refptr<TimingUpdatedObserver> fcp_observer = |
| 396 CreateTimingUpdatedObserver(); |
| 397 fcp_observer->AddMatchingFields( |
| 398 TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT); |
| 399 scoped_refptr<TimingUpdatedObserver> reload_observer = |
| 400 CreateTimingUpdatedObserver(); |
| 401 reload_observer->MatchDocumentWriteBlockReload(2); |
| 402 |
| 251 ui_test_utils::NavigateToURL( | 403 ui_test_utils::NavigateToURL( |
| 252 browser(), embedded_test_server()->GetURL( | 404 browser(), embedded_test_server()->GetURL( |
| 253 "/page_load_metrics/document_write_script_block.html")); | 405 "/page_load_metrics/document_write_script_block.html")); |
| 254 | 406 |
| 255 // Reload should not log the histogram as the script is not blocked. | 407 // Reload should not log the histogram as the script is not blocked. |
| 256 ui_test_utils::NavigateToURL( | 408 ui_test_utils::NavigateToURL( |
| 257 browser(), embedded_test_server()->GetURL( | 409 browser(), embedded_test_server()->GetURL( |
| 258 "/page_load_metrics/document_write_script_block.html")); | 410 "/page_load_metrics/document_write_script_block.html")); |
| 259 | 411 |
| 260 ui_test_utils::NavigateToURL( | 412 ui_test_utils::NavigateToURL( |
| 261 browser(), embedded_test_server()->GetURL( | 413 browser(), embedded_test_server()->GetURL( |
| 262 "/page_load_metrics/document_write_script_block.html")); | 414 "/page_load_metrics/document_write_script_block.html")); |
| 263 | 415 |
| 264 histogram_tester_.ExpectTotalCount( | 416 histogram_tester_.ExpectTotalCount( |
| 265 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); | 417 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); |
| 266 | 418 |
| 267 NavigateToUntrackedUrl(); | 419 fcp_observer->WaitForMatchingIPC(); |
| 420 reload_observer->WaitForMatchingIPC(); |
| 268 | 421 |
| 269 histogram_tester_.ExpectTotalCount( | 422 histogram_tester_.ExpectTotalCount( |
| 270 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); | 423 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); |
| 271 | 424 |
| 272 histogram_tester_.ExpectTotalCount( | 425 histogram_tester_.ExpectTotalCount( |
| 273 internal::kHistogramDocWriteBlockReloadCount, 2); | 426 internal::kHistogramDocWriteBlockReloadCount, 2); |
| 274 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1); | 427 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1); |
| 275 } | 428 } |
| 276 | 429 |
| 277 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteAsync) { | 430 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteAsync) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 NavigateToUntrackedUrl(); | 462 NavigateToUntrackedUrl(); |
| 310 | 463 |
| 311 histogram_tester_.ExpectTotalCount( | 464 histogram_tester_.ExpectTotalCount( |
| 312 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); | 465 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); |
| 313 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); | 466 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); |
| 314 } | 467 } |
| 315 | 468 |
| 316 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, BadXhtml) { | 469 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, BadXhtml) { |
| 317 ASSERT_TRUE(embedded_test_server()->Start()); | 470 ASSERT_TRUE(embedded_test_server()->Start()); |
| 318 | 471 |
| 472 scoped_refptr<TimingUpdatedObserver> timing_observer = |
| 473 CreateTimingUpdatedObserver(); |
| 474 timing_observer->AddMatchingFields(TimingUpdatedObserver::FIRST_PAINT); |
| 475 |
| 319 // When an XHTML page contains invalid XML, it causes a paint of the error | 476 // When an XHTML page contains invalid XML, it causes a paint of the error |
| 320 // message without a layout. Page load metrics currently treats this as an | 477 // message without a layout. Page load metrics currently treats this as an |
| 321 // error. Eventually, we'll fix this by special casing the handling of | 478 // error. Eventually, we'll fix this by special casing the handling of |
| 322 // documents with non-well-formed XML on the blink side. See crbug.com/627607 | 479 // documents with non-well-formed XML on the blink side. See crbug.com/627607 |
| 323 // for more. | 480 // for more. |
| 324 ui_test_utils::NavigateToURL( | 481 ui_test_utils::NavigateToURL( |
| 325 browser(), | 482 browser(), |
| 326 embedded_test_server()->GetURL("/page_load_metrics/badxml.xhtml")); | 483 embedded_test_server()->GetURL("/page_load_metrics/badxml.xhtml")); |
| 327 NavigateToUntrackedUrl(); | 484 |
| 485 timing_observer->WaitForMatchingIPC(); |
| 328 | 486 |
| 329 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 0); | 487 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 0); |
| 330 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); | 488 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); |
| 331 histogram_tester_.ExpectBucketCount(page_load_metrics::internal::kErrorEvents, | 489 histogram_tester_.ExpectBucketCount(page_load_metrics::internal::kErrorEvents, |
| 332 page_load_metrics::ERR_BAD_TIMING_IPC, 1); | 490 page_load_metrics::ERR_BAD_TIMING_IPC, 1); |
| 333 } | 491 } |
| 334 | 492 |
| 335 // Test code that aborts provisional navigations. | 493 // Test code that aborts provisional navigations. |
| 336 // TODO(csharrison): Move these to unit tests once the navigation API in content | 494 // TODO(csharrison): Move these to unit tests once the navigation API in content |
| 337 // properly calls NavigationHandle/NavigationThrottle methods. | 495 // properly calls NavigationHandle/NavigationThrottle methods. |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 | 666 |
| 509 histogram_tester_.ExpectUniqueSample( | 667 histogram_tester_.ExpectUniqueSample( |
| 510 internal::kHistogramFirstMeaningfulPaintStatus, | 668 internal::kHistogramFirstMeaningfulPaintStatus, |
| 511 internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE, 1); | 669 internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE, 1); |
| 512 histogram_tester_.ExpectTotalCount( | 670 histogram_tester_.ExpectTotalCount( |
| 513 internal::kHistogramFirstMeaningfulPaint, 0); | 671 internal::kHistogramFirstMeaningfulPaint, 0); |
| 514 histogram_tester_.ExpectTotalCount( | 672 histogram_tester_.ExpectTotalCount( |
| 515 internal::kHistogramParseStartToFirstMeaningfulPaint, 0); | 673 internal::kHistogramParseStartToFirstMeaningfulPaint, 0); |
| 516 } | 674 } |
| 517 | 675 |
| 518 // Flaky on Linux (timing out or failing in an expectation) crbug.com/657022 | |
| 519 #if defined(OS_LINUX) | |
| 520 #define MAYBE_NoStatePrefetchObserverCacheable \ | |
| 521 DISABLED_NoStatePrefetchObserverCacheable | |
| 522 #else | |
| 523 #define MAYBE_NoStatePrefetchObserverCacheable NoStatePrefetchObserverCacheable | |
| 524 #endif | |
| 525 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 676 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| 526 MAYBE_NoStatePrefetchObserverCacheable) { | 677 NoStatePrefetchObserverCacheable) { |
| 527 ASSERT_TRUE(embedded_test_server()->Start()); | 678 ASSERT_TRUE(embedded_test_server()->Start()); |
| 528 | 679 |
| 680 scoped_refptr<TimingUpdatedObserver> fcp_observer = |
| 681 CreateTimingUpdatedObserver(); |
| 682 fcp_observer->AddMatchingFields( |
| 683 TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT); |
| 684 |
| 529 ui_test_utils::NavigateToURL(browser(), | 685 ui_test_utils::NavigateToURL(browser(), |
| 530 embedded_test_server()->GetURL("/title1.html")); | 686 embedded_test_server()->GetURL("/title1.html")); |
| 531 NavigateToUntrackedUrl(); | 687 |
| 688 fcp_observer->WaitForMatchingIPC(); |
| 532 | 689 |
| 533 histogram_tester_.ExpectTotalCount( | 690 histogram_tester_.ExpectTotalCount( |
| 534 "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 0); | 691 "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 0); |
| 535 histogram_tester_.ExpectTotalCount( | 692 histogram_tester_.ExpectTotalCount( |
| 536 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 1); | 693 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 1); |
| 537 } | 694 } |
| 538 | 695 |
| 539 // Flaky on Linux (timing out or failing in an expectation) crbug.com/657022 | |
| 540 #if defined(OS_LINUX) | |
| 541 #define MAYBE_NoStatePrefetchObserverNoStore \ | |
| 542 DISABLED_NoStatePrefetchObserverNoStore | |
| 543 #else | |
| 544 #define MAYBE_NoStatePrefetchObserverNoStore NoStatePrefetchObserverNoStore | |
| 545 #endif | |
| 546 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 696 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| 547 MAYBE_NoStatePrefetchObserverNoStore) { | 697 NoStatePrefetchObserverNoStore) { |
| 548 ASSERT_TRUE(embedded_test_server()->Start()); | 698 ASSERT_TRUE(embedded_test_server()->Start()); |
| 549 | 699 |
| 700 scoped_refptr<TimingUpdatedObserver> fcp_observer = |
| 701 CreateTimingUpdatedObserver(); |
| 702 fcp_observer->AddMatchingFields( |
| 703 TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT); |
| 704 |
| 550 ui_test_utils::NavigateToURL(browser(), | 705 ui_test_utils::NavigateToURL(browser(), |
| 551 embedded_test_server()->GetURL("/nostore.html")); | 706 embedded_test_server()->GetURL("/nostore.html")); |
| 552 NavigateToUntrackedUrl(); | 707 |
| 708 fcp_observer->WaitForMatchingIPC(); |
| 553 | 709 |
| 554 histogram_tester_.ExpectTotalCount( | 710 histogram_tester_.ExpectTotalCount( |
| 555 "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 1); | 711 "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 1); |
| 556 histogram_tester_.ExpectTotalCount( | 712 histogram_tester_.ExpectTotalCount( |
| 557 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 0); | 713 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 0); |
| 558 } | 714 } |
| 559 | 715 |
| 560 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, CSSTiming) { | 716 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, CSSTiming) { |
| 561 ASSERT_TRUE(embedded_test_server()->Start()); | 717 ASSERT_TRUE(embedded_test_server()->Start()); |
| 562 | 718 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 584 ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL( | 740 ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL( |
| 585 "/page_load_metrics/large.html")); | 741 "/page_load_metrics/large.html")); |
| 586 NavigateToUntrackedUrl(); | 742 NavigateToUntrackedUrl(); |
| 587 | 743 |
| 588 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); | 744 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); |
| 589 | 745 |
| 590 // Verify that there is a single sample recorded in the 10kB bucket (the size | 746 // Verify that there is a single sample recorded in the 10kB bucket (the size |
| 591 // of the main HTML response). | 747 // of the main HTML response). |
| 592 histogram_tester_.ExpectBucketCount(internal::kHistogramTotalBytes, 10, 1); | 748 histogram_tester_.ExpectBucketCount(internal::kHistogramTotalBytes, 10, 1); |
| 593 } | 749 } |
| OLD | NEW |