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 "base/prefs/pref_service.h"
6 #include "chrome/browser/extensions/extension_apitest.h"
7 #include "chrome/browser/prefs/proxy_config_dictionary.h"
8 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/browser/ui/browser.h"
10 #include "chrome/common/chrome_switches.h"
11 #include "chrome/common/extensions/extension.h"
12 #include "chrome/common/pref_names.h"
14 namespace extensions {
18 const char kNoServer[] = "";
19 const char kNoBypass[] = "";
20 const char kNoPac[] = "";
24 class ProxySettingsApiTest : public ExtensionApiTest {
26 void ValidateSettings(int expected_mode,
27 const std::string& expected_server,
28 const std::string& bypass,
29 const std::string& expected_pac_url,
30 PrefService* pref_service) {
31 const PrefService::Preference* pref =
32 pref_service->FindPreference(prefs::kProxy);
33 ASSERT_TRUE(pref != NULL);
34 EXPECT_TRUE(pref->IsExtensionControlled());
36 ProxyConfigDictionary dict(pref_service->GetDictionary(prefs::kProxy));
38 ProxyPrefs::ProxyMode mode;
39 ASSERT_TRUE(dict.GetMode(&mode));
40 EXPECT_EQ(expected_mode, mode);
43 if (!bypass.empty()) {
44 ASSERT_TRUE(dict.GetBypassList(&value));
45 EXPECT_EQ(bypass, value);
47 EXPECT_FALSE(dict.GetBypassList(&value));
50 if (!expected_pac_url.empty()) {
51 ASSERT_TRUE(dict.GetPacUrl(&value));
52 EXPECT_EQ(expected_pac_url, value);
54 EXPECT_FALSE(dict.GetPacUrl(&value));
57 if (!expected_server.empty()) {
58 ASSERT_TRUE(dict.GetProxyServer(&value));
59 EXPECT_EQ(expected_server, value);
61 EXPECT_FALSE(dict.GetProxyServer(&value));
65 void ExpectNoSettings(PrefService* pref_service) {
66 const PrefService::Preference* pref =
67 pref_service->FindPreference(prefs::kProxy);
68 ASSERT_TRUE(pref != NULL);
69 EXPECT_FALSE(pref->IsExtensionControlled());
73 // Tests direct connection settings.
74 IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyDirectSettings) {
75 ASSERT_TRUE(RunExtensionTestIncognito("proxy/direct")) << message_;
76 const Extension* extension = GetSingleLoadedExtension();
77 ASSERT_TRUE(extension);
79 PrefService* pref_service = browser()->profile()->GetPrefs();
80 ValidateSettings(ProxyPrefs::MODE_DIRECT, kNoServer, kNoBypass, kNoPac,
84 // Tests auto-detect settings.
85 IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyAutoSettings) {
86 ASSERT_TRUE(RunExtensionTestIncognito("proxy/auto")) << message_;
87 const Extension* extension = GetSingleLoadedExtension();
88 ASSERT_TRUE(extension);
90 PrefService* pref_service = browser()->profile()->GetPrefs();
91 ValidateSettings(ProxyPrefs::MODE_AUTO_DETECT, kNoServer, kNoBypass, kNoPac,
95 // Tests PAC proxy settings.
96 IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyPacScript) {
97 ASSERT_TRUE(RunExtensionTest("proxy/pac")) << message_;
98 const Extension* extension = GetSingleLoadedExtension();
99 ASSERT_TRUE(extension);
101 PrefService* pref_service = browser()->profile()->GetPrefs();
102 ValidateSettings(ProxyPrefs::MODE_PAC_SCRIPT, kNoServer, kNoBypass,
103 "http://wpad/windows.pac", pref_service);
106 // Tests PAC proxy settings.
107 IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyPacDataUrl) {
108 ASSERT_TRUE(RunExtensionTest("proxy/pacdataurl")) << message_;
109 const Extension* extension = GetSingleLoadedExtension();
110 ASSERT_TRUE(extension);
112 "data:;base64,ZnVuY3Rpb24gRmluZFByb3h5R"
113 "m9yVVJMKHVybCwgaG9zdCkgewogIGlmIChob3N0ID09ICdmb29iYXIuY29tJykKICAgIHJl"
114 "dHVybiAnUFJPWFkgYmxhY2tob2xlOjgwJzsKICByZXR1cm4gJ0RJUkVDVCc7Cn0=";
115 PrefService* pref_service = browser()->profile()->GetPrefs();
116 ValidateSettings(ProxyPrefs::MODE_PAC_SCRIPT, kNoServer, kNoBypass,
120 // Tests PAC proxy settings.
121 IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyPacData) {
122 ASSERT_TRUE(RunExtensionTest("proxy/pacdata")) << message_;
123 const Extension* extension = GetSingleLoadedExtension();
124 ASSERT_TRUE(extension);
126 "data:application/x-ns-proxy-autoconfig;base64,ZnVuY3Rpb24gRmluZFByb3h5R"
127 "m9yVVJMKHVybCwgaG9zdCkgewogIGlmIChob3N0ID09ICdmb29iYXIuY29tJykKICAgIHJl"
128 "dHVybiAnUFJPWFkgYmxhY2tob2xlOjgwJzsKICByZXR1cm4gJ0RJUkVDVCc7Cn0=";
129 PrefService* pref_service = browser()->profile()->GetPrefs();
130 ValidateSettings(ProxyPrefs::MODE_PAC_SCRIPT, kNoServer, kNoBypass,
134 // Tests setting a single proxy to cover all schemes.
135 IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyFixedSingle) {
136 ASSERT_TRUE(RunExtensionTest("proxy/single")) << message_;
137 const Extension* extension = GetSingleLoadedExtension();
138 ASSERT_TRUE(extension);
140 PrefService* pref_service = browser()->profile()->GetPrefs();
141 ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
148 // Tests setting to use the system's proxy settings.
149 IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxySystem) {
150 ASSERT_TRUE(RunExtensionTest("proxy/system")) << message_;
151 const Extension* extension = GetSingleLoadedExtension();
152 ASSERT_TRUE(extension);
154 PrefService* pref_service = browser()->profile()->GetPrefs();
155 ValidateSettings(ProxyPrefs::MODE_SYSTEM, kNoServer, kNoBypass, kNoPac,
159 // Tests setting separate proxies for each scheme.
160 IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyFixedIndividual) {
161 ASSERT_TRUE(RunExtensionTestIncognito("proxy/individual")) << message_;
162 const Extension* extension = GetSingleLoadedExtension();
163 ASSERT_TRUE(extension);
165 PrefService* pref_service = browser()->profile()->GetPrefs();
166 ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
167 "http=1.1.1.1:80;" // http:// is pruned.
168 "https=2.2.2.2:80;" // http:// is pruned.
169 "ftp=3.3.3.3:9000;" // http:// is pruned.
170 "socks=socks4://4.4.4.4:9090",
175 // Now check the incognito preferences.
176 pref_service = browser()->profile()->GetOffTheRecordProfile()->GetPrefs();
177 ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
181 "socks=socks4://4.4.4.4:9090",
187 // Tests setting values only for incognito mode
188 IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest,
189 ProxyFixedIndividualIncognitoOnly) {
190 ASSERT_TRUE(RunExtensionTestIncognito("proxy/individual_incognito_only")) <<
192 const Extension* extension = GetSingleLoadedExtension();
193 ASSERT_TRUE(extension);
195 PrefService* pref_service = browser()->profile()->GetPrefs();
196 ExpectNoSettings(pref_service);
198 // Now check the incognito preferences.
199 pref_service = browser()->profile()->GetOffTheRecordProfile()->GetPrefs();
200 ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
202 "https=socks5://2.2.2.2:1080;"
204 "socks=socks4://4.4.4.4:9090",
210 // Tests setting values also for incognito mode
211 // Test disabled due to http://crbug.com/88972.
212 IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest,
213 DISABLED_ProxyFixedIndividualIncognitoAlso) {
214 ASSERT_TRUE(RunExtensionTestIncognito("proxy/individual_incognito_also")) <<
216 const Extension* extension = GetSingleLoadedExtension();
217 ASSERT_TRUE(extension);
219 PrefService* pref_service = browser()->profile()->GetPrefs();
220 ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
222 "https=socks5://2.2.2.2:1080;"
224 "socks=socks4://4.4.4.4:9090",
229 // Now check the incognito preferences.
230 pref_service = browser()->profile()->GetOffTheRecordProfile()->GetPrefs();
231 ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
233 "https=socks5://6.6.6.6:1080;"
235 "socks=socks4://8.8.8.8:9090",
241 // Tests setting and unsetting values
242 IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyFixedIndividualRemove) {
243 ASSERT_TRUE(RunExtensionTest("proxy/individual_remove")) << message_;
244 const Extension* extension = GetSingleLoadedExtension();
245 ASSERT_TRUE(extension);
247 PrefService* pref_service = browser()->profile()->GetPrefs();
248 ExpectNoSettings(pref_service);
251 IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest,
253 ASSERT_TRUE(RunExtensionTestIncognito("proxy/bypass")) << message_;
254 const Extension* extension = GetSingleLoadedExtension();
255 ASSERT_TRUE(extension);
257 PrefService* pref_service = browser()->profile()->GetPrefs();
258 ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
260 "localhost,::1,foo.bar,<local>",
264 // Now check the incognito preferences.
265 pref_service = browser()->profile()->GetOffTheRecordProfile()->GetPrefs();
266 ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
268 "localhost,::1,foo.bar,<local>",
273 // This test sets proxy to an inavalid host "does.not.exist" and then fetches
274 // a page from localhost, expecting an error since host is invalid.
275 // On ChromeOS, localhost is by default bypassed, so the page from localhost
276 // will be fetched successfully, resulting in no error. Hence this test
277 // shouldn't run on ChromeOS.
278 #if defined(OS_CHROMEOS)
279 #define MAYBE_ProxyEventsInvalidProxy DISABLED_ProxyEventsInvalidProxy
281 #define MAYBE_ProxyEventsInvalidProxy ProxyEventsInvalidProxy
282 #endif // defined(OS_CHROMEOS)
284 // Tests error events: invalid proxy
285 IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, MAYBE_ProxyEventsInvalidProxy) {
286 ASSERT_TRUE(StartEmbeddedTestServer());
288 RunExtensionSubtest("proxy/events", "invalid_proxy.html")) << message_;
291 // Tests error events: PAC script parse error.
292 IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyEventsParseError) {
294 RunExtensionSubtest("proxy/events", "parse_error.html")) << message_;
297 } // namespace extensions