OLD | NEW |
| (Empty) |
1 // Copyright 2017 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/ads_page_load_metrics_obser
ver.h" | |
6 | |
7 #include <string> | |
8 | |
9 #include "base/macros.h" | |
10 #include "base/test/histogram_tester.h" | |
11 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_
test_harness.h" | |
12 #include "chrome/browser/page_load_metrics/page_load_metrics_observer.h" | |
13 #include "chrome/browser/page_load_metrics/page_load_tracker.h" | |
14 #include "content/public/browser/render_frame_host.h" | |
15 #include "content/public/browser/web_contents.h" | |
16 #include "content/public/common/resource_type.h" | |
17 #include "content/public/test/navigation_simulator.h" | |
18 #include "content/public/test/test_renderer_host.h" | |
19 #include "url/gurl.h" | |
20 | |
21 using content::RenderFrameHost; | |
22 using content::RenderFrameHostTester; | |
23 using content::NavigationSimulator; | |
24 | |
25 namespace { | |
26 | |
27 enum class ResourceCached { NOT_CACHED, CACHED }; | |
28 enum class FrameType { AD = 0, NON_AD }; | |
29 | |
30 const char kAdUrl[] = "https://tpc.googlesyndication.com/safeframe/1"; | |
31 const char kNonAdUrl[] = "https://foo.com/"; | |
32 const char kNonAdUrl2[] = "https://bar.com/"; | |
33 | |
34 const char kAdName[] = "google_ads_iframe_1"; | |
35 const char kNonAdName[] = "foo"; | |
36 | |
37 } // namespace | |
38 | |
39 class AdsPageLoadMetricsObserverTest | |
40 : public page_load_metrics::PageLoadMetricsObserverTestHarness { | |
41 public: | |
42 AdsPageLoadMetricsObserverTest() {} | |
43 | |
44 // Returns the final RenderFrameHost after navigation commits. | |
45 RenderFrameHost* NavigateFrame(const std::string& url, | |
46 content::RenderFrameHost* frame) { | |
47 auto navigation_simulator = | |
48 NavigationSimulator::CreateRendererInitiated(GURL(url), frame); | |
49 navigation_simulator->Commit(); | |
50 return navigation_simulator->GetFinalRenderFrameHost(); | |
51 } | |
52 | |
53 // Returns the final RenderFrameHost after navigation commits. | |
54 RenderFrameHost* NavigateMainFrame(const std::string& url) { | |
55 return NavigateFrame(url, web_contents()->GetMainFrame()); | |
56 } | |
57 | |
58 // Returns the final RenderFrameHost after navigation commits. | |
59 RenderFrameHost* CreateAndNavigateSubFrame(const std::string& url, | |
60 const std::string& frame_name, | |
61 content::RenderFrameHost* parent) { | |
62 RenderFrameHost* subframe = | |
63 RenderFrameHostTester::For(parent)->AppendChild(frame_name); | |
64 auto navigation_simulator = | |
65 NavigationSimulator::CreateRendererInitiated(GURL(url), subframe); | |
66 navigation_simulator->Commit(); | |
67 return navigation_simulator->GetFinalRenderFrameHost(); | |
68 } | |
69 | |
70 RenderFrameHost* NavigateFrameAndTestRenavigationMetrics( | |
71 RenderFrameHost* frame, | |
72 FrameType frame_type, | |
73 const std::string& url) { | |
74 base::HistogramTester tester; | |
75 RenderFrameHost* out_frame = NavigateFrame(url, frame); | |
76 | |
77 int bucket = url == kAdUrl ? 1 : 0; | |
78 | |
79 if (frame_type == FrameType::AD) { | |
80 tester.ExpectUniqueSample( | |
81 "PageLoad.Clients.Ads.Google.Navigations.AdFrameRenavigatedToAd", | |
82 bucket, 1); | |
83 } else { | |
84 tester.ExpectUniqueSample( | |
85 "PageLoad.Clients.Ads.Google.Navigations.NonAdFrameRenavigatedToAd", | |
86 bucket, 1); | |
87 } | |
88 | |
89 return out_frame; | |
90 } | |
91 | |
92 void LoadResource(RenderFrameHost* frame, | |
93 ResourceCached resource_cached, | |
94 int resource_size_in_kb) { | |
95 page_load_metrics::ExtraRequestCompleteInfo request( | |
96 GURL(kNonAdUrl), frame->GetFrameTreeNodeId(), | |
97 resource_cached == ResourceCached::CACHED, resource_size_in_kb * 1024, | |
98 0, /* original_network_content_length */ | |
99 nullptr, /* data_reduction_proxy_data */ | |
100 content::RESOURCE_TYPE_SUB_FRAME); | |
101 SimulateLoadedResource(request); | |
102 } | |
103 | |
104 protected: | |
105 void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override { | |
106 tracker->AddObserver(base::MakeUnique<AdsPageLoadMetricsObserver>()); | |
107 } | |
108 | |
109 private: | |
110 DISALLOW_COPY_AND_ASSIGN(AdsPageLoadMetricsObserverTest); | |
111 }; | |
112 | |
113 TEST_F(AdsPageLoadMetricsObserverTest, PageWithNoAds) { | |
114 RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl); | |
115 RenderFrameHost* frame1 = | |
116 CreateAndNavigateSubFrame(kNonAdUrl, kNonAdName, main_frame); | |
117 RenderFrameHost* frame2 = | |
118 CreateAndNavigateSubFrame(kNonAdUrl, kNonAdName, main_frame); | |
119 LoadResource(main_frame, ResourceCached::NOT_CACHED, 10); | |
120 LoadResource(frame1, ResourceCached::NOT_CACHED, 10); | |
121 LoadResource(frame2, ResourceCached::NOT_CACHED, 10); | |
122 | |
123 // Navigate again to trigger histograms. | |
124 NavigateFrame(kNonAdUrl, main_frame); | |
125 | |
126 histogram_tester().ExpectUniqueSample( | |
127 "PageLoad.Clients.Ads.Google.FrameCounts.AnyParentFrame.AdFrames", 0, 1); | |
128 histogram_tester().ExpectTotalCount( | |
129 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Total", 0); | |
130 } | |
131 | |
132 TEST_F(AdsPageLoadMetricsObserverTest, ResourceBeforeAdFrameCommits) { | |
133 RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl); | |
134 | |
135 LoadResource(main_frame, ResourceCached::NOT_CACHED, 10); | |
136 | |
137 // Assume that the next frame's id will be the main frame + 1 and load a | |
138 // resource for that frame. Make sure it gets counted. | |
139 page_load_metrics::ExtraRequestCompleteInfo request( | |
140 GURL(kNonAdUrl), main_frame->GetFrameTreeNodeId() + 1, false /* cached */, | |
141 10 * 1024 /* size */, 0 /* original_network_content_length */, | |
142 nullptr | |
143 /* data_reduction_proxy_data */, | |
144 content::RESOURCE_TYPE_SUB_FRAME); | |
145 SimulateLoadedResource(request); | |
146 | |
147 CreateAndNavigateSubFrame(kNonAdUrl, kAdName, main_frame); | |
148 | |
149 // Navigate again to trigger histograms. | |
150 NavigateFrame(kNonAdUrl, main_frame); | |
151 | |
152 // 20KB total were loaded from network, one of which was in an ad frame. | |
153 histogram_tester().ExpectUniqueSample( | |
154 "PageLoad.Clients.Ads.Google.FrameCounts.AnyParentFrame.AdFrames", 1, 1); | |
155 histogram_tester().ExpectUniqueSample( | |
156 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.TotalFrames", 1, | |
157 1); | |
158 histogram_tester().ExpectUniqueSample( | |
159 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.AdFrames", 1, 1); | |
160 histogram_tester().ExpectUniqueSample( | |
161 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.PercentAdFrames", | |
162 100, 1); | |
163 | |
164 // Individual Ad Frame Metrics | |
165 histogram_tester().ExpectUniqueSample( | |
166 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Total", 10, 1); | |
167 histogram_tester().ExpectUniqueSample( | |
168 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Network", 10, 1); | |
169 histogram_tester().ExpectUniqueSample( | |
170 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.PercentNetwork", 100, | |
171 1); | |
172 | |
173 // Page percentages | |
174 histogram_tester().ExpectUniqueSample( | |
175 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Total.PercentAds", 50, 1); | |
176 histogram_tester().ExpectUniqueSample( | |
177 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.PercentNetwork", | |
178 100, 1); | |
179 histogram_tester().ExpectUniqueSample( | |
180 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Network.PercentAds", 50, 1); | |
181 | |
182 // Page byte counts | |
183 histogram_tester().ExpectUniqueSample( | |
184 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Total", 10, 1); | |
185 histogram_tester().ExpectUniqueSample( | |
186 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Network", 10, 1); | |
187 histogram_tester().ExpectUniqueSample( | |
188 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Total", 20, 1); | |
189 histogram_tester().ExpectUniqueSample( | |
190 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Network", 20, 1); | |
191 histogram_tester().ExpectUniqueSample( | |
192 "PageLoad.Clients.Ads.Google.Bytes.NonAdFrames.Aggregate.Total", 10, 1); | |
193 } | |
194 | |
195 TEST_F(AdsPageLoadMetricsObserverTest, PageWithAdFrames) { | |
196 RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl); | |
197 RenderFrameHost* non_ad_frame = | |
198 CreateAndNavigateSubFrame(kNonAdUrl, kNonAdName, main_frame); | |
199 | |
200 // Create 5 ad frames with the 5th nested inside the 4th. Verify that the | |
201 // nested ad frame doesn't get counted separately (but that its bytes are | |
202 // still counted). Also verify that the various ad signals (urls and names) | |
203 // are properly detected. | |
204 RenderFrameHost* ad_frame1 = | |
205 CreateAndNavigateSubFrame(kNonAdUrl, "google_ads_iframe_1", main_frame); | |
206 RenderFrameHost* ad_frame2 = | |
207 CreateAndNavigateSubFrame(kNonAdUrl, "google_ads_frame_2", main_frame); | |
208 RenderFrameHost* ad_frame3 = CreateAndNavigateSubFrame( | |
209 "https://tpc.googlesyndication.com/safeframe/", "", main_frame); | |
210 RenderFrameHost* ad_frame4 = CreateAndNavigateSubFrame( | |
211 "https://tpc.googlesyndication.com/safeframe/1", "", main_frame); | |
212 RenderFrameHost* nested_ad_frame4 = CreateAndNavigateSubFrame( | |
213 "https://tpc.googlesyndication.com/safeframe/2", "", ad_frame4); | |
214 | |
215 // Create an addditional ad frame without content, it shouldn't be counted | |
216 // in some percentage calculations. | |
217 CreateAndNavigateSubFrame(kAdUrl, kNonAdName, main_frame); | |
218 | |
219 // 70KB total in page, 50 from ads, 40 from network, and 30 of those | |
220 // are from ads. | |
221 LoadResource(main_frame, ResourceCached::NOT_CACHED, 10); | |
222 LoadResource(non_ad_frame, ResourceCached::CACHED, 10); | |
223 LoadResource(ad_frame1, ResourceCached::CACHED, 10); | |
224 LoadResource(ad_frame2, ResourceCached::NOT_CACHED, 10); | |
225 LoadResource(ad_frame3, ResourceCached::NOT_CACHED, 10); | |
226 LoadResource(ad_frame4, ResourceCached::NOT_CACHED, 10); | |
227 LoadResource(nested_ad_frame4, ResourceCached::CACHED, 10); | |
228 | |
229 // Navigate again to trigger histograms. | |
230 NavigateFrame(kNonAdUrl, main_frame); | |
231 | |
232 // Individual Ad Frame Metrics | |
233 histogram_tester().ExpectBucketCount( | |
234 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Total", 10, 3); | |
235 histogram_tester().ExpectBucketCount( | |
236 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Total", 20, 1); | |
237 histogram_tester().ExpectBucketCount( | |
238 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Network", 10, 3); | |
239 histogram_tester().ExpectBucketCount( | |
240 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Network", 0, 2); | |
241 histogram_tester().ExpectBucketCount( | |
242 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.PercentNetwork", 0, | |
243 1); | |
244 histogram_tester().ExpectBucketCount( | |
245 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.PercentNetwork", 100, | |
246 2); | |
247 histogram_tester().ExpectBucketCount( | |
248 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.PercentNetwork", 50, | |
249 1); | |
250 | |
251 // Counts | |
252 histogram_tester().ExpectUniqueSample( | |
253 "PageLoad.Clients.Ads.Google.FrameCounts.AnyParentFrame.AdFrames", 5, 1); | |
254 histogram_tester().ExpectUniqueSample( | |
255 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.TotalFrames", 6, | |
256 1); | |
257 histogram_tester().ExpectUniqueSample( | |
258 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.AdFrames", 5, 1); | |
259 histogram_tester().ExpectUniqueSample( | |
260 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.PercentAdFrames", | |
261 83, 1); | |
262 | |
263 // Page percentages | |
264 histogram_tester().ExpectUniqueSample( | |
265 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Total.PercentAds", 71, 1); | |
266 histogram_tester().ExpectUniqueSample( | |
267 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.PercentNetwork", 60, | |
268 1); | |
269 histogram_tester().ExpectUniqueSample( | |
270 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Network.PercentAds", 75, 1); | |
271 | |
272 // Page byte counts | |
273 histogram_tester().ExpectUniqueSample( | |
274 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Total", 50, 1); | |
275 histogram_tester().ExpectUniqueSample( | |
276 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Network", 30, 1); | |
277 histogram_tester().ExpectUniqueSample( | |
278 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Total", 70, 1); | |
279 histogram_tester().ExpectUniqueSample( | |
280 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Network", 40, 1); | |
281 histogram_tester().ExpectUniqueSample( | |
282 "PageLoad.Clients.Ads.Google.Bytes.NonAdFrames.Aggregate.Total", 20, 1); | |
283 } | |
284 | |
285 TEST_F(AdsPageLoadMetricsObserverTest, PageLoadSubFrameRenavigationMetrics) { | |
286 RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl); | |
287 | |
288 // Test behavior of an ad frame. Once a frame is considered an ad, it's | |
289 // always an ad. | |
290 RenderFrameHost* ad_sub_frame = | |
291 CreateAndNavigateSubFrame(kAdUrl, kNonAdName, main_frame); | |
292 | |
293 ad_sub_frame = NavigateFrameAndTestRenavigationMetrics(ad_sub_frame, | |
294 FrameType::AD, kAdUrl); | |
295 ad_sub_frame = NavigateFrameAndTestRenavigationMetrics( | |
296 ad_sub_frame, FrameType::AD, kNonAdUrl); | |
297 ad_sub_frame = NavigateFrameAndTestRenavigationMetrics( | |
298 ad_sub_frame, FrameType::AD, kNonAdUrl); | |
299 | |
300 // Test behavior of a non-ad frame. Again, once it becomes an ad it stays an | |
301 // ad. | |
302 RenderFrameHost* non_ad_sub_frame = | |
303 CreateAndNavigateSubFrame(kNonAdUrl, kNonAdName, main_frame); | |
304 non_ad_sub_frame = NavigateFrameAndTestRenavigationMetrics( | |
305 non_ad_sub_frame, FrameType::NON_AD, kNonAdUrl); | |
306 non_ad_sub_frame = NavigateFrameAndTestRenavigationMetrics( | |
307 non_ad_sub_frame, FrameType::NON_AD, kAdUrl); | |
308 non_ad_sub_frame = NavigateFrameAndTestRenavigationMetrics( | |
309 non_ad_sub_frame, FrameType::AD, kNonAdUrl); | |
310 non_ad_sub_frame = NavigateFrameAndTestRenavigationMetrics( | |
311 non_ad_sub_frame, FrameType::AD, kAdUrl); | |
312 | |
313 // Verify that children of ad frames don't get counted in the renavigation | |
314 // metrics. | |
315 RenderFrameHost* ad_sub_sub_frame = | |
316 CreateAndNavigateSubFrame(kAdUrl, kNonAdName, ad_sub_frame); | |
317 base::HistogramTester tester; | |
318 ad_sub_sub_frame = NavigateFrame(kNonAdUrl2, ad_sub_sub_frame); | |
319 tester.ExpectTotalCount( | |
320 "PageLoad.Clients.Ads.Google.Navigations.AdFrameRenavigatedToAd", 0); | |
321 } | |
322 | |
323 TEST_F(AdsPageLoadMetricsObserverTest, PageWithAdFrameThatRenavigates) { | |
324 RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl); | |
325 RenderFrameHost* ad_frame = | |
326 CreateAndNavigateSubFrame(kNonAdUrl, kAdName, main_frame); | |
327 | |
328 LoadResource(main_frame, ResourceCached::NOT_CACHED, 10); | |
329 LoadResource(ad_frame, ResourceCached::NOT_CACHED, 10); | |
330 | |
331 // Navigate the ad frame again. | |
332 ad_frame = NavigateFrame(kNonAdUrl, ad_frame); | |
333 | |
334 // In total, 30KB for entire page and 20 in one ad frame. | |
335 LoadResource(ad_frame, ResourceCached::NOT_CACHED, 10); | |
336 | |
337 // Navigate again to trigger histograms. | |
338 NavigateFrame(kNonAdUrl, main_frame); | |
339 | |
340 // Individual Ad Frame Metrics | |
341 histogram_tester().ExpectUniqueSample( | |
342 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Total", 20, 1); | |
343 histogram_tester().ExpectUniqueSample( | |
344 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Network", 20, 1); | |
345 histogram_tester().ExpectUniqueSample( | |
346 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.PercentNetwork", 100, | |
347 1); | |
348 | |
349 // Counts | |
350 histogram_tester().ExpectUniqueSample( | |
351 "PageLoad.Clients.Ads.Google.FrameCounts.AnyParentFrame.AdFrames", 1, 1); | |
352 histogram_tester().ExpectUniqueSample( | |
353 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.TotalFrames", 1, | |
354 1); | |
355 histogram_tester().ExpectUniqueSample( | |
356 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.AdFrames", 1, 1); | |
357 histogram_tester().ExpectUniqueSample( | |
358 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.PercentAdFrames", | |
359 100, 1); | |
360 | |
361 // Page percentages | |
362 histogram_tester().ExpectUniqueSample( | |
363 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Total.PercentAds", 66, 1); | |
364 histogram_tester().ExpectUniqueSample( | |
365 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.PercentNetwork", | |
366 100, 1); | |
367 histogram_tester().ExpectUniqueSample( | |
368 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Network.PercentAds", 66, 1); | |
369 | |
370 // Page byte counts | |
371 histogram_tester().ExpectUniqueSample( | |
372 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Total", 20, 1); | |
373 histogram_tester().ExpectUniqueSample( | |
374 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Network", 20, 1); | |
375 histogram_tester().ExpectUniqueSample( | |
376 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Total", 30, 1); | |
377 histogram_tester().ExpectUniqueSample( | |
378 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Network", 30, 1); | |
379 histogram_tester().ExpectUniqueSample( | |
380 "PageLoad.Clients.Ads.Google.Bytes.NonAdFrames.Aggregate.Total", 10, 1); | |
381 } | |
382 | |
383 TEST_F(AdsPageLoadMetricsObserverTest, PageWithNonAdFrameThatRenavigatesToAd) { | |
384 // Main frame. | |
385 RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl); | |
386 | |
387 // Sub frame that is not an ad. | |
388 RenderFrameHost* sub_frame = | |
389 CreateAndNavigateSubFrame(kNonAdUrl, kNonAdName, main_frame); | |
390 | |
391 // Child of the sub-frame that is an ad. | |
392 RenderFrameHost* sub_frame_child_ad = | |
393 CreateAndNavigateSubFrame(kNonAdUrl2, kAdName, sub_frame); | |
394 | |
395 LoadResource(main_frame, ResourceCached::NOT_CACHED, 10); | |
396 LoadResource(sub_frame, ResourceCached::NOT_CACHED, 10); | |
397 LoadResource(sub_frame_child_ad, ResourceCached::NOT_CACHED, 10); | |
398 | |
399 // Navigate the subframe again, this time it's an ad. | |
400 sub_frame = NavigateFrame(kAdUrl, sub_frame); | |
401 LoadResource(sub_frame, ResourceCached::NOT_CACHED, 10); | |
402 | |
403 // In total, 40KB was loaded for the entire page and 20KB from ad | |
404 // frames (the original child ad frame and the renavigated frame which | |
405 // turned into an ad). | |
406 | |
407 // Navigate again to trigger histograms. | |
408 NavigateFrame(kNonAdUrl, main_frame); | |
409 | |
410 // Individual Ad Frame Metrics | |
411 histogram_tester().ExpectUniqueSample( | |
412 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Total", 10, 2); | |
413 histogram_tester().ExpectUniqueSample( | |
414 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Network", 10, 2); | |
415 histogram_tester().ExpectUniqueSample( | |
416 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.PercentNetwork", 100, | |
417 2); | |
418 | |
419 // Counts | |
420 histogram_tester().ExpectUniqueSample( | |
421 "PageLoad.Clients.Ads.Google.FrameCounts.AnyParentFrame.AdFrames", 2, 1); | |
422 histogram_tester().ExpectUniqueSample( | |
423 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.TotalFrames", 1, | |
424 1); | |
425 histogram_tester().ExpectUniqueSample( | |
426 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.AdFrames", 1, 1); | |
427 histogram_tester().ExpectUniqueSample( | |
428 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.PercentAdFrames", | |
429 100, 1); | |
430 | |
431 // Page percentages | |
432 histogram_tester().ExpectUniqueSample( | |
433 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Total.PercentAds", 50, 1); | |
434 histogram_tester().ExpectUniqueSample( | |
435 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.PercentNetwork", | |
436 100, 1); | |
437 histogram_tester().ExpectUniqueSample( | |
438 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Network.PercentAds", 50, 1); | |
439 | |
440 // Page byte counts | |
441 histogram_tester().ExpectUniqueSample( | |
442 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Total", 20, 1); | |
443 histogram_tester().ExpectUniqueSample( | |
444 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Network", 20, 1); | |
445 histogram_tester().ExpectUniqueSample( | |
446 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Total", 40, 1); | |
447 histogram_tester().ExpectUniqueSample( | |
448 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Network", 40, 1); | |
449 histogram_tester().ExpectUniqueSample( | |
450 "PageLoad.Clients.Ads.Google.Bytes.NonAdFrames.Aggregate.Total", 20, 1); | |
451 } | |
452 | |
453 TEST_F(AdsPageLoadMetricsObserverTest, TwoResourceLoadsBeforeCommit) { | |
454 // Main frame. | |
455 RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl); | |
456 LoadResource(main_frame, ResourceCached::NOT_CACHED, 10); | |
457 | |
458 // Now open a subframe and have its resource load before notification of | |
459 // navigation finishing. | |
460 page_load_metrics::ExtraRequestCompleteInfo request( | |
461 GURL(kNonAdUrl), main_frame->GetFrameTreeNodeId() + 1, false /* cached */, | |
462 10 * 1024 /* size */, false /* data_reduction_proxy_used */, | |
463 0 /* original_network_content_length */, | |
464 content::RESOURCE_TYPE_SUB_FRAME); | |
465 SimulateLoadedResource(request); | |
466 RenderFrameHost* subframe_ad = | |
467 RenderFrameHostTester::For(main_frame)->AppendChild(kAdName); | |
468 auto navigation_simulator = NavigationSimulator::CreateRendererInitiated( | |
469 GURL(kNonAdUrl), subframe_ad); | |
470 | |
471 // The sub-frame renavigates before it commits. | |
472 navigation_simulator->Start(); | |
473 navigation_simulator->Fail(net::ERR_ABORTED); | |
474 | |
475 // Renavigate the subframe to a successful commit. But again, the resource | |
476 // loads before the observer sees the finished navigation. | |
477 SimulateLoadedResource(request); | |
478 NavigateFrame(kNonAdUrl, subframe_ad); | |
479 | |
480 // Navigate again to trigger histograms. | |
481 NavigateFrame(kNonAdUrl, main_frame); | |
482 | |
483 // 30KB in total was loaded. Ten for the main page, ten for an aborted | |
484 // ad subframe, and ten for a successful ad subframe. The aborted ad | |
485 // subframe's bytes don't count. | |
486 | |
487 // Individual Ad Frame Metrics | |
488 histogram_tester().ExpectUniqueSample( | |
489 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Total", 10, 1); | |
490 histogram_tester().ExpectUniqueSample( | |
491 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.Network", 10, 1); | |
492 histogram_tester().ExpectUniqueSample( | |
493 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.PerFrame.PercentNetwork", 100, | |
494 1); | |
495 | |
496 // Counts | |
497 histogram_tester().ExpectUniqueSample( | |
498 "PageLoad.Clients.Ads.Google.FrameCounts.AnyParentFrame.AdFrames", 1, 1); | |
499 histogram_tester().ExpectUniqueSample( | |
500 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.TotalFrames", 1, | |
501 1); | |
502 histogram_tester().ExpectUniqueSample( | |
503 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.AdFrames", 1, 1); | |
504 histogram_tester().ExpectUniqueSample( | |
505 "PageLoad.Clients.Ads.Google.FrameCounts.MainFrameParent.PercentAdFrames", | |
506 100, 1); | |
507 | |
508 // Page percentages | |
509 histogram_tester().ExpectUniqueSample( | |
510 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Total.PercentAds", 50, 1); | |
511 histogram_tester().ExpectUniqueSample( | |
512 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.PercentNetwork", | |
513 100, 1); | |
514 histogram_tester().ExpectUniqueSample( | |
515 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Network.PercentAds", 50, 1); | |
516 | |
517 // Page byte counts | |
518 histogram_tester().ExpectUniqueSample( | |
519 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Total", 10, 1); | |
520 histogram_tester().ExpectUniqueSample( | |
521 "PageLoad.Clients.Ads.Google.Bytes.AdFrames.Aggregate.Network", 10, 1); | |
522 histogram_tester().ExpectUniqueSample( | |
523 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Total", 20, 1); | |
524 histogram_tester().ExpectUniqueSample( | |
525 "PageLoad.Clients.Ads.Google.Bytes.FullPage.Network", 20, 1); | |
526 histogram_tester().ExpectUniqueSample( | |
527 "PageLoad.Clients.Ads.Google.Bytes.NonAdFrames.Aggregate.Total", 10, 1); | |
528 } | |
OLD | NEW |