Chromium Code Reviews| 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/threading/thread_restrictions.h" | 8 #include "base/threading/thread_restrictions.h" |
| 9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
| 10 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" | 10 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 #include "chrome/common/pref_names.h" | 23 #include "chrome/common/pref_names.h" |
| 24 #include "chrome/common/url_constants.h" | 24 #include "chrome/common/url_constants.h" |
| 25 #include "chrome/test/base/in_process_browser_test.h" | 25 #include "chrome/test/base/in_process_browser_test.h" |
| 26 #include "chrome/test/base/ui_test_utils.h" | 26 #include "chrome/test/base/ui_test_utils.h" |
| 27 #include "components/prefs/pref_service.h" | 27 #include "components/prefs/pref_service.h" |
| 28 #include "content/public/browser/browser_thread.h" | 28 #include "content/public/browser/browser_thread.h" |
| 29 #include "content/public/browser/render_process_host.h" | 29 #include "content/public/browser/render_process_host.h" |
| 30 #include "content/public/browser/render_view_host.h" | 30 #include "content/public/browser/render_view_host.h" |
| 31 #include "content/public/test/browser_test_utils.h" | 31 #include "content/public/test/browser_test_utils.h" |
| 32 #include "content/public/test/download_test_observer.h" | 32 #include "content/public/test/download_test_observer.h" |
| 33 #include "net/base/net_errors.h" | |
| 33 #include "net/http/failing_http_transaction_factory.h" | 34 #include "net/http/failing_http_transaction_factory.h" |
| 34 #include "net/http/http_cache.h" | 35 #include "net/http/http_cache.h" |
| 35 #include "net/test/embedded_test_server/embedded_test_server.h" | 36 #include "net/test/embedded_test_server/embedded_test_server.h" |
| 36 #include "net/test/url_request/url_request_failed_job.h" | 37 #include "net/test/url_request/url_request_failed_job.h" |
| 37 #include "net/url_request/url_request_context.h" | 38 #include "net/url_request/url_request_context.h" |
| 38 #include "net/url_request/url_request_context_getter.h" | 39 #include "net/url_request/url_request_context_getter.h" |
| 39 | 40 |
| 40 namespace { | 41 namespace { |
| 41 | 42 |
| 43 void FailAllNetworkTransactions(net::URLRequestContextGetter* getter) { | |
| 44 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | |
| 45 net::HttpCache* cache( | |
| 46 getter->GetURLRequestContext()->http_transaction_factory()->GetCache()); | |
| 47 DCHECK(cache); | |
| 48 std::unique_ptr<net::FailingHttpTransactionFactory> factory = | |
| 49 base::MakeUnique<net::FailingHttpTransactionFactory>(cache->GetSession(), | |
| 50 net::ERR_FAILED); | |
| 51 // Throw away old version; since this is a browser test, there is no | |
| 52 // need to restore the old state. | |
| 53 cache->SetHttpNetworkTransactionFactoryForTesting(std::move(factory)); | |
| 54 } | |
| 55 | |
| 42 // Waits until specified timing and metadata expectations are satisfied. | 56 // Waits until specified timing and metadata expectations are satisfied. |
| 43 class PageLoadMetricsWaiter | 57 class PageLoadMetricsWaiter |
| 44 : public page_load_metrics::MetricsWebContentsObserver::TestingObserver { | 58 : public page_load_metrics::MetricsWebContentsObserver::TestingObserver { |
| 45 public: | 59 public: |
| 46 // A bitvector to express which timing fields to match on. | 60 // A bitvector to express which timing fields to match on. |
| 47 enum ExpectedTimingFields { | 61 enum class TimingField : int { |
| 48 FIRST_PAINT = 1 << 0, | 62 FIRST_LAYOUT = 1 << 0, |
| 49 FIRST_CONTENTFUL_PAINT = 1 << 1, | 63 FIRST_PAINT = 1 << 1, |
| 50 STYLE_UPDATE_BEFORE_FCP = 1 << 2 | 64 FIRST_CONTENTFUL_PAINT = 1 << 2, |
| 65 FIRST_MEANINGFUL_PAINT = 1 << 3, | |
| 66 STYLE_UPDATE_BEFORE_FCP = 1 << 4, | |
| 67 DOCUMENT_WRITE_BLOCK_RELOAD = 1 << 5, | |
| 68 LOAD_EVENT = 1 << 6 | |
| 51 }; | 69 }; |
| 52 | 70 |
| 53 explicit PageLoadMetricsWaiter(content::WebContents* web_contents) | 71 explicit PageLoadMetricsWaiter(content::WebContents* web_contents) |
| 54 : TestingObserver(web_contents) {} | 72 : TestingObserver(web_contents) {} |
| 55 | 73 |
| 56 ~PageLoadMetricsWaiter() override { DCHECK_EQ(nullptr, run_loop_.get()); } | 74 ~PageLoadMetricsWaiter() override { DCHECK_EQ(nullptr, run_loop_.get()); } |
| 57 | 75 |
| 58 // Add the given expectation to match on. | 76 // Add the given expectation to match on. |
| 59 void AddExpectation(ExpectedTimingFields fields) { | 77 void AddMainFrameExpectation(TimingField field) { |
| 60 matching_fields_ |= fields; | 78 main_frame_expected_fields_.Set(field); |
| 79 } | |
| 80 void AddSubFrameExpectation(TimingField field) { | |
| 81 child_frame_expected_fields_.Set(field); | |
| 61 } | 82 } |
| 62 | 83 |
| 63 // Instructs observer to also watch for |count| | 84 // Whether the given TimingField was observed in the main frame. |
| 64 // WebLoadingBehaviorDocumentWriteBlockReload events. | 85 bool DidObserveInMainFrame(TimingField field) { |
| 65 void ExpectDocumentWriteBlockReload(int count) { | 86 return observed_main_frame_fields_.IsSet(field); |
| 66 match_document_write_block_reload_ = count; | |
| 67 } | 87 } |
| 68 | 88 |
| 69 // Waits for a TimingUpdated IPC that matches the fields set by | 89 // Waits for a TimingUpdated IPC that matches the fields set by |
| 70 // |AddExpectation|. All matching fields must be set in a TimingUpdated | 90 // |AddMainFrameExpectation| and |AddSubFrameExpectation|. All matching fields |
| 71 // IPC for it to end this wait. | 91 // must be set in a TimingUpdated IPC for it to end this wait. |
| 72 void Wait() { | 92 void Wait() { |
| 73 if (expectations_satisfied_) | 93 if (expectations_satisfied()) |
| 74 return; | 94 return; |
| 75 | 95 |
| 76 run_loop_.reset(new base::RunLoop()); | 96 run_loop_.reset(new base::RunLoop()); |
| 77 run_loop_->Run(); | 97 run_loop_->Run(); |
| 78 run_loop_.reset(nullptr); | 98 run_loop_.reset(nullptr); |
| 79 | 99 |
| 80 EXPECT_TRUE(expectations_satisfied_); | 100 EXPECT_TRUE(expectations_satisfied()); |
| 81 } | 101 } |
| 82 | 102 |
| 83 private: | 103 private: |
| 104 // Manages a bitset of TimingFields. | |
| 105 class TimingFieldBitSet { | |
| 106 public: | |
| 107 TimingFieldBitSet() {} | |
| 108 | |
| 109 // Returns whether this bitset has all bits unset. | |
| 110 bool Empty() const { return bitmask_ == 0; } | |
| 111 | |
| 112 // Returns whether this bitset has the given bit set. | |
| 113 bool IsSet(TimingField field) const { | |
| 114 return (bitmask_ & static_cast<int>(field)) != 0; | |
| 115 } | |
| 116 | |
| 117 // Sets the bit for the given |field|. | |
| 118 void Set(TimingField field) { bitmask_ |= static_cast<int>(field); } | |
| 119 | |
| 120 // Merges bits set in |other| into this bitset. | |
| 121 void Merge(const TimingFieldBitSet& other) { bitmask_ |= other.bitmask_; } | |
| 122 | |
| 123 // Clears all bits set in the |other| bitset. | |
| 124 void ClearMatching(const TimingFieldBitSet& other) { | |
| 125 bitmask_ &= ~other.bitmask_; | |
| 126 } | |
| 127 | |
| 128 private: | |
| 129 int bitmask_ = 0; | |
| 130 }; | |
| 131 | |
| 132 static TimingFieldBitSet GetMatchedBits( | |
| 133 const page_load_metrics::PageLoadTiming& timing, | |
| 134 const page_load_metrics::PageLoadMetadata& metadata) { | |
| 135 TimingFieldBitSet matched_bits; | |
| 136 if (timing.document_timing.first_layout) | |
| 137 matched_bits.Set(TimingField::FIRST_LAYOUT); | |
| 138 if (timing.document_timing.load_event_start) | |
| 139 matched_bits.Set(TimingField::LOAD_EVENT); | |
| 140 if (timing.paint_timing.first_paint) | |
| 141 matched_bits.Set(TimingField::FIRST_PAINT); | |
| 142 if (timing.paint_timing.first_contentful_paint) | |
| 143 matched_bits.Set(TimingField::FIRST_CONTENTFUL_PAINT); | |
| 144 if (timing.paint_timing.first_meaningful_paint) | |
| 145 matched_bits.Set(TimingField::FIRST_MEANINGFUL_PAINT); | |
| 146 if (timing.style_sheet_timing.update_style_duration_before_fcp) | |
| 147 matched_bits.Set(TimingField::STYLE_UPDATE_BEFORE_FCP); | |
| 148 if (metadata.behavior_flags & | |
| 149 blink::WebLoadingBehaviorFlag:: | |
| 150 kWebLoadingBehaviorDocumentWriteBlockReload) | |
| 151 matched_bits.Set(TimingField::DOCUMENT_WRITE_BLOCK_RELOAD); | |
| 152 | |
| 153 return matched_bits; | |
| 154 } | |
| 155 | |
| 84 void OnTimingUpdated( | 156 void OnTimingUpdated( |
| 157 bool is_main_frame, | |
| 85 const page_load_metrics::PageLoadTiming& timing, | 158 const page_load_metrics::PageLoadTiming& timing, |
| 86 const page_load_metrics::PageLoadMetadata& metadata) override { | 159 const page_load_metrics::PageLoadMetadata& metadata) override { |
| 87 if (match_document_write_block_reload_ > 0 && | 160 if (expectations_satisfied()) |
| 88 metadata.behavior_flags & | 161 return; |
| 89 blink::WebLoadingBehaviorFlag:: | 162 |
| 90 kWebLoadingBehaviorDocumentWriteBlockReload) { | 163 TimingFieldBitSet matched_bits = GetMatchedBits(timing, metadata); |
| 91 --match_document_write_block_reload_; | 164 if (is_main_frame) { |
| 165 main_frame_expected_fields_.ClearMatching(matched_bits); | |
| 166 observed_main_frame_fields_.Merge(matched_bits); | |
| 167 } else { | |
| 168 child_frame_expected_fields_.ClearMatching(matched_bits); | |
| 92 } | 169 } |
| 93 | 170 |
| 94 if (match_document_write_block_reload_ > 0) { | 171 if (expectations_satisfied() && run_loop_) |
| 95 return; | 172 run_loop_->Quit(); |
| 96 } | 173 } |
| 97 | 174 |
| 98 if ((!(matching_fields_ & FIRST_PAINT) || | 175 bool expectations_satisfied() const { |
| 99 timing.paint_timing.first_paint) && | 176 return child_frame_expected_fields_.Empty() && |
| 100 (!(matching_fields_ & FIRST_CONTENTFUL_PAINT) || | 177 main_frame_expected_fields_.Empty(); |
| 101 timing.paint_timing.first_contentful_paint) && | |
| 102 (!(matching_fields_ & STYLE_UPDATE_BEFORE_FCP) || | |
| 103 timing.style_sheet_timing.update_style_duration_before_fcp)) { | |
| 104 expectations_satisfied_ = true; | |
| 105 if (run_loop_) | |
| 106 run_loop_->Quit(); | |
| 107 } | |
| 108 } | 178 } |
| 109 | 179 |
| 110 std::unique_ptr<base::RunLoop> run_loop_; | 180 std::unique_ptr<base::RunLoop> run_loop_; |
| 111 int matching_fields_ = 0; // A bitvector composed from ExpectedTimingFields. | 181 |
| 112 bool expectations_satisfied_ = false; | 182 TimingFieldBitSet child_frame_expected_fields_; |
| 113 int match_document_write_block_reload_ = 0; | 183 TimingFieldBitSet main_frame_expected_fields_; |
| 184 | |
| 185 TimingFieldBitSet observed_main_frame_fields_; | |
| 114 }; | 186 }; |
| 115 | 187 |
| 188 using TimingField = PageLoadMetricsWaiter::TimingField; | |
| 189 | |
| 116 } // namespace | 190 } // namespace |
| 117 | 191 |
| 118 class PageLoadMetricsBrowserTest : public InProcessBrowserTest { | 192 class PageLoadMetricsBrowserTest : public InProcessBrowserTest { |
| 119 public: | 193 public: |
| 120 PageLoadMetricsBrowserTest() {} | 194 PageLoadMetricsBrowserTest() {} |
| 121 ~PageLoadMetricsBrowserTest() override {} | 195 ~PageLoadMetricsBrowserTest() override {} |
| 122 | 196 |
| 123 protected: | 197 protected: |
| 198 // Force navigation to a new page, so the currently tracked page load runs its | |
| 199 // OnComplete callback. You should prefer to use PageLoadMetricsWaiter, and | |
| 200 // only use NavigateToUntrackedUrl for cases where the waiter isn't | |
| 201 // sufficient. | |
| 124 void NavigateToUntrackedUrl() { | 202 void NavigateToUntrackedUrl() { |
| 125 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); | 203 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); |
| 126 } | 204 } |
| 127 | 205 |
| 128 bool NoPageLoadMetricsRecorded() { | 206 bool NoPageLoadMetricsRecorded() { |
| 129 // Determine whether any 'public' page load metrics are recorded. We exclude | 207 // Determine whether any 'public' page load metrics are recorded. We exclude |
| 130 // 'internal' metrics as these may be recorded for debugging purposes. | 208 // 'internal' metrics as these may be recorded for debugging purposes. |
| 131 size_t total_pageload_histograms = | 209 size_t total_pageload_histograms = |
| 132 histogram_tester_.GetTotalCountsForPrefix("PageLoad.").size(); | 210 histogram_tester_.GetTotalCountsForPrefix("PageLoad.").size(); |
| 133 size_t total_internal_histograms = | 211 size_t total_internal_histograms = |
| 134 histogram_tester_.GetTotalCountsForPrefix("PageLoad.Internal.").size(); | 212 histogram_tester_.GetTotalCountsForPrefix("PageLoad.Internal.").size(); |
| 135 DCHECK_GE(total_pageload_histograms, total_internal_histograms); | 213 DCHECK_GE(total_pageload_histograms, total_internal_histograms); |
| 136 return total_pageload_histograms - total_internal_histograms == 0; | 214 return total_pageload_histograms - total_internal_histograms == 0; |
| 137 } | 215 } |
| 138 | 216 |
| 139 std::unique_ptr<PageLoadMetricsWaiter> CreatePageLoadMetricsWaiter() { | 217 std::unique_ptr<PageLoadMetricsWaiter> CreatePageLoadMetricsWaiter() { |
| 140 content::WebContents* web_contents = | 218 content::WebContents* web_contents = |
| 141 browser()->tab_strip_model()->GetActiveWebContents(); | 219 browser()->tab_strip_model()->GetActiveWebContents(); |
| 142 return base::MakeUnique<PageLoadMetricsWaiter>(web_contents); | 220 return base::MakeUnique<PageLoadMetricsWaiter>(web_contents); |
| 143 } | 221 } |
| 144 | 222 |
| 145 base::HistogramTester histogram_tester_; | 223 base::HistogramTester histogram_tester_; |
| 146 | 224 |
| 147 private: | 225 private: |
| 148 DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsBrowserTest); | 226 DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsBrowserTest); |
| 149 }; | 227 }; |
| 150 | 228 |
| 151 void FailAllNetworkTransactions(net::URLRequestContextGetter* getter) { | |
| 152 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | |
| 153 net::HttpCache* cache( | |
| 154 getter->GetURLRequestContext()->http_transaction_factory()->GetCache()); | |
| 155 DCHECK(cache); | |
| 156 std::unique_ptr<net::FailingHttpTransactionFactory> factory( | |
| 157 new net::FailingHttpTransactionFactory(cache->GetSession(), | |
| 158 net::ERR_FAILED)); | |
| 159 // Throw away old version; since this is a browser test, there is no | |
| 160 // need to restore the old state. | |
| 161 cache->SetHttpNetworkTransactionFactoryForTesting(std::move(factory)); | |
| 162 } | |
| 163 | |
| 164 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoNavigation) { | 229 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoNavigation) { |
| 165 ASSERT_TRUE(embedded_test_server()->Start()); | 230 ASSERT_TRUE(embedded_test_server()->Start()); |
| 166 EXPECT_TRUE(NoPageLoadMetricsRecorded()); | 231 EXPECT_TRUE(NoPageLoadMetricsRecorded()); |
| 167 } | 232 } |
| 168 | 233 |
| 169 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NewPage) { | 234 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NewPage) { |
| 170 ASSERT_TRUE(embedded_test_server()->Start()); | 235 ASSERT_TRUE(embedded_test_server()->Start()); |
| 171 | 236 |
| 237 auto waiter = CreatePageLoadMetricsWaiter(); | |
| 238 waiter->AddMainFrameExpectation(TimingField::FIRST_PAINT); | |
| 172 ui_test_utils::NavigateToURL(browser(), | 239 ui_test_utils::NavigateToURL(browser(), |
| 173 embedded_test_server()->GetURL("/title1.html")); | 240 embedded_test_server()->GetURL("/title1.html")); |
| 174 NavigateToUntrackedUrl(); | 241 waiter->Wait(); |
| 175 | 242 |
| 176 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); | 243 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); |
| 177 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | 244 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
| 178 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | 245 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
| 246 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1); | |
| 179 histogram_tester_.ExpectTotalCount(internal::kHistogramParseDuration, 1); | 247 histogram_tester_.ExpectTotalCount(internal::kHistogramParseDuration, 1); |
| 180 histogram_tester_.ExpectTotalCount( | 248 histogram_tester_.ExpectTotalCount( |
| 181 internal::kHistogramParseBlockedOnScriptLoad, 1); | 249 internal::kHistogramParseBlockedOnScriptLoad, 1); |
| 182 histogram_tester_.ExpectTotalCount( | 250 histogram_tester_.ExpectTotalCount( |
| 183 internal::kHistogramParseBlockedOnScriptExecution, 1); | 251 internal::kHistogramParseBlockedOnScriptExecution, 1); |
| 252 | |
| 253 // Force navigation to another page, which should force logging of histograms | |
| 254 // persisted at the end of the page load lifetime. | |
| 255 NavigateToUntrackedUrl(); | |
| 184 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); | 256 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); |
| 185 histogram_tester_.ExpectTotalCount( | 257 histogram_tester_.ExpectTotalCount( |
| 186 internal::kHistogramPageTimingForegroundDuration, 1); | 258 internal::kHistogramPageTimingForegroundDuration, 1); |
| 187 | 259 |
| 188 // Verify that NoPageLoadMetricsRecorded returns false when PageLoad metrics | 260 // Verify that NoPageLoadMetricsRecorded returns false when PageLoad metrics |
| 189 // have been recorded. | 261 // have been recorded. |
| 190 EXPECT_FALSE(NoPageLoadMetricsRecorded()); | 262 EXPECT_FALSE(NoPageLoadMetricsRecorded()); |
| 191 } | 263 } |
| 192 | 264 |
| 265 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPaintForEmptyDocument) { | |
| 266 ASSERT_TRUE(embedded_test_server()->Start()); | |
| 267 | |
| 268 auto waiter = CreatePageLoadMetricsWaiter(); | |
| 269 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); | |
| 270 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | |
| 271 ui_test_utils::NavigateToURL(browser(), | |
| 272 embedded_test_server()->GetURL("/empty.html")); | |
| 273 waiter->Wait(); | |
| 274 EXPECT_FALSE(waiter->DidObserveInMainFrame(TimingField::FIRST_PAINT)); | |
| 275 | |
| 276 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | |
| 277 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | |
| 278 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); | |
| 279 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, | |
| 280 0); | |
| 281 } | |
| 282 | |
| 193 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameDocumentNavigation) { | 283 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameDocumentNavigation) { |
| 194 ASSERT_TRUE(embedded_test_server()->Start()); | 284 ASSERT_TRUE(embedded_test_server()->Start()); |
| 195 | 285 |
| 286 auto waiter = CreatePageLoadMetricsWaiter(); | |
| 287 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); | |
| 288 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | |
| 196 ui_test_utils::NavigateToURL(browser(), | 289 ui_test_utils::NavigateToURL(browser(), |
| 197 embedded_test_server()->GetURL("/title1.html")); | 290 embedded_test_server()->GetURL("/title1.html")); |
| 291 waiter->Wait(); | |
| 292 | |
|
jkarlin
2017/05/11 14:04:06
EXPECT_FALSE(waiter->DidObserveInMainFrame(TimingF
Bryan McQuade
2017/05/11 14:07:03
For better or worse, title1.html does paint, so we
| |
| 293 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); | |
| 294 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | |
| 295 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | |
| 296 | |
| 297 // Perform a same-document navigation. No additional metrics should be logged. | |
| 198 ui_test_utils::NavigateToURL( | 298 ui_test_utils::NavigateToURL( |
| 199 browser(), embedded_test_server()->GetURL("/title1.html#hash")); | 299 browser(), embedded_test_server()->GetURL("/title1.html#hash")); |
| 200 NavigateToUntrackedUrl(); | 300 NavigateToUntrackedUrl(); |
| 201 | 301 |
| 202 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); | 302 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); |
| 203 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | 303 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
| 204 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | 304 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
| 205 } | 305 } |
| 206 | 306 |
| 207 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameUrlNavigation) { | 307 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameUrlNavigation) { |
| 208 ASSERT_TRUE(embedded_test_server()->Start()); | 308 ASSERT_TRUE(embedded_test_server()->Start()); |
| 209 | 309 |
| 310 auto waiter = CreatePageLoadMetricsWaiter(); | |
| 311 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); | |
| 312 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | |
| 210 ui_test_utils::NavigateToURL(browser(), | 313 ui_test_utils::NavigateToURL(browser(), |
| 211 embedded_test_server()->GetURL("/title1.html")); | 314 embedded_test_server()->GetURL("/title1.html")); |
| 315 waiter->Wait(); | |
| 316 | |
|
jkarlin
2017/05/11 14:04:05
EXPECT_FALSE(waiter->DidObserveInMainFrame(TimingF
Bryan McQuade
2017/05/11 14:07:03
Same
| |
| 317 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); | |
| 318 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); | |
| 319 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | |
| 320 | |
| 321 waiter = CreatePageLoadMetricsWaiter(); | |
| 322 waiter->AddMainFrameExpectation(TimingField::FIRST_LAYOUT); | |
| 323 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | |
| 212 ui_test_utils::NavigateToURL(browser(), | 324 ui_test_utils::NavigateToURL(browser(), |
| 213 embedded_test_server()->GetURL("/title1.html")); | 325 embedded_test_server()->GetURL("/title1.html")); |
| 214 NavigateToUntrackedUrl(); | 326 waiter->Wait(); |
| 215 | 327 |
|
jkarlin
2017/05/11 14:04:06
EXPECT_FALSE(waiter->DidObserveInMainFrame(TimingF
Bryan McQuade
2017/05/11 14:07:03
Same
| |
| 216 // We expect one histogram sample for each navigation to title1.html. | 328 // We expect one histogram sample for each navigation to title1.html. |
| 217 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 2); | 329 histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 2); |
| 218 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 2); | 330 histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 2); |
| 219 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 2); | 331 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 2); |
| 220 } | 332 } |
| 221 | 333 |
| 222 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NonHtmlMainResource) { | 334 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NonHtmlMainResource) { |
| 223 ASSERT_TRUE(embedded_test_server()->Start()); | 335 ASSERT_TRUE(embedded_test_server()->Start()); |
| 224 | 336 |
| 225 ui_test_utils::NavigateToURL(browser(), | 337 ui_test_utils::NavigateToURL(browser(), |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 289 browser(), embedded_test_server()->GetURL("/download-test3.gif")); | 401 browser(), embedded_test_server()->GetURL("/download-test3.gif")); |
| 290 downloads_observer.WaitForFinished(); | 402 downloads_observer.WaitForFinished(); |
| 291 | 403 |
| 292 NavigateToUntrackedUrl(); | 404 NavigateToUntrackedUrl(); |
| 293 EXPECT_TRUE(NoPageLoadMetricsRecorded()); | 405 EXPECT_TRUE(NoPageLoadMetricsRecorded()); |
| 294 } | 406 } |
| 295 | 407 |
| 296 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PreloadDocumentWrite) { | 408 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PreloadDocumentWrite) { |
| 297 ASSERT_TRUE(embedded_test_server()->Start()); | 409 ASSERT_TRUE(embedded_test_server()->Start()); |
| 298 | 410 |
| 299 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = | 411 auto waiter = CreatePageLoadMetricsWaiter(); |
| 300 CreatePageLoadMetricsWaiter(); | 412 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); |
| 301 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT); | |
| 302 | 413 |
| 303 ui_test_utils::NavigateToURL( | 414 ui_test_utils::NavigateToURL( |
| 304 browser(), embedded_test_server()->GetURL( | 415 browser(), embedded_test_server()->GetURL( |
| 305 "/page_load_metrics/document_write_external_script.html")); | 416 "/page_load_metrics/document_write_external_script.html")); |
| 306 fcp_waiter->Wait(); | 417 waiter->Wait(); |
| 307 | 418 |
| 308 histogram_tester_.ExpectTotalCount( | 419 histogram_tester_.ExpectTotalCount( |
| 309 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 1); | 420 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 1); |
| 310 } | 421 } |
| 311 | 422 |
| 312 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPreloadDocumentWrite) { | 423 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPreloadDocumentWrite) { |
| 313 ASSERT_TRUE(embedded_test_server()->Start()); | 424 ASSERT_TRUE(embedded_test_server()->Start()); |
| 314 | 425 |
| 426 auto waiter = CreatePageLoadMetricsWaiter(); | |
| 427 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | |
| 315 ui_test_utils::NavigateToURL( | 428 ui_test_utils::NavigateToURL( |
| 316 browser(), embedded_test_server()->GetURL( | 429 browser(), embedded_test_server()->GetURL( |
| 317 "/page_load_metrics/document_write_no_script.html")); | 430 "/page_load_metrics/document_write_no_script.html")); |
| 318 NavigateToUntrackedUrl(); | 431 waiter->Wait(); |
| 319 | 432 |
| 433 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, | |
| 434 1); | |
| 320 histogram_tester_.ExpectTotalCount( | 435 histogram_tester_.ExpectTotalCount( |
| 321 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0); | 436 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0); |
| 322 } | 437 } |
| 323 | 438 |
| 324 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWrite) { | 439 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWrite) { |
| 325 ASSERT_TRUE(embedded_test_server()->Start()); | 440 ASSERT_TRUE(embedded_test_server()->Start()); |
| 326 | 441 |
| 327 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = | 442 auto waiter = CreatePageLoadMetricsWaiter(); |
| 328 CreatePageLoadMetricsWaiter(); | 443 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); |
| 329 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT); | |
| 330 | 444 |
| 331 ui_test_utils::NavigateToURL(browser(), | 445 ui_test_utils::NavigateToURL(browser(), |
| 332 embedded_test_server()->GetURL("/title1.html")); | 446 embedded_test_server()->GetURL("/title1.html")); |
| 333 fcp_waiter->Wait(); | 447 waiter->Wait(); |
| 334 | 448 |
| 449 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, | |
| 450 1); | |
| 335 histogram_tester_.ExpectTotalCount( | 451 histogram_tester_.ExpectTotalCount( |
| 336 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0); | 452 internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0); |
| 337 histogram_tester_.ExpectTotalCount( | 453 histogram_tester_.ExpectTotalCount( |
| 338 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); | 454 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); |
| 339 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); | 455 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); |
| 340 } | 456 } |
| 341 | 457 |
| 342 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteBlock) { | 458 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteBlock) { |
| 343 ASSERT_TRUE(embedded_test_server()->Start()); | 459 ASSERT_TRUE(embedded_test_server()->Start()); |
| 344 | 460 |
| 345 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = | 461 auto waiter = CreatePageLoadMetricsWaiter(); |
| 346 CreatePageLoadMetricsWaiter(); | 462 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); |
| 347 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT); | |
| 348 | 463 |
| 349 ui_test_utils::NavigateToURL( | 464 ui_test_utils::NavigateToURL( |
| 350 browser(), embedded_test_server()->GetURL( | 465 browser(), embedded_test_server()->GetURL( |
| 351 "/page_load_metrics/document_write_script_block.html")); | 466 "/page_load_metrics/document_write_script_block.html")); |
| 352 fcp_waiter->Wait(); | 467 waiter->Wait(); |
| 353 | 468 |
| 354 histogram_tester_.ExpectTotalCount( | 469 histogram_tester_.ExpectTotalCount( |
| 355 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); | 470 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); |
| 356 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1); | 471 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1); |
| 357 } | 472 } |
| 358 | 473 |
| 359 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) { | 474 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) { |
| 360 ASSERT_TRUE(embedded_test_server()->Start()); | 475 ASSERT_TRUE(embedded_test_server()->Start()); |
| 361 | 476 |
| 362 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = | 477 auto waiter = CreatePageLoadMetricsWaiter(); |
| 363 CreatePageLoadMetricsWaiter(); | 478 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); |
| 364 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT); | |
| 365 std::unique_ptr<PageLoadMetricsWaiter> reload_waiter = | |
| 366 CreatePageLoadMetricsWaiter(); | |
| 367 reload_waiter->ExpectDocumentWriteBlockReload(2); | |
| 368 | |
| 369 ui_test_utils::NavigateToURL( | 479 ui_test_utils::NavigateToURL( |
| 370 browser(), embedded_test_server()->GetURL( | 480 browser(), embedded_test_server()->GetURL( |
| 371 "/page_load_metrics/document_write_script_block.html")); | 481 "/page_load_metrics/document_write_script_block.html")); |
| 482 waiter->Wait(); | |
| 483 | |
| 484 histogram_tester_.ExpectTotalCount( | |
| 485 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); | |
| 486 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1); | |
| 372 | 487 |
| 373 // Reload should not log the histogram as the script is not blocked. | 488 // Reload should not log the histogram as the script is not blocked. |
| 489 auto reload_waiter = CreatePageLoadMetricsWaiter(); | |
| 490 reload_waiter->AddMainFrameExpectation( | |
| 491 TimingField::DOCUMENT_WRITE_BLOCK_RELOAD); | |
| 492 reload_waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | |
| 374 ui_test_utils::NavigateToURL( | 493 ui_test_utils::NavigateToURL( |
| 375 browser(), embedded_test_server()->GetURL( | 494 browser(), embedded_test_server()->GetURL( |
| 376 "/page_load_metrics/document_write_script_block.html")); | 495 "/page_load_metrics/document_write_script_block.html")); |
| 496 reload_waiter->Wait(); | |
| 377 | 497 |
| 498 histogram_tester_.ExpectTotalCount( | |
| 499 internal::kHistogramDocWriteBlockReloadCount, 1); | |
| 500 | |
| 501 reload_waiter = CreatePageLoadMetricsWaiter(); | |
| 502 reload_waiter->AddMainFrameExpectation( | |
| 503 TimingField::DOCUMENT_WRITE_BLOCK_RELOAD); | |
| 504 reload_waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | |
| 378 ui_test_utils::NavigateToURL( | 505 ui_test_utils::NavigateToURL( |
| 379 browser(), embedded_test_server()->GetURL( | 506 browser(), embedded_test_server()->GetURL( |
| 380 "/page_load_metrics/document_write_script_block.html")); | 507 "/page_load_metrics/document_write_script_block.html")); |
| 381 | |
| 382 histogram_tester_.ExpectTotalCount( | |
| 383 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); | |
| 384 | |
| 385 fcp_waiter->Wait(); | |
| 386 reload_waiter->Wait(); | 508 reload_waiter->Wait(); |
| 387 | 509 |
| 388 histogram_tester_.ExpectTotalCount( | 510 histogram_tester_.ExpectTotalCount( |
| 389 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); | 511 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); |
| 390 | 512 |
| 391 histogram_tester_.ExpectTotalCount( | 513 histogram_tester_.ExpectTotalCount( |
| 392 internal::kHistogramDocWriteBlockReloadCount, 2); | 514 internal::kHistogramDocWriteBlockReloadCount, 2); |
| 393 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1); | 515 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1); |
| 394 } | 516 } |
| 395 | 517 |
| 396 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteAsync) { | 518 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteAsync) { |
| 397 ASSERT_TRUE(embedded_test_server()->Start()); | 519 ASSERT_TRUE(embedded_test_server()->Start()); |
| 398 | 520 |
| 521 auto waiter = CreatePageLoadMetricsWaiter(); | |
| 522 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | |
| 399 ui_test_utils::NavigateToURL( | 523 ui_test_utils::NavigateToURL( |
| 400 browser(), embedded_test_server()->GetURL( | 524 browser(), embedded_test_server()->GetURL( |
| 401 "/page_load_metrics/document_write_script_async.html")); | 525 "/page_load_metrics/document_write_async_script.html")); |
| 402 NavigateToUntrackedUrl(); | 526 waiter->Wait(); |
| 403 | 527 |
| 528 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, | |
| 529 1); | |
| 404 histogram_tester_.ExpectTotalCount( | 530 histogram_tester_.ExpectTotalCount( |
| 405 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); | 531 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); |
| 406 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); | 532 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); |
| 407 } | 533 } |
| 408 | 534 |
| 409 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteSameDomain) { | 535 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteSameDomain) { |
| 410 ASSERT_TRUE(embedded_test_server()->Start()); | 536 ASSERT_TRUE(embedded_test_server()->Start()); |
| 411 | 537 |
| 538 auto waiter = CreatePageLoadMetricsWaiter(); | |
| 539 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | |
| 412 ui_test_utils::NavigateToURL( | 540 ui_test_utils::NavigateToURL( |
| 413 browser(), embedded_test_server()->GetURL( | 541 browser(), embedded_test_server()->GetURL( |
| 414 "/page_load_metrics/document_write_external_script.html")); | 542 "/page_load_metrics/document_write_external_script.html")); |
| 415 NavigateToUntrackedUrl(); | 543 waiter->Wait(); |
| 416 | 544 |
| 545 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, | |
| 546 1); | |
| 417 histogram_tester_.ExpectTotalCount( | 547 histogram_tester_.ExpectTotalCount( |
| 418 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); | 548 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); |
| 419 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); | 549 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); |
| 420 } | 550 } |
| 421 | 551 |
| 422 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWriteScript) { | 552 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWriteScript) { |
| 423 ASSERT_TRUE(embedded_test_server()->Start()); | 553 ASSERT_TRUE(embedded_test_server()->Start()); |
| 424 | 554 |
| 555 auto waiter = CreatePageLoadMetricsWaiter(); | |
| 556 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); | |
| 425 ui_test_utils::NavigateToURL( | 557 ui_test_utils::NavigateToURL( |
| 426 browser(), embedded_test_server()->GetURL( | 558 browser(), embedded_test_server()->GetURL( |
| 427 "/page_load_metrics/document_write_no_script.html")); | 559 "/page_load_metrics/document_write_no_script.html")); |
| 428 NavigateToUntrackedUrl(); | 560 waiter->Wait(); |
| 429 | 561 |
| 562 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, | |
| 563 1); | |
| 430 histogram_tester_.ExpectTotalCount( | 564 histogram_tester_.ExpectTotalCount( |
| 431 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); | 565 internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); |
| 432 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); | 566 histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); |
| 433 } | 567 } |
| 434 | 568 |
| 435 // TODO(crbug.com/712935): Flaky on Linux dbg. | 569 // TODO(crbug.com/712935): Flaky on Linux dbg. |
| 436 #if defined(OS_LINUX) && !defined(NDEBUG) | 570 #if defined(OS_LINUX) && !defined(NDEBUG) |
| 437 #define MAYBE_BadXhtml DISABLED_BadXhtml | 571 #define MAYBE_BadXhtml DISABLED_BadXhtml |
| 438 #else | 572 #else |
| 439 #define MAYBE_BadXhtml BadXhtml | 573 #define MAYBE_BadXhtml BadXhtml |
| 440 #endif | 574 #endif |
| 441 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, MAYBE_BadXhtml) { | 575 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, MAYBE_BadXhtml) { |
| 442 ASSERT_TRUE(embedded_test_server()->Start()); | 576 ASSERT_TRUE(embedded_test_server()->Start()); |
| 443 | 577 |
| 444 std::unique_ptr<PageLoadMetricsWaiter> timing_waiter = | 578 auto waiter = CreatePageLoadMetricsWaiter(); |
| 445 CreatePageLoadMetricsWaiter(); | 579 waiter->AddMainFrameExpectation(TimingField::FIRST_PAINT); |
| 446 timing_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_PAINT); | |
| 447 | 580 |
| 448 // When an XHTML page contains invalid XML, it causes a paint of the error | 581 // When an XHTML page contains invalid XML, it causes a paint of the error |
| 449 // message without a layout. Page load metrics currently treats this as an | 582 // message without a layout. Page load metrics currently treats this as an |
| 450 // error. Eventually, we'll fix this by special casing the handling of | 583 // error. Eventually, we'll fix this by special casing the handling of |
| 451 // documents with non-well-formed XML on the blink side. See crbug.com/627607 | 584 // documents with non-well-formed XML on the blink side. See crbug.com/627607 |
| 452 // for more. | 585 // for more. |
| 453 ui_test_utils::NavigateToURL( | 586 ui_test_utils::NavigateToURL( |
| 454 browser(), | 587 browser(), |
| 455 embedded_test_server()->GetURL("/page_load_metrics/badxml.xhtml")); | 588 embedded_test_server()->GetURL("/page_load_metrics/badxml.xhtml")); |
| 456 | 589 |
| 457 timing_waiter->Wait(); | 590 waiter->Wait(); |
| 458 | 591 |
| 459 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 0); | 592 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 0); |
| 460 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); | 593 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); |
| 461 histogram_tester_.ExpectTotalCount(page_load_metrics::internal::kErrorEvents, | 594 histogram_tester_.ExpectTotalCount(page_load_metrics::internal::kErrorEvents, |
| 462 1); | 595 1); |
| 463 histogram_tester_.ExpectBucketCount( | 596 histogram_tester_.ExpectBucketCount( |
| 464 page_load_metrics::internal::kErrorEvents, | 597 page_load_metrics::internal::kErrorEvents, |
| 465 page_load_metrics::ERR_BAD_TIMING_IPC_INVALID_TIMING, 1); | 598 page_load_metrics::ERR_BAD_TIMING_IPC_INVALID_TIMING, 1); |
| 466 | 599 |
| 467 histogram_tester_.ExpectTotalCount( | 600 histogram_tester_.ExpectTotalCount( |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 481 chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK); | 614 chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK); |
| 482 content::TestNavigationManager manager( | 615 content::TestNavigationManager manager( |
| 483 browser()->tab_strip_model()->GetActiveWebContents(), url); | 616 browser()->tab_strip_model()->GetActiveWebContents(), url); |
| 484 | 617 |
| 485 chrome::Navigate(¶ms); | 618 chrome::Navigate(¶ms); |
| 486 EXPECT_TRUE(manager.WaitForRequestStart()); | 619 EXPECT_TRUE(manager.WaitForRequestStart()); |
| 487 | 620 |
| 488 GURL url2(embedded_test_server()->GetURL("/title2.html")); | 621 GURL url2(embedded_test_server()->GetURL("/title2.html")); |
| 489 chrome::NavigateParams params2(browser(), url2, | 622 chrome::NavigateParams params2(browser(), url2, |
| 490 ui::PAGE_TRANSITION_FROM_ADDRESS_BAR); | 623 ui::PAGE_TRANSITION_FROM_ADDRESS_BAR); |
| 491 content::TestNavigationManager manager2( | 624 |
| 492 browser()->tab_strip_model()->GetActiveWebContents(), url2); | 625 auto waiter = CreatePageLoadMetricsWaiter(); |
| 626 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | |
| 493 chrome::Navigate(¶ms2); | 627 chrome::Navigate(¶ms2); |
| 628 waiter->Wait(); | |
| 494 | 629 |
| 495 manager2.WaitForNavigationFinished(); | |
| 496 histogram_tester_.ExpectTotalCount( | 630 histogram_tester_.ExpectTotalCount( |
| 497 internal::kHistogramAbortNewNavigationBeforeCommit, 1); | 631 internal::kHistogramAbortNewNavigationBeforeCommit, 1); |
| 498 } | 632 } |
| 499 | 633 |
| 500 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortReload) { | 634 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortReload) { |
| 501 ASSERT_TRUE(embedded_test_server()->Start()); | 635 ASSERT_TRUE(embedded_test_server()->Start()); |
| 502 | 636 |
| 503 GURL url(embedded_test_server()->GetURL("/title1.html")); | 637 GURL url(embedded_test_server()->GetURL("/title1.html")); |
| 504 chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK); | 638 chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK); |
| 505 content::TestNavigationManager manager( | 639 content::TestNavigationManager manager( |
| 506 browser()->tab_strip_model()->GetActiveWebContents(), url); | 640 browser()->tab_strip_model()->GetActiveWebContents(), url); |
| 507 | 641 |
| 508 chrome::Navigate(¶ms); | 642 chrome::Navigate(¶ms); |
| 509 EXPECT_TRUE(manager.WaitForRequestStart()); | 643 EXPECT_TRUE(manager.WaitForRequestStart()); |
| 510 | 644 |
| 511 chrome::NavigateParams params2(browser(), url, ui::PAGE_TRANSITION_RELOAD); | 645 chrome::NavigateParams params2(browser(), url, ui::PAGE_TRANSITION_RELOAD); |
| 512 content::TestNavigationManager manager2( | 646 |
| 513 browser()->tab_strip_model()->GetActiveWebContents(), url); | 647 auto waiter = CreatePageLoadMetricsWaiter(); |
| 648 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | |
| 514 chrome::Navigate(¶ms2); | 649 chrome::Navigate(¶ms2); |
| 650 waiter->Wait(); | |
| 515 | 651 |
| 516 manager2.WaitForNavigationFinished(); | |
| 517 histogram_tester_.ExpectTotalCount( | 652 histogram_tester_.ExpectTotalCount( |
| 518 internal::kHistogramAbortReloadBeforeCommit, 1); | 653 internal::kHistogramAbortReloadBeforeCommit, 1); |
| 519 } | 654 } |
| 520 | 655 |
| 521 // TODO(crbug.com/675061): Flaky on Win7 dbg. | 656 // TODO(crbug.com/675061): Flaky on Win7 dbg. |
| 522 #if defined(OS_WIN) | 657 #if defined(OS_WIN) |
| 523 #define MAYBE_AbortClose DISABLED_AbortClose | 658 #define MAYBE_AbortClose DISABLED_AbortClose |
| 524 #else | 659 #else |
| 525 #define MAYBE_AbortClose AbortClose | 660 #define MAYBE_AbortClose AbortClose |
| 526 #endif | 661 #endif |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 558 chrome::NavigateParams params2(browser(), url2, ui::PAGE_TRANSITION_TYPED); | 693 chrome::NavigateParams params2(browser(), url2, ui::PAGE_TRANSITION_TYPED); |
| 559 content::TestNavigationManager manager2( | 694 content::TestNavigationManager manager2( |
| 560 browser()->tab_strip_model()->GetActiveWebContents(), url2); | 695 browser()->tab_strip_model()->GetActiveWebContents(), url2); |
| 561 chrome::Navigate(¶ms2); | 696 chrome::Navigate(¶ms2); |
| 562 | 697 |
| 563 EXPECT_TRUE(manager2.WaitForRequestStart()); | 698 EXPECT_TRUE(manager2.WaitForRequestStart()); |
| 564 manager.WaitForNavigationFinished(); | 699 manager.WaitForNavigationFinished(); |
| 565 | 700 |
| 566 GURL url3(embedded_test_server()->GetURL("/title3.html")); | 701 GURL url3(embedded_test_server()->GetURL("/title3.html")); |
| 567 chrome::NavigateParams params3(browser(), url3, ui::PAGE_TRANSITION_TYPED); | 702 chrome::NavigateParams params3(browser(), url3, ui::PAGE_TRANSITION_TYPED); |
| 568 content::TestNavigationManager manager3( | 703 |
| 569 browser()->tab_strip_model()->GetActiveWebContents(), url3); | 704 auto waiter = CreatePageLoadMetricsWaiter(); |
| 705 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | |
| 570 chrome::Navigate(¶ms3); | 706 chrome::Navigate(¶ms3); |
| 707 waiter->Wait(); | |
| 571 | 708 |
| 572 EXPECT_TRUE(manager3.WaitForRequestStart()); | |
| 573 manager2.WaitForNavigationFinished(); | 709 manager2.WaitForNavigationFinished(); |
| 574 | 710 |
| 575 manager3.WaitForNavigationFinished(); | |
| 576 | |
| 577 histogram_tester_.ExpectTotalCount( | 711 histogram_tester_.ExpectTotalCount( |
| 578 internal::kHistogramAbortNewNavigationBeforeCommit, 2); | 712 internal::kHistogramAbortNewNavigationBeforeCommit, 2); |
| 579 } | 713 } |
| 580 | 714 |
| 581 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 715 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| 582 NoAbortMetricsOnClientRedirect) { | 716 NoAbortMetricsOnClientRedirect) { |
| 583 ASSERT_TRUE(embedded_test_server()->Start()); | 717 ASSERT_TRUE(embedded_test_server()->Start()); |
| 584 | 718 |
| 585 GURL first_url(embedded_test_server()->GetURL("/title1.html")); | 719 GURL first_url(embedded_test_server()->GetURL("/title1.html")); |
| 586 ui_test_utils::NavigateToURL(browser(), first_url); | 720 ui_test_utils::NavigateToURL(browser(), first_url); |
| 587 | 721 |
| 588 GURL second_url(embedded_test_server()->GetURL("/title2.html")); | 722 GURL second_url(embedded_test_server()->GetURL("/title2.html")); |
| 589 chrome::NavigateParams params(browser(), second_url, | 723 chrome::NavigateParams params(browser(), second_url, |
| 590 ui::PAGE_TRANSITION_LINK); | 724 ui::PAGE_TRANSITION_LINK); |
| 591 content::TestNavigationManager manager( | 725 content::TestNavigationManager manager( |
| 592 browser()->tab_strip_model()->GetActiveWebContents(), second_url); | 726 browser()->tab_strip_model()->GetActiveWebContents(), second_url); |
| 593 chrome::Navigate(¶ms); | 727 chrome::Navigate(¶ms); |
| 594 EXPECT_TRUE(manager.WaitForRequestStart()); | 728 EXPECT_TRUE(manager.WaitForRequestStart()); |
| 595 | 729 |
| 596 { | 730 { |
| 731 auto waiter = CreatePageLoadMetricsWaiter(); | |
| 732 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | |
| 597 content::TestNavigationManager reload_manager( | 733 content::TestNavigationManager reload_manager( |
| 598 browser()->tab_strip_model()->GetActiveWebContents(), first_url); | 734 browser()->tab_strip_model()->GetActiveWebContents(), first_url); |
| 599 EXPECT_TRUE(content::ExecuteScript( | 735 EXPECT_TRUE(content::ExecuteScript( |
| 600 browser()->tab_strip_model()->GetActiveWebContents(), | 736 browser()->tab_strip_model()->GetActiveWebContents(), |
| 601 "window.location.reload();")); | 737 "window.location.reload();")); |
| 738 waiter->Wait(); | |
| 602 } | 739 } |
| 603 | 740 |
| 604 manager.WaitForNavigationFinished(); | 741 manager.WaitForNavigationFinished(); |
| 605 | 742 |
| 606 EXPECT_TRUE(histogram_tester_ | 743 EXPECT_TRUE(histogram_tester_ |
| 607 .GetTotalCountsForPrefix("PageLoad.Experimental.AbortTiming.") | 744 .GetTotalCountsForPrefix("PageLoad.Experimental.AbortTiming.") |
| 608 .empty()); | 745 .empty()); |
| 609 } | 746 } |
| 610 | 747 |
| 611 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 748 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| 612 FirstMeaningfulPaintRecorded) { | 749 FirstMeaningfulPaintRecorded) { |
| 613 ASSERT_TRUE(embedded_test_server()->Start()); | 750 ASSERT_TRUE(embedded_test_server()->Start()); |
| 614 | 751 |
| 752 auto waiter = CreatePageLoadMetricsWaiter(); | |
| 753 waiter->AddMainFrameExpectation(TimingField::FIRST_MEANINGFUL_PAINT); | |
| 615 ui_test_utils::NavigateToURL(browser(), | 754 ui_test_utils::NavigateToURL(browser(), |
| 616 embedded_test_server()->GetURL("/title1.html")); | 755 embedded_test_server()->GetURL("/title1.html")); |
| 756 waiter->Wait(); | |
| 617 | 757 |
| 618 // Wait until the renderer finishes observing layouts. | |
| 619 const int kNetworkIdleTime = 3000; | |
| 620 const int kMargin = 500; | |
| 621 const std::string javascript = base::StringPrintf( | |
| 622 "setTimeout(() => window.domAutomationController.send(true), %d)", | |
| 623 kNetworkIdleTime + kMargin); | |
| 624 bool result; | |
| 625 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( | |
| 626 browser()->tab_strip_model()->GetActiveWebContents(), | |
| 627 javascript, &result)); | |
| 628 EXPECT_TRUE(result); | |
| 629 | |
| 630 NavigateToUntrackedUrl(); | |
| 631 histogram_tester_.ExpectUniqueSample( | 758 histogram_tester_.ExpectUniqueSample( |
| 632 internal::kHistogramFirstMeaningfulPaintStatus, | 759 internal::kHistogramFirstMeaningfulPaintStatus, |
| 633 internal::FIRST_MEANINGFUL_PAINT_RECORDED, 1); | 760 internal::FIRST_MEANINGFUL_PAINT_RECORDED, 1); |
| 634 histogram_tester_.ExpectTotalCount( | 761 histogram_tester_.ExpectTotalCount( |
| 635 internal::kHistogramFirstMeaningfulPaint, 1); | 762 internal::kHistogramFirstMeaningfulPaint, 1); |
| 636 histogram_tester_.ExpectTotalCount( | 763 histogram_tester_.ExpectTotalCount( |
| 637 internal::kHistogramParseStartToFirstMeaningfulPaint, 1); | 764 internal::kHistogramParseStartToFirstMeaningfulPaint, 1); |
| 638 } | 765 } |
| 639 | 766 |
| 640 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 767 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| 641 FirstMeaningfulPaintNotRecorded) { | 768 FirstMeaningfulPaintNotRecorded) { |
| 642 ASSERT_TRUE(embedded_test_server()->Start()); | 769 ASSERT_TRUE(embedded_test_server()->Start()); |
| 643 | 770 |
| 644 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = | 771 auto waiter = CreatePageLoadMetricsWaiter(); |
| 645 CreatePageLoadMetricsWaiter(); | 772 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); |
| 646 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT); | |
| 647 | 773 |
| 648 ui_test_utils::NavigateToURL( | 774 ui_test_utils::NavigateToURL( |
| 649 browser(), embedded_test_server()->GetURL( | 775 browser(), embedded_test_server()->GetURL( |
| 650 "/page_load_metrics/page_with_active_connections.html")); | 776 "/page_load_metrics/page_with_active_connections.html")); |
| 651 fcp_waiter->Wait(); | 777 waiter->Wait(); |
| 652 | 778 |
| 653 // Navigate away before a FMP is reported. | 779 // Navigate away before a FMP is reported. |
| 654 NavigateToUntrackedUrl(); | 780 NavigateToUntrackedUrl(); |
| 655 | 781 |
| 782 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, | |
| 783 1); | |
| 656 histogram_tester_.ExpectUniqueSample( | 784 histogram_tester_.ExpectUniqueSample( |
| 657 internal::kHistogramFirstMeaningfulPaintStatus, | 785 internal::kHistogramFirstMeaningfulPaintStatus, |
| 658 internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE, 1); | 786 internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE, 1); |
| 659 histogram_tester_.ExpectTotalCount( | 787 histogram_tester_.ExpectTotalCount( |
| 660 internal::kHistogramFirstMeaningfulPaint, 0); | 788 internal::kHistogramFirstMeaningfulPaint, 0); |
| 661 histogram_tester_.ExpectTotalCount( | 789 histogram_tester_.ExpectTotalCount( |
| 662 internal::kHistogramParseStartToFirstMeaningfulPaint, 0); | 790 internal::kHistogramParseStartToFirstMeaningfulPaint, 0); |
| 663 } | 791 } |
| 664 | 792 |
| 665 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 793 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| 666 NoStatePrefetchObserverCacheable) { | 794 NoStatePrefetchObserverCacheable) { |
| 667 ASSERT_TRUE(embedded_test_server()->Start()); | 795 ASSERT_TRUE(embedded_test_server()->Start()); |
| 668 | 796 |
| 669 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = | 797 auto waiter = CreatePageLoadMetricsWaiter(); |
| 670 CreatePageLoadMetricsWaiter(); | 798 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); |
| 671 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT); | |
| 672 | 799 |
| 673 ui_test_utils::NavigateToURL(browser(), | 800 ui_test_utils::NavigateToURL(browser(), |
| 674 embedded_test_server()->GetURL("/title1.html")); | 801 embedded_test_server()->GetURL("/title1.html")); |
| 675 | 802 |
| 676 fcp_waiter->Wait(); | 803 waiter->Wait(); |
| 677 | 804 |
| 678 histogram_tester_.ExpectTotalCount( | 805 histogram_tester_.ExpectTotalCount( |
| 679 "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 0); | 806 "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 0); |
| 680 histogram_tester_.ExpectTotalCount( | 807 histogram_tester_.ExpectTotalCount( |
| 681 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 1); | 808 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 1); |
| 682 } | 809 } |
| 683 | 810 |
| 684 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 811 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| 685 NoStatePrefetchObserverNoStore) { | 812 NoStatePrefetchObserverNoStore) { |
| 686 ASSERT_TRUE(embedded_test_server()->Start()); | 813 ASSERT_TRUE(embedded_test_server()->Start()); |
| 687 | 814 |
| 688 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = | 815 auto waiter = CreatePageLoadMetricsWaiter(); |
| 689 CreatePageLoadMetricsWaiter(); | 816 waiter->AddMainFrameExpectation(TimingField::FIRST_CONTENTFUL_PAINT); |
| 690 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT); | |
| 691 | 817 |
| 692 ui_test_utils::NavigateToURL(browser(), | 818 ui_test_utils::NavigateToURL(browser(), |
| 693 embedded_test_server()->GetURL("/nostore.html")); | 819 embedded_test_server()->GetURL("/nostore.html")); |
| 694 | 820 |
| 695 fcp_waiter->Wait(); | 821 waiter->Wait(); |
| 696 | 822 |
| 697 histogram_tester_.ExpectTotalCount( | 823 histogram_tester_.ExpectTotalCount( |
| 698 "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 1); | 824 "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 1); |
| 699 histogram_tester_.ExpectTotalCount( | 825 histogram_tester_.ExpectTotalCount( |
| 700 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 0); | 826 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 0); |
| 701 } | 827 } |
| 702 | 828 |
| 703 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, CSSTiming) { | 829 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, CSSTiming) { |
| 704 ASSERT_TRUE(embedded_test_server()->Start()); | 830 ASSERT_TRUE(embedded_test_server()->Start()); |
| 705 | 831 |
| 706 std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = | 832 auto waiter = CreatePageLoadMetricsWaiter(); |
| 707 CreatePageLoadMetricsWaiter(); | 833 waiter->AddMainFrameExpectation(TimingField::STYLE_UPDATE_BEFORE_FCP); |
| 708 fcp_waiter->AddExpectation(PageLoadMetricsWaiter::STYLE_UPDATE_BEFORE_FCP); | |
| 709 | 834 |
| 710 // Careful: Blink code clamps timestamps to 5us, so any CSS parsing we do here | 835 // Careful: Blink code clamps timestamps to 5us, so any CSS parsing we do here |
| 711 // must take >> 5us, otherwise we'll log 0 for the value and it will remain | 836 // must take >> 5us, otherwise we'll log 0 for the value and it will remain |
| 712 // unset here. | 837 // unset here. |
| 713 ui_test_utils::NavigateToURL( | 838 ui_test_utils::NavigateToURL( |
| 714 browser(), | 839 browser(), |
| 715 embedded_test_server()->GetURL("/page_load_metrics/page_with_css.html")); | 840 embedded_test_server()->GetURL("/page_load_metrics/page_with_css.html")); |
| 716 NavigateToUntrackedUrl(); | 841 waiter->Wait(); |
| 717 fcp_waiter->Wait(); | |
| 718 | 842 |
| 719 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, | 843 histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, |
| 720 1); | 844 1); |
| 721 histogram_tester_.ExpectTotalCount( | 845 histogram_tester_.ExpectTotalCount( |
| 722 "PageLoad.CSSTiming.Parse.BeforeFirstContentfulPaint", 1); | 846 "PageLoad.CSSTiming.Parse.BeforeFirstContentfulPaint", 1); |
| 723 histogram_tester_.ExpectTotalCount( | 847 histogram_tester_.ExpectTotalCount( |
| 724 "PageLoad.CSSTiming.Update.BeforeFirstContentfulPaint", 1); | 848 "PageLoad.CSSTiming.Update.BeforeFirstContentfulPaint", 1); |
| 725 histogram_tester_.ExpectTotalCount( | 849 histogram_tester_.ExpectTotalCount( |
| 726 "PageLoad.CSSTiming.ParseAndUpdate.BeforeFirstContentfulPaint", 1); | 850 "PageLoad.CSSTiming.ParseAndUpdate.BeforeFirstContentfulPaint", 1); |
| 727 } | 851 } |
| 728 | 852 |
| 729 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PayloadSize) { | 853 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PayloadSize) { |
| 730 ASSERT_TRUE(embedded_test_server()->Start()); | 854 ASSERT_TRUE(embedded_test_server()->Start()); |
| 731 | 855 |
| 856 auto waiter = CreatePageLoadMetricsWaiter(); | |
| 857 waiter->AddMainFrameExpectation(TimingField::LOAD_EVENT); | |
| 732 ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL( | 858 ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL( |
| 733 "/page_load_metrics/large.html")); | 859 "/page_load_metrics/large.html")); |
| 860 waiter->Wait(); | |
| 861 | |
| 862 // Payload histograms are only logged when a page load terminates, so force | |
| 863 // navigation to another page. | |
| 734 NavigateToUntrackedUrl(); | 864 NavigateToUntrackedUrl(); |
| 735 | 865 |
| 736 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); | 866 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); |
| 737 | 867 |
| 738 // Verify that there is a single sample recorded in the 10kB bucket (the size | 868 // Verify that there is a single sample recorded in the 10kB bucket (the size |
| 739 // of the main HTML response). | 869 // of the main HTML response). |
| 740 histogram_tester_.ExpectBucketCount(internal::kHistogramTotalBytes, 10, 1); | 870 histogram_tester_.ExpectBucketCount(internal::kHistogramTotalBytes, 10, 1); |
| 741 } | 871 } |
| OLD | NEW |