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

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

Issue 2868213003: Various cleanups for page_load_metrics_browsertest (Closed)
Patch Set: address comments Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/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
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
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
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(&params); 618 chrome::Navigate(&params);
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(&params2); 627 chrome::Navigate(&params2);
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(&params); 642 chrome::Navigate(&params);
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(&params2); 649 chrome::Navigate(&params2);
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
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(&params2); 696 chrome::Navigate(&params2);
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(&params3); 706 chrome::Navigate(&params3);
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(&params); 727 chrome::Navigate(&params);
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698