Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / preference / preference_apitest.cc
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 "base/prefs/pref_service.h"
6 #include "base/strings/utf_string_conversions.h"
7 #include "chrome/browser/browser_process.h"
8 #include "chrome/browser/chrome_notification_types.h"
9 #include "chrome/browser/extensions/extension_apitest.h"
10 #include "chrome/browser/net/prediction_options.h"
11 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/browser/ui/browser.h"
13 #include "chrome/common/chrome_switches.h"
14 #include "chrome/common/pref_names.h"
15 #include "chrome/test/base/ui_test_utils.h"
16 #include "components/translate/core/common/translate_pref_names.h"
17 #include "content/public/browser/notification_service.h"
18 #include "extensions/browser/extension_registry.h"
19 #include "extensions/browser/test_extension_registry_observer.h"
20 #include "extensions/test/extension_test_message_listener.h"
21 #include "extensions/test/result_catcher.h"
22
23 namespace {
24
25 void ReleaseBrowserProcessModule() {
26   g_browser_process->ReleaseModule();
27 }
28
29 }  // namespace
30
31 class ExtensionPreferenceApiTest : public ExtensionApiTest {
32  protected:
33   ExtensionPreferenceApiTest() : profile_(NULL) {}
34
35   void CheckPreferencesSet() {
36     PrefService* prefs = profile_->GetPrefs();
37     const PrefService::Preference* pref = prefs->FindPreference(
38         prefs::kBlockThirdPartyCookies);
39     ASSERT_TRUE(pref);
40     EXPECT_TRUE(pref->IsExtensionControlled());
41     EXPECT_TRUE(prefs->GetBoolean(prefs::kAlternateErrorPagesEnabled));
42     EXPECT_TRUE(prefs->GetBoolean(autofill::prefs::kAutofillEnabled));
43     EXPECT_FALSE(prefs->GetBoolean(prefs::kBlockThirdPartyCookies));
44     EXPECT_TRUE(prefs->GetBoolean(prefs::kEnableHyperlinkAuditing));
45     EXPECT_TRUE(prefs->GetBoolean(prefs::kEnableReferrers));
46     EXPECT_TRUE(prefs->GetBoolean(prefs::kEnableTranslate));
47     EXPECT_EQ(chrome_browser_net::NETWORK_PREDICTION_DEFAULT,
48               prefs->GetInteger(prefs::kNetworkPredictionOptions));
49     EXPECT_TRUE(prefs->GetBoolean(
50         password_manager::prefs::kPasswordManagerSavingEnabled));
51     EXPECT_TRUE(prefs->GetBoolean(prefs::kSafeBrowsingEnabled));
52     EXPECT_TRUE(prefs->GetBoolean(prefs::kSearchSuggestEnabled));
53   }
54
55   void CheckPreferencesCleared() {
56     PrefService* prefs = profile_->GetPrefs();
57     const PrefService::Preference* pref = prefs->FindPreference(
58         prefs::kBlockThirdPartyCookies);
59     ASSERT_TRUE(pref);
60     EXPECT_FALSE(pref->IsExtensionControlled());
61     EXPECT_FALSE(prefs->GetBoolean(prefs::kAlternateErrorPagesEnabled));
62     EXPECT_FALSE(prefs->GetBoolean(autofill::prefs::kAutofillEnabled));
63     EXPECT_TRUE(prefs->GetBoolean(prefs::kBlockThirdPartyCookies));
64     EXPECT_FALSE(prefs->GetBoolean(prefs::kEnableHyperlinkAuditing));
65     EXPECT_FALSE(prefs->GetBoolean(prefs::kEnableReferrers));
66     EXPECT_FALSE(prefs->GetBoolean(prefs::kEnableTranslate));
67     EXPECT_EQ(chrome_browser_net::NETWORK_PREDICTION_NEVER,
68               prefs->GetInteger(prefs::kNetworkPredictionOptions));
69     EXPECT_FALSE(prefs->GetBoolean(
70         password_manager::prefs::kPasswordManagerSavingEnabled));
71     EXPECT_FALSE(prefs->GetBoolean(prefs::kSafeBrowsingEnabled));
72     EXPECT_FALSE(prefs->GetBoolean(prefs::kSearchSuggestEnabled));
73   }
74
75   void SetUpOnMainThread() override {
76     ExtensionApiTest::SetUpOnMainThread();
77
78     // The browser might get closed later (and therefore be destroyed), so we
79     // save the profile.
80     profile_ = browser()->profile();
81
82     // Closing the last browser window also releases a module reference. Make
83     // sure it's not the last one, so the message loop doesn't quit
84     // unexpectedly.
85     g_browser_process->AddRefModule();
86   }
87
88   void TearDownOnMainThread() override {
89     // ReleaseBrowserProcessModule() needs to be called in a message loop, so we
90     // post a task to do it, then run the message loop.
91     base::MessageLoop::current()->PostTask(
92         FROM_HERE, base::Bind(&ReleaseBrowserProcessModule));
93     content::RunAllPendingInMessageLoop();
94
95     ExtensionApiTest::TearDownOnMainThread();
96   }
97
98   Profile* profile_;
99 };
100
101 // http://crbug.com/177163
102 #if defined(OS_WIN) && !defined(NDEBUG)
103 #define MAYBE_Standard DISABLED_Standard
104 #else
105 #define MAYBE_Standard Standard
106 #endif
107 IN_PROC_BROWSER_TEST_F(ExtensionPreferenceApiTest, MAYBE_Standard) {
108   PrefService* prefs = profile_->GetPrefs();
109   prefs->SetBoolean(prefs::kAlternateErrorPagesEnabled, false);
110   prefs->SetBoolean(autofill::prefs::kAutofillEnabled, false);
111   prefs->SetBoolean(prefs::kBlockThirdPartyCookies, true);
112   prefs->SetBoolean(prefs::kEnableHyperlinkAuditing, false);
113   prefs->SetBoolean(prefs::kEnableReferrers, false);
114   prefs->SetBoolean(prefs::kEnableTranslate, false);
115   prefs->SetInteger(prefs::kNetworkPredictionOptions,
116                     chrome_browser_net::NETWORK_PREDICTION_NEVER);
117   prefs->SetBoolean(password_manager::prefs::kPasswordManagerSavingEnabled,
118                     false);
119   prefs->SetBoolean(prefs::kSafeBrowsingEnabled, false);
120   prefs->SetBoolean(prefs::kSearchSuggestEnabled, false);
121
122   const char kExtensionPath[] = "preference/standard";
123
124   EXPECT_TRUE(RunExtensionSubtest(kExtensionPath, "test.html")) << message_;
125   CheckPreferencesSet();
126
127   // The settings should not be reset when the extension is reloaded.
128   ReloadExtension(last_loaded_extension_id());
129   CheckPreferencesSet();
130
131   // Uninstalling and installing the extension (without running the test that
132   // calls the extension API) should clear the settings.
133   extensions::TestExtensionRegistryObserver observer(
134       extensions::ExtensionRegistry::Get(profile_), last_loaded_extension_id());
135   UninstallExtension(last_loaded_extension_id());
136   observer.WaitForExtensionUninstalled();
137   CheckPreferencesCleared();
138
139   LoadExtension(test_data_dir_.AppendASCII(kExtensionPath));
140   CheckPreferencesCleared();
141 }
142
143 IN_PROC_BROWSER_TEST_F(ExtensionPreferenceApiTest, PersistentIncognito) {
144   PrefService* prefs = profile_->GetPrefs();
145   prefs->SetBoolean(prefs::kBlockThirdPartyCookies, false);
146
147   EXPECT_TRUE(
148       RunExtensionTestIncognito("preference/persistent_incognito")) <<
149       message_;
150
151   // Setting an incognito preference should not create an incognito profile.
152   EXPECT_FALSE(profile_->HasOffTheRecordProfile());
153
154   PrefService* otr_prefs = profile_->GetOffTheRecordProfile()->GetPrefs();
155   const PrefService::Preference* pref =
156       otr_prefs->FindPreference(prefs::kBlockThirdPartyCookies);
157   ASSERT_TRUE(pref);
158   EXPECT_TRUE(pref->IsExtensionControlled());
159   EXPECT_TRUE(otr_prefs->GetBoolean(prefs::kBlockThirdPartyCookies));
160
161   pref = prefs->FindPreference(prefs::kBlockThirdPartyCookies);
162   ASSERT_TRUE(pref);
163   EXPECT_FALSE(pref->IsExtensionControlled());
164   EXPECT_FALSE(prefs->GetBoolean(prefs::kBlockThirdPartyCookies));
165 }
166
167 // Flakily times out: http://crbug.com/106144
168 IN_PROC_BROWSER_TEST_F(ExtensionPreferenceApiTest, DISABLED_IncognitoDisabled) {
169   EXPECT_FALSE(RunExtensionTest("preference/persistent_incognito"));
170 }
171
172 IN_PROC_BROWSER_TEST_F(ExtensionPreferenceApiTest, SessionOnlyIncognito) {
173   PrefService* prefs = profile_->GetPrefs();
174   prefs->SetBoolean(prefs::kBlockThirdPartyCookies, false);
175
176   EXPECT_TRUE(
177       RunExtensionTestIncognito("preference/session_only_incognito")) <<
178       message_;
179
180   EXPECT_TRUE(profile_->HasOffTheRecordProfile());
181
182   PrefService* otr_prefs = profile_->GetOffTheRecordProfile()->GetPrefs();
183   const PrefService::Preference* pref =
184       otr_prefs->FindPreference(prefs::kBlockThirdPartyCookies);
185   ASSERT_TRUE(pref);
186   EXPECT_TRUE(pref->IsExtensionControlled());
187   EXPECT_FALSE(otr_prefs->GetBoolean(prefs::kBlockThirdPartyCookies));
188
189   pref = prefs->FindPreference(prefs::kBlockThirdPartyCookies);
190   ASSERT_TRUE(pref);
191   EXPECT_FALSE(pref->IsExtensionControlled());
192   EXPECT_FALSE(prefs->GetBoolean(prefs::kBlockThirdPartyCookies));
193 }
194
195 IN_PROC_BROWSER_TEST_F(ExtensionPreferenceApiTest, Clear) {
196   PrefService* prefs = profile_->GetPrefs();
197   prefs->SetBoolean(prefs::kBlockThirdPartyCookies, true);
198
199   EXPECT_TRUE(RunExtensionTest("preference/clear")) << message_;
200
201   const PrefService::Preference* pref = prefs->FindPreference(
202       prefs::kBlockThirdPartyCookies);
203   ASSERT_TRUE(pref);
204   EXPECT_FALSE(pref->IsExtensionControlled());
205   EXPECT_EQ(true, prefs->GetBoolean(prefs::kBlockThirdPartyCookies));
206 }
207
208 IN_PROC_BROWSER_TEST_F(ExtensionPreferenceApiTest, OnChange) {
209   EXPECT_TRUE(RunExtensionTestIncognito("preference/onchange")) <<
210       message_;
211 }
212
213 IN_PROC_BROWSER_TEST_F(ExtensionPreferenceApiTest, OnChangeSplit) {
214   extensions::ResultCatcher catcher;
215   catcher.RestrictToBrowserContext(profile_);
216   extensions::ResultCatcher catcher_incognito;
217   catcher_incognito.RestrictToBrowserContext(
218       profile_->GetOffTheRecordProfile());
219
220   // Open an incognito window.
221   ui_test_utils::OpenURLOffTheRecord(profile_, GURL("chrome://newtab/"));
222
223   // changeDefault listeners.
224   ExtensionTestMessageListener listener1("changeDefault regular ready", true);
225   ExtensionTestMessageListener listener_incognito1(
226       "changeDefault incognito ready", true);
227
228   // changeIncognitoOnly listeners.
229   ExtensionTestMessageListener listener2(
230       "changeIncognitoOnly regular ready", true);
231   ExtensionTestMessageListener listener_incognito2(
232       "changeIncognitoOnly incognito ready", true);
233   ExtensionTestMessageListener listener3(
234       "changeIncognitoOnly regular listening", true);
235   ExtensionTestMessageListener listener_incognito3(
236       "changeIncognitoOnly incognito pref set", false);
237
238   // changeDefaultOnly listeners.
239   ExtensionTestMessageListener listener4(
240       "changeDefaultOnly regular ready", true);
241   ExtensionTestMessageListener listener_incognito4(
242       "changeDefaultOnly incognito ready", true);
243   ExtensionTestMessageListener listener5(
244       "changeDefaultOnly regular pref set", false);
245   ExtensionTestMessageListener listener_incognito5(
246       "changeDefaultOnly incognito listening", true);
247
248   // changeIncognitoOnlyBack listeners.
249   ExtensionTestMessageListener listener6(
250       "changeIncognitoOnlyBack regular ready", true);
251   ExtensionTestMessageListener listener_incognito6(
252       "changeIncognitoOnlyBack incognito ready", true);
253   ExtensionTestMessageListener listener7(
254       "changeIncognitoOnlyBack regular listening", true);
255   ExtensionTestMessageListener listener_incognito7(
256       "changeIncognitoOnlyBack incognito pref set", false);
257
258   // clearIncognito listeners.
259   ExtensionTestMessageListener listener8(
260       "clearIncognito regular ready", true);
261   ExtensionTestMessageListener listener_incognito8(
262       "clearIncognito incognito ready", true);
263   ExtensionTestMessageListener listener9(
264       "clearIncognito regular listening", true);
265   ExtensionTestMessageListener listener_incognito9(
266       "clearIncognito incognito pref cleared", false);
267
268   // clearDefault listeners.
269   ExtensionTestMessageListener listener10(
270       "clearDefault regular ready", true);
271   ExtensionTestMessageListener listener_incognito10(
272       "clearDefault incognito ready", true);
273
274   base::FilePath extension_data_dir =
275       test_data_dir_.AppendASCII("preference").AppendASCII("onchange_split");
276   ASSERT_TRUE(LoadExtensionIncognito(extension_data_dir));
277
278   // Test 1 - changeDefault
279   EXPECT_TRUE(listener1.WaitUntilSatisfied()); // Regular ready
280   EXPECT_TRUE(listener_incognito1.WaitUntilSatisfied()); // Incognito ready
281   listener1.Reply("ok");
282   listener_incognito1.Reply("ok");
283
284   // Test 2 - changeIncognitoOnly
285   EXPECT_TRUE(listener2.WaitUntilSatisfied()); // Regular ready
286   EXPECT_TRUE(listener_incognito2.WaitUntilSatisfied()); // Incognito ready
287   EXPECT_TRUE(listener3.WaitUntilSatisfied()); // Regular listening
288   listener2.Reply("ok");
289   listener_incognito2.Reply("ok");
290   // Incognito preference set -- notify the regular listener
291   EXPECT_TRUE(listener_incognito3.WaitUntilSatisfied());
292   listener3.Reply("ok");
293
294   // Test 3 - changeDefaultOnly
295   EXPECT_TRUE(listener4.WaitUntilSatisfied()); // Regular ready
296   EXPECT_TRUE(listener_incognito4.WaitUntilSatisfied()); // Incognito ready
297   EXPECT_TRUE(listener_incognito5.WaitUntilSatisfied()); // Incognito listening
298   listener4.Reply("ok");
299   listener_incognito4.Reply("ok");
300   // Regular preference set - notify the incognito listener
301   EXPECT_TRUE(listener5.WaitUntilSatisfied());
302   listener_incognito5.Reply("ok");
303
304   // Test 4 - changeIncognitoOnlyBack
305   EXPECT_TRUE(listener6.WaitUntilSatisfied()); // Regular ready
306   EXPECT_TRUE(listener_incognito6.WaitUntilSatisfied()); // Incognito ready
307   EXPECT_TRUE(listener7.WaitUntilSatisfied()); // Regular listening
308   listener6.Reply("ok");
309   listener_incognito6.Reply("ok");
310   // Incognito preference set -- notify the regular listener
311   EXPECT_TRUE(listener_incognito7.WaitUntilSatisfied());
312   listener7.Reply("ok");
313
314   // Test 5 - clearIncognito
315   EXPECT_TRUE(listener8.WaitUntilSatisfied()); // Regular ready
316   EXPECT_TRUE(listener_incognito8.WaitUntilSatisfied()); // Incognito ready
317   EXPECT_TRUE(listener9.WaitUntilSatisfied()); // Regular listening
318   listener8.Reply("ok");
319   listener_incognito8.Reply("ok");
320   // Incognito preference cleared -- notify the regular listener
321   EXPECT_TRUE(listener_incognito9.WaitUntilSatisfied());
322   listener9.Reply("ok");
323
324   // Test 6 - clearDefault
325   EXPECT_TRUE(listener10.WaitUntilSatisfied()); // Regular ready
326   EXPECT_TRUE(listener_incognito10.WaitUntilSatisfied()); // Incognito ready
327   listener10.Reply("ok");
328   listener_incognito10.Reply("ok");
329
330   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
331   EXPECT_TRUE(catcher_incognito.GetNextResult()) << catcher.message();
332 }