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

Side by Side Diff: components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc

Issue 1357403003: Separate page load metrics for backgrounded pages (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Bryan review notes: change provisional vector to map Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/page_load_metrics/browser/metrics_web_contents_observer.h" 5 #include "components/page_load_metrics/browser/metrics_web_contents_observer.h"
6 6
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "base/process/kill.h" 8 #include "base/process/kill.h"
9 #include "base/test/histogram_tester.h" 9 #include "base/test/histogram_tester.h"
10 #include "base/time/time.h" 10 #include "base/time/time.h"
(...skipping 11 matching lines...) Expand all
22 const char kDefaultTestUrlAnchor[] = "https://google.com#samepage"; 22 const char kDefaultTestUrlAnchor[] = "https://google.com#samepage";
23 const char kDefaultTestUrl2[] = "https://whatever.com"; 23 const char kDefaultTestUrl2[] = "https://whatever.com";
24 24
25 const char kHistogramNameFirstLayout[] = 25 const char kHistogramNameFirstLayout[] =
26 "PageLoad.Timing.NavigationToFirstLayout"; 26 "PageLoad.Timing.NavigationToFirstLayout";
27 const char kHistogramNameDomContent[] = 27 const char kHistogramNameDomContent[] =
28 "PageLoad.Timing.NavigationToDOMContentLoadedEventFired"; 28 "PageLoad.Timing.NavigationToDOMContentLoadedEventFired";
29 const char kHistogramNameLoad[] = 29 const char kHistogramNameLoad[] =
30 "PageLoad.Timing.NavigationToLoadEventFired"; 30 "PageLoad.Timing.NavigationToLoadEventFired";
31 31
32 const char kBGHistogramNameFirstLayout[] =
33 "PageLoad.Timing.BG.NavigationToFirstLayout";
34 const char kBGHistogramNameDomContent[] =
35 "PageLoad.Timing.BG.NavigationToDOMContentLoadedEventFired";
36 const char kBGHistogramNameLoad[] =
37 "PageLoad.Timing.BG.NavigationToLoadEventFired";
32 } // namespace 38 } // namespace
33 39
34 class MetricsWebContentsObserverTest 40 class MetricsWebContentsObserverTest
35 : public content::RenderViewHostTestHarness { 41 : public content::RenderViewHostTestHarness {
36 public: 42 public:
37 MetricsWebContentsObserverTest() {} 43 MetricsWebContentsObserverTest() {}
38 44
39 void SetUp() override { 45 void SetUp() override {
40 RenderViewHostTestHarness::SetUp(); 46 RenderViewHostTestHarness::SetUp();
41 observer_ = make_scoped_ptr(new MetricsWebContentsObserver(web_contents())); 47 observer_ = make_scoped_ptr(new MetricsWebContentsObserver(web_contents()));
48 observer_->WasShown();
42 } 49 }
43 50
44 void AssertNoHistogramsLogged() { 51 void AssertNoHistogramsLogged() {
45 histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 0); 52 histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 0);
46 histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0); 53 histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0);
47 histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 0); 54 histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 0);
48 } 55 }
49 56
50 protected: 57 protected:
51 base::HistogramTester histogram_tester_; 58 base::HistogramTester histogram_tester_;
(...skipping 20 matching lines...) Expand all
72 content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe"); 79 content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe");
73 80
74 content::RenderFrameHostTester* subframe_tester = 81 content::RenderFrameHostTester* subframe_tester =
75 content::RenderFrameHostTester::For(subframe); 82 content::RenderFrameHostTester::For(subframe);
76 subframe_tester->SimulateNavigationStart(GURL(kDefaultTestUrl2)); 83 subframe_tester->SimulateNavigationStart(GURL(kDefaultTestUrl2));
77 subframe_tester->SimulateNavigationCommit(GURL(kDefaultTestUrl2)); 84 subframe_tester->SimulateNavigationCommit(GURL(kDefaultTestUrl2));
78 observer_->OnMessageReceived( 85 observer_->OnMessageReceived(
79 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), 86 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing),
80 subframe); 87 subframe);
81 subframe_tester->SimulateNavigationStop(); 88 subframe_tester->SimulateNavigationStop();
89 observer_->DidFinishLoad(web_contents()->GetMainFrame(),
Bryan McQuade 2015/09/29 00:43:01 we probably no longer need these calls to DidFinis
90 GURL(kDefaultTestUrl2));
82 91
83 // Navigate again to see if the timing updated for a subframe message. 92 // Navigate again to see if the timing updated for a subframe message.
84 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 93 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
85 94
86 AssertNoHistogramsLogged(); 95 AssertNoHistogramsLogged();
87 } 96 }
88 97
89 TEST_F(MetricsWebContentsObserverTest, SamePageNoTrigger) { 98 TEST_F(MetricsWebContentsObserverTest, SamePageNoTrigger) {
90 base::TimeDelta first_layout = base::TimeDelta::FromMilliseconds(1); 99 base::TimeDelta first_layout = base::TimeDelta::FromMilliseconds(1);
91 100
92 PageLoadTiming timing; 101 PageLoadTiming timing;
93 timing.navigation_start = base::Time::FromDoubleT(1); 102 timing.navigation_start = base::Time::FromDoubleT(1);
94 timing.first_layout = first_layout; 103 timing.first_layout = first_layout;
95 104
96 content::WebContentsTester* web_contents_tester = 105 content::WebContentsTester* web_contents_tester =
97 content::WebContentsTester::For(web_contents()); 106 content::WebContentsTester::For(web_contents());
98 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 107 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
99 108
100 observer_->OnMessageReceived( 109 observer_->OnMessageReceived(
101 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), 110 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing),
102 web_contents()->GetMainFrame()); 111 web_contents()->GetMainFrame());
112 observer_->DidFinishLoad(web_contents()->GetMainFrame(),
113 GURL(kDefaultTestUrl));
103 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrlAnchor)); 114 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrlAnchor));
104 // A same page navigation shouldn't trigger logging UMA for the original. 115 // A same page navigation shouldn't trigger logging UMA for the original.
105 AssertNoHistogramsLogged(); 116 AssertNoHistogramsLogged();
106 } 117 }
107 118
108 TEST_F(MetricsWebContentsObserverTest, SamePageNoTriggerUntilTrueNavCommit) { 119 TEST_F(MetricsWebContentsObserverTest, SamePageNoTriggerUntilTrueNavCommit) {
109 base::TimeDelta first_layout = base::TimeDelta::FromMilliseconds(1); 120 base::TimeDelta first_layout = base::TimeDelta::FromMilliseconds(1);
110 121
111 PageLoadTiming timing; 122 PageLoadTiming timing;
112 timing.navigation_start = base::Time::FromDoubleT(1); 123 timing.navigation_start = base::Time::FromDoubleT(1);
113 timing.first_layout = first_layout; 124 timing.first_layout = first_layout;
114 125
115 content::WebContentsTester* web_contents_tester = 126 content::WebContentsTester* web_contents_tester =
116 content::WebContentsTester::For(web_contents()); 127 content::WebContentsTester::For(web_contents());
117 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 128 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
118 129
119 observer_->OnMessageReceived( 130 observer_->OnMessageReceived(
120 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), 131 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing),
121 web_contents()->GetMainFrame()); 132 web_contents()->GetMainFrame());
133 observer_->DidFinishLoad(web_contents()->GetMainFrame(),
134 GURL(kDefaultTestUrl));
122 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrlAnchor)); 135 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrlAnchor));
136 observer_->DidFinishLoad(web_contents()->GetMainFrame(),
137 GURL(kDefaultTestUrlAnchor));
123 // A same page navigation shouldn't trigger logging UMA for the original. 138 // A same page navigation shouldn't trigger logging UMA for the original.
124 AssertNoHistogramsLogged(); 139 AssertNoHistogramsLogged();
125 140
126 // But we should keep the timing info and log it when we get another 141 // But we should keep the timing info and log it when we get another
127 // navigation. 142 // navigation.
128 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); 143 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
129 histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 0); 144 histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 0);
130 histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0); 145 histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0);
131 histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 1); 146 histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 1);
132 histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout, 147 histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout,
133 first_layout.InMilliseconds(), 1); 148 first_layout.InMilliseconds(), 1);
134 } 149 }
135 150
136 TEST_F(MetricsWebContentsObserverTest, SingleMetricAfterCommit) { 151 TEST_F(MetricsWebContentsObserverTest, SingleMetricAfterCommit) {
137 base::TimeDelta first_layout = base::TimeDelta::FromMilliseconds(1); 152 base::TimeDelta first_layout = base::TimeDelta::FromMilliseconds(1);
138 153
139 PageLoadTiming timing; 154 PageLoadTiming timing;
140 timing.navigation_start = base::Time::FromDoubleT(1); 155 timing.navigation_start = base::Time::FromDoubleT(1);
141 timing.first_layout = first_layout; 156 timing.first_layout = first_layout;
142 157
143 content::WebContentsTester* web_contents_tester = 158 content::WebContentsTester* web_contents_tester =
144 content::WebContentsTester::For(web_contents()); 159 content::WebContentsTester::For(web_contents());
145 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 160 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
146 161
147 observer_->OnMessageReceived( 162 observer_->OnMessageReceived(
148 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), 163 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing),
149 web_contents()->GetMainFrame()); 164 web_contents()->GetMainFrame());
165 observer_->DidFinishLoad(web_contents()->GetMainFrame(),
166 GURL(kDefaultTestUrl));
150 167
151 AssertNoHistogramsLogged(); 168 AssertNoHistogramsLogged();
152 169
153 // Navigate again to force histogram recording. 170 // Navigate again to force histogram recording.
154 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); 171 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
155 172
156 histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 0); 173 histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 0);
157 histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0); 174 histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0);
158 histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 1); 175 histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 1);
159 histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout, 176 histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout,
(...skipping 14 matching lines...) Expand all
174 timing.dom_content_loaded_event_start = dom_content; 191 timing.dom_content_loaded_event_start = dom_content;
175 timing.load_event_start = load; 192 timing.load_event_start = load;
176 193
177 content::WebContentsTester* web_contents_tester = 194 content::WebContentsTester* web_contents_tester =
178 content::WebContentsTester::For(web_contents()); 195 content::WebContentsTester::For(web_contents());
179 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 196 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
180 197
181 observer_->OnMessageReceived( 198 observer_->OnMessageReceived(
182 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing), 199 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing),
183 web_contents()->GetMainFrame()); 200 web_contents()->GetMainFrame());
201 observer_->DidFinishLoad(web_contents()->GetMainFrame(),
202 GURL(kDefaultTestUrl));
184 203
185 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); 204 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
186 205
187 PageLoadTiming timing2; 206 PageLoadTiming timing2;
188 timing2.navigation_start = base::Time::FromDoubleT(200); 207 timing2.navigation_start = base::Time::FromDoubleT(200);
189 timing2.first_layout = first_layout_2; 208 timing2.first_layout = first_layout_2;
190 209
191 observer_->OnMessageReceived( 210 observer_->OnMessageReceived(
192 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing2), 211 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing2),
193 web_contents()->GetMainFrame()); 212 web_contents()->GetMainFrame());
213 observer_->DidFinishLoad(web_contents()->GetMainFrame(),
214 GURL(kDefaultTestUrl2));
194 215
195 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 216 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
196 217
197 histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout, 218 histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout,
198 first_layout_1.InMilliseconds(), 1); 219 first_layout_1.InMilliseconds(), 1);
199 histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 2); 220 histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 2);
200 histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout, 221 histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout,
201 first_layout_1.InMilliseconds(), 1); 222 first_layout_1.InMilliseconds(), 1);
202 histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout, 223 histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout,
203 first_layout_2.InMilliseconds(), 1); 224 first_layout_2.InMilliseconds(), 1);
204 225
205 histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 1); 226 histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 1);
206 histogram_tester_.ExpectBucketCount(kHistogramNameDomContent, 227 histogram_tester_.ExpectBucketCount(kHistogramNameDomContent,
207 dom_content.InMilliseconds(), 1); 228 dom_content.InMilliseconds(), 1);
208 229
209 histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 1); 230 histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 1);
210 histogram_tester_.ExpectBucketCount(kHistogramNameLoad, load.InMilliseconds(), 231 histogram_tester_.ExpectBucketCount(kHistogramNameLoad, load.InMilliseconds(),
211 1); 232 1);
212 } 233 }
213 234
235 TEST_F(MetricsWebContentsObserverTest, BackgroundDifferentHistogram) {
236 base::TimeDelta first_layout = base::TimeDelta::FromMilliseconds(1);
237
238 PageLoadTiming timing;
239 timing.navigation_start = base::Time::FromDoubleT(1);
240 timing.first_layout = first_layout;
241
242 content::WebContentsTester* web_contents_tester =
243 content::WebContentsTester::For(web_contents());
244
245 // Simulate "Open link in new tab."
246 observer_->WasHidden();
247 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
248
249 observer_->OnMessageReceived(
250 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing),
251 web_contents()->GetMainFrame());
252
253 // Simulate switching to the tab and making another navigation.
254 observer_->WasShown();
255 observer_->DidFinishLoad(web_contents()->GetMainFrame(),
256 GURL(kDefaultTestUrl));
257 AssertNoHistogramsLogged();
258
259 // Navigate again to force histogram recording.
260 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
261
262 histogram_tester_.ExpectTotalCount(kBGHistogramNameDomContent, 0);
263 histogram_tester_.ExpectTotalCount(kBGHistogramNameLoad, 0);
264 histogram_tester_.ExpectTotalCount(kBGHistogramNameFirstLayout, 1);
265 histogram_tester_.ExpectBucketCount(kBGHistogramNameFirstLayout,
266 first_layout.InMilliseconds(), 1);
267
268 histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 0);
269 histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0);
270 histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 0);
271 }
272
273 TEST_F(MetricsWebContentsObserverTest, DontBackgroundQuickerLoad) {
274 base::TimeDelta first_layout = base::TimeDelta::FromMilliseconds(1);
275
276 PageLoadTiming timing;
277 timing.navigation_start = base::Time::FromDoubleT(1);
278 timing.first_layout = first_layout;
279
280 observer_->WasHidden();
281
282 // Open in new tab
283 content::WebContentsTester* web_contents_tester =
284 content::WebContentsTester::For(web_contents());
285
286 web_contents_tester->StartNavigation(GURL(kDefaultTestUrl));
287
288 content::RenderFrameHostTester* rfh_tester =
289 content::RenderFrameHostTester::For(main_rfh());
290
291 // Switch to the tab
292 observer_->WasShown();
293
294 // Start another provisional load
295 web_contents_tester->StartNavigation(GURL(kDefaultTestUrl2));
296 rfh_tester->SimulateNavigationCommit(GURL(kDefaultTestUrl2));
297 observer_->OnMessageReceived(
298 PageLoadMetricsMsg_TimingUpdated(observer_->routing_id(), timing),
299 main_rfh());
300 rfh_tester->SimulateNavigationStop();
301
302 observer_->DidFinishLoad(web_contents()->GetMainFrame(),
303 GURL(kDefaultTestUrl2));
304
305 // Navigate again to see if the timing updated for a subframe message.
306 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
307
308 histogram_tester_.ExpectTotalCount(kHistogramNameDomContent, 0);
309 histogram_tester_.ExpectTotalCount(kHistogramNameLoad, 0);
310 histogram_tester_.ExpectTotalCount(kHistogramNameFirstLayout, 1);
311 histogram_tester_.ExpectBucketCount(kHistogramNameFirstLayout,
312 first_layout.InMilliseconds(), 1);
313 }
Bryan McQuade 2015/09/29 00:43:01 could we add one more test where some metrics occu
Charlie Harrison 2015/09/29 14:13:07 It's already in the most updated patch :)
214 } // namespace page_load_metrics 314 } // namespace page_load_metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698