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.
4
5 #include "chrome/browser/prefs/session_startup_pref.h"
6 #include "chrome/common/pref_names.h"
7 #include "chrome/test/base/testing_pref_service_syncable.h"
8 #include "components/pref_registry/pref_registry_syncable.h"
9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 #if defined(OS_MACOSX)
13 #include "chrome/browser/ui/cocoa/window_restore_utils.h"
14 #endif
15
16 // Unit tests for SessionStartupPref.
17 class SessionStartupPrefTest : public testing::Test {
18 public:
SetUp()19 virtual void SetUp() {
20 pref_service_.reset(new TestingPrefServiceSyncable);
21 SessionStartupPref::RegisterProfilePrefs(registry());
22 registry()->RegisterBooleanPref(
23 prefs::kHomePageIsNewTabPage,
24 true,
25 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
26 // Make the tests independent of the Mac startup pref migration (see
27 // SessionStartupPref::MigrateMacDefaultPrefIfNecessary).
28 registry()->RegisterStringPref(
29 prefs::kProfileCreatedByVersion,
30 "22.0.0.0",
31 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
32 }
33
IsUseLastOpenDefault()34 bool IsUseLastOpenDefault() {
35 // On ChromeOS, the default SessionStartupPref is LAST.
36 #if defined(OS_CHROMEOS)
37 return true;
38 #else
39 return false;
40 #endif
41 }
42
registry()43 user_prefs::PrefRegistrySyncable* registry() {
44 return pref_service_->registry();
45 }
46
47 scoped_ptr<TestingPrefServiceSyncable> pref_service_;
48 };
49
TEST_F(SessionStartupPrefTest,URLListIsFixedUp)50 TEST_F(SessionStartupPrefTest, URLListIsFixedUp) {
51 base::ListValue* url_pref_list = new base::ListValue;
52 url_pref_list->Set(0, new base::StringValue("google.com"));
53 url_pref_list->Set(1, new base::StringValue("chromium.org"));
54 pref_service_->SetUserPref(prefs::kURLsToRestoreOnStartup, url_pref_list);
55
56 SessionStartupPref result =
57 SessionStartupPref::GetStartupPref(pref_service_.get());
58 EXPECT_EQ(2u, result.urls.size());
59 EXPECT_EQ("http://google.com/", result.urls[0].spec());
60 EXPECT_EQ("http://chromium.org/", result.urls[1].spec());
61 }
62
TEST_F(SessionStartupPrefTest,URLListManagedOverridesUser)63 TEST_F(SessionStartupPrefTest, URLListManagedOverridesUser) {
64 base::ListValue* url_pref_list1 = new base::ListValue;
65 url_pref_list1->Set(0, new base::StringValue("chromium.org"));
66 pref_service_->SetUserPref(prefs::kURLsToRestoreOnStartup, url_pref_list1);
67
68 base::ListValue* url_pref_list2 = new base::ListValue;
69 url_pref_list2->Set(0, new base::StringValue("chromium.org"));
70 url_pref_list2->Set(1, new base::StringValue("chromium.org"));
71 url_pref_list2->Set(2, new base::StringValue("chromium.org"));
72 pref_service_->SetManagedPref(prefs::kURLsToRestoreOnStartup,
73 url_pref_list2);
74
75 SessionStartupPref result =
76 SessionStartupPref::GetStartupPref(pref_service_.get());
77 EXPECT_EQ(3u, result.urls.size());
78
79 SessionStartupPref override_test =
80 SessionStartupPref(SessionStartupPref::URLS);
81 override_test.urls.push_back(GURL("dev.chromium.org"));
82 SessionStartupPref::SetStartupPref(pref_service_.get(), override_test);
83
84 result = SessionStartupPref::GetStartupPref(pref_service_.get());
85 EXPECT_EQ(3u, result.urls.size());
86 }
87
88 // Checks to make sure that if the user had previously not selected anything
89 // (so that, in effect, the default value "Open the homepage" was selected),
90 // their preferences are migrated on upgrade to m19.
TEST_F(SessionStartupPrefTest,DefaultMigration)91 TEST_F(SessionStartupPrefTest, DefaultMigration) {
92 registry()->RegisterStringPref(
93 prefs::kHomePage,
94 "http://google.com/",
95 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
96 pref_service_->SetString(prefs::kHomePage, "http://chromium.org/");
97 pref_service_->SetBoolean(prefs::kHomePageIsNewTabPage, false);
98
99 EXPECT_FALSE(pref_service_->HasPrefPath(prefs::kRestoreOnStartup));
100
101 SessionStartupPref pref = SessionStartupPref::GetStartupPref(
102 pref_service_.get());
103
104 if (IsUseLastOpenDefault()) {
105 EXPECT_EQ(SessionStartupPref::LAST, pref.type);
106 EXPECT_EQ(0U, pref.urls.size());
107 } else {
108 EXPECT_EQ(SessionStartupPref::URLS, pref.type);
109 EXPECT_EQ(1U, pref.urls.size());
110 EXPECT_EQ(GURL("http://chromium.org/"), pref.urls[0]);
111 }
112 }
113
114 // Checks to make sure that if the user had previously not selected anything
115 // (so that, in effect, the default value "Open the homepage" was selected),
116 // and the NTP is being used for the homepage, their preferences are migrated
117 // to "Open the New Tab Page" on upgrade to M19.
TEST_F(SessionStartupPrefTest,DefaultMigrationHomepageIsNTP)118 TEST_F(SessionStartupPrefTest, DefaultMigrationHomepageIsNTP) {
119 registry()->RegisterStringPref(
120 prefs::kHomePage,
121 "http://google.com/",
122 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
123 pref_service_->SetString(prefs::kHomePage, "http://chromium.org/");
124 pref_service_->SetBoolean(prefs::kHomePageIsNewTabPage, true);
125
126 EXPECT_FALSE(pref_service_->HasPrefPath(prefs::kRestoreOnStartup));
127
128 SessionStartupPref pref = SessionStartupPref::GetStartupPref(
129 pref_service_.get());
130
131 if (IsUseLastOpenDefault())
132 EXPECT_EQ(SessionStartupPref::LAST, pref.type);
133 else
134 EXPECT_EQ(SessionStartupPref::DEFAULT, pref.type);
135
136 // The "URLs to restore on startup" shouldn't get migrated.
137 EXPECT_EQ(0U, pref.urls.size());
138 }
139
140 // Checks to make sure that if the user had previously selected "Open the
141 // "homepage", their preferences are migrated on upgrade to M19.
TEST_F(SessionStartupPrefTest,HomePageMigration)142 TEST_F(SessionStartupPrefTest, HomePageMigration) {
143 registry()->RegisterStringPref(
144 prefs::kHomePage,
145 "http://google.com/",
146 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
147
148 // By design, it's impossible to set the 'restore on startup' pref to 0
149 // ("open the homepage") using SessionStartupPref::SetStartupPref(), so set it
150 // using the pref service directly.
151 pref_service_->SetInteger(prefs::kRestoreOnStartup, /*kPrefValueHomePage*/ 0);
152 pref_service_->SetString(prefs::kHomePage, "http://chromium.org/");
153 pref_service_->SetBoolean(prefs::kHomePageIsNewTabPage, false);
154
155 SessionStartupPref pref = SessionStartupPref::GetStartupPref(
156 pref_service_.get());
157
158 EXPECT_EQ(SessionStartupPref::URLS, pref.type);
159 EXPECT_EQ(1U, pref.urls.size());
160 EXPECT_EQ(GURL("http://chromium.org/"), pref.urls[0]);
161 }
162
163 // Checks to make sure that if the user had previously selected "Open the
164 // "homepage", and the NTP is being used for the homepage, their preferences
165 // are migrated on upgrade to M19.
TEST_F(SessionStartupPrefTest,HomePageMigrationHomepageIsNTP)166 TEST_F(SessionStartupPrefTest, HomePageMigrationHomepageIsNTP) {
167 registry()->RegisterStringPref(
168 prefs::kHomePage,
169 "http://google.com/",
170 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
171
172 // By design, it's impossible to set the 'restore on startup' pref to 0
173 // ("open the homepage") using SessionStartupPref::SetStartupPref(), so set it
174 // using the pref service directly.
175 pref_service_->SetInteger(prefs::kRestoreOnStartup, /*kPrefValueHomePage*/ 0);
176 pref_service_->SetString(prefs::kHomePage, "http://chromium.org/");
177 pref_service_->SetBoolean(prefs::kHomePageIsNewTabPage, true);
178
179 SessionStartupPref pref = SessionStartupPref::GetStartupPref(
180 pref_service_.get());
181
182 EXPECT_EQ(SessionStartupPref::DEFAULT, pref.type);
183 }
184
185 #if defined(OS_MACOSX)
186 // See SessionStartupPref::MigrateMacDefaultPrefIfNecessary.
TEST_F(SessionStartupPrefTest,MacDefaultStartupPrefMigration)187 TEST_F(SessionStartupPrefTest, MacDefaultStartupPrefMigration) {
188 if (!restore_utils::IsWindowRestoreEnabled())
189 return;
190
191 // Use an old profile.
192 pref_service_->SetString(prefs::kProfileCreatedByVersion, "19.0.0.0");
193 ASSERT_TRUE(SessionStartupPref::TypeIsDefault(pref_service_.get()));
194
195 // Trigger the migration.
196 SessionStartupPref pref = SessionStartupPref::GetStartupPref(
197 pref_service_.get());
198
199 // The pref is now explicit.
200 EXPECT_EQ(SessionStartupPref::LAST, pref.type);
201 EXPECT_FALSE(SessionStartupPref::TypeIsDefault(pref_service_.get()));
202 }
203 #endif
204