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 "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_ test_harness.h" | |
11 #include "content/public/browser/render_frame_host.h" | |
12 #include "url/gurl.h" | |
13 | |
14 using content::RenderFrameHost; | |
15 using content::RenderFrameHostTester; | |
Charlie Harrison
2017/04/11 17:30:07
include test_renderer_host.h
jkarlin
2017/04/13 17:25:30
Done.
| |
16 | |
17 namespace { | |
Charlie Harrison
2017/04/11 17:30:06
nit:
namespace {
enum class ResourceCached { NOT_
jkarlin
2017/04/13 17:25:30
Done.
| |
18 enum class ResourceCached { NOT_CACHED, CACHED }; | |
19 } | |
20 | |
21 class AdsPageLoadMetricsObserverTest | |
22 : public page_load_metrics::PageLoadMetricsObserverTestHarness { | |
23 public: | |
24 AdsPageLoadMetricsObserverTest() {} | |
25 | |
26 RenderFrameHost* NavigateMainFrame(const GURL& url) { | |
27 NavigateAndCommit(url); | |
28 return web_contents()->GetMainFrame(); | |
29 } | |
30 | |
31 RenderFrameHost* CreateAndNavigateSubFrame(const GURL& url, | |
32 const std::string& frame_name, | |
33 content::RenderFrameHost* parent) { | |
34 RenderFrameHostTester* rfh_tester = RenderFrameHostTester::For(parent); | |
35 RenderFrameHost* subframe = rfh_tester->AppendChild(frame_name); | |
36 RenderFrameHostTester* subframe_tester = | |
37 RenderFrameHostTester::For(subframe); | |
38 subframe_tester->SimulateNavigationCommit(url); | |
39 return subframe; | |
Charlie Harrison
2017/04/11 17:30:06
I wonder if you could use the NavigationSimulator
jkarlin
2017/04/13 17:25:30
Done.
| |
40 } | |
41 | |
42 void LoadResource(RenderFrameHost* frame, | |
43 ResourceCached resource_cached, | |
44 int resource_size_in_kb) { | |
45 page_load_metrics::ExtraRequestInfo request( | |
46 GURL(), frame->GetFrameTreeNodeId(), | |
Charlie Harrison
2017/04/11 17:30:06
include gurl
jkarlin
2017/04/13 17:25:30
Already there.
| |
47 resource_cached == ResourceCached::CACHED, resource_size_in_kb * 1024, | |
48 false /* data_reduction_proxy_used */, | |
49 0 /* original_network_content_length */); | |
50 SimulateLoadedResource(request); | |
51 } | |
52 | |
53 protected: | |
54 void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override { | |
Charlie Harrison
2017/04/11 17:30:06
include page_load_tracker.h
jkarlin
2017/04/13 17:25:30
Done.
| |
55 tracker->AddObserver(base::WrapUnique(new AdsPageLoadMetricsObserver())); | |
Charlie Harrison
2017/04/11 17:30:06
nit: prefer base::MakeUnique<AdsPageLoadMetricsObs
jkarlin
2017/04/13 17:25:30
Done.
| |
56 } | |
57 | |
58 private: | |
59 DISALLOW_COPY_AND_ASSIGN(AdsPageLoadMetricsObserverTest); | |
Charlie Harrison
2017/04/11 17:30:06
include base/macros.
jkarlin
2017/04/13 17:25:30
Already there.
| |
60 }; | |
61 | |
62 TEST_F(AdsPageLoadMetricsObserverTest, PageWithNoAds) { | |
63 RenderFrameHost* main_frame = NavigateMainFrame(GURL("https://foo.com/")); | |
64 RenderFrameHost* frame1 = CreateAndNavigateSubFrame( | |
65 GURL("https://foo.com/frame1"), "foo name", main_frame); | |
66 RenderFrameHost* frame2 = | |
67 CreateAndNavigateSubFrame(GURL("https://foo.com/frame2"), "", main_frame); | |
68 LoadResource(main_frame, ResourceCached::NOT_CACHED, 1); | |
69 LoadResource(frame1, ResourceCached::NOT_CACHED, 1); | |
70 LoadResource(frame2, ResourceCached::NOT_CACHED, 1); | |
71 | |
72 // Navigate again to trigger histograms. | |
73 NavigateMainFrame(GURL("https://bar.com/")); | |
74 | |
75 histogram_tester().ExpectUniqueSample( | |
76 "PageLoad.Clients.Ads.Google.PageHasNoAds", 1, 1); | |
77 histogram_tester().ExpectTotalCount( | |
78 "PageLoad.Clients.Ads.Google.AdFrameCount", 0); | |
79 histogram_tester().ExpectTotalCount( | |
80 "PageLoad.Clients.Ads.Google.Bytes.AdFrames", 0); | |
81 } | |
82 | |
83 TEST_F(AdsPageLoadMetricsObserverTest, ResourceBeforeAdFrameCommits) { | |
84 RenderFrameHost* main_frame = NavigateMainFrame(GURL("https://foo.com/")); | |
85 | |
86 LoadResource(main_frame, ResourceCached::NOT_CACHED, 1); | |
87 | |
88 // Assume that the next frame's id will be the main frame + 1 and load a | |
89 // resource for that frame. Make sure it gets counted. | |
90 page_load_metrics::ExtraRequestInfo request( | |
91 GURL(), main_frame->GetFrameTreeNodeId() + 1, false /* cached */, | |
92 1024 /* size */, false /* data_reduction_proxy_used */, | |
93 0 /* original_network_content_length */); | |
94 SimulateLoadedResource(request); | |
95 | |
96 CreateAndNavigateSubFrame(GURL("https://foo.com/frame2"), | |
97 "google_ads_iframe_1", main_frame); | |
98 | |
99 // Navigate again to trigger histograms. | |
100 NavigateMainFrame(GURL("https://bar.com/")); | |
101 | |
102 // 2KB total were loaded from network, one of which was in an ad frame. | |
103 histogram_tester().ExpectTotalCount( | |
104 "PageLoad.Clients.Ads.Google.PageHasNoAds", 0); | |
105 histogram_tester().ExpectUniqueSample( | |
106 "PageLoad.Clients.Ads.Google.AdFrameCount", 1, 1); | |
107 | |
108 // Individual Ad Frame Metrics | |
109 histogram_tester().ExpectUniqueSample( | |
110 "PageLoad.Clients.Ads.Google.Bytes.AdFrame", 1, 1); | |
111 histogram_tester().ExpectUniqueSample( | |
112 "PageLoad.Clients.Ads.Google.Bytes.AdFrameFromNetwork", 1, 1); | |
113 histogram_tester().ExpectUniqueSample( | |
114 "PageLoad.Clients.Ads.Google.BytesPercent.AdFrameFromNetwork", 100, 1); | |
115 | |
116 // Page percentages | |
117 histogram_tester().ExpectUniqueSample( | |
118 "PageLoad.Clients.Ads.Google.BytesPercent.AdFrames", 50, 1); | |
119 histogram_tester().ExpectUniqueSample( | |
120 "PageLoad.Clients.Ads.Google.BytesPercent." | |
121 "AdFramesFromNetworkOfAdFramesTotal", | |
122 100, 1); | |
123 histogram_tester().ExpectUniqueSample( | |
124 "PageLoad.Clients.Ads.Google.Bytes.Percent." | |
125 "AdFramesFromNetworkOfPageFromNetwork", | |
126 50, 1); | |
127 | |
128 // Page byte counts | |
129 histogram_tester().ExpectUniqueSample( | |
130 "PageLoad.Clients.Ads.Google.Bytes.AdFrames", 1, 1); | |
131 histogram_tester().ExpectUniqueSample( | |
132 "PageLoad.Clients.Ads.Google.Bytes.PageSansAdFrames", 1, 1); | |
133 histogram_tester().ExpectUniqueSample( | |
134 "PageLoad.Clients.Ads.Google.Bytes.Page", 2, 1); | |
135 histogram_tester().ExpectUniqueSample( | |
136 "PageLoad.Clients.Ads.Google.Bytes.PageFromNetwork", 2, 1); | |
137 histogram_tester().ExpectUniqueSample( | |
138 "PageLoad.Clients.Ads.Google.Bytes.AdFramesFromNetwork", 1, 1); | |
139 } | |
140 | |
141 TEST_F(AdsPageLoadMetricsObserverTest, PageWithAdFrames) { | |
142 RenderFrameHost* main_frame = NavigateMainFrame(GURL("https://foo.com/")); | |
143 RenderFrameHost* non_ad_frame = CreateAndNavigateSubFrame( | |
144 GURL("https://foo.com/frame1"), "foo name", main_frame); | |
145 | |
146 // Create 5 ad frames, one nested inside another. Verify that the nested ad | |
147 // frame doesn't get counted separately (but that its bytes are still | |
148 // coutned). Also verify that the various ad signals (urls and names) are | |
149 // properly detected. | |
150 RenderFrameHost* ad_frame1 = CreateAndNavigateSubFrame( | |
151 GURL("https://foo.com/frame2"), "google_ads_iframe_1", main_frame); | |
152 RenderFrameHost* ad_frame2 = CreateAndNavigateSubFrame( | |
153 GURL("https://foo.com/frame2"), "google_ads_frame_1", main_frame); | |
154 RenderFrameHost* ad_frame3 = CreateAndNavigateSubFrame( | |
155 GURL("http://tpc.googlesyndication.com/safeframe/"), "", main_frame); | |
156 RenderFrameHost* ad_frame4 = CreateAndNavigateSubFrame( | |
157 GURL("https://tpc.googlesyndication.com/safeframe/1"), "", main_frame); | |
158 RenderFrameHost* nested_ad_frame4 = CreateAndNavigateSubFrame( | |
159 GURL("https://tpc.googlesyndication.com/safeframe/2"), "", ad_frame4); | |
160 | |
161 // Create an ad frame without content, it shouldn't be counted. | |
162 CreateAndNavigateSubFrame( | |
163 GURL("https://tpc.googlesyndication.com/safeframe/3"), "", main_frame); | |
164 | |
165 // 7 bytes total in page, all from network, 5 from ads. | |
166 LoadResource(main_frame, ResourceCached::NOT_CACHED, 1); | |
167 LoadResource(non_ad_frame, ResourceCached::NOT_CACHED, 1); | |
168 LoadResource(ad_frame1, ResourceCached::NOT_CACHED, 1); | |
169 LoadResource(ad_frame2, ResourceCached::NOT_CACHED, 1); | |
170 LoadResource(ad_frame3, ResourceCached::NOT_CACHED, 1); | |
171 LoadResource(ad_frame4, ResourceCached::NOT_CACHED, 1); | |
172 LoadResource(nested_ad_frame4, ResourceCached::NOT_CACHED, 1); | |
173 | |
174 // Navigate again to trigger histograms. | |
175 NavigateMainFrame(GURL("https://bar.com/")); | |
176 | |
177 // Individual Ad Frame Metrics | |
178 histogram_tester().ExpectTotalCount( | |
179 "PageLoad.Clients.Ads.Google.Bytes.AdFrame", 4); | |
180 histogram_tester().ExpectTotalCount( | |
181 "PageLoad.Clients.Ads.Google.Bytes.AdFrameFromNetwork", 4); | |
182 histogram_tester().ExpectTotalCount( | |
183 "PageLoad.Clients.Ads.Google.BytesPercent.AdFrameFromNetwork", 4); | |
184 | |
185 // Counts | |
186 histogram_tester().ExpectTotalCount( | |
187 "PageLoad.Clients.Ads.Google.PageHasNoAds", 0); | |
188 histogram_tester().ExpectUniqueSample( | |
189 "PageLoad.Clients.Ads.Google.AdFrameCount", 4, 1); | |
190 | |
191 // Page percentages | |
192 histogram_tester().ExpectUniqueSample( | |
193 "PageLoad.Clients.Ads.Google.BytesPercent.AdFrames", 71, 1); | |
194 histogram_tester().ExpectUniqueSample( | |
195 "PageLoad.Clients.Ads.Google.BytesPercent." | |
196 "AdFramesFromNetworkOfAdFramesTotal", | |
197 100, 1); | |
198 histogram_tester().ExpectUniqueSample( | |
199 "PageLoad.Clients.Ads.Google.Bytes.Percent." | |
200 "AdFramesFromNetworkOfPageFromNetwork", | |
201 71, 1); | |
202 | |
203 // Page byte counts | |
204 histogram_tester().ExpectUniqueSample( | |
205 "PageLoad.Clients.Ads.Google.Bytes.AdFrames", 5, 1); | |
206 histogram_tester().ExpectUniqueSample( | |
207 "PageLoad.Clients.Ads.Google.Bytes.PageSansAdFrames", 2, 1); | |
208 histogram_tester().ExpectUniqueSample( | |
209 "PageLoad.Clients.Ads.Google.Bytes.Page", 7, 1); | |
210 histogram_tester().ExpectUniqueSample( | |
211 "PageLoad.Clients.Ads.Google.Bytes.PageFromNetwork", 7, 1); | |
212 histogram_tester().ExpectUniqueSample( | |
213 "PageLoad.Clients.Ads.Google.Bytes.AdFramesFromNetwork", 5, 1); | |
214 } | |
OLD | NEW |