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

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

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

Powered by Google App Engine
This is Rietveld 408576698