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

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

Issue 2874663005: [Page Load Metrics] Add mojom file to page load metrics. (Closed)
Patch Set: rebase Created 3 years, 7 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 2015 The Chromium Authors. All rights reserved. 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 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 "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" 5 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 22 matching lines...) Expand all
33 const char kDefaultTestUrl[] = "https://google.com/"; 33 const char kDefaultTestUrl[] = "https://google.com/";
34 const char kDefaultTestUrlAnchor[] = "https://google.com/#samedocument"; 34 const char kDefaultTestUrlAnchor[] = "https://google.com/#samedocument";
35 const char kDefaultTestUrl2[] = "https://whatever.com/"; 35 const char kDefaultTestUrl2[] = "https://whatever.com/";
36 const char kFilteredStartUrl[] = "https://whatever.com/ignore-on-start"; 36 const char kFilteredStartUrl[] = "https://whatever.com/ignore-on-start";
37 const char kFilteredCommitUrl[] = "https://whatever.com/ignore-on-commit"; 37 const char kFilteredCommitUrl[] = "https://whatever.com/ignore-on-commit";
38 38
39 // Simple PageLoadMetricsObserver that copies observed PageLoadTimings into the 39 // Simple PageLoadMetricsObserver that copies observed PageLoadTimings into the
40 // provided std::vector, so they can be analyzed by unit tests. 40 // provided std::vector, so they can be analyzed by unit tests.
41 class TestPageLoadMetricsObserver : public PageLoadMetricsObserver { 41 class TestPageLoadMetricsObserver : public PageLoadMetricsObserver {
42 public: 42 public:
43 TestPageLoadMetricsObserver(std::vector<PageLoadTiming>* updated_timings, 43 TestPageLoadMetricsObserver(
44 std::vector<PageLoadTiming>* complete_timings, 44 std::vector<mojo::StructPtr<mojom::PageLoadTiming>>* updated_timings,
45 std::vector<GURL>* observed_committed_urls) 45 std::vector<mojo::StructPtr<mojom::PageLoadTiming>>* complete_timings,
46 std::vector<GURL>* observed_committed_urls)
46 : updated_timings_(updated_timings), 47 : updated_timings_(updated_timings),
47 complete_timings_(complete_timings), 48 complete_timings_(complete_timings),
48 observed_committed_urls_(observed_committed_urls) {} 49 observed_committed_urls_(observed_committed_urls) {}
49 50
50 ObservePolicy OnStart(content::NavigationHandle* navigation_handle, 51 ObservePolicy OnStart(content::NavigationHandle* navigation_handle,
51 const GURL& currently_committed_url, 52 const GURL& currently_committed_url,
52 bool started_in_foreground) override { 53 bool started_in_foreground) override {
53 observed_committed_urls_->push_back(currently_committed_url); 54 observed_committed_urls_->push_back(currently_committed_url);
54 return CONTINUE_OBSERVING; 55 return CONTINUE_OBSERVING;
55 } 56 }
56 57
57 void OnTimingUpdate(const PageLoadTiming& timing, 58 void OnTimingUpdate(const mojom::PageLoadTiming& timing,
58 const PageLoadExtraInfo& extra_info) override { 59 const PageLoadExtraInfo& extra_info) override {
59 updated_timings_->push_back(timing); 60 updated_timings_->push_back(timing.Clone());
60 } 61 }
61 62
62 void OnComplete(const PageLoadTiming& timing, 63 void OnComplete(const mojom::PageLoadTiming& timing,
63 const PageLoadExtraInfo& extra_info) override { 64 const PageLoadExtraInfo& extra_info) override {
64 complete_timings_->push_back(timing); 65 complete_timings_->push_back(timing.Clone());
65 } 66 }
66 67
67 ObservePolicy FlushMetricsOnAppEnterBackground( 68 ObservePolicy FlushMetricsOnAppEnterBackground(
68 const PageLoadTiming& timing, 69 const mojom::PageLoadTiming& timing,
69 const PageLoadExtraInfo& extra_info) override { 70 const PageLoadExtraInfo& extra_info) override {
70 return STOP_OBSERVING; 71 return STOP_OBSERVING;
71 } 72 }
72 73
73 private: 74 private:
74 std::vector<PageLoadTiming>* const updated_timings_; 75 std::vector<mojo::StructPtr<mojom::PageLoadTiming>>* const updated_timings_;
75 std::vector<PageLoadTiming>* const complete_timings_; 76 std::vector<mojo::StructPtr<mojom::PageLoadTiming>>* const complete_timings_;
76 std::vector<GURL>* const observed_committed_urls_; 77 std::vector<GURL>* const observed_committed_urls_;
77 }; 78 };
78 79
79 // Test PageLoadMetricsObserver that stops observing page loads with certain 80 // Test PageLoadMetricsObserver that stops observing page loads with certain
80 // substrings in the URL. 81 // substrings in the URL.
81 class FilteringPageLoadMetricsObserver : public PageLoadMetricsObserver { 82 class FilteringPageLoadMetricsObserver : public PageLoadMetricsObserver {
82 public: 83 public:
83 explicit FilteringPageLoadMetricsObserver( 84 explicit FilteringPageLoadMetricsObserver(
84 std::vector<GURL>* completed_filtered_urls) 85 std::vector<GURL>* completed_filtered_urls)
85 : completed_filtered_urls_(completed_filtered_urls) {} 86 : completed_filtered_urls_(completed_filtered_urls) {}
86 87
87 ObservePolicy OnStart(content::NavigationHandle* handle, 88 ObservePolicy OnStart(content::NavigationHandle* handle,
88 const GURL& currently_committed_url, 89 const GURL& currently_committed_url,
89 bool started_in_foreground) override { 90 bool started_in_foreground) override {
90 const bool should_ignore = 91 const bool should_ignore =
91 handle->GetURL().spec().find("ignore-on-start") != std::string::npos; 92 handle->GetURL().spec().find("ignore-on-start") != std::string::npos;
92 return should_ignore ? STOP_OBSERVING : CONTINUE_OBSERVING; 93 return should_ignore ? STOP_OBSERVING : CONTINUE_OBSERVING;
93 } 94 }
94 95
95 ObservePolicy OnCommit(content::NavigationHandle* handle) override { 96 ObservePolicy OnCommit(content::NavigationHandle* handle) override {
96 const bool should_ignore = 97 const bool should_ignore =
97 handle->GetURL().spec().find("ignore-on-commit") != std::string::npos; 98 handle->GetURL().spec().find("ignore-on-commit") != std::string::npos;
98 return should_ignore ? STOP_OBSERVING : CONTINUE_OBSERVING; 99 return should_ignore ? STOP_OBSERVING : CONTINUE_OBSERVING;
99 } 100 }
100 101
101 void OnComplete(const PageLoadTiming& timing, 102 void OnComplete(const mojom::PageLoadTiming& timing,
102 const PageLoadExtraInfo& extra_info) override { 103 const PageLoadExtraInfo& extra_info) override {
103 completed_filtered_urls_->push_back(extra_info.url); 104 completed_filtered_urls_->push_back(extra_info.url);
104 } 105 }
105 106
106 private: 107 private:
107 std::vector<GURL>* const completed_filtered_urls_; 108 std::vector<GURL>* const completed_filtered_urls_;
108 }; 109 };
109 110
110 class TestPageLoadMetricsEmbedderInterface 111 class TestPageLoadMetricsEmbedderInterface
111 : public PageLoadMetricsEmbedderInterface { 112 : public PageLoadMetricsEmbedderInterface {
112 public: 113 public:
113 TestPageLoadMetricsEmbedderInterface() : is_ntp_(false) {} 114 TestPageLoadMetricsEmbedderInterface() : is_ntp_(false) {}
114 115
115 bool IsNewTabPageUrl(const GURL& url) override { return is_ntp_; } 116 bool IsNewTabPageUrl(const GURL& url) override { return is_ntp_; }
116 void set_is_ntp(bool is_ntp) { is_ntp_ = is_ntp; } 117 void set_is_ntp(bool is_ntp) { is_ntp_ = is_ntp; }
117 void RegisterObservers(PageLoadTracker* tracker) override { 118 void RegisterObservers(PageLoadTracker* tracker) override {
118 tracker->AddObserver(base::MakeUnique<TestPageLoadMetricsObserver>( 119 tracker->AddObserver(base::MakeUnique<TestPageLoadMetricsObserver>(
119 &updated_timings_, &complete_timings_, &observed_committed_urls_)); 120 &updated_timings_, &complete_timings_, &observed_committed_urls_));
120 tracker->AddObserver(base::MakeUnique<FilteringPageLoadMetricsObserver>( 121 tracker->AddObserver(base::MakeUnique<FilteringPageLoadMetricsObserver>(
121 &completed_filtered_urls_)); 122 &completed_filtered_urls_));
122 } 123 }
123 const std::vector<PageLoadTiming>& updated_timings() const { 124 const std::vector<mojo::StructPtr<mojom::PageLoadTiming>>& updated_timings()
125 const {
124 return updated_timings_; 126 return updated_timings_;
125 } 127 }
126 const std::vector<PageLoadTiming>& complete_timings() const { 128 const std::vector<mojo::StructPtr<mojom::PageLoadTiming>>& complete_timings()
129 const {
127 return complete_timings_; 130 return complete_timings_;
128 } 131 }
129 132
130 // currently_committed_urls passed to OnStart(). 133 // currently_committed_urls passed to OnStart().
131 const std::vector<GURL>& observed_committed_urls_from_on_start() const { 134 const std::vector<GURL>& observed_committed_urls_from_on_start() const {
132 return observed_committed_urls_; 135 return observed_committed_urls_;
133 } 136 }
134 137
135 // committed URLs passed to FilteringPageLoadMetricsObserver::OnComplete(). 138 // committed URLs passed to FilteringPageLoadMetricsObserver::OnComplete().
136 const std::vector<GURL>& completed_filtered_urls() const { 139 const std::vector<GURL>& completed_filtered_urls() const {
137 return completed_filtered_urls_; 140 return completed_filtered_urls_;
138 } 141 }
139 142
140 private: 143 private:
141 std::vector<PageLoadTiming> updated_timings_; 144 std::vector<mojo::StructPtr<mojom::PageLoadTiming>> updated_timings_;
142 std::vector<PageLoadTiming> complete_timings_; 145 std::vector<mojo::StructPtr<mojom::PageLoadTiming>> complete_timings_;
143 std::vector<GURL> observed_committed_urls_; 146 std::vector<GURL> observed_committed_urls_;
144 std::vector<GURL> completed_filtered_urls_; 147 std::vector<GURL> completed_filtered_urls_;
145 bool is_ntp_; 148 bool is_ntp_;
146 }; 149 };
147 150
148 } // namespace 151 } // namespace
149 152
150 class MetricsWebContentsObserverTest : public ChromeRenderViewHostTestHarness { 153 class MetricsWebContentsObserverTest : public ChromeRenderViewHostTestHarness {
151 public: 154 public:
152 MetricsWebContentsObserverTest() : num_errors_(0) {} 155 MetricsWebContentsObserverTest() : num_errors_(0) {}
153 156
154 void SetUp() override { 157 void SetUp() override {
155 ChromeRenderViewHostTestHarness::SetUp(); 158 ChromeRenderViewHostTestHarness::SetUp();
156 AttachObserver(); 159 AttachObserver();
157 } 160 }
158 161
159 void NavigateToUntrackedUrl() { 162 void NavigateToUntrackedUrl() {
160 content::WebContentsTester::For(web_contents()) 163 content::WebContentsTester::For(web_contents())
161 ->NavigateAndCommit(GURL(url::kAboutBlankURL)); 164 ->NavigateAndCommit(GURL(url::kAboutBlankURL));
162 } 165 }
163 166
164 void SimulateTimingUpdate(const PageLoadTiming& timing) { 167 void SimulateTimingUpdate(const mojom::PageLoadTiming& timing) {
165 SimulateTimingUpdate(timing, web_contents()->GetMainFrame()); 168 SimulateTimingUpdate(timing, web_contents()->GetMainFrame());
166 } 169 }
167 170
168 void SimulateTimingUpdate(const PageLoadTiming& timing, 171 void SimulateTimingUpdate(const mojom::PageLoadTiming& timing,
169 content::RenderFrameHost* render_frame_host) { 172 content::RenderFrameHost* render_frame_host) {
170 observer_->OnTimingUpdated(render_frame_host, timing, PageLoadMetadata()); 173 observer_->OnTimingUpdated(render_frame_host, timing,
174 mojom::PageLoadMetadata());
171 } 175 }
172 176
173 void AttachObserver() { 177 void AttachObserver() {
174 embedder_interface_ = new TestPageLoadMetricsEmbedderInterface(); 178 embedder_interface_ = new TestPageLoadMetricsEmbedderInterface();
175 // Owned by the web_contents. Tests must be careful not to call 179 // Owned by the web_contents. Tests must be careful not to call
176 // SimulateTimingUpdate after they call DeleteContents() without also 180 // SimulateTimingUpdate after they call DeleteContents() without also
177 // calling AttachObserver() again. Otherwise they will use-after-free the 181 // calling AttachObserver() again. Otherwise they will use-after-free the
178 // observer_. 182 // observer_.
179 observer_ = MetricsWebContentsObserver::CreateForWebContents( 183 observer_ = MetricsWebContentsObserver::CreateForWebContents(
180 web_contents(), base::WrapUnique(embedder_interface_)); 184 web_contents(), base::WrapUnique(embedder_interface_));
181 observer_->WasShown(); 185 observer_->WasShown();
182 } 186 }
183 187
184 void CheckErrorEvent(InternalErrorLoadEvent error, int count) { 188 void CheckErrorEvent(InternalErrorLoadEvent error, int count) {
185 histogram_tester_.ExpectBucketCount(internal::kErrorEvents, error, count); 189 histogram_tester_.ExpectBucketCount(internal::kErrorEvents, error, count);
186 num_errors_ += count; 190 num_errors_ += count;
187 } 191 }
188 192
189 void CheckTotalErrorEvents() { 193 void CheckTotalErrorEvents() {
190 histogram_tester_.ExpectTotalCount(internal::kErrorEvents, num_errors_); 194 histogram_tester_.ExpectTotalCount(internal::kErrorEvents, num_errors_);
191 } 195 }
192 196
193 void CheckNoErrorEvents() { 197 void CheckNoErrorEvents() {
194 histogram_tester_.ExpectTotalCount(internal::kErrorEvents, 0); 198 histogram_tester_.ExpectTotalCount(internal::kErrorEvents, 0);
195 } 199 }
196 200
197 int CountEmptyCompleteTimingReported() { 201 int CountEmptyCompleteTimingReported() {
198 int empty = 0; 202 int empty = 0;
199 for (const auto& timing : embedder_interface_->complete_timings()) { 203 for (const auto& timing : embedder_interface_->complete_timings()) {
200 if (timing.IsEmpty()) 204 if (page_load_metrics::IsEmpty(*timing))
201 ++empty; 205 ++empty;
202 } 206 }
203 return empty; 207 return empty;
204 } 208 }
205 209
206 int CountCompleteTimingReported() { 210 int CountCompleteTimingReported() {
207 return embedder_interface_->complete_timings().size(); 211 return embedder_interface_->complete_timings().size();
208 } 212 }
209 int CountUpdatedTimingReported() { 213 int CountUpdatedTimingReported() {
210 return embedder_interface_->updated_timings().size(); 214 return embedder_interface_->updated_timings().size();
(...skipping 12 matching lines...) Expand all
223 TestPageLoadMetricsEmbedderInterface* embedder_interface_; 227 TestPageLoadMetricsEmbedderInterface* embedder_interface_;
224 MetricsWebContentsObserver* observer_; 228 MetricsWebContentsObserver* observer_;
225 229
226 private: 230 private:
227 int num_errors_; 231 int num_errors_;
228 232
229 DISALLOW_COPY_AND_ASSIGN(MetricsWebContentsObserverTest); 233 DISALLOW_COPY_AND_ASSIGN(MetricsWebContentsObserverTest);
230 }; 234 };
231 235
232 TEST_F(MetricsWebContentsObserverTest, SuccessfulMainFrameNavigation) { 236 TEST_F(MetricsWebContentsObserverTest, SuccessfulMainFrameNavigation) {
233 PageLoadTiming timing; 237 mojom::PageLoadTiming timing;
238 page_load_metrics::InitPageLoadTimingForTest(&timing);
234 timing.navigation_start = base::Time::FromDoubleT(1); 239 timing.navigation_start = base::Time::FromDoubleT(1);
235 240
236 content::WebContentsTester* web_contents_tester = 241 content::WebContentsTester* web_contents_tester =
237 content::WebContentsTester::For(web_contents()); 242 content::WebContentsTester::For(web_contents());
238 243
239 ASSERT_TRUE(observed_committed_urls_from_on_start().empty()); 244 ASSERT_TRUE(observed_committed_urls_from_on_start().empty());
240 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 245 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
241 ASSERT_EQ(1u, observed_committed_urls_from_on_start().size()); 246 ASSERT_EQ(1u, observed_committed_urls_from_on_start().size());
242 ASSERT_TRUE(observed_committed_urls_from_on_start().at(0).is_empty()); 247 ASSERT_TRUE(observed_committed_urls_from_on_start().at(0).is_empty());
243 248
244 ASSERT_EQ(0, CountUpdatedTimingReported()); 249 ASSERT_EQ(0, CountUpdatedTimingReported());
245 SimulateTimingUpdate(timing); 250 SimulateTimingUpdate(timing);
246 ASSERT_EQ(1, CountUpdatedTimingReported()); 251 ASSERT_EQ(1, CountUpdatedTimingReported());
247 ASSERT_EQ(0, CountCompleteTimingReported()); 252 ASSERT_EQ(0, CountCompleteTimingReported());
248 253
249 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); 254 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
250 ASSERT_EQ(1, CountCompleteTimingReported()); 255 ASSERT_EQ(1, CountCompleteTimingReported());
251 ASSERT_EQ(0, CountEmptyCompleteTimingReported()); 256 ASSERT_EQ(0, CountEmptyCompleteTimingReported());
252 ASSERT_EQ(2u, observed_committed_urls_from_on_start().size()); 257 ASSERT_EQ(2u, observed_committed_urls_from_on_start().size());
253 ASSERT_EQ(kDefaultTestUrl, 258 ASSERT_EQ(kDefaultTestUrl,
254 observed_committed_urls_from_on_start().at(1).spec()); 259 observed_committed_urls_from_on_start().at(1).spec());
255 ASSERT_EQ(1, CountUpdatedTimingReported()); 260 ASSERT_EQ(1, CountUpdatedTimingReported());
256 261
257 CheckNoErrorEvents(); 262 CheckNoErrorEvents();
258 } 263 }
259 264
260 TEST_F(MetricsWebContentsObserverTest, NotInMainFrame) { 265 TEST_F(MetricsWebContentsObserverTest, NotInMainFrame) {
261 PageLoadTiming timing; 266 mojom::PageLoadTiming timing;
267 page_load_metrics::InitPageLoadTimingForTest(&timing);
262 timing.navigation_start = base::Time::FromDoubleT(1); 268 timing.navigation_start = base::Time::FromDoubleT(1);
263 269
264 content::WebContentsTester* web_contents_tester = 270 content::WebContentsTester* web_contents_tester =
265 content::WebContentsTester::For(web_contents()); 271 content::WebContentsTester::For(web_contents());
266 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 272 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
267 273
268 content::RenderFrameHostTester* rfh_tester = 274 content::RenderFrameHostTester* rfh_tester =
269 content::RenderFrameHostTester::For(main_rfh()); 275 content::RenderFrameHostTester::For(main_rfh());
270 content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe"); 276 content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe");
271 277
272 content::RenderFrameHostTester* subframe_tester = 278 content::RenderFrameHostTester* subframe_tester =
273 content::RenderFrameHostTester::For(subframe); 279 content::RenderFrameHostTester::For(subframe);
274 subframe_tester->SimulateNavigationStart(GURL(kDefaultTestUrl2)); 280 subframe_tester->SimulateNavigationStart(GURL(kDefaultTestUrl2));
275 subframe_tester->SimulateNavigationCommit(GURL(kDefaultTestUrl2)); 281 subframe_tester->SimulateNavigationCommit(GURL(kDefaultTestUrl2));
276 SimulateTimingUpdate(timing, subframe); 282 SimulateTimingUpdate(timing, subframe);
277 subframe_tester->SimulateNavigationStop(); 283 subframe_tester->SimulateNavigationStop();
278 284
279 // Navigate again to see if the timing updated for a subframe message. 285 // Navigate again to see if the timing updated for a subframe message.
280 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); 286 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
281 287
282 ASSERT_EQ(0, CountUpdatedTimingReported()); 288 ASSERT_EQ(0, CountUpdatedTimingReported());
283 ASSERT_EQ(1, CountCompleteTimingReported()); 289 ASSERT_EQ(1, CountCompleteTimingReported());
284 ASSERT_EQ(1, CountEmptyCompleteTimingReported()); 290 ASSERT_EQ(1, CountEmptyCompleteTimingReported());
285 CheckErrorEvent(ERR_TIMING_IPC_FROM_SUBFRAME, 1); 291 CheckErrorEvent(ERR_TIMING_IPC_FROM_SUBFRAME, 1);
286 CheckErrorEvent(ERR_NO_IPCS_RECEIVED, 1); 292 CheckErrorEvent(ERR_NO_IPCS_RECEIVED, 1);
287 CheckTotalErrorEvents(); 293 CheckTotalErrorEvents();
288 } 294 }
289 295
290 TEST_F(MetricsWebContentsObserverTest, SameDocumentNoTrigger) { 296 TEST_F(MetricsWebContentsObserverTest, SameDocumentNoTrigger) {
291 PageLoadTiming timing; 297 mojom::PageLoadTiming timing;
298 page_load_metrics::InitPageLoadTimingForTest(&timing);
292 timing.navigation_start = base::Time::FromDoubleT(1); 299 timing.navigation_start = base::Time::FromDoubleT(1);
293 300
294 content::WebContentsTester* web_contents_tester = 301 content::WebContentsTester* web_contents_tester =
295 content::WebContentsTester::For(web_contents()); 302 content::WebContentsTester::For(web_contents());
296 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 303 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
297 ASSERT_EQ(0, CountUpdatedTimingReported()); 304 ASSERT_EQ(0, CountUpdatedTimingReported());
298 SimulateTimingUpdate(timing); 305 SimulateTimingUpdate(timing);
299 ASSERT_EQ(1, CountUpdatedTimingReported()); 306 ASSERT_EQ(1, CountUpdatedTimingReported());
300 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrlAnchor)); 307 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrlAnchor));
301 // Send the same timing update. The original tracker for kDefaultTestUrl 308 // Send the same timing update. The original tracker for kDefaultTestUrl
302 // should dedup the update, and the tracker for kDefaultTestUrlAnchor should 309 // should dedup the update, and the tracker for kDefaultTestUrlAnchor should
303 // have been destroyed as a result of its being a same page navigation, so 310 // have been destroyed as a result of its being a same page navigation, so
304 // CountUpdatedTimingReported() should continue to return 1. 311 // CountUpdatedTimingReported() should continue to return 1.
305 SimulateTimingUpdate(timing); 312 SimulateTimingUpdate(timing);
306 313
307 ASSERT_EQ(1, CountUpdatedTimingReported()); 314 ASSERT_EQ(1, CountUpdatedTimingReported());
308 ASSERT_EQ(0, CountCompleteTimingReported()); 315 ASSERT_EQ(0, CountCompleteTimingReported());
309 316
310 // Navigate again to force histogram logging. 317 // Navigate again to force histogram logging.
311 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); 318 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
312 319
313 // A same page navigation shouldn't trigger logging UMA for the original. 320 // A same page navigation shouldn't trigger logging UMA for the original.
314 ASSERT_EQ(1, CountUpdatedTimingReported()); 321 ASSERT_EQ(1, CountUpdatedTimingReported());
315 ASSERT_EQ(1, CountCompleteTimingReported()); 322 ASSERT_EQ(1, CountCompleteTimingReported());
316 ASSERT_EQ(0, CountEmptyCompleteTimingReported()); 323 ASSERT_EQ(0, CountEmptyCompleteTimingReported());
317 CheckNoErrorEvents(); 324 CheckNoErrorEvents();
318 } 325 }
319 326
320 TEST_F(MetricsWebContentsObserverTest, DontLogNewTabPage) { 327 TEST_F(MetricsWebContentsObserverTest, DontLogNewTabPage) {
321 PageLoadTiming timing; 328 mojom::PageLoadTiming timing;
329 page_load_metrics::InitPageLoadTimingForTest(&timing);
322 timing.navigation_start = base::Time::FromDoubleT(1); 330 timing.navigation_start = base::Time::FromDoubleT(1);
323 331
324 content::WebContentsTester* web_contents_tester = 332 content::WebContentsTester* web_contents_tester =
325 content::WebContentsTester::For(web_contents()); 333 content::WebContentsTester::For(web_contents());
326 embedder_interface_->set_is_ntp(true); 334 embedder_interface_->set_is_ntp(true);
327 335
328 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 336 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
329 SimulateTimingUpdate(timing); 337 SimulateTimingUpdate(timing);
330 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); 338 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
331 ASSERT_EQ(0, CountUpdatedTimingReported()); 339 ASSERT_EQ(0, CountUpdatedTimingReported());
332 ASSERT_EQ(0, CountCompleteTimingReported()); 340 ASSERT_EQ(0, CountCompleteTimingReported());
333 CheckErrorEvent(ERR_IPC_WITH_NO_RELEVANT_LOAD, 1); 341 CheckErrorEvent(ERR_IPC_WITH_NO_RELEVANT_LOAD, 1);
334 CheckTotalErrorEvents(); 342 CheckTotalErrorEvents();
335 } 343 }
336 344
337 TEST_F(MetricsWebContentsObserverTest, DontLogIrrelevantNavigation) { 345 TEST_F(MetricsWebContentsObserverTest, DontLogIrrelevantNavigation) {
338 PageLoadTiming timing; 346 mojom::PageLoadTiming timing;
347 page_load_metrics::InitPageLoadTimingForTest(&timing);
339 timing.navigation_start = base::Time::FromDoubleT(10); 348 timing.navigation_start = base::Time::FromDoubleT(10);
340 349
341 content::WebContentsTester* web_contents_tester = 350 content::WebContentsTester* web_contents_tester =
342 content::WebContentsTester::For(web_contents()); 351 content::WebContentsTester::For(web_contents());
343 352
344 GURL about_blank_url = GURL("about:blank"); 353 GURL about_blank_url = GURL("about:blank");
345 web_contents_tester->NavigateAndCommit(about_blank_url); 354 web_contents_tester->NavigateAndCommit(about_blank_url);
346 SimulateTimingUpdate(timing); 355 SimulateTimingUpdate(timing);
347 ASSERT_EQ(0, CountUpdatedTimingReported()); 356 ASSERT_EQ(0, CountUpdatedTimingReported());
348 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 357 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
349 ASSERT_EQ(0, CountUpdatedTimingReported()); 358 ASSERT_EQ(0, CountUpdatedTimingReported());
350 ASSERT_EQ(0, CountCompleteTimingReported()); 359 ASSERT_EQ(0, CountCompleteTimingReported());
351 360
352 CheckErrorEvent(ERR_IPC_FROM_BAD_URL_SCHEME, 1); 361 CheckErrorEvent(ERR_IPC_FROM_BAD_URL_SCHEME, 1);
353 CheckErrorEvent(ERR_IPC_WITH_NO_RELEVANT_LOAD, 1); 362 CheckErrorEvent(ERR_IPC_WITH_NO_RELEVANT_LOAD, 1);
354 CheckTotalErrorEvents(); 363 CheckTotalErrorEvents();
355 } 364 }
356 365
357 TEST_F(MetricsWebContentsObserverTest, EmptyTimingError) { 366 TEST_F(MetricsWebContentsObserverTest, EmptyTimingError) {
358 PageLoadTiming timing; 367 mojom::PageLoadTiming timing;
368 page_load_metrics::InitPageLoadTimingForTest(&timing);
359 369
360 content::WebContentsTester* web_contents_tester = 370 content::WebContentsTester* web_contents_tester =
361 content::WebContentsTester::For(web_contents()); 371 content::WebContentsTester::For(web_contents());
362 372
363 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 373 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
364 SimulateTimingUpdate(timing); 374 SimulateTimingUpdate(timing);
365 ASSERT_EQ(0, CountUpdatedTimingReported()); 375 ASSERT_EQ(0, CountUpdatedTimingReported());
366 NavigateToUntrackedUrl(); 376 NavigateToUntrackedUrl();
367 ASSERT_EQ(0, CountUpdatedTimingReported()); 377 ASSERT_EQ(0, CountUpdatedTimingReported());
368 ASSERT_EQ(1, CountCompleteTimingReported()); 378 ASSERT_EQ(1, CountCompleteTimingReported());
369 379
370 CheckErrorEvent(ERR_BAD_TIMING_IPC_INVALID_TIMING, 1); 380 CheckErrorEvent(ERR_BAD_TIMING_IPC_INVALID_TIMING, 1);
371 CheckErrorEvent(ERR_NO_IPCS_RECEIVED, 1); 381 CheckErrorEvent(ERR_NO_IPCS_RECEIVED, 1);
372 CheckTotalErrorEvents(); 382 CheckTotalErrorEvents();
373 383
374 histogram_tester_.ExpectTotalCount( 384 histogram_tester_.ExpectTotalCount(
375 page_load_metrics::internal::kPageLoadTimingStatus, 1); 385 page_load_metrics::internal::kPageLoadTimingStatus, 1);
376 histogram_tester_.ExpectBucketCount( 386 histogram_tester_.ExpectBucketCount(
377 page_load_metrics::internal::kPageLoadTimingStatus, 387 page_load_metrics::internal::kPageLoadTimingStatus,
378 page_load_metrics::internal::INVALID_EMPTY_TIMING, 1); 388 page_load_metrics::internal::INVALID_EMPTY_TIMING, 1);
379 } 389 }
380 390
381 TEST_F(MetricsWebContentsObserverTest, NullNavigationStartError) { 391 TEST_F(MetricsWebContentsObserverTest, NullNavigationStartError) {
382 PageLoadTiming timing; 392 mojom::PageLoadTiming timing;
383 timing.parse_timing.parse_start = base::TimeDelta::FromMilliseconds(1); 393 page_load_metrics::InitPageLoadTimingForTest(&timing);
394 timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1);
384 395
385 content::WebContentsTester* web_contents_tester = 396 content::WebContentsTester* web_contents_tester =
386 content::WebContentsTester::For(web_contents()); 397 content::WebContentsTester::For(web_contents());
387 398
388 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 399 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
389 SimulateTimingUpdate(timing); 400 SimulateTimingUpdate(timing);
390 ASSERT_EQ(0, CountUpdatedTimingReported()); 401 ASSERT_EQ(0, CountUpdatedTimingReported());
391 NavigateToUntrackedUrl(); 402 NavigateToUntrackedUrl();
392 ASSERT_EQ(0, CountUpdatedTimingReported()); 403 ASSERT_EQ(0, CountUpdatedTimingReported());
393 ASSERT_EQ(1, CountCompleteTimingReported()); 404 ASSERT_EQ(1, CountCompleteTimingReported());
394 405
395 CheckErrorEvent(ERR_BAD_TIMING_IPC_INVALID_TIMING, 1); 406 CheckErrorEvent(ERR_BAD_TIMING_IPC_INVALID_TIMING, 1);
396 CheckErrorEvent(ERR_NO_IPCS_RECEIVED, 1); 407 CheckErrorEvent(ERR_NO_IPCS_RECEIVED, 1);
397 CheckTotalErrorEvents(); 408 CheckTotalErrorEvents();
398 409
399 histogram_tester_.ExpectTotalCount( 410 histogram_tester_.ExpectTotalCount(
400 page_load_metrics::internal::kPageLoadTimingStatus, 1); 411 page_load_metrics::internal::kPageLoadTimingStatus, 1);
401 histogram_tester_.ExpectBucketCount( 412 histogram_tester_.ExpectBucketCount(
402 page_load_metrics::internal::kPageLoadTimingStatus, 413 page_load_metrics::internal::kPageLoadTimingStatus,
403 page_load_metrics::internal::INVALID_NULL_NAVIGATION_START, 1); 414 page_load_metrics::internal::INVALID_NULL_NAVIGATION_START, 1);
404 } 415 }
405 416
406 TEST_F(MetricsWebContentsObserverTest, TimingOrderError) { 417 TEST_F(MetricsWebContentsObserverTest, TimingOrderError) {
407 PageLoadTiming timing; 418 mojom::PageLoadTiming timing;
419 page_load_metrics::InitPageLoadTimingForTest(&timing);
408 timing.navigation_start = base::Time::FromDoubleT(1); 420 timing.navigation_start = base::Time::FromDoubleT(1);
409 timing.parse_timing.parse_stop = base::TimeDelta::FromMilliseconds(1); 421 timing.parse_timing->parse_stop = base::TimeDelta::FromMilliseconds(1);
410 422
411 content::WebContentsTester* web_contents_tester = 423 content::WebContentsTester* web_contents_tester =
412 content::WebContentsTester::For(web_contents()); 424 content::WebContentsTester::For(web_contents());
413 425
414 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 426 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
415 SimulateTimingUpdate(timing); 427 SimulateTimingUpdate(timing);
416 ASSERT_EQ(0, CountUpdatedTimingReported()); 428 ASSERT_EQ(0, CountUpdatedTimingReported());
417 NavigateToUntrackedUrl(); 429 NavigateToUntrackedUrl();
418 ASSERT_EQ(0, CountUpdatedTimingReported()); 430 ASSERT_EQ(0, CountUpdatedTimingReported());
419 ASSERT_EQ(1, CountCompleteTimingReported()); 431 ASSERT_EQ(1, CountCompleteTimingReported());
420 432
421 CheckErrorEvent(ERR_BAD_TIMING_IPC_INVALID_TIMING, 1); 433 CheckErrorEvent(ERR_BAD_TIMING_IPC_INVALID_TIMING, 1);
422 CheckErrorEvent(ERR_NO_IPCS_RECEIVED, 1); 434 CheckErrorEvent(ERR_NO_IPCS_RECEIVED, 1);
423 CheckTotalErrorEvents(); 435 CheckTotalErrorEvents();
424 436
425 histogram_tester_.ExpectTotalCount( 437 histogram_tester_.ExpectTotalCount(
426 page_load_metrics::internal::kPageLoadTimingStatus, 1); 438 page_load_metrics::internal::kPageLoadTimingStatus, 1);
427 histogram_tester_.ExpectBucketCount( 439 histogram_tester_.ExpectBucketCount(
428 page_load_metrics::internal::kPageLoadTimingStatus, 440 page_load_metrics::internal::kPageLoadTimingStatus,
429 page_load_metrics::internal::INVALID_ORDER_PARSE_START_PARSE_STOP, 1); 441 page_load_metrics::internal::INVALID_ORDER_PARSE_START_PARSE_STOP, 1);
430 } 442 }
431 443
432 TEST_F(MetricsWebContentsObserverTest, NotInMainError) { 444 TEST_F(MetricsWebContentsObserverTest, NotInMainError) {
433 PageLoadTiming timing; 445 mojom::PageLoadTiming timing;
446 page_load_metrics::InitPageLoadTimingForTest(&timing);
434 timing.navigation_start = base::Time::FromDoubleT(1); 447 timing.navigation_start = base::Time::FromDoubleT(1);
435 448
436 content::WebContentsTester* web_contents_tester = 449 content::WebContentsTester* web_contents_tester =
437 content::WebContentsTester::For(web_contents()); 450 content::WebContentsTester::For(web_contents());
438 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 451 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
439 452
440 content::RenderFrameHostTester* rfh_tester = 453 content::RenderFrameHostTester* rfh_tester =
441 content::RenderFrameHostTester::For(main_rfh()); 454 content::RenderFrameHostTester::For(main_rfh());
442 content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe"); 455 content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe");
443 456
444 content::RenderFrameHostTester* subframe_tester = 457 content::RenderFrameHostTester* subframe_tester =
445 content::RenderFrameHostTester::For(subframe); 458 content::RenderFrameHostTester::For(subframe);
446 subframe_tester->SimulateNavigationStart(GURL(kDefaultTestUrl2)); 459 subframe_tester->SimulateNavigationStart(GURL(kDefaultTestUrl2));
447 subframe_tester->SimulateNavigationCommit(GURL(kDefaultTestUrl2)); 460 subframe_tester->SimulateNavigationCommit(GURL(kDefaultTestUrl2));
448 SimulateTimingUpdate(timing, subframe); 461 SimulateTimingUpdate(timing, subframe);
449 CheckErrorEvent(ERR_TIMING_IPC_FROM_SUBFRAME, 1); 462 CheckErrorEvent(ERR_TIMING_IPC_FROM_SUBFRAME, 1);
450 CheckTotalErrorEvents(); 463 CheckTotalErrorEvents();
451 ASSERT_EQ(0, CountUpdatedTimingReported()); 464 ASSERT_EQ(0, CountUpdatedTimingReported());
452 ASSERT_EQ(0, CountCompleteTimingReported()); 465 ASSERT_EQ(0, CountCompleteTimingReported());
453 } 466 }
454 467
455 TEST_F(MetricsWebContentsObserverTest, BadIPC) { 468 TEST_F(MetricsWebContentsObserverTest, BadIPC) {
456 PageLoadTiming timing; 469 mojom::PageLoadTiming timing;
470 page_load_metrics::InitPageLoadTimingForTest(&timing);
457 timing.navigation_start = base::Time::FromDoubleT(10); 471 timing.navigation_start = base::Time::FromDoubleT(10);
458 PageLoadTiming timing2; 472 mojom::PageLoadTiming timing2;
473 page_load_metrics::InitPageLoadTimingForTest(&timing2);
459 timing2.navigation_start = base::Time::FromDoubleT(100); 474 timing2.navigation_start = base::Time::FromDoubleT(100);
460 475
461 content::WebContentsTester* web_contents_tester = 476 content::WebContentsTester* web_contents_tester =
462 content::WebContentsTester::For(web_contents()); 477 content::WebContentsTester::For(web_contents());
463 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 478 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
464 479
465 SimulateTimingUpdate(timing); 480 SimulateTimingUpdate(timing);
466 ASSERT_EQ(1, CountUpdatedTimingReported()); 481 ASSERT_EQ(1, CountUpdatedTimingReported());
467 SimulateTimingUpdate(timing2); 482 SimulateTimingUpdate(timing2);
468 ASSERT_EQ(1, CountUpdatedTimingReported()); 483 ASSERT_EQ(1, CountUpdatedTimingReported());
469 484
470 CheckErrorEvent(ERR_BAD_TIMING_IPC_INVALID_TIMING_DESCENDENT, 1); 485 CheckErrorEvent(ERR_BAD_TIMING_IPC_INVALID_TIMING_DESCENDENT, 1);
471 CheckTotalErrorEvents(); 486 CheckTotalErrorEvents();
472 } 487 }
473 488
474 TEST_F(MetricsWebContentsObserverTest, ObservePartialNavigation) { 489 TEST_F(MetricsWebContentsObserverTest, ObservePartialNavigation) {
475 // Reset the state of the tests, and attach the MetricsWebContentsObserver in 490 // Reset the state of the tests, and attach the MetricsWebContentsObserver in
476 // the middle of a navigation. This tests that the class is robust to only 491 // the middle of a navigation. This tests that the class is robust to only
477 // observing some of a navigation. 492 // observing some of a navigation.
478 DeleteContents(); 493 DeleteContents();
479 SetContents(CreateTestWebContents()); 494 SetContents(CreateTestWebContents());
480 495
481 PageLoadTiming timing; 496 mojom::PageLoadTiming timing;
497 page_load_metrics::InitPageLoadTimingForTest(&timing);
482 timing.navigation_start = base::Time::FromDoubleT(10); 498 timing.navigation_start = base::Time::FromDoubleT(10);
483 499
484 content::WebContentsTester* web_contents_tester = 500 content::WebContentsTester* web_contents_tester =
485 content::WebContentsTester::For(web_contents()); 501 content::WebContentsTester::For(web_contents());
486 content::RenderFrameHostTester* rfh_tester = 502 content::RenderFrameHostTester* rfh_tester =
487 content::RenderFrameHostTester::For(main_rfh()); 503 content::RenderFrameHostTester::For(main_rfh());
488 504
489 // Start the navigation, then start observing the web contents. This used to 505 // Start the navigation, then start observing the web contents. This used to
490 // crash us. Make sure we bail out and don't log histograms. 506 // crash us. Make sure we bail out and don't log histograms.
491 web_contents_tester->StartNavigation(GURL(kDefaultTestUrl)); 507 web_contents_tester->StartNavigation(GURL(kDefaultTestUrl));
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); 679 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
664 ASSERT_EQ(std::vector<GURL>({GURL(kDefaultTestUrl)}), 680 ASSERT_EQ(std::vector<GURL>({GURL(kDefaultTestUrl)}),
665 completed_filtered_urls()); 681 completed_filtered_urls());
666 682
667 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); 683 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl));
668 ASSERT_EQ(std::vector<GURL>({GURL(kDefaultTestUrl), GURL(kDefaultTestUrl2)}), 684 ASSERT_EQ(std::vector<GURL>({GURL(kDefaultTestUrl), GURL(kDefaultTestUrl2)}),
669 completed_filtered_urls()); 685 completed_filtered_urls());
670 } 686 }
671 687
672 } // namespace page_load_metrics 688 } // namespace page_load_metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698