| 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/timer/mock_timer.h" | 6 #include "base/timer/mock_timer.h" |
| 7 #include "base/values.h" | 7 #include "base/values.h" |
| 8 #include "chrome/browser/engagement/site_engagement_helper.h" | 8 #include "chrome/browser/engagement/site_engagement_helper.h" |
| 9 #include "chrome/browser/engagement/site_engagement_service.h" | 9 #include "chrome/browser/engagement/site_engagement_service.h" |
| 10 #include "chrome/browser/engagement/site_engagement_service_factory.h" | 10 #include "chrome/browser/engagement/site_engagement_service_factory.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 // Simulate a mouse event and handle it. | 41 // Simulate a mouse event and handle it. |
| 42 void HandleMouseEvent(SiteEngagementHelper* helper, | 42 void HandleMouseEvent(SiteEngagementHelper* helper, |
| 43 blink::WebMouseEvent::Button button, | 43 blink::WebMouseEvent::Button button, |
| 44 blink::WebInputEvent::Type type) { | 44 blink::WebInputEvent::Type type) { |
| 45 blink::WebMouseEvent event; | 45 blink::WebMouseEvent event; |
| 46 event.button = button; | 46 event.button = button; |
| 47 event.type = type; | 47 event.type = type; |
| 48 helper->input_tracker_.HandleMouseEvent(event); | 48 helper->input_tracker_.HandleMouseEvent(event); |
| 49 } | 49 } |
| 50 | 50 |
| 51 // Set a timer object for test purposes. | 51 // Set a pause timer on the input tracker for test purposes. |
| 52 void SetHelperTimer(SiteEngagementHelper* helper, | 52 void SetInputTrackerPauseTimer(SiteEngagementHelper* helper, |
| 53 scoped_ptr<base::Timer> timer) { | 53 scoped_ptr<base::Timer> timer) { |
| 54 helper->input_tracker_.SetTimerForTesting(timer.Pass()); | 54 helper->input_tracker_.SetPauseTimerForTesting(timer.Pass()); |
| 55 } | 55 } |
| 56 | 56 |
| 57 bool CallbacksAdded(SiteEngagementHelper* helper) { | 57 bool CallbacksAdded(SiteEngagementHelper* helper) { |
| 58 return helper->input_tracker_.callbacks_added(); | 58 return helper->input_tracker_.callbacks_added(); |
| 59 } | 59 } |
| 60 }; | 60 }; |
| 61 | 61 |
| 62 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, | 62 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, |
| 63 KeyPressEngagementAccumulation) { | 63 KeyPressEngagementAccumulation) { |
| 64 GURL url1("https://www.google.com/"); | 64 GURL url1("https://www.google.com/"); |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 EXPECT_DOUBLE_EQ(1.45, service->GetTotalEngagementPoints()); | 199 EXPECT_DOUBLE_EQ(1.45, service->GetTotalEngagementPoints()); |
| 200 } | 200 } |
| 201 | 201 |
| 202 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, | 202 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, |
| 203 CheckTimerAndCallbacks) { | 203 CheckTimerAndCallbacks) { |
| 204 GURL url1("https://www.google.com/"); | 204 GURL url1("https://www.google.com/"); |
| 205 GURL url2("http://www.google.com/"); | 205 GURL url2("http://www.google.com/"); |
| 206 content::WebContents* web_contents = | 206 content::WebContents* web_contents = |
| 207 browser()->tab_strip_model()->GetActiveWebContents(); | 207 browser()->tab_strip_model()->GetActiveWebContents(); |
| 208 | 208 |
| 209 scoped_ptr<base::MockTimer> mock_timer(new base::MockTimer(true, false)); | 209 base::MockTimer* input_tracker_timer = new base::MockTimer(true, false); |
| 210 base::MockTimer* timer = mock_timer.get(); | |
| 211 scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents)); | 210 scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents)); |
| 212 SetHelperTimer(helper.get(), mock_timer.Pass()); | 211 SetInputTrackerPauseTimer(helper.get(), make_scoped_ptr(input_tracker_timer)); |
| 213 | 212 |
| 214 SiteEngagementService* service = | 213 SiteEngagementService* service = |
| 215 SiteEngagementServiceFactory::GetForProfile(browser()->profile()); | 214 SiteEngagementServiceFactory::GetForProfile(browser()->profile()); |
| 216 DCHECK(service); | 215 DCHECK(service); |
| 217 | 216 |
| 218 ui_test_utils::NavigateToURL(browser(), url1); | 217 ui_test_utils::NavigateToURL(browser(), url1); |
| 219 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url1)); | 218 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url1)); |
| 220 EXPECT_EQ(0, service->GetScore(url2)); | 219 EXPECT_EQ(0, service->GetScore(url2)); |
| 221 | 220 |
| 222 // Timer should not be running after navigation. It should start after input. | 221 // Timer should be running for navigation delay. |
| 223 EXPECT_FALSE(timer->IsRunning()); | 222 EXPECT_TRUE(input_tracker_timer->IsRunning()); |
| 223 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 224 input_tracker_timer->Fire(); |
| 225 |
| 226 // Timer should start running again after input. |
| 227 EXPECT_FALSE(input_tracker_timer->IsRunning()); |
| 224 EXPECT_TRUE(CallbacksAdded(helper.get())); | 228 EXPECT_TRUE(CallbacksAdded(helper.get())); |
| 225 HandleKeyPress(helper.get(), ui::VKEY_RETURN); | 229 HandleKeyPress(helper.get(), ui::VKEY_RETURN); |
| 226 EXPECT_TRUE(timer->IsRunning()); | 230 EXPECT_TRUE(input_tracker_timer->IsRunning()); |
| 227 EXPECT_FALSE(CallbacksAdded(helper.get())); | 231 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 228 | 232 |
| 229 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url1)); | 233 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url1)); |
| 230 EXPECT_EQ(0, service->GetScore(url2)); | 234 EXPECT_EQ(0, service->GetScore(url2)); |
| 231 timer->Fire(); | |
| 232 | 235 |
| 233 EXPECT_FALSE(timer->IsRunning()); | 236 input_tracker_timer->Fire(); |
| 237 EXPECT_FALSE(input_tracker_timer->IsRunning()); |
| 234 EXPECT_TRUE(CallbacksAdded(helper.get())); | 238 EXPECT_TRUE(CallbacksAdded(helper.get())); |
| 239 |
| 240 // Timer should start running again after input. |
| 235 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonNone, | 241 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonNone, |
| 236 blink::WebInputEvent::MouseWheel); | 242 blink::WebInputEvent::MouseWheel); |
| 237 EXPECT_TRUE(timer->IsRunning()); | 243 EXPECT_TRUE(input_tracker_timer->IsRunning()); |
| 238 EXPECT_FALSE(CallbacksAdded(helper.get())); | 244 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 239 | 245 |
| 240 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); | 246 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); |
| 241 EXPECT_EQ(0, service->GetScore(url2)); | 247 EXPECT_EQ(0, service->GetScore(url2)); |
| 242 timer->Fire(); | |
| 243 | 248 |
| 244 EXPECT_FALSE(timer->IsRunning()); | 249 input_tracker_timer->Fire(); |
| 250 EXPECT_FALSE(input_tracker_timer->IsRunning()); |
| 245 EXPECT_TRUE(CallbacksAdded(helper.get())); | 251 EXPECT_TRUE(CallbacksAdded(helper.get())); |
| 252 |
| 253 // Timer should be running for navigation delay. |
| 246 ui_test_utils::NavigateToURL(browser(), url2); | 254 ui_test_utils::NavigateToURL(browser(), url2); |
| 247 EXPECT_FALSE(timer->IsRunning()); | 255 EXPECT_TRUE(input_tracker_timer->IsRunning()); |
| 248 EXPECT_TRUE(CallbacksAdded(helper.get())); | 256 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 249 | 257 |
| 250 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); | 258 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); |
| 251 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url2)); | 259 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url2)); |
| 252 | 260 |
| 261 input_tracker_timer->Fire(); |
| 262 EXPECT_FALSE(input_tracker_timer->IsRunning()); |
| 263 EXPECT_TRUE(CallbacksAdded(helper.get())); |
| 264 |
| 253 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonRight, | 265 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonRight, |
| 254 blink::WebInputEvent::MouseDown); | 266 blink::WebInputEvent::MouseDown); |
| 255 EXPECT_TRUE(timer->IsRunning()); | 267 EXPECT_TRUE(input_tracker_timer->IsRunning()); |
| 256 EXPECT_FALSE(CallbacksAdded(helper.get())); | 268 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 257 | 269 |
| 258 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); | 270 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); |
| 259 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url2)); | 271 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url2)); |
| 260 EXPECT_DOUBLE_EQ(1.15, service->GetTotalEngagementPoints()); | 272 EXPECT_DOUBLE_EQ(1.15, service->GetTotalEngagementPoints()); |
| 261 } | 273 } |
| 274 |
| 275 // Ensure that navigation does not trigger input tracking until after a delay. |
| 276 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, ShowAndHide) { |
| 277 GURL url1("https://www.google.com/"); |
| 278 GURL url2("http://www.google.com/"); |
| 279 content::WebContents* web_contents = |
| 280 browser()->tab_strip_model()->GetActiveWebContents(); |
| 281 |
| 282 base::MockTimer* input_tracker_timer = new base::MockTimer(true, false); |
| 283 scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents)); |
| 284 SetInputTrackerPauseTimer(helper.get(), make_scoped_ptr(input_tracker_timer)); |
| 285 |
| 286 ui_test_utils::NavigateToURL(browser(), url1); |
| 287 input_tracker_timer->Fire(); |
| 288 |
| 289 EXPECT_FALSE(input_tracker_timer->IsRunning()); |
| 290 EXPECT_TRUE(CallbacksAdded(helper.get())); |
| 291 |
| 292 // Hiding the tab should stop input tracking. |
| 293 ui_test_utils::NavigateToURLWithDisposition( |
| 294 browser(), url2, NEW_FOREGROUND_TAB, |
| 295 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 296 |
| 297 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 298 |
| 299 // Showing the tab should start tracking again after another delay. |
| 300 browser()->tab_strip_model()->ActivateTabAt(0, true); |
| 301 EXPECT_TRUE(input_tracker_timer->IsRunning()); |
| 302 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 303 |
| 304 input_tracker_timer->Fire(); |
| 305 EXPECT_FALSE(input_tracker_timer->IsRunning()); |
| 306 EXPECT_TRUE(CallbacksAdded(helper.get())); |
| 307 |
| 308 // New background tabs should not affect the current tab's input tracking. |
| 309 ui_test_utils::NavigateToURLWithDisposition( |
| 310 browser(), url2, NEW_BACKGROUND_TAB, |
| 311 ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); |
| 312 EXPECT_FALSE(input_tracker_timer->IsRunning()); |
| 313 EXPECT_TRUE(CallbacksAdded(helper.get())); |
| 314 |
| 315 // Ensure behavior holds when tab is hidden before the initial delay timer |
| 316 // fires. |
| 317 ui_test_utils::NavigateToURL(browser(), url2); |
| 318 EXPECT_TRUE(input_tracker_timer->IsRunning()); |
| 319 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 320 |
| 321 ui_test_utils::NavigateToURLWithDisposition( |
| 322 browser(), url2, NEW_FOREGROUND_TAB, |
| 323 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 324 EXPECT_FALSE(input_tracker_timer->IsRunning()); |
| 325 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 326 |
| 327 // Showing the tab should start tracking again after another delay. |
| 328 browser()->tab_strip_model()->ActivateTabAt(0, true); |
| 329 EXPECT_TRUE(input_tracker_timer->IsRunning()); |
| 330 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 331 |
| 332 input_tracker_timer->Fire(); |
| 333 EXPECT_TRUE(CallbacksAdded(helper.get())); |
| 334 } |
| 335 |
| 336 // Ensure tracking behavior is correct for multiple navigations in a single tab. |
| 337 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, SingleTabNavigation) { |
| 338 GURL url1("https://www.google.com/"); |
| 339 GURL url2("https://www.example.com/"); |
| 340 content::WebContents* web_contents = |
| 341 browser()->tab_strip_model()->GetActiveWebContents(); |
| 342 |
| 343 base::MockTimer* input_tracker_timer = new base::MockTimer(true, false); |
| 344 scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents)); |
| 345 SetInputTrackerPauseTimer(helper.get(), make_scoped_ptr(input_tracker_timer)); |
| 346 |
| 347 // Navigation should start the initial delay timer. |
| 348 ui_test_utils::NavigateToURL(browser(), url1); |
| 349 EXPECT_TRUE(input_tracker_timer->IsRunning()); |
| 350 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 351 |
| 352 // Navigating before the timer fires should simply reset the timer. |
| 353 ui_test_utils::NavigateToURL(browser(), url2); |
| 354 EXPECT_TRUE(input_tracker_timer->IsRunning()); |
| 355 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 356 |
| 357 // When the timer fires, callbacks are added. |
| 358 input_tracker_timer->Fire(); |
| 359 EXPECT_FALSE(input_tracker_timer->IsRunning()); |
| 360 EXPECT_TRUE(CallbacksAdded(helper.get())); |
| 361 |
| 362 // Navigation should start the initial delay timer again. |
| 363 ui_test_utils::NavigateToURL(browser(), url1); |
| 364 EXPECT_TRUE(input_tracker_timer->IsRunning()); |
| 365 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 366 } |
| OLD | NEW |