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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.h"
6
7 #include <vector>
8
9 #include "base/macros.h"
10 #include "base/memory/ptr_util.h"
11 #include "build/build_config.h"
12 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h"
13 #include "components/page_load_metrics/browser/metrics_web_contents_observer.h"
14 #include "components/page_load_metrics/browser/page_load_metrics_util.h"
15 #include "components/page_load_metrics/browser/page_load_tracker.h"
16 #include "components/page_load_metrics/common/test/page_load_metrics_test_util.h"
17 #include "content/public/browser/web_contents.h"
18 #include "services/metrics/public/cpp/ukm_builders.h"
19 #include "third_party/blink/public/common/input/web_mouse_event.h"
20
21 namespace {
22 const char kExampleUrl[] = "http://www.example.com/";
23 const char kGoogleSearchResultsUrl[] = "https://www.google.com/webhp?q=d";
24 } // namespace
25
26 class FromGWSPageLoadMetricsObserverTest
27 : public page_load_metrics::PageLoadMetricsObserverTestHarness {
28 public:
RegisterObservers(page_load_metrics::PageLoadTracker * tracker)29 void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override {
30 FromGWSPageLoadMetricsObserver* observer =
31 new FromGWSPageLoadMetricsObserver();
32 tracker->AddObserver(base::WrapUnique(observer));
33 }
34
SimulateTimingWithoutPaint()35 void SimulateTimingWithoutPaint() {
36 page_load_metrics::mojom::PageLoadTiming timing;
37 page_load_metrics::InitPageLoadTimingForTest(&timing);
38 timing.navigation_start = base::Time::FromDoubleT(1);
39 tester()->SimulateTimingUpdate(timing);
40 }
41
SimulateTimingWithFirstPaint()42 void SimulateTimingWithFirstPaint() {
43 page_load_metrics::mojom::PageLoadTiming timing;
44 page_load_metrics::InitPageLoadTimingForTest(&timing);
45 timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(0);
46 timing.navigation_start = base::Time::FromDoubleT(1);
47 timing.paint_timing->first_paint = base::TimeDelta::FromMilliseconds(0);
48 PopulateRequiredTimingFields(&timing);
49 tester()->SimulateTimingUpdate(timing);
50 }
51
SimulateMouseEvent()52 void SimulateMouseEvent() {
53 blink::WebMouseEvent mouse_event(
54 blink::WebInputEvent::Type::kMouseDown,
55 blink::WebInputEvent::kNoModifiers,
56 blink::WebInputEvent::GetStaticTimeStampForTests());
57 mouse_event.button = blink::WebMouseEvent::Button::kLeft;
58 mouse_event.SetPositionInWidget(7, 7);
59 mouse_event.click_count = 1;
60 tester()->SimulateInputEvent(mouse_event);
61 }
62 };
63
64 class FromGWSPageLoadMetricsLoggerTest : public testing::Test {};
65
TEST_F(FromGWSPageLoadMetricsObserverTest,NoMetrics)66 TEST_F(FromGWSPageLoadMetricsObserverTest, NoMetrics) {
67 tester()->histogram_tester().ExpectTotalCount(
68 internal::kHistogramFromGWSFirstImagePaint, 0);
69 EXPECT_EQ(0ul, tester()->test_ukm_recorder().entries_count());
70 }
71
TEST_F(FromGWSPageLoadMetricsObserverTest,NoPreviousCommittedUrl)72 TEST_F(FromGWSPageLoadMetricsObserverTest, NoPreviousCommittedUrl) {
73 page_load_metrics::mojom::PageLoadTiming timing;
74 page_load_metrics::InitPageLoadTimingForTest(&timing);
75 timing.navigation_start = base::Time::FromDoubleT(1);
76 timing.paint_timing->first_image_paint = base::TimeDelta::FromMilliseconds(1);
77 PopulateRequiredTimingFields(&timing);
78 NavigateAndCommit(GURL(kExampleUrl));
79
80 tester()->SimulateTimingUpdate(timing);
81
82 // Navigate again to force logging.
83 tester()->NavigateToUntrackedUrl();
84 tester()->histogram_tester().ExpectTotalCount(
85 internal::kHistogramFromGWSFirstImagePaint, 0);
86 size_t document_created_entries_count =
87 tester()->test_ukm_recorder().GetEntriesByName("DocumentCreated").size();
88 EXPECT_EQ(0ul, tester()->test_ukm_recorder().entries_count() -
89 document_created_entries_count);
90 }
91
TEST_F(FromGWSPageLoadMetricsObserverTest,NonSearchPreviousCommittedUrl)92 TEST_F(FromGWSPageLoadMetricsObserverTest, NonSearchPreviousCommittedUrl) {
93 page_load_metrics::mojom::PageLoadTiming timing;
94 page_load_metrics::InitPageLoadTimingForTest(&timing);
95 timing.navigation_start = base::Time::FromDoubleT(1);
96 timing.paint_timing->first_image_paint = base::TimeDelta::FromMilliseconds(1);
97 PopulateRequiredTimingFields(&timing);
98 NavigateAndCommit(GURL("http://www.other.com"));
99 NavigateAndCommit(GURL(kExampleUrl));
100
101 tester()->SimulateTimingUpdate(timing);
102
103 // Navigate again to force logging.
104 tester()->NavigateToUntrackedUrl();
105 tester()->histogram_tester().ExpectTotalCount(
106 internal::kHistogramFromGWSFirstImagePaint, 0);
107 size_t document_created_entries_count =
108 tester()->test_ukm_recorder().GetEntriesByName("DocumentCreated").size();
109 EXPECT_EQ(0ul, tester()->test_ukm_recorder().entries_count() -
110 document_created_entries_count);
111 }
112
TEST_F(FromGWSPageLoadMetricsObserverTest,GoogleNonSearchPreviousCommittedUrl1)113 TEST_F(FromGWSPageLoadMetricsObserverTest,
114 GoogleNonSearchPreviousCommittedUrl1) {
115 page_load_metrics::mojom::PageLoadTiming timing;
116 page_load_metrics::InitPageLoadTimingForTest(&timing);
117 timing.navigation_start = base::Time::FromDoubleT(1);
118 timing.paint_timing->first_image_paint = base::TimeDelta::FromMilliseconds(1);
119 PopulateRequiredTimingFields(&timing);
120 NavigateAndCommit(GURL("https://www.google.com/"));
121 NavigateAndCommit(GURL(kExampleUrl));
122
123 tester()->SimulateTimingUpdate(timing);
124
125 // Navigate again to force logging.
126 tester()->NavigateToUntrackedUrl();
127 tester()->histogram_tester().ExpectTotalCount(
128 internal::kHistogramFromGWSFirstImagePaint, 0);
129 size_t document_created_entries_count =
130 tester()->test_ukm_recorder().GetEntriesByName("DocumentCreated").size();
131 EXPECT_EQ(0ul, tester()->test_ukm_recorder().entries_count() -
132 document_created_entries_count);
133 }
134
TEST_F(FromGWSPageLoadMetricsObserverTest,GoogleNonSearchPreviousCommittedUrl2)135 TEST_F(FromGWSPageLoadMetricsObserverTest,
136 GoogleNonSearchPreviousCommittedUrl2) {
137 page_load_metrics::mojom::PageLoadTiming timing;
138 page_load_metrics::InitPageLoadTimingForTest(&timing);
139 timing.navigation_start = base::Time::FromDoubleT(1);
140 timing.paint_timing->first_image_paint = base::TimeDelta::FromMilliseconds(1);
141 PopulateRequiredTimingFields(&timing);
142 // Navigation from /search, but missing a query string, so can't have been a
143 // search results page.
144 NavigateAndCommit(GURL("https://www.google.com/search?a=b&c=d"));
145 NavigateAndCommit(GURL(kExampleUrl));
146
147 tester()->SimulateTimingUpdate(timing);
148
149 // Navigate again to force logging.
150 tester()->NavigateToUntrackedUrl();
151 tester()->histogram_tester().ExpectTotalCount(
152 internal::kHistogramFromGWSFirstImagePaint, 0);
153 size_t document_created_entries_count =
154 tester()->test_ukm_recorder().GetEntriesByName("DocumentCreated").size();
155 EXPECT_EQ(0ul, tester()->test_ukm_recorder().entries_count() -
156 document_created_entries_count);
157 }
158
TEST_F(FromGWSPageLoadMetricsObserverTest,SearchPreviousCommittedUrl1)159 TEST_F(FromGWSPageLoadMetricsObserverTest, SearchPreviousCommittedUrl1) {
160 page_load_metrics::mojom::PageLoadTiming timing;
161 page_load_metrics::InitPageLoadTimingForTest(&timing);
162 timing.navigation_start = base::Time::FromDoubleT(1);
163 timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(10);
164 timing.paint_timing->first_paint = base::TimeDelta::FromMilliseconds(20);
165 timing.paint_timing->first_contentful_paint =
166 base::TimeDelta::FromMilliseconds(40);
167 timing.paint_timing->largest_contentful_paint->largest_text_paint =
168 base::TimeDelta::FromMilliseconds(50);
169 timing.paint_timing->largest_contentful_paint->largest_text_paint_size = 20u;
170 timing.paint_timing->first_image_paint =
171 base::TimeDelta::FromMilliseconds(160);
172 timing.parse_timing->parse_stop = base::TimeDelta::FromMilliseconds(320);
173 timing.document_timing->dom_content_loaded_event_start =
174 base::TimeDelta::FromMilliseconds(640);
175 timing.document_timing->load_event_start =
176 base::TimeDelta::FromMilliseconds(1280);
177 timing.interactive_timing->first_input_delay =
178 base::TimeDelta::FromMilliseconds(50);
179 timing.interactive_timing->first_input_timestamp =
180 base::TimeDelta::FromMilliseconds(1400);
181 PopulateRequiredTimingFields(&timing);
182 NavigateAndCommit(GURL("https://www.google.com/webhp?q=test"));
183 NavigateAndCommit(GURL(kExampleUrl));
184
185 tester()->SimulateTimingUpdate(timing);
186 page_load_metrics::mojom::FrameRenderDataUpdate render_data(1.0, 1.0, 0, 0, 0,
187 0, {});
188 tester()->SimulateRenderDataUpdate(render_data);
189 render_data.layout_shift_delta = 1.5;
190 render_data.layout_shift_delta_before_input_or_scroll = 0.0;
191 tester()->SimulateRenderDataUpdate(render_data);
192
193 // Navigate again to force logging.
194 tester()->NavigateToUntrackedUrl();
195
196 tester()->histogram_tester().ExpectTotalCount(
197 internal::kHistogramFromGWSParseStart, 1);
198 tester()->histogram_tester().ExpectBucketCount(
199 internal::kHistogramFromGWSParseStart,
200 timing.parse_timing->parse_start.value().InMilliseconds(), 1);
201
202 tester()->histogram_tester().ExpectTotalCount(
203 internal::kHistogramFromGWSFirstPaint, 1);
204 tester()->histogram_tester().ExpectBucketCount(
205 internal::kHistogramFromGWSFirstPaint,
206 timing.paint_timing->first_paint.value().InMilliseconds(), 1);
207
208 tester()->histogram_tester().ExpectTotalCount(
209 internal::kHistogramFromGWSFirstContentfulPaint, 1);
210 tester()->histogram_tester().ExpectBucketCount(
211 internal::kHistogramFromGWSFirstContentfulPaint,
212 timing.paint_timing->first_contentful_paint.value().InMilliseconds(), 1);
213
214 tester()->histogram_tester().ExpectTotalCount(
215 internal::kHistogramFromGWSLargestContentfulPaint, 1);
216 tester()->histogram_tester().ExpectBucketCount(
217 internal::kHistogramFromGWSLargestContentfulPaint,
218 timing.paint_timing->largest_contentful_paint->largest_text_paint.value()
219 .InMilliseconds(),
220 1);
221
222 tester()->histogram_tester().ExpectTotalCount(
223 internal::kHistogramFromGWSParseStartToFirstContentfulPaint, 1);
224 tester()->histogram_tester().ExpectBucketCount(
225 internal::kHistogramFromGWSParseStartToFirstContentfulPaint,
226 (timing.paint_timing->first_contentful_paint.value() -
227 timing.parse_timing->parse_start.value())
228 .InMilliseconds(),
229 1);
230
231 tester()->histogram_tester().ExpectTotalCount(
232 internal::kHistogramFromGWSFirstImagePaint, 1);
233 tester()->histogram_tester().ExpectBucketCount(
234 internal::kHistogramFromGWSFirstImagePaint,
235 timing.paint_timing->first_image_paint.value().InMilliseconds(), 1);
236
237 tester()->histogram_tester().ExpectTotalCount(
238 internal::kHistogramFromGWSParseDuration, 1);
239 tester()->histogram_tester().ExpectBucketCount(
240 internal::kHistogramFromGWSParseDuration,
241 (timing.parse_timing->parse_stop.value() -
242 timing.parse_timing->parse_start.value())
243 .InMilliseconds(),
244 1);
245
246 tester()->histogram_tester().ExpectTotalCount(
247 internal::kHistogramFromGWSDomContentLoaded, 1);
248 tester()->histogram_tester().ExpectBucketCount(
249 internal::kHistogramFromGWSDomContentLoaded,
250 timing.document_timing->dom_content_loaded_event_start.value()
251 .InMilliseconds(),
252 1);
253
254 tester()->histogram_tester().ExpectTotalCount(internal::kHistogramFromGWSLoad,
255 1);
256 tester()->histogram_tester().ExpectBucketCount(
257 internal::kHistogramFromGWSLoad,
258 timing.document_timing->load_event_start.value().InMilliseconds(), 1);
259
260 tester()->histogram_tester().ExpectTotalCount(
261 internal::kHistogramFromGWSFirstInputDelay, 1);
262 tester()->histogram_tester().ExpectBucketCount(
263 internal::kHistogramFromGWSFirstInputDelay,
264 timing.interactive_timing->first_input_delay.value().InMilliseconds(), 1);
265
266 tester()->histogram_tester().ExpectTotalCount(
267 internal::kHistogramFromGWSCumulativeLayoutShiftMainFrame, 1);
268 tester()->histogram_tester().ExpectBucketCount(
269 internal::kHistogramFromGWSCumulativeLayoutShiftMainFrame, 25, 1);
270
271 auto entries = tester()->test_ukm_recorder().GetEntriesByName(
272 ukm::builders::PageLoad_FromGoogleSearch::kEntryName);
273 EXPECT_EQ(1u, entries.size());
274 for (const auto* const entry : entries) {
275 tester()->test_ukm_recorder().ExpectEntrySourceHasUrl(entry,
276 GURL(kExampleUrl));
277 }
278 }
279
TEST_F(FromGWSPageLoadMetricsObserverTest,SearchPreviousCommittedUrl2)280 TEST_F(FromGWSPageLoadMetricsObserverTest, SearchPreviousCommittedUrl2) {
281 page_load_metrics::mojom::PageLoadTiming timing;
282 page_load_metrics::InitPageLoadTimingForTest(&timing);
283 timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1);
284 timing.navigation_start = base::Time::FromDoubleT(1);
285 timing.paint_timing->first_image_paint = base::TimeDelta::FromMilliseconds(1);
286 PopulateRequiredTimingFields(&timing);
287 NavigateAndCommit(GURL("https://www.google.com/#q=test"));
288 NavigateAndCommit(GURL(kExampleUrl));
289
290 tester()->SimulateTimingUpdate(timing);
291
292 // Navigate again to force logging.
293 tester()->NavigateToUntrackedUrl();
294 tester()->histogram_tester().ExpectTotalCount(
295 internal::kHistogramFromGWSFirstImagePaint, 1);
296 tester()->histogram_tester().ExpectBucketCount(
297 internal::kHistogramFromGWSFirstImagePaint,
298 timing.paint_timing->first_image_paint.value().InMilliseconds(), 1);
299
300 auto entries = tester()->test_ukm_recorder().GetEntriesByName(
301 ukm::builders::PageLoad_FromGoogleSearch::kEntryName);
302 EXPECT_EQ(1u, entries.size());
303 for (const auto* const entry : entries) {
304 tester()->test_ukm_recorder().ExpectEntrySourceHasUrl(entry,
305 GURL(kExampleUrl));
306 }
307 }
308
TEST_F(FromGWSPageLoadMetricsObserverTest,SearchPreviousCommittedUrl3)309 TEST_F(FromGWSPageLoadMetricsObserverTest, SearchPreviousCommittedUrl3) {
310 page_load_metrics::mojom::PageLoadTiming timing;
311 page_load_metrics::InitPageLoadTimingForTest(&timing);
312 timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1);
313 timing.navigation_start = base::Time::FromDoubleT(1);
314 timing.paint_timing->first_image_paint = base::TimeDelta::FromMilliseconds(1);
315 PopulateRequiredTimingFields(&timing);
316 NavigateAndCommit(GURL("https://www.google.com/webhp#q=test"));
317 NavigateAndCommit(GURL(kExampleUrl));
318
319 tester()->SimulateTimingUpdate(timing);
320
321 // Navigate again to force logging.
322 tester()->NavigateToUntrackedUrl();
323 tester()->histogram_tester().ExpectTotalCount(
324 internal::kHistogramFromGWSFirstImagePaint, 1);
325 tester()->histogram_tester().ExpectBucketCount(
326 internal::kHistogramFromGWSFirstImagePaint,
327 timing.paint_timing->first_image_paint.value().InMilliseconds(), 1);
328
329 auto entries = tester()->test_ukm_recorder().GetEntriesByName(
330 ukm::builders::PageLoad_FromGoogleSearch::kEntryName);
331 EXPECT_EQ(1u, entries.size());
332 for (const auto* const entry : entries) {
333 tester()->test_ukm_recorder().ExpectEntrySourceHasUrl(entry,
334 GURL(kExampleUrl));
335 }
336 }
337
TEST_F(FromGWSPageLoadMetricsObserverTest,SearchPreviousCommittedUrl4)338 TEST_F(FromGWSPageLoadMetricsObserverTest, SearchPreviousCommittedUrl4) {
339 page_load_metrics::mojom::PageLoadTiming timing;
340 page_load_metrics::InitPageLoadTimingForTest(&timing);
341 timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1);
342 timing.navigation_start = base::Time::FromDoubleT(1);
343 timing.paint_timing->first_image_paint = base::TimeDelta::FromMilliseconds(1);
344 PopulateRequiredTimingFields(&timing);
345 NavigateAndCommit(GURL("https://www.google.co.uk/search#q=test"));
346 NavigateAndCommit(GURL(kExampleUrl));
347
348 tester()->SimulateTimingUpdate(timing);
349
350 // Navigate again to force logging.
351 tester()->NavigateToUntrackedUrl();
352 tester()->histogram_tester().ExpectTotalCount(
353 internal::kHistogramFromGWSFirstImagePaint, 1);
354 tester()->histogram_tester().ExpectBucketCount(
355 internal::kHistogramFromGWSFirstImagePaint,
356 timing.paint_timing->first_image_paint.value().InMilliseconds(), 1);
357
358 auto entries = tester()->test_ukm_recorder().GetEntriesByName(
359 ukm::builders::PageLoad_FromGoogleSearch::kEntryName);
360 EXPECT_EQ(1u, entries.size());
361 for (const auto* const entry : entries) {
362 tester()->test_ukm_recorder().ExpectEntrySourceHasUrl(entry,
363 GURL(kExampleUrl));
364 }
365 }
366
TEST_F(FromGWSPageLoadMetricsObserverTest,SearchToNonSearchToOtherPage)367 TEST_F(FromGWSPageLoadMetricsObserverTest, SearchToNonSearchToOtherPage) {
368 page_load_metrics::mojom::PageLoadTiming timing;
369 page_load_metrics::InitPageLoadTimingForTest(&timing);
370 timing.navigation_start = base::Time::FromDoubleT(1);
371 timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1);
372 timing.paint_timing->first_image_paint = base::TimeDelta::FromMilliseconds(1);
373 page_load_metrics::mojom::PageLoadTiming timing2;
374 page_load_metrics::InitPageLoadTimingForTest(&timing2);
375 timing2.navigation_start = base::Time::FromDoubleT(2);
376 timing2.paint_timing->first_image_paint =
377 base::TimeDelta::FromMilliseconds(100);
378 PopulateRequiredTimingFields(&timing);
379 PopulateRequiredTimingFields(&timing2);
380 NavigateAndCommit(GURL("https://www.google.co.uk/search#q=test"));
381 NavigateAndCommit(GURL(kExampleUrl));
382 tester()->SimulateTimingUpdate(timing);
383 NavigateAndCommit(GURL("http://www.example.com/other"));
384 tester()->SimulateTimingUpdate(timing2);
385
386 // Navigate again to force logging. We expect to log timing for the page
387 // navigated from search, but not for the page navigated from that page.
388 tester()->NavigateToUntrackedUrl();
389 tester()->histogram_tester().ExpectTotalCount(
390 internal::kHistogramFromGWSFirstImagePaint, 1);
391 tester()->histogram_tester().ExpectBucketCount(
392 internal::kHistogramFromGWSFirstImagePaint,
393 timing.paint_timing->first_image_paint.value().InMilliseconds(), 1);
394
395 auto entries = tester()->test_ukm_recorder().GetEntriesByName(
396 ukm::builders::PageLoad_FromGoogleSearch::kEntryName);
397 EXPECT_EQ(1u, entries.size());
398 for (const auto* const entry : entries) {
399 tester()->test_ukm_recorder().ExpectEntrySourceHasUrl(entry,
400 GURL(kExampleUrl));
401 }
402 }
403
TEST_F(FromGWSPageLoadMetricsObserverTest,SearchToNonSearchToSearch)404 TEST_F(FromGWSPageLoadMetricsObserverTest, SearchToNonSearchToSearch) {
405 page_load_metrics::mojom::PageLoadTiming timing;
406 page_load_metrics::InitPageLoadTimingForTest(&timing);
407 timing.navigation_start = base::Time::FromDoubleT(1);
408 timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1);
409 timing.paint_timing->first_image_paint = base::TimeDelta::FromMilliseconds(1);
410 page_load_metrics::mojom::PageLoadTiming timing2;
411 page_load_metrics::InitPageLoadTimingForTest(&timing2);
412 timing2.navigation_start = base::Time::FromDoubleT(2);
413 timing2.paint_timing->first_image_paint =
414 base::TimeDelta::FromMilliseconds(100);
415 PopulateRequiredTimingFields(&timing);
416 PopulateRequiredTimingFields(&timing2);
417 NavigateAndCommit(GURL("https://www.google.co.uk/search#q=test"));
418 NavigateAndCommit(GURL(kExampleUrl));
419 tester()->SimulateTimingUpdate(timing);
420 NavigateAndCommit(GURL("https://www.google.co.uk/search#q=test"));
421 tester()->SimulateTimingUpdate(timing2);
422
423 // Navigate again to force logging. We expect to log timing for the page
424 // navigated from search, but not for the search page we navigated to.
425 tester()->NavigateToUntrackedUrl();
426 tester()->histogram_tester().ExpectTotalCount(
427 internal::kHistogramFromGWSFirstImagePaint, 1);
428 tester()->histogram_tester().ExpectBucketCount(
429 internal::kHistogramFromGWSFirstImagePaint,
430 timing.paint_timing->first_image_paint.value().InMilliseconds(), 1);
431
432 auto entries = tester()->test_ukm_recorder().GetEntriesByName(
433 ukm::builders::PageLoad_FromGoogleSearch::kEntryName);
434 EXPECT_EQ(1u, entries.size());
435 for (const auto* const entry : entries) {
436 tester()->test_ukm_recorder().ExpectEntrySourceHasUrl(entry,
437 GURL(kExampleUrl));
438 }
439 }
440
TEST_F(FromGWSPageLoadMetricsObserverTest,SearchToNonSearchToSearchToNonSearch)441 TEST_F(FromGWSPageLoadMetricsObserverTest,
442 SearchToNonSearchToSearchToNonSearch) {
443 page_load_metrics::mojom::PageLoadTiming timing;
444 page_load_metrics::InitPageLoadTimingForTest(&timing);
445 timing.navigation_start = base::Time::FromDoubleT(1);
446 timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1);
447 timing.paint_timing->first_image_paint = base::TimeDelta::FromMilliseconds(1);
448 page_load_metrics::mojom::PageLoadTiming timing2;
449 page_load_metrics::InitPageLoadTimingForTest(&timing2);
450 timing2.navigation_start = base::Time::FromDoubleT(2);
451 timing2.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(100);
452 timing2.paint_timing->first_image_paint =
453 base::TimeDelta::FromMilliseconds(100);
454 page_load_metrics::mojom::PageLoadTiming timing3;
455 page_load_metrics::InitPageLoadTimingForTest(&timing3);
456 timing3.navigation_start = base::Time::FromDoubleT(3);
457 timing3.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1000);
458 timing3.paint_timing->first_image_paint =
459 base::TimeDelta::FromMilliseconds(1000);
460 PopulateRequiredTimingFields(&timing);
461 PopulateRequiredTimingFields(&timing2);
462 PopulateRequiredTimingFields(&timing3);
463 NavigateAndCommit(GURL("https://www.google.co.uk/search#q=test"));
464 NavigateAndCommit(GURL(kExampleUrl));
465 tester()->SimulateTimingUpdate(timing);
466 NavigateAndCommit(GURL("https://www.google.co.uk/search#q=test"));
467 tester()->SimulateTimingUpdate(timing2);
468 NavigateAndCommit(GURL(kExampleUrl));
469 tester()->SimulateTimingUpdate(timing3);
470
471 // Navigate again to force logging. We expect to log timing for both pages
472 // navigated from search, but not for the search pages we navigated to.
473 tester()->NavigateToUntrackedUrl();
474 tester()->histogram_tester().ExpectTotalCount(
475 internal::kHistogramFromGWSFirstImagePaint, 2);
476 tester()->histogram_tester().ExpectBucketCount(
477 internal::kHistogramFromGWSFirstImagePaint,
478 timing.paint_timing->first_image_paint.value().InMilliseconds(), 1);
479 tester()->histogram_tester().ExpectBucketCount(
480 internal::kHistogramFromGWSFirstImagePaint,
481 timing3.paint_timing->first_image_paint.value().InMilliseconds(), 1);
482
483 auto entries = tester()->test_ukm_recorder().GetEntriesByName(
484 ukm::builders::PageLoad_FromGoogleSearch::kEntryName);
485 EXPECT_EQ(2u, entries.size());
486 for (const auto* const entry : entries) {
487 tester()->test_ukm_recorder().ExpectEntrySourceHasUrl(entry,
488 GURL(kExampleUrl));
489 }
490 }
491
TEST_F(FromGWSPageLoadMetricsObserverTest,SearchToNonSearchToSearchToNonSearchBackgrounded)492 TEST_F(FromGWSPageLoadMetricsObserverTest,
493 SearchToNonSearchToSearchToNonSearchBackgrounded) {
494 page_load_metrics::mojom::PageLoadTiming timing;
495 page_load_metrics::InitPageLoadTimingForTest(&timing);
496 timing.navigation_start = base::Time::FromDoubleT(1);
497 timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1);
498 timing.paint_timing->first_image_paint = base::TimeDelta::FromMilliseconds(1);
499 page_load_metrics::mojom::PageLoadTiming timing2;
500 page_load_metrics::InitPageLoadTimingForTest(&timing2);
501 timing2.navigation_start = base::Time::FromDoubleT(2);
502 timing2.paint_timing->first_image_paint =
503 base::TimeDelta::FromMilliseconds(100);
504 page_load_metrics::mojom::PageLoadTiming timing3;
505 page_load_metrics::InitPageLoadTimingForTest(&timing3);
506 timing3.navigation_start = base::Time::FromDoubleT(3);
507 timing3.paint_timing->first_image_paint =
508 base::TimeDelta::FromMilliseconds(1000);
509 PopulateRequiredTimingFields(&timing);
510 PopulateRequiredTimingFields(&timing2);
511 PopulateRequiredTimingFields(&timing3);
512 NavigateAndCommit(GURL("https://www.google.co.uk/search#q=test"));
513 NavigateAndCommit(GURL(kExampleUrl));
514 tester()->SimulateTimingUpdate(timing);
515 NavigateAndCommit(GURL("https://www.google.co.uk/search#q=test"));
516 web_contents()->WasHidden();
517 tester()->SimulateTimingUpdate(timing2);
518 NavigateAndCommit(GURL(kExampleUrl));
519 tester()->SimulateTimingUpdate(timing3);
520
521 // Navigate again to force logging. We expect to log timing for the first page
522 // navigated from search, but not the second since it was backgrounded.
523 tester()->NavigateToUntrackedUrl();
524 tester()->histogram_tester().ExpectTotalCount(
525 internal::kHistogramFromGWSFirstImagePaint, 1);
526 tester()->histogram_tester().ExpectBucketCount(
527 internal::kHistogramFromGWSFirstImagePaint,
528 timing.paint_timing->first_image_paint.value().InMilliseconds(), 1);
529
530 auto entries = tester()->test_ukm_recorder().GetEntriesByName(
531 ukm::builders::PageLoad_FromGoogleSearch::kEntryName);
532 EXPECT_EQ(2u, entries.size());
533 for (const auto* const entry : entries) {
534 tester()->test_ukm_recorder().ExpectEntrySourceHasUrl(entry,
535 GURL(kExampleUrl));
536 }
537 }
538
TEST_F(FromGWSPageLoadMetricsObserverTest,SearchRedirectorPreviousCommittedUrl)539 TEST_F(FromGWSPageLoadMetricsObserverTest,
540 SearchRedirectorPreviousCommittedUrl) {
541 page_load_metrics::mojom::PageLoadTiming timing;
542 page_load_metrics::InitPageLoadTimingForTest(&timing);
543 timing.navigation_start = base::Time::FromDoubleT(1);
544 timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1);
545 timing.paint_timing->first_image_paint = base::TimeDelta::FromMilliseconds(1);
546 PopulateRequiredTimingFields(&timing);
547 NavigateAndCommit(GURL("https://www.google.com/search#q=test"));
548 NavigateAndCommit(GURL("https://www.google.com/url?source=web"));
549 NavigateAndCommit(GURL(kExampleUrl));
550
551 tester()->SimulateTimingUpdate(timing);
552
553 // Navigate again to force logging.
554 tester()->NavigateToUntrackedUrl();
555 tester()->histogram_tester().ExpectTotalCount(
556 internal::kHistogramFromGWSFirstImagePaint, 1);
557 tester()->histogram_tester().ExpectBucketCount(
558 internal::kHistogramFromGWSFirstImagePaint,
559 timing.paint_timing->first_image_paint.value().InMilliseconds(), 1);
560
561 auto entries = tester()->test_ukm_recorder().GetEntriesByName(
562 ukm::builders::PageLoad_FromGoogleSearch::kEntryName);
563 EXPECT_EQ(1u, entries.size());
564 for (const auto* const entry : entries) {
565 tester()->test_ukm_recorder().ExpectEntrySourceHasUrl(entry,
566 GURL(kExampleUrl));
567 }
568 }
569
TEST_F(FromGWSPageLoadMetricsObserverTest,NonSearchRedirectorPreviousCommittedUrl)570 TEST_F(FromGWSPageLoadMetricsObserverTest,
571 NonSearchRedirectorPreviousCommittedUrl) {
572 page_load_metrics::mojom::PageLoadTiming timing;
573 page_load_metrics::InitPageLoadTimingForTest(&timing);
574 timing.navigation_start = base::Time::FromDoubleT(1);
575 timing.paint_timing->first_image_paint = base::TimeDelta::FromMilliseconds(1);
576 PopulateRequiredTimingFields(&timing);
577 NavigateAndCommit(GURL("https://www.google.com/webhp?q=test"));
578 NavigateAndCommit(GURL("https://www.google.com/url?a=b&c=d"));
579 NavigateAndCommit(GURL(kExampleUrl));
580
581 tester()->SimulateTimingUpdate(timing);
582
583 // Navigate again to force logging.
584 tester()->NavigateToUntrackedUrl();
585 tester()->histogram_tester().ExpectTotalCount(
586 internal::kHistogramFromGWSFirstImagePaint, 0);
587
588 size_t document_created_entries_count =
589 tester()->test_ukm_recorder().GetEntriesByName("DocumentCreated").size();
590 EXPECT_EQ(0ul, tester()->test_ukm_recorder().entries_count() -
591 document_created_entries_count);
592 }
593
TEST_F(FromGWSPageLoadMetricsObserverTest,SearchPreviousCommittedUrlBackgroundLater)594 TEST_F(FromGWSPageLoadMetricsObserverTest,
595 SearchPreviousCommittedUrlBackgroundLater) {
596 page_load_metrics::mojom::PageLoadTiming timing;
597 page_load_metrics::InitPageLoadTimingForTest(&timing);
598 timing.parse_timing->parse_start = base::TimeDelta::FromMicroseconds(1);
599 timing.navigation_start = base::Time::FromDoubleT(1);
600 timing.paint_timing->first_image_paint = base::TimeDelta::FromMicroseconds(1);
601 PopulateRequiredTimingFields(&timing);
602
603 NavigateAndCommit(GURL("https://www.google.com/search#q=test"));
604 NavigateAndCommit(GURL(kExampleUrl));
605 page_load_metrics::mojom::FrameRenderDataUpdate render_data(1.0, 1.0, 0, 0, 0,
606 0, {});
607 tester()->SimulateRenderDataUpdate(render_data);
608
609 web_contents()->WasHidden();
610 tester()->SimulateTimingUpdate(timing);
611 render_data.layout_shift_delta = 1.5;
612 render_data.layout_shift_delta_before_input_or_scroll = 0.0;
613 tester()->SimulateRenderDataUpdate(render_data);
614
615 // If the system clock is low resolution PageLoadTracker's background_time_
616 // may be < timing.first_image_paint.
617 if (page_load_metrics::WasStartedInForegroundOptionalEventInForeground(
618 timing.paint_timing->first_image_paint,
619 tester()->GetDelegateForCommittedLoad())) {
620 tester()->histogram_tester().ExpectTotalCount(
621 internal::kHistogramFromGWSFirstImagePaint, 1);
622 tester()->histogram_tester().ExpectBucketCount(
623 internal::kHistogramFromGWSFirstImagePaint,
624 timing.paint_timing->first_image_paint.value().InMilliseconds(), 1);
625 } else {
626 tester()->histogram_tester().ExpectTotalCount(
627 internal::kHistogramFromGWSFirstImagePaint, 0);
628 }
629
630 // Navigate again to force logging layout shift score.
631 tester()->NavigateToUntrackedUrl();
632
633 // Layout shift score should still be updated after tab was hidden.
634 tester()->histogram_tester().ExpectTotalCount(
635 internal::kHistogramFromGWSCumulativeLayoutShiftMainFrame, 1);
636 tester()->histogram_tester().ExpectBucketCount(
637 internal::kHistogramFromGWSCumulativeLayoutShiftMainFrame, 25, 1);
638 }
639
640 // Disabled due to flakiness: https://crbug.com/1092018
641 #if defined(OS_LINUX) || defined(OS_CHROMEOS)
642 #define MAYBE_NewNavigationBeforeCommit DISABLED_NewNavigationBeforeCommit
643 #else
644 #define MAYBE_NewNavigationBeforeCommit NewNavigationBeforeCommit
645 #endif
TEST_F(FromGWSPageLoadMetricsObserverTest,MAYBE_NewNavigationBeforeCommit)646 TEST_F(FromGWSPageLoadMetricsObserverTest, MAYBE_NewNavigationBeforeCommit) {
647 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
648 tester()->StartNavigation(GURL("http://example.test"));
649
650 // Simulate the user performing another navigation before commit.
651 NavigateAndCommit(GURL("https://www.example.com"));
652 tester()->histogram_tester().ExpectTotalCount(
653 internal::kHistogramFromGWSAbortNewNavigationBeforeCommit, 1);
654 }
655
TEST_F(FromGWSPageLoadMetricsObserverTest,NewNavigationBeforePaint)656 TEST_F(FromGWSPageLoadMetricsObserverTest, NewNavigationBeforePaint) {
657 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
658 NavigateAndCommit(GURL("http://example.test"));
659 SimulateTimingWithoutPaint();
660 // Simulate the user performing another navigation before paint.
661 NavigateAndCommit(GURL("https://www.example.com"));
662 tester()->histogram_tester().ExpectTotalCount(
663 internal::kHistogramFromGWSAbortNewNavigationBeforePaint, 1);
664 }
665
TEST_F(FromGWSPageLoadMetricsObserverTest,StopBeforeCommit)666 TEST_F(FromGWSPageLoadMetricsObserverTest, StopBeforeCommit) {
667 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
668 tester()->StartNavigation(GURL("http://example.test"));
669 // Simulate the user pressing the stop button.
670 web_contents()->Stop();
671 // Now close the tab. This will trigger logging for the prior navigation which
672 // was stopped above.
673 DeleteContents();
674 tester()->histogram_tester().ExpectTotalCount(
675 internal::kHistogramFromGWSAbortStopBeforeCommit, 1);
676 }
677
TEST_F(FromGWSPageLoadMetricsObserverTest,StopBeforeCommitNonSearch)678 TEST_F(FromGWSPageLoadMetricsObserverTest, StopBeforeCommitNonSearch) {
679 NavigateAndCommit(GURL("http://google.com"));
680 tester()->StartNavigation(GURL("http://example.test"));
681 // Simulate the user pressing the stop button.
682 web_contents()->Stop();
683 // Now close the tab. This will trigger logging for the prior navigation which
684 // was stopped above.
685 DeleteContents();
686 tester()->histogram_tester().ExpectTotalCount(
687 internal::kHistogramFromGWSAbortStopBeforeCommit, 0);
688 }
689
TEST_F(FromGWSPageLoadMetricsObserverTest,StopBeforeCommitSearchToSearch)690 TEST_F(FromGWSPageLoadMetricsObserverTest, StopBeforeCommitSearchToSearch) {
691 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
692 tester()->StartNavigation(GURL("http://www.google.com/webhp?q=5"));
693 // Simulate the user pressing the stop button.
694 web_contents()->Stop();
695 // Now close the tab. This will trigger logging for the prior navigation which
696 // was stopped above.
697 DeleteContents();
698 tester()->histogram_tester().ExpectTotalCount(
699 internal::kHistogramFromGWSAbortStopBeforeCommit, 0);
700 }
701
TEST_F(FromGWSPageLoadMetricsObserverTest,StopBeforePaint)702 TEST_F(FromGWSPageLoadMetricsObserverTest, StopBeforePaint) {
703 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
704 NavigateAndCommit(GURL("http://example.test"));
705 SimulateTimingWithoutPaint();
706 // Simulate the user pressing the stop button.
707 web_contents()->Stop();
708 // Now close the tab. This will trigger logging for the prior navigation which
709 // was stopped above.
710 DeleteContents();
711 tester()->histogram_tester().ExpectTotalCount(
712 internal::kHistogramFromGWSAbortStopBeforePaint, 1);
713 }
714
TEST_F(FromGWSPageLoadMetricsObserverTest,StopBeforeCommitAndBeforePaint)715 TEST_F(FromGWSPageLoadMetricsObserverTest, StopBeforeCommitAndBeforePaint) {
716 // Commit the first navigation.
717 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
718 NavigateAndCommit(GURL("https://example.test"));
719 SimulateTimingWithoutPaint();
720 // Now start a second navigation, but don't commit it.
721 tester()->StartNavigation(GURL("https://www.google.com"));
722 // Simulate the user pressing the stop button. This should cause us to record
723 // stop metrics for the FromGWS committed load, too.
724 web_contents()->Stop();
725 // Simulate closing the tab.
726 DeleteContents();
727 // The second navigation was not from GWS.
728 tester()->histogram_tester().ExpectTotalCount(
729 internal::kHistogramFromGWSAbortStopBeforeCommit, 0);
730 tester()->histogram_tester().ExpectTotalCount(
731 internal::kHistogramFromGWSAbortStopBeforePaint, 1);
732 }
733
TEST_F(FromGWSPageLoadMetricsObserverTest,CloseBeforeCommit)734 TEST_F(FromGWSPageLoadMetricsObserverTest, CloseBeforeCommit) {
735 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
736 tester()->StartNavigation(GURL("https://example.test"));
737 // Simulate closing the tab.
738 DeleteContents();
739 tester()->histogram_tester().ExpectTotalCount(
740 internal::kHistogramFromGWSAbortCloseBeforeCommit, 1);
741 }
742
TEST_F(FromGWSPageLoadMetricsObserverTest,CloseBeforePaint)743 TEST_F(FromGWSPageLoadMetricsObserverTest, CloseBeforePaint) {
744 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
745 NavigateAndCommit(GURL("https://example.test"));
746 SimulateTimingWithoutPaint();
747 // Simulate closing the tab.
748 DeleteContents();
749 tester()->histogram_tester().ExpectTotalCount(
750 internal::kHistogramFromGWSAbortCloseBeforePaint, 1);
751 }
752
TEST_F(FromGWSPageLoadMetricsObserverTest,AbortCloseBeforeCommitAndBeforePaint)753 TEST_F(FromGWSPageLoadMetricsObserverTest,
754 AbortCloseBeforeCommitAndBeforePaint) {
755 // Commit the first navigation.
756 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
757 NavigateAndCommit(GURL("https://example.test"));
758 SimulateTimingWithoutPaint();
759 // Now start a second navigation, but don't commit it.
760 tester()->StartNavigation(GURL("https://example.test2"));
761 // Simulate closing the tab.
762 DeleteContents();
763 // The second navigation was not from GWS.
764 tester()->histogram_tester().ExpectTotalCount(
765 internal::kHistogramFromGWSAbortCloseBeforeCommit, 0);
766 tester()->histogram_tester().ExpectTotalCount(
767 internal::kHistogramFromGWSAbortCloseBeforePaint, 1);
768 }
769
TEST_F(FromGWSPageLoadMetricsObserverTest,AbortStopBeforeCommitAndCloseBeforePaint)770 TEST_F(FromGWSPageLoadMetricsObserverTest,
771 AbortStopBeforeCommitAndCloseBeforePaint) {
772 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
773 tester()->StartNavigation(GURL("https://example.test"));
774 // Simulate the user pressing the stop button.
775 web_contents()->Stop();
776 NavigateAndCommit(GURL("https://example.test2"));
777 SimulateTimingWithoutPaint();
778 // Simulate closing the tab.
779 DeleteContents();
780 tester()->histogram_tester().ExpectTotalCount(
781 internal::kHistogramFromGWSAbortStopBeforeCommit, 1);
782 // The second navigation was from GWS, as GWS was the last committed URL.
783 tester()->histogram_tester().ExpectTotalCount(
784 internal::kHistogramFromGWSAbortCloseBeforePaint, 1);
785 }
786
787 // TODO(bmcquade, csharrison): add tests for reload, back/forward, and other
788 // aborts.
789
TEST_F(FromGWSPageLoadMetricsObserverTest,NoAbortNewNavigationFromAboutURL)790 TEST_F(FromGWSPageLoadMetricsObserverTest, NoAbortNewNavigationFromAboutURL) {
791 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
792 NavigateAndCommit(GURL("about:blank"));
793 NavigateAndCommit(GURL("https://www.example.com"));
794 tester()->histogram_tester().ExpectTotalCount(
795 internal::kHistogramFromGWSAbortNewNavigationBeforePaint, 0);
796 }
797
TEST_F(FromGWSPageLoadMetricsObserverTest,NoAbortNewNavigationAfterPaint)798 TEST_F(FromGWSPageLoadMetricsObserverTest, NoAbortNewNavigationAfterPaint) {
799 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
800 page_load_metrics::mojom::PageLoadTiming timing;
801 page_load_metrics::InitPageLoadTimingForTest(&timing);
802 timing.navigation_start = base::Time::FromDoubleT(1);
803 timing.paint_timing->first_paint = base::TimeDelta::FromMicroseconds(1);
804 PopulateRequiredTimingFields(&timing);
805 NavigateAndCommit(GURL("https://example.test"));
806 tester()->SimulateTimingUpdate(timing);
807
808 // The test cannot assume that abort time will be > first_paint
809 // (1 micro-sec). If the system clock is low resolution, PageLoadTracker's
810 // abort time may be <= first_paint. In that case the histogram will be
811 // logged. Thus both 0 and 1 counts of histograms are considered good.
812
813 NavigateAndCommit(GURL("https://example.test2"));
814
815 base::HistogramTester::CountsMap counts_map =
816 tester()->histogram_tester().GetTotalCountsForPrefix(
817 internal::kHistogramFromGWSAbortNewNavigationBeforePaint);
818
819 EXPECT_TRUE(counts_map.empty() ||
820 (counts_map.size() == 1 && counts_map.begin()->second == 1));
821 }
822
TEST_F(FromGWSPageLoadMetricsObserverTest,NewNavigationBeforeInteraction)823 TEST_F(FromGWSPageLoadMetricsObserverTest, NewNavigationBeforeInteraction) {
824 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
825 NavigateAndCommit(GURL("http://example.test"));
826 SimulateTimingWithFirstPaint();
827 // Simulate the user performing another navigation before paint.
828 NavigateAndCommit(GURL("https://www.example.com"));
829 tester()->histogram_tester().ExpectTotalCount(
830 internal::kHistogramFromGWSAbortNewNavigationBeforeInteraction, 1);
831 }
832
TEST_F(FromGWSPageLoadMetricsObserverTest,StopBeforeInteraction)833 TEST_F(FromGWSPageLoadMetricsObserverTest, StopBeforeInteraction) {
834 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
835 NavigateAndCommit(GURL("http://example.test"));
836 SimulateTimingWithFirstPaint();
837 // Simulate the user pressing the stop button.
838 web_contents()->Stop();
839 // Now close the tab. This will trigger logging for the prior navigation which
840 // was stopped above.
841 DeleteContents();
842 tester()->histogram_tester().ExpectTotalCount(
843 internal::kHistogramFromGWSAbortStopBeforeInteraction, 1);
844 }
845
TEST_F(FromGWSPageLoadMetricsObserverTest,CloseBeforeInteraction)846 TEST_F(FromGWSPageLoadMetricsObserverTest, CloseBeforeInteraction) {
847 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
848 NavigateAndCommit(GURL("https://example.test"));
849 SimulateTimingWithFirstPaint();
850 // Simulate closing the tab.
851 DeleteContents();
852 tester()->histogram_tester().ExpectTotalCount(
853 internal::kHistogramFromGWSAbortCloseBeforeInteraction, 1);
854 }
855
TEST_F(FromGWSPageLoadMetricsObserverTest,CloseBeforePaintAndInteraction)856 TEST_F(FromGWSPageLoadMetricsObserverTest, CloseBeforePaintAndInteraction) {
857 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
858 NavigateAndCommit(GURL("https://example.test"));
859 SimulateTimingWithoutPaint();
860 // Simulate closing the tab.
861 DeleteContents();
862 tester()->histogram_tester().ExpectTotalCount(
863 internal::kHistogramFromGWSAbortCloseBeforeInteraction, 0);
864 }
865
TEST_F(FromGWSPageLoadMetricsObserverTest,CloseAfterInteraction)866 TEST_F(FromGWSPageLoadMetricsObserverTest, CloseAfterInteraction) {
867 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
868 NavigateAndCommit(GURL("https://example.test"));
869 SimulateTimingWithFirstPaint();
870 // Simulate user interaction.
871 SimulateMouseEvent();
872 // Simulate closing the tab.
873 DeleteContents();
874 tester()->histogram_tester().ExpectTotalCount(
875 internal::kHistogramFromGWSAbortCloseBeforeInteraction, 0);
876 }
877
TEST_F(FromGWSPageLoadMetricsObserverTest,CommittedIntent)878 TEST_F(FromGWSPageLoadMetricsObserverTest, CommittedIntent) {
879 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
880 NavigateAndCommit(GURL("intent://en.m.wikipedia.org/wiki/Test"));
881 SimulateTimingWithFirstPaint();
882 // Simulate closing the tab.
883 DeleteContents();
884 tester()->histogram_tester().ExpectTotalCount(
885 internal::kHistogramFromGWSAbortCloseBeforeInteraction, 0);
886 }
887
TEST_F(FromGWSPageLoadMetricsObserverTest,ProvisionalIntent)888 TEST_F(FromGWSPageLoadMetricsObserverTest, ProvisionalIntent) {
889 NavigateAndCommit(GURL(kGoogleSearchResultsUrl));
890 tester()->StartNavigation(GURL("intent://en.m.wikipedia.org/wiki/Test"));
891 // Simulate closing the tab.
892 DeleteContents();
893 tester()->histogram_tester().ExpectTotalCount(
894 internal::kHistogramFromGWSAbortCloseBeforeCommit, 0);
895 }
896
TEST_F(FromGWSPageLoadMetricsLoggerTest,Basic)897 TEST_F(FromGWSPageLoadMetricsLoggerTest, Basic) {
898 FromGWSPageLoadMetricsLogger logger;
899 ASSERT_FALSE(logger.ShouldLogPostCommitMetrics(GURL(kExampleUrl)));
900 }
901
TEST_F(FromGWSPageLoadMetricsLoggerTest,NoPreviousPage)902 TEST_F(FromGWSPageLoadMetricsLoggerTest, NoPreviousPage) {
903 FromGWSPageLoadMetricsLogger logger;
904 logger.SetPreviouslyCommittedUrl(GURL());
905 logger.set_navigation_initiated_via_link(true);
906 ASSERT_FALSE(logger.ShouldLogPostCommitMetrics(GURL(kExampleUrl)));
907 }
908
TEST_F(FromGWSPageLoadMetricsLoggerTest,NavigationNotInitiatedViaLink)909 TEST_F(FromGWSPageLoadMetricsLoggerTest, NavigationNotInitiatedViaLink) {
910 FromGWSPageLoadMetricsLogger logger;
911 logger.SetPreviouslyCommittedUrl(GURL(kGoogleSearchResultsUrl));
912 logger.set_navigation_initiated_via_link(false);
913 ASSERT_FALSE(logger.ShouldLogPostCommitMetrics(GURL(kExampleUrl)));
914 }
915
TEST_F(FromGWSPageLoadMetricsLoggerTest,ProvisionalFromGWS)916 TEST_F(FromGWSPageLoadMetricsLoggerTest, ProvisionalFromGWS) {
917 FromGWSPageLoadMetricsLogger logger;
918 logger.SetPreviouslyCommittedUrl(GURL(kGoogleSearchResultsUrl));
919 logger.SetProvisionalUrl(GURL(kGoogleSearchResultsUrl));
920 ASSERT_FALSE(logger.ShouldLogFailedProvisionalLoadMetrics());
921 }
922
TEST_F(FromGWSPageLoadMetricsLoggerTest,ProvisionalNotFromGWS)923 TEST_F(FromGWSPageLoadMetricsLoggerTest, ProvisionalNotFromGWS) {
924 FromGWSPageLoadMetricsLogger logger;
925 logger.SetPreviouslyCommittedUrl(GURL(kGoogleSearchResultsUrl));
926 logger.SetProvisionalUrl(GURL(kExampleUrl));
927 ASSERT_TRUE(logger.ShouldLogFailedProvisionalLoadMetrics());
928 }
929
TEST_F(FromGWSPageLoadMetricsLoggerTest,ProvisionalIgnoredAfterCommit1)930 TEST_F(FromGWSPageLoadMetricsLoggerTest, ProvisionalIgnoredAfterCommit1) {
931 FromGWSPageLoadMetricsLogger logger;
932 logger.SetPreviouslyCommittedUrl(GURL(kGoogleSearchResultsUrl));
933 logger.SetProvisionalUrl(GURL(kExampleUrl));
934 logger.set_navigation_initiated_via_link(true);
935 ASSERT_FALSE(
936 logger.ShouldLogPostCommitMetrics(GURL(kGoogleSearchResultsUrl)));
937 }
938
TEST_F(FromGWSPageLoadMetricsLoggerTest,ProvisionalIgnoredAfterCommit2)939 TEST_F(FromGWSPageLoadMetricsLoggerTest, ProvisionalIgnoredAfterCommit2) {
940 FromGWSPageLoadMetricsLogger logger;
941 logger.SetPreviouslyCommittedUrl(GURL(kGoogleSearchResultsUrl));
942 logger.SetProvisionalUrl(GURL(kGoogleSearchResultsUrl));
943 logger.set_navigation_initiated_via_link(true);
944 ASSERT_TRUE(logger.ShouldLogPostCommitMetrics(GURL(kExampleUrl)));
945 }
946
TEST_F(FromGWSPageLoadMetricsLoggerTest,NavigationFromSearch)947 TEST_F(FromGWSPageLoadMetricsLoggerTest, NavigationFromSearch) {
948 FromGWSPageLoadMetricsLogger logger;
949 logger.SetPreviouslyCommittedUrl(GURL(kGoogleSearchResultsUrl));
950 logger.set_navigation_initiated_via_link(true);
951 ASSERT_TRUE(logger.ShouldLogPostCommitMetrics(GURL(kExampleUrl)));
952 }
953
TEST_F(FromGWSPageLoadMetricsLoggerTest,NavigationToSearchHostname)954 TEST_F(FromGWSPageLoadMetricsLoggerTest, NavigationToSearchHostname) {
955 FromGWSPageLoadMetricsLogger logger;
956 logger.SetPreviouslyCommittedUrl(GURL(kGoogleSearchResultsUrl));
957 logger.set_navigation_initiated_via_link(true);
958 ASSERT_FALSE(
959 logger.ShouldLogPostCommitMetrics(GURL("https://www.google.com/about/")));
960 }
961
TEST_F(FromGWSPageLoadMetricsLoggerTest,NavigationFromSearchRedirector)962 TEST_F(FromGWSPageLoadMetricsLoggerTest, NavigationFromSearchRedirector) {
963 FromGWSPageLoadMetricsLogger logger;
964 logger.SetPreviouslyCommittedUrl(
965 GURL("https://www.google.com/url?source=web"));
966 logger.set_navigation_initiated_via_link(true);
967 ASSERT_TRUE(logger.ShouldLogPostCommitMetrics(GURL(kExampleUrl)));
968 }
969