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

Side by Side Diff: chrome/browser/engagement/site_engagement_service_browsertest.cc

Issue 1373363005: Add a delay to Site Engagement tracking after navigation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comment Created 5 years, 2 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
« no previous file with comments | « chrome/browser/engagement/site_engagement_helper.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "base/command_line.h" 5 #include "base/command_line.h"
6 #include "base/test/histogram_tester.h" 6 #include "base/test/histogram_tester.h"
7 #include "base/timer/mock_timer.h" 7 #include "base/timer/mock_timer.h"
8 #include "base/values.h" 8 #include "base/values.h"
9 #include "chrome/browser/engagement/site_engagement_helper.h" 9 #include "chrome/browser/engagement/site_engagement_helper.h"
10 #include "chrome/browser/engagement/site_engagement_service.h" 10 #include "chrome/browser/engagement/site_engagement_service.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 // Simulate a mouse event and handle it. 42 // Simulate a mouse event and handle it.
43 void HandleMouseEvent(SiteEngagementHelper* helper, 43 void HandleMouseEvent(SiteEngagementHelper* helper,
44 blink::WebMouseEvent::Button button, 44 blink::WebMouseEvent::Button button,
45 blink::WebInputEvent::Type type) { 45 blink::WebInputEvent::Type type) {
46 blink::WebMouseEvent event; 46 blink::WebMouseEvent event;
47 event.button = button; 47 event.button = button;
48 event.type = type; 48 event.type = type;
49 helper->input_tracker_.HandleMouseEvent(event); 49 helper->input_tracker_.HandleMouseEvent(event);
50 } 50 }
51 51
52 // Set a timer object for test purposes. 52 // Set a pause timer on the input tracker for test purposes.
53 void SetHelperTimer(SiteEngagementHelper* helper, 53 void SetInputTrackerPauseTimer(SiteEngagementHelper* helper,
54 scoped_ptr<base::Timer> timer) { 54 scoped_ptr<base::Timer> timer) {
55 helper->input_tracker_.SetTimerForTesting(timer.Pass()); 55 helper->input_tracker_.SetPauseTimerForTesting(timer.Pass());
56 } 56 }
57 57
58 bool CallbacksAdded(SiteEngagementHelper* helper) { 58 bool IsTracking(SiteEngagementHelper* helper) {
59 return helper->input_tracker_.callbacks_added(); 59 return helper->input_tracker_.is_tracking();
60 } 60 }
61 }; 61 };
62 62
63 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, 63 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest,
64 KeyPressEngagementAccumulation) { 64 KeyPressEngagementAccumulation) {
65 GURL url1("https://www.google.com/"); 65 GURL url1("https://www.google.com/");
66 GURL url2("http://www.google.com/"); 66 GURL url2("http://www.google.com/");
67 content::WebContents* web_contents = 67 content::WebContents* web_contents =
68 browser()->tab_strip_model()->GetActiveWebContents(); 68 browser()->tab_strip_model()->GetActiveWebContents();
69 69
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 SiteEngagementMetrics::ENGAGEMENT_MOUSE, 5); 230 SiteEngagementMetrics::ENGAGEMENT_MOUSE, 5);
231 } 231 }
232 232
233 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, 233 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest,
234 CheckTimerAndCallbacks) { 234 CheckTimerAndCallbacks) {
235 GURL url1("https://www.google.com/"); 235 GURL url1("https://www.google.com/");
236 GURL url2("http://www.google.com/"); 236 GURL url2("http://www.google.com/");
237 content::WebContents* web_contents = 237 content::WebContents* web_contents =
238 browser()->tab_strip_model()->GetActiveWebContents(); 238 browser()->tab_strip_model()->GetActiveWebContents();
239 239
240 scoped_ptr<base::MockTimer> mock_timer(new base::MockTimer(true, false)); 240 base::MockTimer* input_tracker_timer = new base::MockTimer(true, false);
241 base::MockTimer* timer = mock_timer.get();
242 scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents)); 241 scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents));
243 SetHelperTimer(helper.get(), mock_timer.Pass()); 242 SetInputTrackerPauseTimer(helper.get(), make_scoped_ptr(input_tracker_timer));
244 243
245 SiteEngagementService* service = 244 SiteEngagementService* service =
246 SiteEngagementServiceFactory::GetForProfile(browser()->profile()); 245 SiteEngagementServiceFactory::GetForProfile(browser()->profile());
247 DCHECK(service); 246 DCHECK(service);
248 247
249 ui_test_utils::NavigateToURL(browser(), url1); 248 ui_test_utils::NavigateToURL(browser(), url1);
250 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url1)); 249 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url1));
251 EXPECT_EQ(0, service->GetScore(url2)); 250 EXPECT_EQ(0, service->GetScore(url2));
252 251
253 // Timer should not be running after navigation. It should start after input. 252 // Timer should be running for navigation delay.
254 EXPECT_FALSE(timer->IsRunning()); 253 EXPECT_TRUE(input_tracker_timer->IsRunning());
255 EXPECT_TRUE(CallbacksAdded(helper.get())); 254 EXPECT_FALSE(IsTracking(helper.get()));
255 input_tracker_timer->Fire();
256
257 // Timer should start running again after input.
258 EXPECT_FALSE(input_tracker_timer->IsRunning());
259 EXPECT_TRUE(IsTracking(helper.get()));
256 HandleKeyPress(helper.get(), ui::VKEY_RETURN); 260 HandleKeyPress(helper.get(), ui::VKEY_RETURN);
257 EXPECT_TRUE(timer->IsRunning()); 261 EXPECT_TRUE(input_tracker_timer->IsRunning());
258 EXPECT_FALSE(CallbacksAdded(helper.get())); 262 EXPECT_FALSE(IsTracking(helper.get()));
259 263
260 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url1)); 264 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url1));
261 EXPECT_EQ(0, service->GetScore(url2)); 265 EXPECT_EQ(0, service->GetScore(url2));
262 timer->Fire();
263 266
264 EXPECT_FALSE(timer->IsRunning()); 267 input_tracker_timer->Fire();
265 EXPECT_TRUE(CallbacksAdded(helper.get())); 268 EXPECT_FALSE(input_tracker_timer->IsRunning());
269 EXPECT_TRUE(IsTracking(helper.get()));
270
271 // Timer should start running again after input.
266 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonNone, 272 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonNone,
267 blink::WebInputEvent::MouseWheel); 273 blink::WebInputEvent::MouseWheel);
268 EXPECT_TRUE(timer->IsRunning()); 274 EXPECT_TRUE(input_tracker_timer->IsRunning());
269 EXPECT_FALSE(CallbacksAdded(helper.get())); 275 EXPECT_FALSE(IsTracking(helper.get()));
270 276
271 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); 277 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1));
272 EXPECT_EQ(0, service->GetScore(url2)); 278 EXPECT_EQ(0, service->GetScore(url2));
273 timer->Fire();
274 279
275 EXPECT_FALSE(timer->IsRunning()); 280 input_tracker_timer->Fire();
276 EXPECT_TRUE(CallbacksAdded(helper.get())); 281 EXPECT_FALSE(input_tracker_timer->IsRunning());
282 EXPECT_TRUE(IsTracking(helper.get()));
283
284 // Timer should be running for navigation delay.
277 ui_test_utils::NavigateToURL(browser(), url2); 285 ui_test_utils::NavigateToURL(browser(), url2);
278 EXPECT_FALSE(timer->IsRunning()); 286 EXPECT_TRUE(input_tracker_timer->IsRunning());
279 EXPECT_TRUE(CallbacksAdded(helper.get())); 287 EXPECT_FALSE(IsTracking(helper.get()));
280 288
281 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); 289 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1));
282 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url2)); 290 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url2));
283 291
292 input_tracker_timer->Fire();
293 EXPECT_FALSE(input_tracker_timer->IsRunning());
294 EXPECT_TRUE(IsTracking(helper.get()));
295
284 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonRight, 296 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonRight,
285 blink::WebInputEvent::MouseDown); 297 blink::WebInputEvent::MouseDown);
286 EXPECT_TRUE(timer->IsRunning()); 298 EXPECT_TRUE(input_tracker_timer->IsRunning());
287 EXPECT_FALSE(CallbacksAdded(helper.get())); 299 EXPECT_FALSE(IsTracking(helper.get()));
288 300
289 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); 301 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1));
290 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url2)); 302 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url2));
291 EXPECT_DOUBLE_EQ(1.15, service->GetTotalEngagementPoints()); 303 EXPECT_DOUBLE_EQ(1.15, service->GetTotalEngagementPoints());
292 } 304 }
305
306 // Ensure that navigation does not trigger input tracking until after a delay.
307 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, ShowAndHide) {
308 GURL url1("https://www.google.com/");
309 GURL url2("http://www.google.com/");
310 content::WebContents* web_contents =
311 browser()->tab_strip_model()->GetActiveWebContents();
312
313 base::MockTimer* input_tracker_timer = new base::MockTimer(true, false);
314 scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents));
315 SetInputTrackerPauseTimer(helper.get(), make_scoped_ptr(input_tracker_timer));
316
317 ui_test_utils::NavigateToURL(browser(), url1);
318 input_tracker_timer->Fire();
319
320 EXPECT_FALSE(input_tracker_timer->IsRunning());
321 EXPECT_TRUE(IsTracking(helper.get()));
322
323 // Hiding the tab should stop input tracking.
324 ui_test_utils::NavigateToURLWithDisposition(
325 browser(), url2, NEW_FOREGROUND_TAB,
326 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
327
328 EXPECT_FALSE(IsTracking(helper.get()));
329
330 // Showing the tab should start tracking again after another delay.
331 browser()->tab_strip_model()->ActivateTabAt(0, true);
332 EXPECT_TRUE(input_tracker_timer->IsRunning());
333 EXPECT_FALSE(IsTracking(helper.get()));
334
335 input_tracker_timer->Fire();
336 EXPECT_FALSE(input_tracker_timer->IsRunning());
337 EXPECT_TRUE(IsTracking(helper.get()));
338
339 // New background tabs should not affect the current tab's input tracking.
340 ui_test_utils::NavigateToURLWithDisposition(
341 browser(), url2, NEW_BACKGROUND_TAB,
342 ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
343 EXPECT_FALSE(input_tracker_timer->IsRunning());
344 EXPECT_TRUE(IsTracking(helper.get()));
345
346 // Ensure behavior holds when tab is hidden before the initial delay timer
347 // fires.
348 ui_test_utils::NavigateToURL(browser(), url2);
349 EXPECT_TRUE(input_tracker_timer->IsRunning());
350 EXPECT_FALSE(IsTracking(helper.get()));
351
352 ui_test_utils::NavigateToURLWithDisposition(
353 browser(), url2, NEW_FOREGROUND_TAB,
354 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
355 EXPECT_FALSE(input_tracker_timer->IsRunning());
356 EXPECT_FALSE(IsTracking(helper.get()));
357
358 // Showing the tab should start tracking again after another delay.
359 browser()->tab_strip_model()->ActivateTabAt(0, true);
360 EXPECT_TRUE(input_tracker_timer->IsRunning());
361 EXPECT_FALSE(IsTracking(helper.get()));
362
363 input_tracker_timer->Fire();
364 EXPECT_TRUE(IsTracking(helper.get()));
365 }
366
367 // Ensure tracking behavior is correct for multiple navigations in a single tab.
368 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, SingleTabNavigation) {
369 GURL url1("https://www.google.com/");
370 GURL url2("https://www.example.com/");
371 content::WebContents* web_contents =
372 browser()->tab_strip_model()->GetActiveWebContents();
373
374 base::MockTimer* input_tracker_timer = new base::MockTimer(true, false);
375 scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents));
376 SetInputTrackerPauseTimer(helper.get(), make_scoped_ptr(input_tracker_timer));
377
378 // Navigation should start the initial delay timer.
379 ui_test_utils::NavigateToURL(browser(), url1);
380 EXPECT_TRUE(input_tracker_timer->IsRunning());
381 EXPECT_FALSE(IsTracking(helper.get()));
382
383 // Navigating before the timer fires should simply reset the timer.
384 ui_test_utils::NavigateToURL(browser(), url2);
385 EXPECT_TRUE(input_tracker_timer->IsRunning());
386 EXPECT_FALSE(IsTracking(helper.get()));
387
388 // When the timer fires, callbacks are added.
389 input_tracker_timer->Fire();
390 EXPECT_FALSE(input_tracker_timer->IsRunning());
391 EXPECT_TRUE(IsTracking(helper.get()));
392
393 // Navigation should start the initial delay timer again.
394 ui_test_utils::NavigateToURL(browser(), url1);
395 EXPECT_TRUE(input_tracker_timer->IsRunning());
396 EXPECT_FALSE(IsTracking(helper.get()));
397 }
398
399 // Ensure tracking behavior is correct for multiple navigations in a single tab.
400 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, SwitchRenderViewHost) {
401 GURL url1("https://www.google.com/");
402 GURL url2("https://www.example.com/");
403 content::WebContents* web_contents =
404 browser()->tab_strip_model()->GetActiveWebContents();
405
406 base::MockTimer* input_tracker_timer = new base::MockTimer(true, false);
407 scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents));
408 SetInputTrackerPauseTimer(helper.get(), make_scoped_ptr(input_tracker_timer));
409
410 // Navigation starts the initial delay timer.
411 ui_test_utils::NavigateToURL(browser(), url1);
412 EXPECT_TRUE(input_tracker_timer->IsRunning());
413 EXPECT_FALSE(IsTracking(helper.get()));
414
415 content::RenderViewHost* rvh = web_contents->GetRenderViewHost();
416
417 // The timer should still be running after the RenderViewHost is changed.
418 helper->RenderViewHostChanged(rvh, rvh);
419 EXPECT_TRUE(input_tracker_timer->IsRunning());
420 EXPECT_FALSE(IsTracking(helper.get()));
421
422 // Firing the timer should add the callbacks.
423 input_tracker_timer->Fire();
424 EXPECT_FALSE(input_tracker_timer->IsRunning());
425 EXPECT_TRUE(IsTracking(helper.get()));
426
427 // The callbacks should be on readded another RVH change since the timer has
428 // already fired.
429 helper->RenderViewHostChanged(rvh, rvh);
430 EXPECT_FALSE(input_tracker_timer->IsRunning());
431 EXPECT_TRUE(IsTracking(helper.get()));
432
433 // Ensure nothing bad happens with a destroyed RVH.
434 helper->RenderViewHostChanged(nullptr, rvh);
435 EXPECT_FALSE(input_tracker_timer->IsRunning());
436 EXPECT_TRUE(IsTracking(helper.get()));
437
438 // Ensure nothing happens when RVH change happens for a hidden tab.
439 helper->WasHidden();
440 EXPECT_FALSE(input_tracker_timer->IsRunning());
441 EXPECT_FALSE(IsTracking(helper.get()));
442
443 helper->RenderViewHostChanged(nullptr, rvh);
444 EXPECT_FALSE(input_tracker_timer->IsRunning());
445 EXPECT_FALSE(IsTracking(helper.get()));
446 }
OLDNEW
« no previous file with comments | « chrome/browser/engagement/site_engagement_helper.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698