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