1 // Copyright (c) 2012 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.
5 #include "chrome/browser/ui/bookmarks/bookmark_prompt_controller.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/metrics/field_trial.h"
9 #include "base/prefs/pref_service.h"
10 #include "chrome/browser/bookmarks/bookmark_prompt_prefs.h"
11 #include "chrome/browser/browser_process.h"
12 #include "chrome/browser/ui/browser.h"
13 #include "chrome/browser/ui/browser_list.h"
14 #include "chrome/browser/ui/tabs/tab_strip_model.h"
15 #include "chrome/test/base/browser_with_test_window_test.h"
16 #include "chrome/test/base/test_browser_window.h"
17 #include "chrome/test/base/testing_browser_process.h"
18 #include "content/public/browser/notification_service.h"
19 #include "content/public/browser/notification_types.h"
20 #include "content/public/browser/web_contents.h"
22 class BookmarkPromptControllerTest
: public BrowserWithTestWindowTest
{
24 BookmarkPromptControllerTest() : field_trial_list_(NULL
), page_id_(0) {
25 base::FieldTrialList::CreateFieldTrial("BookmarkPrompt", "Experiment");
29 int show_prompt_call_count() const {
30 return static_cast<MyTestBrowserWindow
*>(browser()->window())->
31 show_prompt_call_count();
34 void Visit(const GURL
& url
) {
35 AddTab(browser(), url
);
37 // Simulate page loaded.
39 content::WebContents
* web_contents
=
40 browser()->tab_strip_model()->GetActiveWebContents();
41 content::NotificationService::current()->Notify(
42 content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME
,
43 content::Source
<content::WebContents
>(web_contents
),
44 content::Details
<int>(&page_id_
));
46 // Wait until HistoryService::QueryURL completion.
47 static_cast<TestingProfile
*>(browser()->profile())->
48 BlockUntilHistoryProcessesPendingRequests();
52 class MyTestBrowserWindow
: public TestBrowserWindow
{
54 MyTestBrowserWindow() : show_prompt_call_count_(0) {}
55 int show_prompt_call_count() { return show_prompt_call_count_
; }
58 virtual bool IsActive() const OVERRIDE
{ return true; }
59 virtual void ShowBookmarkPrompt() OVERRIDE
{ ++show_prompt_call_count_
; }
60 int show_prompt_call_count_
;
62 DISALLOW_COPY_AND_ASSIGN(MyTestBrowserWindow
);
65 virtual void SetUp() OVERRIDE
{
66 TestingBrowserProcess::GetGlobal()->
67 SetBookmarkPromptController(new BookmarkPromptController
);
68 BrowserWithTestWindowTest::SetUp();
69 ASSERT_TRUE(static_cast<TestingProfile
*>(browser()->profile())->
70 CreateHistoryService(true, false));
71 static_cast<TestingProfile
*>(browser()->profile())->
72 BlockUntilHistoryIndexIsRefreshed();
73 // Simulate browser activation.
74 BrowserList::SetLastActive(browser());
77 virtual void TearDown() OVERRIDE
{
78 TestingBrowserProcess::GetGlobal()->
79 SetBookmarkPromptController(NULL
);
80 static_cast<TestingProfile
*>(browser()->profile())->
81 DestroyHistoryService();
82 BrowserWithTestWindowTest::TearDown();
85 virtual BrowserWindow
* CreateBrowserWindow() OVERRIDE
{
86 return new MyTestBrowserWindow
;
89 base::FieldTrialList field_trial_list_
;
92 DISALLOW_COPY_AND_ASSIGN(BookmarkPromptControllerTest
);
95 // Test for maximum prompt impression count.
96 TEST_F(BookmarkPromptControllerTest
, MaxImpressionCountTest
) {
97 BookmarkPromptPrefs
prefs(browser()->profile()->GetPrefs());
99 // Simulate we've already display bookmark prompt many times.
100 for (int i
= 0; i
< BookmarkPromptController::kMaxPromptImpressionCount
;
102 prefs
.IncrementPromptImpressionCount();
105 // Visit the URL many times to display bookmark prompt.
106 GURL
url("http://foo");
107 for (int visit_count
= 1;
108 visit_count
<= BookmarkPromptController::kVisitCountForSessionTrigger
;
113 // Although, we don't display bookmark prompt since we've already displayed
115 EXPECT_EQ(0, show_prompt_call_count());
116 EXPECT_EQ(BookmarkPromptController::kMaxPromptImpressionCount
,
117 prefs
.GetPromptImpressionCount());
120 // Test for session trigger and permanent trigger.
121 TEST_F(BookmarkPromptControllerTest
, TriggerTest
) {
122 BookmarkPromptPrefs
prefs(browser()->profile()->GetPrefs());
124 GURL
url("http://foo");
125 for (int visit_count
= 1;
126 visit_count
< BookmarkPromptController::kVisitCountForPermanentTrigger
;
129 if (visit_count
< BookmarkPromptController::kVisitCountForSessionTrigger
) {
130 EXPECT_EQ(0, show_prompt_call_count());
131 EXPECT_EQ(0, prefs
.GetPromptImpressionCount());
133 EXPECT_EQ(1, show_prompt_call_count());
134 EXPECT_EQ(1, prefs
.GetPromptImpressionCount());
140 EXPECT_EQ(2, show_prompt_call_count());
141 EXPECT_EQ(2, prefs
.GetPromptImpressionCount());