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

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

Issue 1338603002: Implement a site engagement score based on time-on-site. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing reviewer feedback 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
OLDNEW
(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/run_loop.h"
7 #include "base/single_thread_task_runner.h"
8 #include "base/task_runner.h"
9 #include "base/test/simple_test_clock.h"
10 #include "base/thread_task_runner_handle.h"
11 #include "base/timer/mock_timer.h"
12 #include "base/values.h"
13 #include "chrome/browser/engagement/site_engagement_helper.h"
14 #include "chrome/browser/engagement/site_engagement_service.h"
15 #include "chrome/browser/engagement/site_engagement_service_factory.h"
16 #include "chrome/browser/ui/browser.h"
17 #include "chrome/browser/ui/tabs/tab_strip_model.h"
18 #include "chrome/common/chrome_switches.h"
19 #include "chrome/test/base/browser_with_test_window_test.h"
20 #include "chrome/test/base/in_process_browser_test.h"
21 #include "chrome/test/base/ui_test_utils.h"
22 #include "content/public/test/browser_test_utils.h"
23 #include "content/public/test/test_navigation_observer.h"
24 #include "net/test/embedded_test_server/embedded_test_server.h"
25 #include "testing/gtest/include/gtest/gtest.h"
26 #include "ui/events/keycodes/keyboard_codes.h"
27
28 class TestObserver : public SiteEngagementHelper::Observer {
29 public:
30 TestObserver(SiteEngagementHelper* helper, base::Closure quit_closure)
31 : helper_(helper), quit_closure_(quit_closure) { }
32 ~TestObserver() {
33 helper_->RemoveObserverForTesting(this);
34 }
35
36 void OnInputRecorded(SiteEngagementHelper* helper) override {
37 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure_);
38 }
39
40 private:
41 SiteEngagementHelper* helper_;
42 base::Closure quit_closure_;
43 };
44
45 class SiteEngagementServiceBrowserTest : public InProcessBrowserTest {
46 public:
47 void SetUpOnMainThread() override {
48 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
49 InProcessBrowserTest::SetUpOnMainThread();
50 }
51
52 // Create a SiteEngagementHelper. Called here as friend class methods cannot
53 // be called in tests.
54 SiteEngagementHelper* CreateHelper(content::WebContents* web_contents,
55 bool enable_callbacks) {
56 SiteEngagementHelper::CreateForWebContents(web_contents);
57 SiteEngagementHelper* helper =
58 SiteEngagementHelper::FromWebContents(web_contents);
59 DCHECK(helper);
60
61 // Selectively enable or disable the input listening callbacks to avoid
62 // interference in tests.
63 if (enable_callbacks)
64 SiteEngagementHelper::EnableCallbackRegistrationForTesting();
65 else
66 SiteEngagementHelper::DisableCallbackRegistrationForTesting();
67 return helper;
68 }
69
70 // Simulate a key press event and handle it.
71 void HandleKeyPress(SiteEngagementHelper* helper, ui::KeyboardCode key) {
72 content::NativeWebKeyboardEvent event;
73 event.windowsKeyCode = key;
74 event.type = blink::WebKeyboardEvent::RawKeyDown;
75 helper->input_tracker_->HandleKeyPressEvent(event);
76 }
77
78 // Simulate a mouse event and handle it.
79 void HandleMouseEvent(SiteEngagementHelper* helper,
80 blink::WebMouseEvent::Button button,
81 blink::WebInputEvent::Type type) {
82 blink::WebMouseEvent event;
83 event.button = button;
84 event.type = type;
85 helper->input_tracker_->HandleMouseEvent(event);
86 }
87
88 // Set a timer object for test purposes.
89 void SetHelperTimer(SiteEngagementHelper* helper,
90 scoped_ptr<base::Timer> timer) {
91 helper->input_tracker_->SetTimerForTesting(timer.Pass());
92 }
93 };
94
95 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest,
96 KeyPressEngagementAccumulation) {
97 GURL url1("https://www.google.com/");
98 GURL url2("http://www.google.com/");
99 content::WebContents* web_contents =
100 browser()->tab_strip_model()->GetActiveWebContents();
101
102 SiteEngagementHelper* helper = CreateHelper(web_contents, false);
103 SiteEngagementService* service =
104 SiteEngagementServiceFactory::GetForProfile(browser()->profile());
105 DCHECK(service);
106
107 // Check that navigation triggers engagement.
108 ui_test_utils::NavigateToURL(browser(), url1);
109 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url1));
110 EXPECT_EQ(0, service->GetScore(url2));
111
112 // Simulate a key press trigger and ensure it is treated correctly.
113 HandleKeyPress(helper, ui::VKEY_DOWN);
114
115 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url1));
116 EXPECT_EQ(0, service->GetScore(url2));
117
118 // Simulate three key presses, and ensure they are treated correctly.
119 HandleKeyPress(helper, ui::VKEY_UP);
120 HandleKeyPress(helper, ui::VKEY_RETURN);
121 HandleKeyPress(helper, ui::VKEY_J);
122
123 EXPECT_DOUBLE_EQ(0.7, service->GetScore(url1));
124 EXPECT_EQ(0, service->GetScore(url2));
125
126 // Simulate key presses for a different link.
127 ui_test_utils::NavigateToURL(browser(), url2);
128
129 EXPECT_DOUBLE_EQ(0.7, service->GetScore(url1));
130 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url2));
131 EXPECT_DOUBLE_EQ(1.2, service->GetTotalEngagementPoints());
132
133 HandleKeyPress(helper, ui::VKEY_K);
134 EXPECT_DOUBLE_EQ(0.7, service->GetScore(url1));
135 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url2));
136 EXPECT_DOUBLE_EQ(1.25, service->GetTotalEngagementPoints());
137 }
138
139 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest,
140 MouseEventEngagementAccumulation) {
141 GURL url1("https://www.google.com/");
142 GURL url2("http://www.google.com/");
143 content::WebContents* web_contents =
144 browser()->tab_strip_model()->GetActiveWebContents();
145
146 SiteEngagementHelper* helper = CreateHelper(web_contents, false);
147 SiteEngagementService* service =
148 SiteEngagementServiceFactory::GetForProfile(browser()->profile());
149 DCHECK(service);
150
151 ui_test_utils::NavigateToURL(browser(), url1);
152 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url1));
153 EXPECT_EQ(0, service->GetScore(url2));
154
155 HandleMouseEvent(helper, blink::WebMouseEvent::ButtonLeft,
156 blink::WebInputEvent::MouseDown);
157
158 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url1));
159 EXPECT_EQ(0, service->GetScore(url2));
160
161 HandleMouseEvent(helper, blink::WebMouseEvent::ButtonRight,
162 blink::WebInputEvent::MouseWheel);
163 HandleMouseEvent(helper, blink::WebMouseEvent::ButtonMiddle,
164 blink::WebInputEvent::MouseDown);
165 HandleMouseEvent(helper, blink::WebMouseEvent::ButtonNone,
166 blink::WebInputEvent::MouseMove);
167
168 EXPECT_DOUBLE_EQ(0.7, service->GetScore(url1));
169 EXPECT_EQ(0, service->GetScore(url2));
170
171 ui_test_utils::NavigateToURL(browser(), url2);
172
173 EXPECT_DOUBLE_EQ(0.7, service->GetScore(url1));
174 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url2));
175 EXPECT_DOUBLE_EQ(1.2, service->GetTotalEngagementPoints());
176
177 HandleMouseEvent(helper, blink::WebMouseEvent::ButtonLeft,
178 blink::WebInputEvent::MouseDown);
179 EXPECT_DOUBLE_EQ(0.7, service->GetScore(url1));
180 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url2));
181 EXPECT_DOUBLE_EQ(1.25, service->GetTotalEngagementPoints());
182 }
183
184 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest,
185 MixedInputEngagementAccumulation) {
186 GURL url1("https://www.google.com/");
187 GURL url2("http://www.google.com/");
188 content::WebContents* web_contents =
189 browser()->tab_strip_model()->GetActiveWebContents();
190
191 SiteEngagementHelper* helper = CreateHelper(web_contents, false);
192 SiteEngagementService* service =
193 SiteEngagementServiceFactory::GetForProfile(browser()->profile());
194 DCHECK(service);
195
196 ui_test_utils::NavigateToURL(browser(), url1);
197 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url1));
198 EXPECT_EQ(0, service->GetScore(url2));
199
200 HandleKeyPress(helper, ui::VKEY_UP);
201 HandleKeyPress(helper, ui::VKEY_RETURN);
202 HandleKeyPress(helper, ui::VKEY_J);
203
204 HandleMouseEvent(helper, blink::WebMouseEvent::ButtonLeft,
205 blink::WebInputEvent::MouseDown);
206
207 EXPECT_DOUBLE_EQ(0.7, service->GetScore(url1));
208 EXPECT_EQ(0, service->GetScore(url2));
209
210 HandleMouseEvent(helper, blink::WebMouseEvent::ButtonRight,
211 blink::WebInputEvent::MouseMove);
212 HandleMouseEvent(helper, blink::WebMouseEvent::ButtonMiddle,
213 blink::WebInputEvent::MouseDown);
214 HandleMouseEvent(helper, blink::WebMouseEvent::ButtonNone,
215 blink::WebInputEvent::MouseMove);
216
217 EXPECT_DOUBLE_EQ(0.85, service->GetScore(url1));
218 EXPECT_EQ(0, service->GetScore(url2));
219
220 ui_test_utils::NavigateToURL(browser(), url2);
221
222 EXPECT_DOUBLE_EQ(0.85, service->GetScore(url1));
223 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url2));
224 EXPECT_DOUBLE_EQ(1.35, service->GetTotalEngagementPoints());
225
226 HandleMouseEvent(helper, blink::WebMouseEvent::ButtonNone,
227 blink::WebInputEvent::MouseWheel);
228 HandleKeyPress(helper, ui::VKEY_DOWN);
229
230 EXPECT_DOUBLE_EQ(0.85, service->GetScore(url1));
231 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url2));
232 EXPECT_DOUBLE_EQ(1.45, service->GetTotalEngagementPoints());
233 }
234
235 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest,
236 CheckTimer) {
237 GURL url1("https://www.google.com/");
238 GURL url2("http://www.google.com/");
239 content::WebContents* web_contents =
240 browser()->tab_strip_model()->GetActiveWebContents();
241
242 scoped_ptr<base::MockTimer> mock_timer(new base::MockTimer(true, false));
243 base::MockTimer* timer = mock_timer.get();
244 SiteEngagementHelper* helper = CreateHelper(web_contents, false);
245 SetHelperTimer(helper, mock_timer.Pass());
246
247 SiteEngagementService* service =
248 SiteEngagementServiceFactory::GetForProfile(browser()->profile());
249 DCHECK(service);
250
251 ui_test_utils::NavigateToURL(browser(), url1);
252 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url1));
253 EXPECT_EQ(0, service->GetScore(url2));
254
255 // Timer should not be running after navigation. It should start after input.
256 EXPECT_FALSE(timer->IsRunning());
257 HandleKeyPress(helper, ui::VKEY_RETURN);
258 EXPECT_TRUE(timer->IsRunning());
259
260 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url1));
261 EXPECT_EQ(0, service->GetScore(url2));
262 timer->Fire();
263
264 EXPECT_FALSE(timer->IsRunning());
265 HandleMouseEvent(helper, blink::WebMouseEvent::ButtonNone,
266 blink::WebInputEvent::MouseMove);
267 EXPECT_TRUE(timer->IsRunning());
268
269 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1));
270 EXPECT_EQ(0, service->GetScore(url2));
271 timer->Fire();
272
273 EXPECT_FALSE(timer->IsRunning());
274 ui_test_utils::NavigateToURL(browser(), url2);
275 EXPECT_FALSE(timer->IsRunning());
276
277 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1));
278 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url2));
279
280 HandleMouseEvent(helper, blink::WebMouseEvent::ButtonNone,
281 blink::WebInputEvent::MouseMove);
282 EXPECT_TRUE(timer->IsRunning());
283
284 EXPECT_DOUBLE_EQ(0.6, service->GetScore(url1));
285 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url2));
286 EXPECT_DOUBLE_EQ(1.15, service->GetTotalEngagementPoints());
287 }
288
289 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest,
290 SimulateInput) {
291 GURL url1("https://www.google.com/");
292 GURL url2("http://www.google.com/");
293 content::WebContents* web_contents =
294 browser()->tab_strip_model()->GetActiveWebContents();
295
296 scoped_ptr<base::MockTimer> mock_timer(new base::MockTimer(true, false));
297 base::MockTimer* timer = mock_timer.get();
298 SiteEngagementHelper* helper = CreateHelper(web_contents, true);
299 SetHelperTimer(helper, mock_timer.Pass());
300
301 SiteEngagementService* service =
302 SiteEngagementServiceFactory::GetForProfile(browser()->profile());
303 DCHECK(service);
304 EXPECT_FALSE(timer->IsRunning());
305
306 // Navigate and click. Ensure that the timer is running as expected.
307 {
308 base::RunLoop run_loop;
309 TestObserver observer(helper, run_loop.QuitClosure());
310 helper->AddObserverForTesting(&observer);
311
312 ui_test_utils::NavigateToURL(browser(), url1);
313 EXPECT_DOUBLE_EQ(0.5, service->GetScore(url1));
314 EXPECT_EQ(0, service->GetScore(url2));
315 EXPECT_FALSE(timer->IsRunning());
316
317 // Click and wait until the observer exits.
318 content::SimulateMouseClick(web_contents, 0,
319 blink::WebMouseEvent::ButtonLeft);
320 run_loop.Run();
321
322 EXPECT_DOUBLE_EQ(0.55, service->GetScore(url1));
323 EXPECT_EQ(0, service->GetScore(url2));
324 EXPECT_TRUE(timer->IsRunning());
325 timer->Fire();
326 }
327
328 // Navigate and click.
329 {
330 base::RunLoop run_loop;
331 TestObserver observer(helper, run_loop.QuitClosure());
332 helper->AddObserverForTesting(&observer);
333
334 EXPECT_FALSE(timer->IsRunning());
335 ui_test_utils::NavigateToURL(browser(), url1);
336 EXPECT_DOUBLE_EQ(1.05, service->GetScore(url1));
337 EXPECT_EQ(0, service->GetScore(url2));
338 EXPECT_FALSE(timer->IsRunning());
339
340 content::SimulateMouseClick(web_contents, 0,
341 blink::WebMouseEvent::ButtonLeft);
342 run_loop.Run();
343
344 EXPECT_DOUBLE_EQ(1.1, service->GetScore(url1));
345 EXPECT_EQ(0, service->GetScore(url2));
346 EXPECT_TRUE(timer->IsRunning());
347 timer->Fire();
348 }
349
350 // Click only.
351 {
352 base::RunLoop run_loop;
353 TestObserver observer(helper, run_loop.QuitClosure());
354 helper->AddObserverForTesting(&observer);
355
356 EXPECT_FALSE(timer->IsRunning());
357 content::SimulateMouseClick(web_contents, 0,
358 blink::WebMouseEvent::ButtonMiddle);
359 run_loop.Run();
360
361 EXPECT_DOUBLE_EQ(1.15, service->GetScore(url1));
362 EXPECT_EQ(0, service->GetScore(url2));
363 EXPECT_TRUE(timer->IsRunning());
364 timer->Fire();
365 }
366
367 // Navigate and click.
368 {
369 base::RunLoop run_loop;
370 TestObserver observer(helper, run_loop.QuitClosure());
371 helper->AddObserverForTesting(&observer);
372
373 EXPECT_FALSE(timer->IsRunning());
374 ui_test_utils::NavigateToURL(browser(), url1);
375 EXPECT_DOUBLE_EQ(1.65, service->GetScore(url1));
376 EXPECT_EQ(0, service->GetScore(url2));
377 content::SimulateMouseClick(web_contents, 0,
378 blink::WebMouseEvent::ButtonRight);
379 run_loop.Run();
380
381 EXPECT_DOUBLE_EQ(1.7, service->GetScore(url1));
382 EXPECT_EQ(0, service->GetScore(url2));
383 EXPECT_TRUE(timer->IsRunning());
384
385 // Simulate another event while the timer is running to make sure that this
386 // input is ignored.
387 content::SimulateMouseClick(web_contents, 0,
388 blink::WebMouseEvent::ButtonLeft);
389
390 EXPECT_DOUBLE_EQ(1.7, service->GetScore(url1));
391 EXPECT_EQ(0, service->GetScore(url2));
392 EXPECT_TRUE(timer->IsRunning());
393 timer->Fire();
394 }
395 }
396
397 IN_PROC_BROWSER_TEST_F(SiteEngagementServiceBrowserTest,
398 ShowAndHide) {
399 GURL url1("https://www.google.com/");
400 GURL url2("http://www.google.com/");
401 content::WebContents* web_contents =
402 browser()->tab_strip_model()->GetActiveWebContents();
403
404 scoped_ptr<base::MockTimer> mock_timer(new base::MockTimer(true, false));
405 base::MockTimer* timer = mock_timer.get();
406 SiteEngagementHelper* helper = CreateHelper(web_contents, true);
407 SetHelperTimer(helper, mock_timer.Pass());
408
409 SiteEngagementService* service =
410 SiteEngagementServiceFactory::GetForProfile(browser()->profile());
411 DCHECK(service);
412 EXPECT_FALSE(timer->IsRunning());
413
414 // Navigate and hide.
415 {
416 base::RunLoop run_loop;
417 TestObserver observer(helper, run_loop.QuitClosure());
418 helper->AddObserverForTesting(&observer);
419
420 ui_test_utils::NavigateToURL(browser(), url1);
421 content::SimulateMouseClick(web_contents, 0,
422 blink::WebMouseEvent::ButtonRight);
423 run_loop.Run();
424
425 // Timer runs after input is recorded.
426 EXPECT_TRUE(timer->IsRunning());
427
428 ui_test_utils::NavigateToURLWithDisposition(
429 browser(), url2, NEW_FOREGROUND_TAB,
430 ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
431
432 // Hiding the original tab should stop the timer.
433 EXPECT_FALSE(timer->IsRunning());
434 EXPECT_EQ(2, browser()->tab_strip_model()->count());
435
436 // Timer should still be stopped on re-focus.
437 browser()->tab_strip_model()->ActivateTabAt(0, true);
438 EXPECT_FALSE(timer->IsRunning());
439 }
440
441 // Click. Timer should be started.
442 {
443 base::RunLoop run_loop;
444 TestObserver observer(helper, run_loop.QuitClosure());
445 helper->AddObserverForTesting(&observer);
446
447 content::SimulateMouseClick(web_contents, 0,
448 blink::WebMouseEvent::ButtonRight);
449 run_loop.Run();
450
451 // Timer runs after input is recorded.
452 EXPECT_TRUE(timer->IsRunning());
453 timer->Fire();
454 EXPECT_FALSE(timer->IsRunning());
455 }
456 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698