OLD | NEW |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |