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