| OLD | NEW |
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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" |
| 27 #include "content/public/browser/browser_message_filter.h" |
| 26 #include "content/public/browser/browser_thread.h" | 28 #include "content/public/browser/browser_thread.h" |
| 29 #include "content/public/browser/render_process_host.h" |
| 30 #include "content/public/browser/render_view_host.h" |
| 27 #include "content/public/test/browser_test_utils.h" | 31 #include "content/public/test/browser_test_utils.h" |
| 28 #include "content/public/test/download_test_observer.h" | 32 #include "content/public/test/download_test_observer.h" |
| 33 #include "ipc/ipc_message_start.h" |
| 29 #include "net/http/failing_http_transaction_factory.h" | 34 #include "net/http/failing_http_transaction_factory.h" |
| 30 #include "net/http/http_cache.h" | 35 #include "net/http/http_cache.h" |
| 31 #include "net/test/embedded_test_server/embedded_test_server.h" | 36 #include "net/test/embedded_test_server/embedded_test_server.h" |
| 32 #include "net/test/url_request/url_request_failed_job.h" | 37 #include "net/test/url_request/url_request_failed_job.h" |
| 33 #include "net/url_request/url_request_context.h" | 38 #include "net/url_request/url_request_context.h" |
| 34 #include "net/url_request/url_request_context_getter.h" | 39 #include "net/url_request/url_request_context_getter.h" |
| 35 | 40 |
| 41 namespace { |
| 42 |
| 43 // Waits until a PageLoadMetricsMsg_TimingUpdated message IPC is received. |
| 44 class TimingUpdatedObserver : public content::BrowserMessageFilter { |
| 45 public: |
| 46 explicit TimingUpdatedObserver(content::RenderWidgetHost* render_widget_host) |
| 47 : content::BrowserMessageFilter(PageLoadMetricsMsgStart) { |
| 48 render_widget_host->GetProcess()->AddFilter(this); |
| 49 |
| 50 // Roudtrip to the IO thread, to ensure that the filter is properly |
| 51 // installed. |
| 52 content::BrowserThread::PostTaskAndReply( |
| 53 content::BrowserThread::IO, FROM_HERE, base::Bind(&base::DoNothing), |
| 54 base::Bind(&TimingUpdatedObserver::Quit, this)); |
| 55 run_loop_.reset(new base::RunLoop()); |
| 56 run_loop_->Run(); |
| 57 run_loop_.reset(nullptr); |
| 58 } |
| 59 |
| 60 // Waits for the IPC. Returns immediately if the IPC has already been received |
| 61 // before this call. |
| 62 void WaitForTimingUpdatedIPC() { |
| 63 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 64 if (timing_updated_) |
| 65 return; |
| 66 |
| 67 run_loop_.reset(new base::RunLoop()); |
| 68 run_loop_->Run(); |
| 69 run_loop_.reset(nullptr); |
| 70 } |
| 71 |
| 72 private: |
| 73 bool OnMessageReceived(const IPC::Message& message) override { |
| 74 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 75 |
| 76 if (message.type() == PageLoadMetricsMsg_TimingUpdated::ID) { |
| 77 content::BrowserThread::PostTask( |
| 78 content::BrowserThread::UI, FROM_HERE, |
| 79 base::Bind(&TimingUpdatedObserver::SetTimingUpdatedAndQuit, this)); |
| 80 } |
| 81 |
| 82 return false; |
| 83 } |
| 84 |
| 85 void Quit() { |
| 86 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 87 if (run_loop_) |
| 88 run_loop_->Quit(); |
| 89 } |
| 90 |
| 91 void SetTimingUpdatedAndQuit() { |
| 92 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 93 timing_updated_ = true; |
| 94 Quit(); |
| 95 } |
| 96 |
| 97 ~TimingUpdatedObserver() override {} |
| 98 |
| 99 std::unique_ptr<base::RunLoop> run_loop_; |
| 100 bool timing_updated_ = false; |
| 101 }; |
| 102 |
| 103 } // namespace |
| 104 |
| 36 class PageLoadMetricsBrowserTest : public InProcessBrowserTest { | 105 class PageLoadMetricsBrowserTest : public InProcessBrowserTest { |
| 37 public: | 106 public: |
| 38 PageLoadMetricsBrowserTest() {} | 107 PageLoadMetricsBrowserTest() {} |
| 39 ~PageLoadMetricsBrowserTest() override {} | 108 ~PageLoadMetricsBrowserTest() override {} |
| 40 | 109 |
| 41 protected: | 110 protected: |
| 42 void NavigateToUntrackedUrl() { | 111 void NavigateToUntrackedUrl() { |
| 43 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); | 112 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); |
| 44 } | 113 } |
| 45 | 114 |
| 46 bool NoPageLoadMetricsRecorded() { | 115 bool NoPageLoadMetricsRecorded() { |
| 47 return histogram_tester_.GetTotalCountsForPrefix("PageLoad.").empty(); | 116 return histogram_tester_.GetTotalCountsForPrefix("PageLoad.").empty(); |
| 48 } | 117 } |
| 49 | 118 |
| 119 void WaitForTimingUpdatedIPC() { |
| 120 content::WebContents* web_contents = |
| 121 browser()->tab_strip_model()->GetActiveWebContents(); |
| 122 scoped_refptr<TimingUpdatedObserver> observer(new TimingUpdatedObserver( |
| 123 web_contents->GetRenderViewHost()->GetWidget())); |
| 124 |
| 125 // The observer must be created before checking this, to avoid a race |
| 126 // condition. |
| 127 if (!NoPageLoadMetricsRecorded()) |
| 128 return; |
| 129 |
| 130 observer->WaitForTimingUpdatedIPC(); |
| 131 } |
| 132 |
| 50 base::HistogramTester histogram_tester_; | 133 base::HistogramTester histogram_tester_; |
| 51 | 134 |
| 52 DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsBrowserTest); | 135 DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsBrowserTest); |
| 53 }; | 136 }; |
| 54 | 137 |
| 55 void FailAllNetworkTransactions(net::URLRequestContextGetter* getter) { | 138 void FailAllNetworkTransactions(net::URLRequestContextGetter* getter) { |
| 56 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 139 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 57 net::HttpCache* cache( | 140 net::HttpCache* cache( |
| 58 getter->GetURLRequestContext()->http_transaction_factory()->GetCache()); | 141 getter->GetURLRequestContext()->http_transaction_factory()->GetCache()); |
| 59 DCHECK(cache); | 142 DCHECK(cache); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 70 EXPECT_TRUE(NoPageLoadMetricsRecorded()); | 153 EXPECT_TRUE(NoPageLoadMetricsRecorded()); |
| 71 } | 154 } |
| 72 | 155 |
| 73 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NewPage) { | 156 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NewPage) { |
| 74 ASSERT_TRUE(embedded_test_server()->Start()); | 157 ASSERT_TRUE(embedded_test_server()->Start()); |
| 75 | 158 |
| 76 ui_test_utils::NavigateToURL(browser(), | 159 ui_test_utils::NavigateToURL(browser(), |
| 77 embedded_test_server()->GetURL("/title1.html")); | 160 embedded_test_server()->GetURL("/title1.html")); |
| 78 NavigateToUntrackedUrl(); | 161 NavigateToUntrackedUrl(); |
| 79 | 162 |
| 163 WaitForTimingUpdatedIPC(); |
| 80 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); | 164 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); |
| 81 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | 165 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
| 82 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | 166 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
| 83 histogram_tester_.ExpectTotalCount(internal::kHistogramParseDuration, 1); | 167 histogram_tester_.ExpectTotalCount(internal::kHistogramParseDuration, 1); |
| 84 histogram_tester_.ExpectTotalCount( | 168 histogram_tester_.ExpectTotalCount( |
| 85 internal::kHistogramParseBlockedOnScriptLoad, 1); | 169 internal::kHistogramParseBlockedOnScriptLoad, 1); |
| 86 histogram_tester_.ExpectTotalCount( | 170 histogram_tester_.ExpectTotalCount( |
| 87 internal::kHistogramParseBlockedOnScriptExecution, 1); | 171 internal::kHistogramParseBlockedOnScriptExecution, 1); |
| 88 | 172 |
| 89 // Verify that NoPageLoadMetricsRecorded returns false when PageLoad metrics | 173 // Verify that NoPageLoadMetricsRecorded returns false when PageLoad metrics |
| 90 // have been recorded. | 174 // have been recorded. |
| 91 EXPECT_FALSE(NoPageLoadMetricsRecorded()); | 175 EXPECT_FALSE(NoPageLoadMetricsRecorded()); |
| 92 } | 176 } |
| 93 | 177 |
| 94 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SamePageNavigation) { | 178 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SamePageNavigation) { |
| 95 ASSERT_TRUE(embedded_test_server()->Start()); | 179 ASSERT_TRUE(embedded_test_server()->Start()); |
| 96 | 180 |
| 97 ui_test_utils::NavigateToURL(browser(), | 181 ui_test_utils::NavigateToURL(browser(), |
| 98 embedded_test_server()->GetURL("/title1.html")); | 182 embedded_test_server()->GetURL("/title1.html")); |
| 99 ui_test_utils::NavigateToURL( | 183 ui_test_utils::NavigateToURL( |
| 100 browser(), embedded_test_server()->GetURL("/title1.html#hash")); | 184 browser(), embedded_test_server()->GetURL("/title1.html#hash")); |
| 101 NavigateToUntrackedUrl(); | 185 NavigateToUntrackedUrl(); |
| 102 | 186 |
| 187 WaitForTimingUpdatedIPC(); |
| 103 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); | 188 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); |
| 104 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | 189 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
| 105 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | 190 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
| 106 } | 191 } |
| 107 | 192 |
| 108 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameUrlNavigation) { | 193 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameUrlNavigation) { |
| 109 ASSERT_TRUE(embedded_test_server()->Start()); | 194 ASSERT_TRUE(embedded_test_server()->Start()); |
| 110 | 195 |
| 111 ui_test_utils::NavigateToURL(browser(), | 196 ui_test_utils::NavigateToURL(browser(), |
| 112 embedded_test_server()->GetURL("/title1.html")); | 197 embedded_test_server()->GetURL("/title1.html")); |
| 113 ui_test_utils::NavigateToURL(browser(), | 198 ui_test_utils::NavigateToURL(browser(), |
| 114 embedded_test_server()->GetURL("/title1.html")); | 199 embedded_test_server()->GetURL("/title1.html")); |
| 115 NavigateToUntrackedUrl(); | 200 NavigateToUntrackedUrl(); |
| 116 | 201 |
| 117 // We expect one histogram sample for each navigation to title1.html. | 202 // We expect one histogram sample for each navigation to title1.html. |
| 203 WaitForTimingUpdatedIPC(); |
| 118 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 2); | 204 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 2); |
| 119 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 2); | 205 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 2); |
| 120 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 2); | 206 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 2); |
| 121 } | 207 } |
| 122 | 208 |
| 123 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NonHtmlMainResource) { | 209 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NonHtmlMainResource) { |
| 124 ASSERT_TRUE(embedded_test_server()->Start()); | 210 ASSERT_TRUE(embedded_test_server()->Start()); |
| 125 | 211 |
| 126 ui_test_utils::NavigateToURL(browser(), | 212 ui_test_utils::NavigateToURL(browser(), |
| 127 embedded_test_server()->GetURL("/circle.svg")); | 213 embedded_test_server()->GetURL("/circle.svg")); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 } | 280 } |
| 195 | 281 |
| 196 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PreloadDocumentWrite) { | 282 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PreloadDocumentWrite) { |
| 197 ASSERT_TRUE(embedded_test_server()->Start()); | 283 ASSERT_TRUE(embedded_test_server()->Start()); |
| 198 | 284 |
| 199 ui_test_utils::NavigateToURL( | 285 ui_test_utils::NavigateToURL( |
| 200 browser(), embedded_test_server()->GetURL( | 286 browser(), embedded_test_server()->GetURL( |
| 201 "/page_load_metrics/document_write_external_script.html")); | 287 "/page_load_metrics/document_write_external_script.html")); |
| 202 NavigateToUntrackedUrl(); | 288 NavigateToUntrackedUrl(); |
| 203 | 289 |
| 290 WaitForTimingUpdatedIPC(); |
| 204 histogram_tester_.ExpectTotalCount( | 291 histogram_tester_.ExpectTotalCount( |
| 205 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 1); | 292 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 1); |
| 206 } | 293 } |
| 207 | 294 |
| 208 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPreloadDocumentWrite) { | 295 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPreloadDocumentWrite) { |
| 209 ASSERT_TRUE(embedded_test_server()->Start()); | 296 ASSERT_TRUE(embedded_test_server()->Start()); |
| 210 | 297 |
| 211 ui_test_utils::NavigateToURL( | 298 ui_test_utils::NavigateToURL( |
| 212 browser(), embedded_test_server()->GetURL( | 299 browser(), embedded_test_server()->GetURL( |
| 213 "/page_load_metrics/document_write_no_script.html")); | 300 "/page_load_metrics/document_write_no_script.html")); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 230 } | 317 } |
| 231 | 318 |
| 232 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteBlock) { | 319 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteBlock) { |
| 233 ASSERT_TRUE(embedded_test_server()->Start()); | 320 ASSERT_TRUE(embedded_test_server()->Start()); |
| 234 | 321 |
| 235 ui_test_utils::NavigateToURL( | 322 ui_test_utils::NavigateToURL( |
| 236 browser(), embedded_test_server()->GetURL( | 323 browser(), embedded_test_server()->GetURL( |
| 237 "/page_load_metrics/document_write_script_block.html")); | 324 "/page_load_metrics/document_write_script_block.html")); |
| 238 NavigateToUntrackedUrl(); | 325 NavigateToUntrackedUrl(); |
| 239 | 326 |
| 327 WaitForTimingUpdatedIPC(); |
| 240 histogram_tester_.ExpectTotalCount( | 328 histogram_tester_.ExpectTotalCount( |
| 241 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); | 329 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); |
| 242 } | 330 } |
| 243 | 331 |
| 244 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) { | 332 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) { |
| 245 ASSERT_TRUE(embedded_test_server()->Start()); | 333 ASSERT_TRUE(embedded_test_server()->Start()); |
| 246 | 334 |
| 247 ui_test_utils::NavigateToURL( | 335 ui_test_utils::NavigateToURL( |
| 248 browser(), embedded_test_server()->GetURL( | 336 browser(), embedded_test_server()->GetURL( |
| 249 "/page_load_metrics/document_write_script_block.html")); | 337 "/page_load_metrics/document_write_script_block.html")); |
| 250 | 338 |
| 251 // Reload should not log the histogram as the script is not blocked. | 339 // Reload should not log the histogram as the script is not blocked. |
| 252 ui_test_utils::NavigateToURL( | 340 ui_test_utils::NavigateToURL( |
| 253 browser(), embedded_test_server()->GetURL( | 341 browser(), embedded_test_server()->GetURL( |
| 254 "/page_load_metrics/document_write_script_block.html")); | 342 "/page_load_metrics/document_write_script_block.html")); |
| 255 | 343 |
| 256 ui_test_utils::NavigateToURL( | 344 ui_test_utils::NavigateToURL( |
| 257 browser(), embedded_test_server()->GetURL( | 345 browser(), embedded_test_server()->GetURL( |
| 258 "/page_load_metrics/document_write_script_block.html")); | 346 "/page_load_metrics/document_write_script_block.html")); |
| 259 | 347 |
| 348 WaitForTimingUpdatedIPC(); |
| 260 histogram_tester_.ExpectTotalCount( | 349 histogram_tester_.ExpectTotalCount( |
| 261 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); | 350 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); |
| 262 | 351 |
| 263 NavigateToUntrackedUrl(); | 352 NavigateToUntrackedUrl(); |
| 264 | 353 |
| 265 histogram_tester_.ExpectTotalCount( | 354 histogram_tester_.ExpectTotalCount( |
| 266 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); | 355 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); |
| 267 | 356 |
| 268 histogram_tester_.ExpectTotalCount( | 357 histogram_tester_.ExpectTotalCount( |
| 269 internal::kHistogramDocWriteBlockReloadCount, 2); | 358 internal::kHistogramDocWriteBlockReloadCount, 2); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 // When an XHTML page contains invalid XML, it causes a paint of the error | 400 // When an XHTML page contains invalid XML, it causes a paint of the error |
| 312 // message without a layout. Page load metrics currently treats this as an | 401 // message without a layout. Page load metrics currently treats this as an |
| 313 // error. Eventually, we'll fix this by special casing the handling of | 402 // error. Eventually, we'll fix this by special casing the handling of |
| 314 // documents with non-well-formed XML on the blink side. See crbug.com/627607 | 403 // documents with non-well-formed XML on the blink side. See crbug.com/627607 |
| 315 // for more. | 404 // for more. |
| 316 ui_test_utils::NavigateToURL( | 405 ui_test_utils::NavigateToURL( |
| 317 browser(), | 406 browser(), |
| 318 embedded_test_server()->GetURL("/page_load_metrics/badxml.xhtml")); | 407 embedded_test_server()->GetURL("/page_load_metrics/badxml.xhtml")); |
| 319 NavigateToUntrackedUrl(); | 408 NavigateToUntrackedUrl(); |
| 320 | 409 |
| 410 WaitForTimingUpdatedIPC(); |
| 321 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 0); | 411 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 0); |
| 322 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); | 412 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); |
| 323 histogram_tester_.ExpectBucketCount(page_load_metrics::internal::kErrorEvents, | 413 histogram_tester_.ExpectBucketCount(page_load_metrics::internal::kErrorEvents, |
| 324 page_load_metrics::ERR_BAD_TIMING_IPC, 1); | 414 page_load_metrics::ERR_BAD_TIMING_IPC, 1); |
| 325 } | 415 } |
| 326 | 416 |
| 327 // Test code that aborts provisional navigations. | 417 // Test code that aborts provisional navigations. |
| 328 // TODO(csharrison): Move these to unit tests once the navigation API in content | 418 // TODO(csharrison): Move these to unit tests once the navigation API in content |
| 329 // properly calls NavigationHandle/NavigationThrottle methods. | 419 // properly calls NavigationHandle/NavigationThrottle methods. |
| 330 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortNewNavigation) { | 420 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortNewNavigation) { |
| 331 ASSERT_TRUE(embedded_test_server()->Start()); | 421 ASSERT_TRUE(embedded_test_server()->Start()); |
| 332 | 422 |
| 333 GURL url(embedded_test_server()->GetURL("/title1.html")); | 423 GURL url(embedded_test_server()->GetURL("/title1.html")); |
| 334 chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK); | 424 chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK); |
| 335 content::TestNavigationManager manager( | 425 content::TestNavigationManager manager( |
| 336 browser()->tab_strip_model()->GetActiveWebContents(), url); | 426 browser()->tab_strip_model()->GetActiveWebContents(), url); |
| 337 | 427 |
| 338 chrome::Navigate(¶ms); | 428 chrome::Navigate(¶ms); |
| 339 EXPECT_TRUE(manager.WaitForRequestStart()); | 429 EXPECT_TRUE(manager.WaitForRequestStart()); |
| 340 | 430 |
| 341 GURL url2(embedded_test_server()->GetURL("/title2.html")); | 431 GURL url2(embedded_test_server()->GetURL("/title2.html")); |
| 342 chrome::NavigateParams params2(browser(), url2, | 432 chrome::NavigateParams params2(browser(), url2, |
| 343 ui::PAGE_TRANSITION_FROM_ADDRESS_BAR); | 433 ui::PAGE_TRANSITION_FROM_ADDRESS_BAR); |
| 344 content::TestNavigationManager manager2( | 434 content::TestNavigationManager manager2( |
| 345 browser()->tab_strip_model()->GetActiveWebContents(), url2); | 435 browser()->tab_strip_model()->GetActiveWebContents(), url2); |
| 346 chrome::Navigate(¶ms2); | 436 chrome::Navigate(¶ms2); |
| 347 | 437 |
| 348 manager2.WaitForNavigationFinished(); | 438 manager2.WaitForNavigationFinished(); |
| 439 WaitForTimingUpdatedIPC(); |
| 349 histogram_tester_.ExpectTotalCount( | 440 histogram_tester_.ExpectTotalCount( |
| 350 internal::kHistogramAbortNewNavigationBeforeCommit, 1); | 441 internal::kHistogramAbortNewNavigationBeforeCommit, 1); |
| 351 } | 442 } |
| 352 | 443 |
| 353 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortReload) { | 444 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortReload) { |
| 354 ASSERT_TRUE(embedded_test_server()->Start()); | 445 ASSERT_TRUE(embedded_test_server()->Start()); |
| 355 | 446 |
| 356 GURL url(embedded_test_server()->GetURL("/title1.html")); | 447 GURL url(embedded_test_server()->GetURL("/title1.html")); |
| 357 chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK); | 448 chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK); |
| 358 content::TestNavigationManager manager( | 449 content::TestNavigationManager manager( |
| 359 browser()->tab_strip_model()->GetActiveWebContents(), url); | 450 browser()->tab_strip_model()->GetActiveWebContents(), url); |
| 360 | 451 |
| 361 chrome::Navigate(¶ms); | 452 chrome::Navigate(¶ms); |
| 362 EXPECT_TRUE(manager.WaitForRequestStart()); | 453 EXPECT_TRUE(manager.WaitForRequestStart()); |
| 363 | 454 |
| 364 chrome::NavigateParams params2(browser(), url, ui::PAGE_TRANSITION_RELOAD); | 455 chrome::NavigateParams params2(browser(), url, ui::PAGE_TRANSITION_RELOAD); |
| 365 content::TestNavigationManager manager2( | 456 content::TestNavigationManager manager2( |
| 366 browser()->tab_strip_model()->GetActiveWebContents(), url); | 457 browser()->tab_strip_model()->GetActiveWebContents(), url); |
| 367 chrome::Navigate(¶ms2); | 458 chrome::Navigate(¶ms2); |
| 368 | 459 |
| 369 manager2.WaitForNavigationFinished(); | 460 manager2.WaitForNavigationFinished(); |
| 461 WaitForTimingUpdatedIPC(); |
| 370 histogram_tester_.ExpectTotalCount( | 462 histogram_tester_.ExpectTotalCount( |
| 371 internal::kHistogramAbortReloadBeforeCommit, 1); | 463 internal::kHistogramAbortReloadBeforeCommit, 1); |
| 372 } | 464 } |
| 373 | 465 |
| 374 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortClose) { | 466 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortClose) { |
| 375 ASSERT_TRUE(embedded_test_server()->Start()); | 467 ASSERT_TRUE(embedded_test_server()->Start()); |
| 376 | 468 |
| 377 GURL url(embedded_test_server()->GetURL("/title1.html")); | 469 GURL url(embedded_test_server()->GetURL("/title1.html")); |
| 378 chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK); | 470 chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK); |
| 379 content::TestNavigationManager manager( | 471 content::TestNavigationManager manager( |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 442 { | 534 { |
| 443 content::TestNavigationManager reload_manager( | 535 content::TestNavigationManager reload_manager( |
| 444 browser()->tab_strip_model()->GetActiveWebContents(), first_url); | 536 browser()->tab_strip_model()->GetActiveWebContents(), first_url); |
| 445 EXPECT_TRUE(content::ExecuteScript( | 537 EXPECT_TRUE(content::ExecuteScript( |
| 446 browser()->tab_strip_model()->GetActiveWebContents(), | 538 browser()->tab_strip_model()->GetActiveWebContents(), |
| 447 "window.location.reload();")); | 539 "window.location.reload();")); |
| 448 } | 540 } |
| 449 | 541 |
| 450 manager.WaitForNavigationFinished(); | 542 manager.WaitForNavigationFinished(); |
| 451 | 543 |
| 544 WaitForTimingUpdatedIPC(); |
| 452 histogram_tester_.ExpectTotalCount( | 545 histogram_tester_.ExpectTotalCount( |
| 453 internal::kHistogramAbortClientRedirectBeforeCommit, 1); | 546 internal::kHistogramAbortClientRedirectBeforeCommit, 1); |
| 454 } | 547 } |
| 455 | 548 |
| 456 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 549 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| 457 FirstMeaningfulPaintRecorded) { | 550 FirstMeaningfulPaintRecorded) { |
| 458 ASSERT_TRUE(embedded_test_server()->Start()); | 551 ASSERT_TRUE(embedded_test_server()->Start()); |
| 459 | 552 |
| 460 ui_test_utils::NavigateToURL(browser(), | 553 ui_test_utils::NavigateToURL(browser(), |
| 461 embedded_test_server()->GetURL("/title1.html")); | 554 embedded_test_server()->GetURL("/title1.html")); |
| 462 | 555 |
| 463 // Wait until the renderer finishes observing layouts. | 556 // Wait until the renderer finishes observing layouts. |
| 464 const int kNetworkIdleTime = 500; | 557 const int kNetworkIdleTime = 500; |
| 465 const int kMargin = 500; | 558 const int kMargin = 500; |
| 466 const std::string javascript = base::StringPrintf( | 559 const std::string javascript = base::StringPrintf( |
| 467 "setTimeout(() => window.domAutomationController.send(true), %d)", | 560 "setTimeout(() => window.domAutomationController.send(true), %d)", |
| 468 kNetworkIdleTime + kMargin); | 561 kNetworkIdleTime + kMargin); |
| 469 bool result; | 562 bool result; |
| 470 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( | 563 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( |
| 471 browser()->tab_strip_model()->GetActiveWebContents(), | 564 browser()->tab_strip_model()->GetActiveWebContents(), |
| 472 javascript, &result)); | 565 javascript, &result)); |
| 473 EXPECT_TRUE(result); | 566 EXPECT_TRUE(result); |
| 474 | 567 |
| 475 NavigateToUntrackedUrl(); | 568 NavigateToUntrackedUrl(); |
| 569 WaitForTimingUpdatedIPC(); |
| 476 histogram_tester_.ExpectUniqueSample( | 570 histogram_tester_.ExpectUniqueSample( |
| 477 internal::kHistogramFirstMeaningfulPaintStatus, | 571 internal::kHistogramFirstMeaningfulPaintStatus, |
| 478 internal::FIRST_MEANINGFUL_PAINT_RECORDED, 1); | 572 internal::FIRST_MEANINGFUL_PAINT_RECORDED, 1); |
| 479 histogram_tester_.ExpectTotalCount( | 573 histogram_tester_.ExpectTotalCount( |
| 480 internal::kHistogramFirstMeaningfulPaint, 1); | 574 internal::kHistogramFirstMeaningfulPaint, 1); |
| 481 histogram_tester_.ExpectTotalCount( | 575 histogram_tester_.ExpectTotalCount( |
| 482 internal::kHistogramParseStartToFirstMeaningfulPaint, 1); | 576 internal::kHistogramParseStartToFirstMeaningfulPaint, 1); |
| 483 } | 577 } |
| 484 | 578 |
| 485 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 579 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| 486 FirstMeaningfulPaintNotRecorded) { | 580 FirstMeaningfulPaintNotRecorded) { |
| 487 ASSERT_TRUE(embedded_test_server()->Start()); | 581 ASSERT_TRUE(embedded_test_server()->Start()); |
| 488 | 582 |
| 489 ui_test_utils::NavigateToURL(browser(), | 583 ui_test_utils::NavigateToURL(browser(), |
| 490 embedded_test_server()->GetURL("/title1.html")); | 584 embedded_test_server()->GetURL("/title1.html")); |
| 491 | 585 |
| 492 // Navigate away before a FMP is reported. | 586 // Navigate away before a FMP is reported. |
| 493 NavigateToUntrackedUrl(); | 587 NavigateToUntrackedUrl(); |
| 494 | 588 |
| 589 WaitForTimingUpdatedIPC(); |
| 495 histogram_tester_.ExpectUniqueSample( | 590 histogram_tester_.ExpectUniqueSample( |
| 496 internal::kHistogramFirstMeaningfulPaintStatus, | 591 internal::kHistogramFirstMeaningfulPaintStatus, |
| 497 internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE, 1); | 592 internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE, 1); |
| 498 histogram_tester_.ExpectTotalCount( | 593 histogram_tester_.ExpectTotalCount( |
| 499 internal::kHistogramFirstMeaningfulPaint, 0); | 594 internal::kHistogramFirstMeaningfulPaint, 0); |
| 500 histogram_tester_.ExpectTotalCount( | 595 histogram_tester_.ExpectTotalCount( |
| 501 internal::kHistogramParseStartToFirstMeaningfulPaint, 0); | 596 internal::kHistogramParseStartToFirstMeaningfulPaint, 0); |
| 502 } | 597 } |
| 503 | 598 |
| 504 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 599 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| 505 NoStatePrefetchObserverCacheable) { | 600 NoStatePrefetchObserverCacheable) { |
| 506 ASSERT_TRUE(embedded_test_server()->Start()); | 601 ASSERT_TRUE(embedded_test_server()->Start()); |
| 507 | 602 |
| 508 ui_test_utils::NavigateToURL(browser(), | 603 ui_test_utils::NavigateToURL(browser(), |
| 509 embedded_test_server()->GetURL("/title1.html")); | 604 embedded_test_server()->GetURL("/title1.html")); |
| 510 NavigateToUntrackedUrl(); | 605 NavigateToUntrackedUrl(); |
| 511 | 606 |
| 607 WaitForTimingUpdatedIPC(); |
| 512 histogram_tester_.ExpectTotalCount( | 608 histogram_tester_.ExpectTotalCount( |
| 513 prerender::PrerenderHistograms::GetFirstContentfulPaintHistogramName( | 609 prerender::PrerenderHistograms::GetFirstContentfulPaintHistogramName( |
| 514 prerender::ORIGIN_NONE, false, true, base::TimeDelta()), | 610 prerender::ORIGIN_NONE, false, true, base::TimeDelta()), |
| 515 0); | 611 0); |
| 516 histogram_tester_.ExpectTotalCount( | 612 histogram_tester_.ExpectTotalCount( |
| 517 prerender::PrerenderHistograms::GetFirstContentfulPaintHistogramName( | 613 prerender::PrerenderHistograms::GetFirstContentfulPaintHistogramName( |
| 518 prerender::ORIGIN_NONE, false, false, base::TimeDelta()), | 614 prerender::ORIGIN_NONE, false, false, base::TimeDelta()), |
| 519 1); | 615 1); |
| 520 } | 616 } |
| 521 | 617 |
| 522 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 618 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| 523 NoStatePrefetchObserverNoStore) { | 619 NoStatePrefetchObserverNoStore) { |
| 524 ASSERT_TRUE(embedded_test_server()->Start()); | 620 ASSERT_TRUE(embedded_test_server()->Start()); |
| 525 | 621 |
| 526 ui_test_utils::NavigateToURL(browser(), | 622 ui_test_utils::NavigateToURL(browser(), |
| 527 embedded_test_server()->GetURL("/nostore.html")); | 623 embedded_test_server()->GetURL("/nostore.html")); |
| 528 NavigateToUntrackedUrl(); | 624 NavigateToUntrackedUrl(); |
| 529 | 625 |
| 626 WaitForTimingUpdatedIPC(); |
| 530 histogram_tester_.ExpectTotalCount( | 627 histogram_tester_.ExpectTotalCount( |
| 531 prerender::PrerenderHistograms::GetFirstContentfulPaintHistogramName( | 628 prerender::PrerenderHistograms::GetFirstContentfulPaintHistogramName( |
| 532 prerender::ORIGIN_NONE, false, true, base::TimeDelta()), | 629 prerender::ORIGIN_NONE, false, true, base::TimeDelta()), |
| 533 1); | 630 1); |
| 534 histogram_tester_.ExpectTotalCount( | 631 histogram_tester_.ExpectTotalCount( |
| 535 prerender::PrerenderHistograms::GetFirstContentfulPaintHistogramName( | 632 prerender::PrerenderHistograms::GetFirstContentfulPaintHistogramName( |
| 536 prerender::ORIGIN_NONE, false, false, base::TimeDelta()), | 633 prerender::ORIGIN_NONE, false, false, base::TimeDelta()), |
| 537 0); | 634 0); |
| 538 } | 635 } |
| OLD | NEW |