OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "base/command_line.h" |
| 6 #include "base/timer/mock_timer.h" |
| 7 #include "base/values.h" |
| 8 #include "chrome/browser/engagement/site_engagement_helper.h" |
| 9 #include "chrome/browser/engagement/site_engagement_service.h" |
| 10 #include "chrome/browser/engagement/site_engagement_service_factory.h" |
| 11 #include "chrome/browser/ui/browser.h" |
| 12 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 13 #include "chrome/common/chrome_switches.h" |
| 14 #include "chrome/test/base/in_process_browser_test.h" |
| 15 #include "chrome/test/base/ui_test_utils.h" |
| 16 #include "content/public/test/browser_test_utils.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" |
| 18 #include "ui/events/keycodes/keyboard_codes.h" |
| 19 |
| 20 class SiteEngagementServiceBrowserTest : public InProcessBrowserTest { |
| 21 public: |
| 22 // Create a SiteEngagementHelper. Called here as friend class methods cannot |
| 23 // be called in tests. |
| 24 scoped_ptr<SiteEngagementHelper> CreateHelper( |
| 25 content::WebContents* web_contents) { |
| 26 scoped_ptr<SiteEngagementHelper> helper( |
| 27 new SiteEngagementHelper(web_contents)); |
| 28 DCHECK(helper.get()); |
| 29 |
| 30 return helper.Pass(); |
| 31 } |
| 32 |
| 33 // Simulate a key press event and handle it. |
| 34 void HandleKeyPress(SiteEngagementHelper* helper, ui::KeyboardCode key) { |
| 35 content::NativeWebKeyboardEvent event; |
| 36 event.windowsKeyCode = key; |
| 37 event.type = blink::WebKeyboardEvent::RawKeyDown; |
| 38 helper->input_tracker_.HandleKeyPressEvent(event); |
| 39 } |
| 40 |
| 41 // Simulate a mouse event and handle it. |
| 42 void HandleMouseEvent(SiteEngagementHelper* helper, |
| 43 blink::WebMouseEvent::Button button, |
| 44 blink::WebInputEvent::Type type) { |
| 45 blink::WebMouseEvent event; |
| 46 event.button = button; |
| 47 event.type = type; |
| 48 helper->input_tracker_.HandleMouseEvent(event); |
| 49 } |
| 50 |
| 51 // Set a timer object for test purposes. |
| 52 void SetHelperTimer(SiteEngagementHelper* helper, |
| 53 scoped_ptr<base::Timer> timer) { |
| 54 helper->input_tracker_.SetTimerForTesting(timer.Pass()); |
| 55 } |
| 56 |
| 57 bool CallbacksAdded(SiteEngagementHelper* helper) { |
| 58 return helper->input_tracker_.callbacks_added(); |
| 59 } |
| 60 }; |
| 61 |
| 62 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, |
| 63 KeyPressEngagementAccumulation) { |
| 64 GURL url1("https://www.google.com/"); |
| 65 GURL url2("http://www.google.com/"); |
| 66 content::WebContents* web_contents = |
| 67 browser()->tab_strip_model()->GetActiveWebContents(); |
| 68 |
| 69 scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents)); |
| 70 SiteEngagementService* service = |
| 71 SiteEngagementServiceFactory::GetForProfile(browser()->profile()); |
| 72 DCHECK(service); |
| 73 |
| 74 // Check that navigation triggers engagement. |
| 75 ui_test_utils::NavigateToURL(browser(), url1); |
| 76 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url1)); |
| 77 EXPECT_EQ(0, service->GetScore(url2)); |
| 78 |
| 79 // Simulate a key press trigger and ensure it is treated correctly. |
| 80 HandleKeyPress(helper.get(), ui::VKEY_DOWN); |
| 81 |
| 82 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url1)); |
| 83 EXPECT_EQ(0, service->GetScore(url2)); |
| 84 |
| 85 // Simulate three key presses, and ensure they are treated correctly. |
| 86 HandleKeyPress(helper.get(), ui::VKEY_UP); |
| 87 HandleKeyPress(helper.get(), ui::VKEY_RETURN); |
| 88 HandleKeyPress(helper.get(), ui::VKEY_J); |
| 89 |
| 90 EXPECT_DOUBLE_EQ(0.7, service->GetScore(url1)); |
| 91 EXPECT_EQ(0, service->GetScore(url2)); |
| 92 |
| 93 // Simulate key presses for a different link. |
| 94 ui_test_utils::NavigateToURL(browser(), url2); |
| 95 |
| 96 EXPECT_DOUBLE_EQ(0.7, service->GetScore(url1)); |
| 97 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url2)); |
| 98 EXPECT_DOUBLE_EQ(1.2, service->GetTotalEngagementPoints()); |
| 99 |
| 100 HandleKeyPress(helper.get(), ui::VKEY_K); |
| 101 EXPECT_DOUBLE_EQ(0.7, service->GetScore(url1)); |
| 102 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url2)); |
| 103 EXPECT_DOUBLE_EQ(1.25, service->GetTotalEngagementPoints()); |
| 104 } |
| 105 |
| 106 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, |
| 107 MouseEventEngagementAccumulation) { |
| 108 GURL url1("https://www.google.com/"); |
| 109 GURL url2("http://www.google.com/"); |
| 110 content::WebContents* web_contents = |
| 111 browser()->tab_strip_model()->GetActiveWebContents(); |
| 112 |
| 113 scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents)); |
| 114 SiteEngagementService* service = |
| 115 SiteEngagementServiceFactory::GetForProfile(browser()->profile()); |
| 116 DCHECK(service); |
| 117 |
| 118 ui_test_utils::NavigateToURL(browser(), url1); |
| 119 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url1)); |
| 120 EXPECT_EQ(0, service->GetScore(url2)); |
| 121 |
| 122 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonLeft, |
| 123 blink::WebInputEvent::MouseDown); |
| 124 |
| 125 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url1)); |
| 126 EXPECT_EQ(0, service->GetScore(url2)); |
| 127 |
| 128 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonRight, |
| 129 blink::WebInputEvent::MouseWheel); |
| 130 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonMiddle, |
| 131 blink::WebInputEvent::MouseDown); |
| 132 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonLeft, |
| 133 blink::WebInputEvent::MouseDown); |
| 134 |
| 135 EXPECT_DOUBLE_EQ(0.7, service->GetScore(url1)); |
| 136 EXPECT_EQ(0, service->GetScore(url2)); |
| 137 |
| 138 ui_test_utils::NavigateToURL(browser(), url2); |
| 139 |
| 140 EXPECT_DOUBLE_EQ(0.7, service->GetScore(url1)); |
| 141 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url2)); |
| 142 EXPECT_DOUBLE_EQ(1.2, service->GetTotalEngagementPoints()); |
| 143 |
| 144 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonLeft, |
| 145 blink::WebInputEvent::MouseDown); |
| 146 EXPECT_DOUBLE_EQ(0.7, service->GetScore(url1)); |
| 147 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url2)); |
| 148 EXPECT_DOUBLE_EQ(1.25, service->GetTotalEngagementPoints()); |
| 149 } |
| 150 |
| 151 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, |
| 152 MixedInputEngagementAccumulation) { |
| 153 GURL url1("https://www.google.com/"); |
| 154 GURL url2("http://www.google.com/"); |
| 155 content::WebContents* web_contents = |
| 156 browser()->tab_strip_model()->GetActiveWebContents(); |
| 157 |
| 158 scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents)); |
| 159 SiteEngagementService* service = |
| 160 SiteEngagementServiceFactory::GetForProfile(browser()->profile()); |
| 161 DCHECK(service); |
| 162 |
| 163 ui_test_utils::NavigateToURL(browser(), url1); |
| 164 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url1)); |
| 165 EXPECT_EQ(0, service->GetScore(url2)); |
| 166 |
| 167 HandleKeyPress(helper.get(), ui::VKEY_UP); |
| 168 HandleKeyPress(helper.get(), ui::VKEY_RETURN); |
| 169 HandleKeyPress(helper.get(), ui::VKEY_J); |
| 170 |
| 171 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonLeft, |
| 172 blink::WebInputEvent::MouseDown); |
| 173 |
| 174 EXPECT_DOUBLE_EQ(0.7, service->GetScore(url1)); |
| 175 EXPECT_EQ(0, service->GetScore(url2)); |
| 176 |
| 177 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonRight, |
| 178 blink::WebInputEvent::MouseDown); |
| 179 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonMiddle, |
| 180 blink::WebInputEvent::MouseDown); |
| 181 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonNone, |
| 182 blink::WebInputEvent::MouseWheel); |
| 183 |
| 184 EXPECT_DOUBLE_EQ(0.85, service->GetScore(url1)); |
| 185 EXPECT_EQ(0, service->GetScore(url2)); |
| 186 |
| 187 ui_test_utils::NavigateToURL(browser(), url2); |
| 188 |
| 189 EXPECT_DOUBLE_EQ(0.85, service->GetScore(url1)); |
| 190 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url2)); |
| 191 EXPECT_DOUBLE_EQ(1.35, service->GetTotalEngagementPoints()); |
| 192 |
| 193 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonNone, |
| 194 blink::WebInputEvent::MouseWheel); |
| 195 HandleKeyPress(helper.get(), ui::VKEY_DOWN); |
| 196 |
| 197 EXPECT_DOUBLE_EQ(0.85, service->GetScore(url1)); |
| 198 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url2)); |
| 199 EXPECT_DOUBLE_EQ(1.45, service->GetTotalEngagementPoints()); |
| 200 } |
| 201 |
| 202 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest, |
| 203 CheckTimerAndCallbacks) { |
| 204 GURL url1("https://www.google.com/"); |
| 205 GURL url2("http://www.google.com/"); |
| 206 content::WebContents* web_contents = |
| 207 browser()->tab_strip_model()->GetActiveWebContents(); |
| 208 |
| 209 scoped_ptr<base::MockTimer> mock_timer(new base::MockTimer(true, false)); |
| 210 base::MockTimer* timer = mock_timer.get(); |
| 211 scoped_ptr<SiteEngagementHelper> helper(CreateHelper(web_contents)); |
| 212 SetHelperTimer(helper.get(), mock_timer.Pass()); |
| 213 |
| 214 SiteEngagementService* service = |
| 215 SiteEngagementServiceFactory::GetForProfile(browser()->profile()); |
| 216 DCHECK(service); |
| 217 |
| 218 ui_test_utils::NavigateToURL(browser(), url1); |
| 219 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url1)); |
| 220 EXPECT_EQ(0, service->GetScore(url2)); |
| 221 |
| 222 // Timer should not be running after navigation. It should start after input. |
| 223 EXPECT_FALSE(timer->IsRunning()); |
| 224 EXPECT_TRUE(CallbacksAdded(helper.get())); |
| 225 HandleKeyPress(helper.get(), ui::VKEY_RETURN); |
| 226 EXPECT_TRUE(timer->IsRunning()); |
| 227 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 228 |
| 229 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url1)); |
| 230 EXPECT_EQ(0, service->GetScore(url2)); |
| 231 timer->Fire(); |
| 232 |
| 233 EXPECT_FALSE(timer->IsRunning()); |
| 234 EXPECT_TRUE(CallbacksAdded(helper.get())); |
| 235 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonNone, |
| 236 blink::WebInputEvent::MouseWheel); |
| 237 EXPECT_TRUE(timer->IsRunning()); |
| 238 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 239 |
| 240 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); |
| 241 EXPECT_EQ(0, service->GetScore(url2)); |
| 242 timer->Fire(); |
| 243 |
| 244 EXPECT_FALSE(timer->IsRunning()); |
| 245 EXPECT_TRUE(CallbacksAdded(helper.get())); |
| 246 ui_test_utils::NavigateToURL(browser(), url2); |
| 247 EXPECT_FALSE(timer->IsRunning()); |
| 248 EXPECT_TRUE(CallbacksAdded(helper.get())); |
| 249 |
| 250 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); |
| 251 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url2)); |
| 252 |
| 253 HandleMouseEvent(helper.get(), blink::WebMouseEvent::ButtonRight, |
| 254 blink::WebInputEvent::MouseDown); |
| 255 EXPECT_TRUE(timer->IsRunning()); |
| 256 EXPECT_FALSE(CallbacksAdded(helper.get())); |
| 257 |
| 258 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1)); |
| 259 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url2)); |
| 260 EXPECT_DOUBLE_EQ(1.15, service->GetTotalEngagementPoints()); |
| 261 } |
OLD | NEW |