Index: chrome/browser/engagement/site_engagement_service_browsertest.cc |
diff --git a/chrome/browser/engagement/site_engagement_service_browsertest.cc b/chrome/browser/engagement/site_engagement_service_browsertest.cc |
index bec367aa36e7e6336e7a7dabb5f63a248ea088b1..2da4efa2571129a089b5632ce1e5d163e0a1829a 100644 |
--- a/chrome/browser/engagement/site_engagement_service_browsertest.cc |
+++ b/chrome/browser/engagement/site_engagement_service_browsertest.cc |
@@ -49,14 +49,14 @@ class SiteEngagementServiceBrowserTest : public InProcessBrowserTest { |
helper->input_tracker_.HandleMouseEvent(event); |
} |
- // Set a timer object for test purposes. |
- void SetHelperTimer(SiteEngagementHelper* helper, |
- scoped_ptr<base::Timer> timer) { |
- helper->input_tracker_.SetTimerForTesting(timer.Pass()); |
+ // Set a pause timer on the input tracker for test purposes. |
+ void SetInputTrackerPauseTimer(SiteEngagementHelper* helper, |
+ scoped_ptr<base::Timer> timer) { |
+ helper->input_tracker_.SetPauseTimerForTesting(timer.Pass()); |
} |
- bool CallbacksAdded(SiteEngagementHelper* helper) { |
- return helper->input_tracker_.callbacks_added(); |
+ bool IsTracking(SiteEngagementHelper* helper) { |
+ return helper->input_tracker_.is_tracking(); |
} |
}; |
@@ -237,10 +237,9 @@ IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, |
content::WebContents* web_contents = |
browser()->tab_strip_model()->GetActiveWebContents(); |
- scoped_ptr<base::MockTimer> mock_timer(new base::MockTimer(true, false)); |
- base::MockTimer* timer = mock_timer.get(); |
+ base::MockTimer* input_tracker_timer = new base::MockTimer(true, false); |
scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents)); |
- SetHelperTimer(helper.get(), mock_timer.Pass()); |
+ SetInputTrackerPauseTimer(helper.get(), make_scoped_ptr(input_tracker_timer)); |
SiteEngagementService* service = |
SiteEngagementServiceFactory::GetForProfile(browser()->profile()); |
@@ -250,43 +249,198 @@ IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, |
EXPECT_DOUBLE_EQ(0.5, service->GetScore(url1)); |
EXPECT_EQ(0, service->GetScore(url2)); |
- // Timer should not be running after navigation. It should start after input. |
- EXPECT_FALSE(timer->IsRunning()); |
- EXPECT_TRUE(CallbacksAdded(helper.get())); |
+ // Timer should be running for navigation delay. |
+ EXPECT_TRUE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
+ input_tracker_timer->Fire(); |
+ |
+ // Timer should start running again after input. |
+ EXPECT_FALSE(input_tracker_timer->IsRunning()); |
+ EXPECT_TRUE(IsTracking(helper.get())); |
HandleKeyPress(helper.get(), ui::VKEY_RETURN); |
- EXPECT_TRUE(timer->IsRunning()); |
- EXPECT_FALSE(CallbacksAdded(helper.get())); |
+ EXPECT_TRUE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
EXPECT_DOUBLE_EQ(0.55, service->GetScore(url1)); |
EXPECT_EQ(0, service->GetScore(url2)); |
- timer->Fire(); |
- EXPECT_FALSE(timer->IsRunning()); |
- EXPECT_TRUE(CallbacksAdded(helper.get())); |
+ input_tracker_timer->Fire(); |
+ EXPECT_FALSE(input_tracker_timer->IsRunning()); |
+ EXPECT_TRUE(IsTracking(helper.get())); |
+ |
+ // Timer should start running again after input. |
HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonNone, |
blink::WebInputEvent::MouseWheel); |
- EXPECT_TRUE(timer->IsRunning()); |
- EXPECT_FALSE(CallbacksAdded(helper.get())); |
+ EXPECT_TRUE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); |
EXPECT_EQ(0, service->GetScore(url2)); |
- timer->Fire(); |
- EXPECT_FALSE(timer->IsRunning()); |
- EXPECT_TRUE(CallbacksAdded(helper.get())); |
+ input_tracker_timer->Fire(); |
+ EXPECT_FALSE(input_tracker_timer->IsRunning()); |
+ EXPECT_TRUE(IsTracking(helper.get())); |
+ |
+ // Timer should be running for navigation delay. |
ui_test_utils::NavigateToURL(browser(), url2); |
- EXPECT_FALSE(timer->IsRunning()); |
- EXPECT_TRUE(CallbacksAdded(helper.get())); |
+ EXPECT_TRUE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); |
EXPECT_DOUBLE_EQ(0.5, service->GetScore(url2)); |
+ input_tracker_timer->Fire(); |
+ EXPECT_FALSE(input_tracker_timer->IsRunning()); |
+ EXPECT_TRUE(IsTracking(helper.get())); |
+ |
HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonRight, |
blink::WebInputEvent::MouseDown); |
- EXPECT_TRUE(timer->IsRunning()); |
- EXPECT_FALSE(CallbacksAdded(helper.get())); |
+ EXPECT_TRUE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); |
EXPECT_DOUBLE_EQ(0.55, service->GetScore(url2)); |
EXPECT_DOUBLE_EQ(1.15, service->GetTotalEngagementPoints()); |
} |
+ |
+// Ensure that navigation does not trigger input tracking until after a delay. |
+IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, ShowAndHide) { |
+ GURL url1("https://www.google.com/"); |
+ GURL url2("http://www.google.com/"); |
+ content::WebContents* web_contents = |
+ browser()->tab_strip_model()->GetActiveWebContents(); |
+ |
+ base::MockTimer* input_tracker_timer = new base::MockTimer(true, false); |
+ scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents)); |
+ SetInputTrackerPauseTimer(helper.get(), make_scoped_ptr(input_tracker_timer)); |
+ |
+ ui_test_utils::NavigateToURL(browser(), url1); |
+ input_tracker_timer->Fire(); |
+ |
+ EXPECT_FALSE(input_tracker_timer->IsRunning()); |
+ EXPECT_TRUE(IsTracking(helper.get())); |
+ |
+ // Hiding the tab should stop input tracking. |
+ ui_test_utils::NavigateToURLWithDisposition( |
+ browser(), url2, NEW_FOREGROUND_TAB, |
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
+ |
+ EXPECT_FALSE(IsTracking(helper.get())); |
+ |
+ // Showing the tab should start tracking again after another delay. |
+ browser()->tab_strip_model()->ActivateTabAt(0, true); |
+ EXPECT_TRUE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
+ |
+ input_tracker_timer->Fire(); |
+ EXPECT_FALSE(input_tracker_timer->IsRunning()); |
+ EXPECT_TRUE(IsTracking(helper.get())); |
+ |
+ // New background tabs should not affect the current tab's input tracking. |
+ ui_test_utils::NavigateToURLWithDisposition( |
+ browser(), url2, NEW_BACKGROUND_TAB, |
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); |
+ EXPECT_FALSE(input_tracker_timer->IsRunning()); |
+ EXPECT_TRUE(IsTracking(helper.get())); |
+ |
+ // Ensure behavior holds when tab is hidden before the initial delay timer |
+ // fires. |
+ ui_test_utils::NavigateToURL(browser(), url2); |
+ EXPECT_TRUE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
+ |
+ ui_test_utils::NavigateToURLWithDisposition( |
+ browser(), url2, NEW_FOREGROUND_TAB, |
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
+ EXPECT_FALSE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
+ |
+ // Showing the tab should start tracking again after another delay. |
+ browser()->tab_strip_model()->ActivateTabAt(0, true); |
+ EXPECT_TRUE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
+ |
+ input_tracker_timer->Fire(); |
+ EXPECT_TRUE(IsTracking(helper.get())); |
+} |
+ |
+// Ensure tracking behavior is correct for multiple navigations in a single tab. |
+IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, SingleTabNavigation) { |
+ GURL url1("https://www.google.com/"); |
+ GURL url2("https://www.example.com/"); |
+ content::WebContents* web_contents = |
+ browser()->tab_strip_model()->GetActiveWebContents(); |
+ |
+ base::MockTimer* input_tracker_timer = new base::MockTimer(true, false); |
+ scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents)); |
+ SetInputTrackerPauseTimer(helper.get(), make_scoped_ptr(input_tracker_timer)); |
+ |
+ // Navigation should start the initial delay timer. |
+ ui_test_utils::NavigateToURL(browser(), url1); |
+ EXPECT_TRUE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
+ |
+ // Navigating before the timer fires should simply reset the timer. |
+ ui_test_utils::NavigateToURL(browser(), url2); |
+ EXPECT_TRUE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
+ |
+ // When the timer fires, callbacks are added. |
+ input_tracker_timer->Fire(); |
+ EXPECT_FALSE(input_tracker_timer->IsRunning()); |
+ EXPECT_TRUE(IsTracking(helper.get())); |
+ |
+ // Navigation should start the initial delay timer again. |
+ ui_test_utils::NavigateToURL(browser(), url1); |
+ EXPECT_TRUE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
+} |
+ |
+// Ensure tracking behavior is correct for multiple navigations in a single tab. |
+IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, SwitchRenderViewHost) { |
+ GURL url1("https://www.google.com/"); |
+ GURL url2("https://www.example.com/"); |
+ content::WebContents* web_contents = |
+ browser()->tab_strip_model()->GetActiveWebContents(); |
+ |
+ base::MockTimer* input_tracker_timer = new base::MockTimer(true, false); |
+ scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents)); |
+ SetInputTrackerPauseTimer(helper.get(), make_scoped_ptr(input_tracker_timer)); |
+ |
+ // Navigation starts the initial delay timer. |
+ ui_test_utils::NavigateToURL(browser(), url1); |
+ EXPECT_TRUE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
+ |
+ content::RenderViewHost* rvh = web_contents->GetRenderViewHost(); |
+ |
+ // The timer should still be running after the RenderViewHost is changed. |
+ helper->RenderViewHostChanged(rvh, rvh); |
+ EXPECT_TRUE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
+ |
+ // Firing the timer should add the callbacks. |
+ input_tracker_timer->Fire(); |
+ EXPECT_FALSE(input_tracker_timer->IsRunning()); |
+ EXPECT_TRUE(IsTracking(helper.get())); |
+ |
+ // The callbacks should be on readded another RVH change since the timer has |
+ // already fired. |
+ helper->RenderViewHostChanged(rvh, rvh); |
+ EXPECT_FALSE(input_tracker_timer->IsRunning()); |
+ EXPECT_TRUE(IsTracking(helper.get())); |
+ |
+ // Ensure nothing bad happens with a destroyed RVH. |
+ helper->RenderViewHostChanged(nullptr, rvh); |
+ EXPECT_FALSE(input_tracker_timer->IsRunning()); |
+ EXPECT_TRUE(IsTracking(helper.get())); |
+ |
+ // Ensure nothing happens when RVH change happens for a hidden tab. |
+ helper->WasHidden(); |
+ EXPECT_FALSE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
+ |
+ helper->RenderViewHostChanged(nullptr, rvh); |
+ EXPECT_FALSE(input_tracker_timer->IsRunning()); |
+ EXPECT_FALSE(IsTracking(helper.get())); |
+} |