OLD | NEW |
| (Empty) |
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/ui/webui/options/preferences_browsertest.h" | |
6 | |
7 #include <stddef.h> | |
8 | |
9 #include <iostream> | |
10 #include <memory> | |
11 #include <sstream> | |
12 #include <utility> | |
13 | |
14 #include "base/callback.h" | |
15 #include "base/json/json_reader.h" | |
16 #include "base/json/json_writer.h" | |
17 #include "base/memory/ptr_util.h" | |
18 #include "base/values.h" | |
19 #include "build/build_config.h" | |
20 #include "chrome/browser/chrome_notification_types.h" | |
21 #include "chrome/browser/profiles/profile.h" | |
22 #include "chrome/browser/ui/browser.h" | |
23 #include "chrome/browser/ui/tabs/tab_strip_model.h" | |
24 #include "chrome/common/pref_names.h" | |
25 #include "chrome/common/url_constants.h" | |
26 #include "chrome/test/base/ui_test_utils.h" | |
27 #include "components/policy/core/browser/browser_policy_connector.h" | |
28 #include "components/policy/core/common/external_data_fetcher.h" | |
29 #include "components/policy/core/common/policy_map.h" | |
30 #include "components/policy/core/common/policy_types.h" | |
31 #include "components/policy/policy_constants.h" | |
32 #include "components/prefs/pref_service.h" | |
33 #include "content/public/browser/notification_details.h" | |
34 #include "content/public/browser/notification_source.h" | |
35 #include "content/public/browser/render_view_host.h" | |
36 #include "content/public/browser/web_contents.h" | |
37 #include "content/public/test/browser_test_utils.h" | |
38 #include "testing/gtest/include/gtest/gtest.h" | |
39 #include "url/gurl.h" | |
40 | |
41 #if defined(OS_CHROMEOS) | |
42 #include "base/strings/stringprintf.h" | |
43 #include "chrome/browser/browser_process.h" | |
44 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" | |
45 #include "chrome/browser/chromeos/proxy_cros_settings_parser.h" | |
46 #include "chrome/browser/chromeos/settings/cros_settings.h" | |
47 #include "chrome/browser/chromeos/settings/stub_install_attributes.h" | |
48 #include "chromeos/dbus/dbus_thread_manager.h" | |
49 #include "chromeos/dbus/shill_profile_client.h" | |
50 #include "chromeos/dbus/shill_service_client.h" | |
51 #include "chromeos/network/network_state.h" | |
52 #include "chromeos/network/network_state_handler.h" | |
53 #include "chromeos/network/proxy/proxy_config_handler.h" | |
54 #include "chromeos/settings/cros_settings_names.h" | |
55 #include "components/onc/onc_pref_names.h" | |
56 #include "components/proxy_config/proxy_config_dictionary.h" | |
57 #include "components/proxy_config/proxy_config_pref_names.h" | |
58 #include "content/public/test/test_utils.h" | |
59 #include "third_party/cros_system_api/dbus/service_constants.h" | |
60 #endif | |
61 | |
62 using testing::AllOf; | |
63 using testing::Mock; | |
64 using testing::Property; | |
65 using testing::Return; | |
66 using testing::_; | |
67 | |
68 namespace base { | |
69 | |
70 // Helper for pretty-printing the contents of base::Value in case of failures. | |
71 void PrintTo(const base::Value& value, std::ostream* stream) { | |
72 std::string json; | |
73 JSONWriter::Write(value, &json); | |
74 *stream << json; | |
75 } | |
76 | |
77 } // namespace base | |
78 | |
79 // Googlemock matcher for base::Value. | |
80 MATCHER_P(EqualsValue, expected, "") { | |
81 return arg && arg->Equals(expected); | |
82 } | |
83 | |
84 PreferencesBrowserTest::PreferencesBrowserTest() { | |
85 } | |
86 | |
87 PreferencesBrowserTest::~PreferencesBrowserTest() { | |
88 } | |
89 | |
90 PrefService* PreferencesBrowserTest::pref_service() { | |
91 DCHECK(pref_change_registrar_); | |
92 return pref_change_registrar_->prefs(); | |
93 } | |
94 | |
95 // Navigates to the settings page, causing the JavaScript pref handling code to | |
96 // load and injects JavaScript testing code. | |
97 void PreferencesBrowserTest::SetUpOnMainThread() { | |
98 ui_test_utils::NavigateToURL(browser(), | |
99 GURL(chrome::kChromeUISettingsFrameURL)); | |
100 SetUpPrefs(); | |
101 } | |
102 | |
103 void PreferencesBrowserTest::TearDownOnMainThread() { | |
104 pref_change_registrar_.reset(); | |
105 } | |
106 | |
107 void PreferencesBrowserTest::SetUpPrefs() { | |
108 content::WebContents* web_contents = | |
109 browser()->tab_strip_model()->GetActiveWebContents(); | |
110 ASSERT_TRUE(web_contents); | |
111 render_view_host_ = web_contents->GetRenderViewHost(); | |
112 ASSERT_TRUE(render_view_host_); | |
113 | |
114 DCHECK(!pref_change_registrar_); | |
115 pref_change_registrar_.reset(new PrefChangeRegistrar); | |
116 pref_change_registrar_->Init(browser()->profile()->GetPrefs()); | |
117 | |
118 ASSERT_TRUE(content::ExecuteScript(render_view_host_, | |
119 "function TestEnv() {" | |
120 " this.sentinelName_ = 'download.prompt_for_download';" | |
121 " this.prefs_ = [];" | |
122 " TestEnv.instance_ = this;" | |
123 "}" | |
124 "" | |
125 "TestEnv.handleEvent = function(event) {" | |
126 " var env = TestEnv.instance_;" | |
127 " var name = event.type;" | |
128 " env.removePrefListener_(name);" | |
129 " if (name == TestEnv.sentinelName_)" | |
130 " env.sentinelValue_ = event.value.value;" | |
131 " else" | |
132 " env.reply_[name] = event.value;" | |
133 " if (env.fetching_ && !--env.fetching_ ||" | |
134 " !env.fetching_ && name == env.sentinelName_) {" | |
135 " env.removePrefListeners_();" | |
136 " window.domAutomationController.send(JSON.stringify(env.reply_));" | |
137 " delete env.reply_;" | |
138 " }" | |
139 "};" | |
140 "" | |
141 "TestEnv.prototype = {" | |
142 " addPrefListener_: function(name) {" | |
143 " Preferences.getInstance().addEventListener(name," | |
144 " TestEnv.handleEvent);" | |
145 " }," | |
146 "" | |
147 " addPrefListeners_: function() {" | |
148 " for (var i in this.prefs_)" | |
149 " this.addPrefListener_(this.prefs_[i]);" | |
150 " }," | |
151 "" | |
152 " removePrefListener_: function(name) {" | |
153 " Preferences.getInstance().removeEventListener(name," | |
154 " TestEnv.handleEvent);" | |
155 " }," | |
156 "" | |
157 " removePrefListeners_: function() {" | |
158 " for (var i in this.prefs_)" | |
159 " this.removePrefListener_(this.prefs_[i]);" | |
160 " }," | |
161 "" | |
162 "" | |
163 " addPref: function(name) {" | |
164 " this.prefs_.push(name);" | |
165 " }," | |
166 "" | |
167 " setupAndReply: function() {" | |
168 " this.reply_ = {};" | |
169 " Preferences.instance_ = new Preferences();" | |
170 " this.addPref(this.sentinelName_);" | |
171 " this.fetching_ = this.prefs_.length;" | |
172 " this.addPrefListeners_();" | |
173 " Preferences.getInstance().initialize();" | |
174 " }," | |
175 "" | |
176 " runAndReply: function(test) {" | |
177 " this.reply_ = {};" | |
178 " this.addPrefListeners_();" | |
179 " test();" | |
180 " this.sentinelValue_ = !this.sentinelValue_;" | |
181 " Preferences.setBooleanPref(this.sentinelName_, this.sentinelValue_," | |
182 " true);" | |
183 " }," | |
184 "" | |
185 " startObserving: function() {" | |
186 " this.reply_ = {};" | |
187 " this.addPrefListeners_();" | |
188 " }," | |
189 "" | |
190 " finishObservingAndReply: function() {" | |
191 " this.sentinelValue_ = !this.sentinelValue_;" | |
192 " Preferences.setBooleanPref(this.sentinelName_, this.sentinelValue_," | |
193 " true);" | |
194 " }" | |
195 "};")); | |
196 } | |
197 | |
198 // Forwards notifications received when pref values change in the backend. | |
199 void PreferencesBrowserTest::OnPreferenceChanged(const std::string& pref_name) { | |
200 OnCommit(pref_service()->FindPreference(pref_name.c_str())); | |
201 } | |
202 | |
203 void PreferencesBrowserTest::SetUpInProcessBrowserTestFixture() { | |
204 // Sets up a mock policy provider for user and device policies. | |
205 EXPECT_CALL(policy_provider_, IsInitializationComplete(_)) | |
206 .WillRepeatedly(Return(true)); | |
207 policy::BrowserPolicyConnector::SetPolicyProviderForTesting( | |
208 &policy_provider_); | |
209 } | |
210 | |
211 void PreferencesBrowserTest::SetUserPolicies( | |
212 const std::vector<std::string>& names, | |
213 const std::vector<std::unique_ptr<base::Value>>& values, | |
214 policy::PolicyLevel level) { | |
215 policy::PolicyMap map; | |
216 for (size_t i = 0; i < names.size(); ++i) { | |
217 map.Set(names[i], level, policy::POLICY_SCOPE_USER, | |
218 policy::POLICY_SOURCE_CLOUD, values[i]->CreateDeepCopy(), nullptr); | |
219 } | |
220 policy_provider_.UpdateChromePolicy(map); | |
221 } | |
222 | |
223 void PreferencesBrowserTest::ClearUserPolicies() { | |
224 policy::PolicyMap empty_policy_map; | |
225 policy_provider_.UpdateChromePolicy(empty_policy_map); | |
226 } | |
227 | |
228 void PreferencesBrowserTest::SetUserValues( | |
229 const std::vector<std::string>& names, | |
230 const std::vector<std::unique_ptr<base::Value>>& values) { | |
231 for (size_t i = 0; i < names.size(); ++i) { | |
232 pref_service()->Set(names[i].c_str(), *values[i]); | |
233 } | |
234 } | |
235 | |
236 void PreferencesBrowserTest::VerifyKeyValue(const base::DictionaryValue& dict, | |
237 const std::string& key, | |
238 const base::Value& expected) { | |
239 const base::Value* actual = NULL; | |
240 EXPECT_TRUE(dict.Get(key, &actual)) << "Was checking key: " << key; | |
241 if (actual) | |
242 EXPECT_EQ(expected, *actual) << "Was checking key: " << key; | |
243 } | |
244 | |
245 void PreferencesBrowserTest::VerifyPref( | |
246 const base::DictionaryValue* prefs, | |
247 const std::string& name, | |
248 const std::unique_ptr<base::Value>& value, | |
249 const std::string& controlledBy, | |
250 bool disabled, | |
251 bool uncommitted) { | |
252 const base::Value* pref = NULL; | |
253 const base::DictionaryValue* dict = NULL; | |
254 ASSERT_TRUE(prefs->GetWithoutPathExpansion(name, &pref)); | |
255 ASSERT_TRUE(pref->GetAsDictionary(&dict)); | |
256 VerifyKeyValue(*dict, "value", *value); | |
257 if (!controlledBy.empty()) | |
258 VerifyKeyValue(*dict, "controlledBy", base::Value(controlledBy)); | |
259 else | |
260 EXPECT_FALSE(dict->HasKey("controlledBy")); | |
261 | |
262 if (disabled) | |
263 VerifyKeyValue(*dict, "disabled", base::Value(true)); | |
264 else if (dict->HasKey("disabled")) | |
265 VerifyKeyValue(*dict, "disabled", base::Value(false)); | |
266 | |
267 if (uncommitted) | |
268 VerifyKeyValue(*dict, "uncommitted", base::Value(true)); | |
269 else if (dict->HasKey("uncommitted")) | |
270 VerifyKeyValue(*dict, "uncommitted", base::Value(false)); | |
271 } | |
272 | |
273 void PreferencesBrowserTest::VerifyObservedPref( | |
274 const std::string& json, | |
275 const std::string& name, | |
276 const std::unique_ptr<base::Value>& value, | |
277 const std::string& controlledBy, | |
278 bool disabled, | |
279 bool uncommitted) { | |
280 std::unique_ptr<base::Value> observed_value_ptr = | |
281 base::JSONReader::Read(json); | |
282 const base::DictionaryValue* observed_dict; | |
283 ASSERT_TRUE(observed_value_ptr.get()); | |
284 ASSERT_TRUE(observed_value_ptr->GetAsDictionary(&observed_dict)); | |
285 VerifyPref(observed_dict, name, value, controlledBy, disabled, uncommitted); | |
286 } | |
287 | |
288 void PreferencesBrowserTest::VerifyObservedPrefs( | |
289 const std::string& json, | |
290 const std::vector<std::string>& names, | |
291 const std::vector<std::unique_ptr<base::Value>>& values, | |
292 const std::string& controlledBy, | |
293 bool disabled, | |
294 bool uncommitted) { | |
295 std::unique_ptr<base::Value> observed_value_ptr = | |
296 base::JSONReader::Read(json); | |
297 const base::DictionaryValue* observed_dict; | |
298 ASSERT_TRUE(observed_value_ptr.get()); | |
299 ASSERT_TRUE(observed_value_ptr->GetAsDictionary(&observed_dict)); | |
300 for (size_t i = 0; i < names.size(); ++i) { | |
301 VerifyPref(observed_dict, names[i], values[i], controlledBy, disabled, | |
302 uncommitted); | |
303 } | |
304 } | |
305 | |
306 void PreferencesBrowserTest::ExpectNoCommit(const std::string& name) { | |
307 pref_change_registrar_->Add( | |
308 name.c_str(), | |
309 base::Bind(&PreferencesBrowserTest::OnPreferenceChanged, | |
310 base::Unretained(this))); | |
311 EXPECT_CALL(*this, OnCommit(Property(&PrefService::Preference::name, name))) | |
312 .Times(0); | |
313 } | |
314 | |
315 void PreferencesBrowserTest::ExpectSetCommit( | |
316 const std::string& name, | |
317 const std::unique_ptr<base::Value>& value) { | |
318 pref_change_registrar_->Add( | |
319 name.c_str(), | |
320 base::Bind(&PreferencesBrowserTest::OnPreferenceChanged, | |
321 base::Unretained(this))); | |
322 EXPECT_CALL( | |
323 *this, | |
324 OnCommit(AllOf(Property(&PrefService::Preference::name, name), | |
325 Property(&PrefService::Preference::IsUserControlled, true), | |
326 Property(&PrefService::Preference::GetValue, | |
327 EqualsValue(value.get()))))); | |
328 } | |
329 | |
330 void PreferencesBrowserTest::ExpectClearCommit(const std::string& name) { | |
331 pref_change_registrar_->Add( | |
332 name.c_str(), | |
333 base::Bind(&PreferencesBrowserTest::OnPreferenceChanged, | |
334 base::Unretained(this))); | |
335 EXPECT_CALL(*this, OnCommit(AllOf( | |
336 Property(&PrefService::Preference::name, name), | |
337 Property(&PrefService::Preference::IsUserControlled, false)))); | |
338 } | |
339 | |
340 void PreferencesBrowserTest::VerifyAndClearExpectations() { | |
341 Mock::VerifyAndClearExpectations(this); | |
342 pref_change_registrar_->RemoveAll(); | |
343 } | |
344 | |
345 void PreferencesBrowserTest::SetupJavaScriptTestEnvironment( | |
346 const std::vector<std::string>& pref_names, | |
347 std::string* observed_json) const { | |
348 std::stringstream javascript; | |
349 javascript << "var testEnv = new TestEnv();"; | |
350 for (const auto& name : pref_names) { | |
351 javascript << "testEnv.addPref('" << name.c_str() << "');"; | |
352 } | |
353 javascript << "testEnv.setupAndReply();"; | |
354 std::string temp_observed_json; | |
355 if (!observed_json) | |
356 observed_json = &temp_observed_json; | |
357 ASSERT_TRUE(content::ExecuteScriptAndExtractString( | |
358 render_view_host_, javascript.str(), observed_json)); | |
359 } | |
360 | |
361 void PreferencesBrowserTest::SetPref(const std::string& name, | |
362 const std::string& type, | |
363 const std::unique_ptr<base::Value>& value, | |
364 bool commit, | |
365 std::string* observed_json) { | |
366 std::unique_ptr<base::Value> commit_ptr(new base::Value(commit)); | |
367 std::stringstream javascript; | |
368 javascript << "testEnv.runAndReply(function() {" | |
369 << " Preferences.set" << type << "Pref(" | |
370 << " '" << name << "'," | |
371 << " " << *value << "," | |
372 << " " << *commit_ptr << ");" | |
373 << "});"; | |
374 ASSERT_TRUE(content::ExecuteScriptAndExtractString( | |
375 render_view_host_, javascript.str(), observed_json)); | |
376 } | |
377 | |
378 void PreferencesBrowserTest::VerifySetPref( | |
379 const std::string& name, | |
380 const std::string& type, | |
381 const std::unique_ptr<base::Value>& value, | |
382 bool commit) { | |
383 if (commit) | |
384 ExpectSetCommit(name, value); | |
385 else | |
386 ExpectNoCommit(name); | |
387 std::string observed_json; | |
388 SetPref(name, type, value, commit, &observed_json); | |
389 VerifyObservedPref(observed_json, name, value, std::string(), false, !commit); | |
390 VerifyAndClearExpectations(); | |
391 } | |
392 | |
393 void PreferencesBrowserTest::VerifyClearPref( | |
394 const std::string& name, | |
395 const std::unique_ptr<base::Value>& value, | |
396 bool commit) { | |
397 if (commit) | |
398 ExpectClearCommit(name); | |
399 else | |
400 ExpectNoCommit(name); | |
401 std::string commit_json; | |
402 base::JSONWriter::Write(base::Value(commit), &commit_json); | |
403 std::stringstream javascript; | |
404 javascript << "testEnv.runAndReply(function() {" | |
405 << " Preferences.clearPref(" | |
406 << " '" << name.c_str() << "'," | |
407 << " " << commit_json.c_str() << ");});"; | |
408 std::string observed_json; | |
409 ASSERT_TRUE(content::ExecuteScriptAndExtractString( | |
410 render_view_host_, javascript.str(), &observed_json)); | |
411 VerifyObservedPref(observed_json, name, value, "recommended", false, !commit); | |
412 VerifyAndClearExpectations(); | |
413 } | |
414 | |
415 void PreferencesBrowserTest::VerifyCommit( | |
416 const std::string& name, | |
417 const std::unique_ptr<base::Value>& value, | |
418 const std::string& controlledBy) { | |
419 std::stringstream javascript; | |
420 javascript << "testEnv.runAndReply(function() {" | |
421 << " Preferences.getInstance().commitPref(" | |
422 << " '" << name.c_str() << "');});"; | |
423 std::string observed_json; | |
424 ASSERT_TRUE(content::ExecuteScriptAndExtractString( | |
425 render_view_host_, javascript.str(), &observed_json)); | |
426 VerifyObservedPref(observed_json, name, value, controlledBy, false, false); | |
427 } | |
428 | |
429 void PreferencesBrowserTest::VerifySetCommit( | |
430 const std::string& name, | |
431 const std::unique_ptr<base::Value>& value) { | |
432 ExpectSetCommit(name, value); | |
433 VerifyCommit(name, value, std::string()); | |
434 VerifyAndClearExpectations(); | |
435 } | |
436 | |
437 void PreferencesBrowserTest::VerifyClearCommit( | |
438 const std::string& name, | |
439 const std::unique_ptr<base::Value>& value) { | |
440 ExpectClearCommit(name); | |
441 VerifyCommit(name, value, "recommended"); | |
442 VerifyAndClearExpectations(); | |
443 } | |
444 | |
445 void PreferencesBrowserTest::VerifyRollback( | |
446 const std::string& name, | |
447 const std::unique_ptr<base::Value>& value, | |
448 const std::string& controlledBy) { | |
449 ExpectNoCommit(name); | |
450 std::stringstream javascript; | |
451 javascript << "testEnv.runAndReply(function() {" | |
452 << " Preferences.getInstance().rollbackPref(" | |
453 << " '" << name.c_str() << "');});"; | |
454 std::string observed_json; | |
455 ASSERT_TRUE(content::ExecuteScriptAndExtractString( | |
456 render_view_host_, javascript.str(), &observed_json)); | |
457 VerifyObservedPref(observed_json, name, value, controlledBy, false, true); | |
458 VerifyAndClearExpectations(); | |
459 } | |
460 | |
461 void PreferencesBrowserTest::StartObserving() { | |
462 ASSERT_TRUE(content::ExecuteScript( | |
463 render_view_host_, "testEnv.startObserving();")); | |
464 } | |
465 | |
466 void PreferencesBrowserTest::FinishObserving(std::string* observed_json) { | |
467 ASSERT_TRUE(content::ExecuteScriptAndExtractString( | |
468 render_view_host_, | |
469 "testEnv.finishObservingAndReply();", | |
470 observed_json)); | |
471 } | |
472 | |
473 void PreferencesBrowserTest::UseDefaultTestPrefs(bool includeListPref) { | |
474 // Boolean pref. | |
475 types_.push_back("Boolean"); | |
476 pref_names_.push_back(prefs::kAlternateErrorPagesEnabled); | |
477 policy_names_.push_back(policy::key::kAlternateErrorPagesEnabled); | |
478 non_default_values_.push_back(base::MakeUnique<base::Value>(false)); | |
479 | |
480 // Integer pref. | |
481 types_.push_back("Integer"); | |
482 pref_names_.push_back(prefs::kRestoreOnStartup); | |
483 policy_names_.push_back(policy::key::kRestoreOnStartup); | |
484 non_default_values_.push_back(base::MakeUnique<base::Value>(4)); | |
485 | |
486 // List pref. | |
487 if (includeListPref) { | |
488 types_.push_back("List"); | |
489 pref_names_.push_back(prefs::kURLsToRestoreOnStartup); | |
490 policy_names_.push_back(policy::key::kRestoreOnStartupURLs); | |
491 auto list = base::MakeUnique<base::ListValue>(); | |
492 list->AppendString("http://www.example.com"); | |
493 list->AppendString("http://example.com"); | |
494 non_default_values_.push_back(std::move(list)); | |
495 } | |
496 | |
497 // Retrieve default values. | |
498 for (const auto& name : pref_names_) { | |
499 default_values_.push_back( | |
500 pref_service()->GetDefaultPrefValue(name.c_str())->CreateDeepCopy()); | |
501 } | |
502 } | |
503 | |
504 // Verifies that initializing the JavaScript Preferences class fires the correct | |
505 // notifications in JavaScript. | |
506 IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, FetchPrefs) { | |
507 UseDefaultTestPrefs(true); | |
508 std::string observed_json; | |
509 | |
510 // Verify notifications when default values are in effect. | |
511 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
512 VerifyObservedPrefs(observed_json, pref_names_, default_values_, | |
513 std::string(), false, false); | |
514 | |
515 // Verify notifications when recommended values are in effect. | |
516 SetUserPolicies(policy_names_, non_default_values_, | |
517 policy::POLICY_LEVEL_RECOMMENDED); | |
518 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
519 VerifyObservedPrefs(observed_json, pref_names_, non_default_values_, | |
520 "recommended", false, false); | |
521 | |
522 // Verify notifications when mandatory values are in effect. | |
523 SetUserPolicies(policy_names_, non_default_values_, | |
524 policy::POLICY_LEVEL_MANDATORY); | |
525 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
526 VerifyObservedPrefs(observed_json, pref_names_, non_default_values_, "policy", | |
527 true, false); | |
528 | |
529 // Verify notifications when user-modified values are in effect. | |
530 ClearUserPolicies(); | |
531 SetUserValues(pref_names_, non_default_values_); | |
532 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
533 VerifyObservedPrefs(observed_json, pref_names_, non_default_values_, | |
534 std::string(), false, false); | |
535 } | |
536 | |
537 // Verifies that setting a user-modified pref value through the JavaScript | |
538 // Preferences class fires the correct notification in JavaScript and causes the | |
539 // change to be committed to the C++ backend. | |
540 IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, SetPrefs) { | |
541 UseDefaultTestPrefs(false); | |
542 | |
543 ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL)); | |
544 for (size_t i = 0; i < pref_names_.size(); ++i) { | |
545 VerifySetPref(pref_names_[i], types_[i], non_default_values_[i], true); | |
546 } | |
547 } | |
548 | |
549 // Verifies that clearing a user-modified pref value through the JavaScript | |
550 // Preferences class fires the correct notification in JavaScript and causes the | |
551 // change to be committed to the C++ backend. | |
552 IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, ClearPrefs) { | |
553 UseDefaultTestPrefs(false); | |
554 | |
555 SetUserPolicies(policy_names_, default_values_, | |
556 policy::POLICY_LEVEL_RECOMMENDED); | |
557 SetUserValues(pref_names_, non_default_values_); | |
558 ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL)); | |
559 for (size_t i = 0; i < pref_names_.size(); ++i) { | |
560 VerifyClearPref(pref_names_[i], default_values_[i], true); | |
561 } | |
562 } | |
563 | |
564 // Verifies that when the user-modified value of a dialog pref is set and the | |
565 // change then committed through the JavaScript Preferences class, the correct | |
566 // notifications fire and a commit to the C++ backend occurs in the latter step | |
567 // only. | |
568 IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, DialogPrefsSetCommit) { | |
569 UseDefaultTestPrefs(false); | |
570 | |
571 ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL)); | |
572 for (size_t i = 0; i < pref_names_.size(); ++i) { | |
573 VerifySetPref(pref_names_[i], types_[i], non_default_values_[i], false); | |
574 VerifySetCommit(pref_names_[i], non_default_values_[i]); | |
575 } | |
576 } | |
577 | |
578 // Verifies that when the user-modified value of a dialog pref is set and the | |
579 // change then rolled back through the JavaScript Preferences class, the correct | |
580 // notifications fire and no commit to the C++ backend occurs. | |
581 IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, DialogPrefsSetRollback) { | |
582 UseDefaultTestPrefs(false); | |
583 | |
584 // Verify behavior when default values are in effect. | |
585 ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL)); | |
586 for (size_t i = 0; i < pref_names_.size(); ++i) { | |
587 VerifySetPref(pref_names_[i], types_[i], non_default_values_[i], false); | |
588 VerifyRollback(pref_names_[i], default_values_[i], std::string()); | |
589 } | |
590 | |
591 // Verify behavior when recommended values are in effect. | |
592 SetUserPolicies(policy_names_, default_values_, | |
593 policy::POLICY_LEVEL_RECOMMENDED); | |
594 ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL)); | |
595 for (size_t i = 0; i < pref_names_.size(); ++i) { | |
596 VerifySetPref(pref_names_[i], types_[i], non_default_values_[i], false); | |
597 VerifyRollback(pref_names_[i], default_values_[i], "recommended"); | |
598 } | |
599 } | |
600 | |
601 // Verifies that when the user-modified value of a dialog pref is cleared and | |
602 // the change then committed through the JavaScript Preferences class, the | |
603 // correct notifications fire and a commit to the C++ backend occurs in the | |
604 // latter step only. | |
605 IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, DialogPrefsClearCommit) { | |
606 UseDefaultTestPrefs(false); | |
607 | |
608 SetUserPolicies(policy_names_, default_values_, | |
609 policy::POLICY_LEVEL_RECOMMENDED); | |
610 SetUserValues(pref_names_, non_default_values_); | |
611 ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL)); | |
612 for (size_t i = 0; i < pref_names_.size(); ++i) { | |
613 VerifyClearPref(pref_names_[i], default_values_[i], false); | |
614 VerifyClearCommit(pref_names_[i], default_values_[i]); | |
615 } | |
616 } | |
617 | |
618 // Verifies that when the user-modified value of a dialog pref is cleared and | |
619 // the change then rolled back through the JavaScript Preferences class, the | |
620 // correct notifications fire and no commit to the C++ backend occurs. | |
621 IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, DialogPrefsClearRollback) { | |
622 UseDefaultTestPrefs(false); | |
623 | |
624 SetUserPolicies(policy_names_, default_values_, | |
625 policy::POLICY_LEVEL_RECOMMENDED); | |
626 SetUserValues(pref_names_, non_default_values_); | |
627 ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL)); | |
628 for (size_t i = 0; i < pref_names_.size(); ++i) { | |
629 VerifyClearPref(pref_names_[i], default_values_[i], false); | |
630 VerifyRollback(pref_names_[i], non_default_values_[i], std::string()); | |
631 } | |
632 } | |
633 | |
634 // Verifies that when preference values change in the C++ backend, the correct | |
635 // notifications fire in JavaScript. | |
636 IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, NotificationsOnBackendChanges) { | |
637 UseDefaultTestPrefs(false); | |
638 std::string observed_json; | |
639 | |
640 ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL)); | |
641 | |
642 // Verify notifications when recommended values come into effect. | |
643 StartObserving(); | |
644 SetUserPolicies(policy_names_, non_default_values_, | |
645 policy::POLICY_LEVEL_RECOMMENDED); | |
646 FinishObserving(&observed_json); | |
647 VerifyObservedPrefs(observed_json, pref_names_, non_default_values_, | |
648 "recommended", false, false); | |
649 | |
650 // Verify notifications when mandatory values come into effect. | |
651 StartObserving(); | |
652 SetUserPolicies(policy_names_, non_default_values_, | |
653 policy::POLICY_LEVEL_MANDATORY); | |
654 FinishObserving(&observed_json); | |
655 VerifyObservedPrefs(observed_json, pref_names_, non_default_values_, "policy", | |
656 true, false); | |
657 | |
658 // Verify notifications when default values come into effect. | |
659 StartObserving(); | |
660 ClearUserPolicies(); | |
661 FinishObserving(&observed_json); | |
662 VerifyObservedPrefs(observed_json, pref_names_, default_values_, | |
663 std::string(), false, false); | |
664 | |
665 // Verify notifications when user-modified values come into effect. | |
666 StartObserving(); | |
667 SetUserValues(pref_names_, non_default_values_); | |
668 FinishObserving(&observed_json); | |
669 VerifyObservedPrefs(observed_json, pref_names_, non_default_values_, | |
670 std::string(), false, false); | |
671 } | |
672 | |
673 #if defined(OS_CHROMEOS) | |
674 | |
675 // Verifies that initializing the JavaScript Preferences class fires the correct | |
676 // notifications in JavaScript for pref values handled by the | |
677 // CoreChromeOSOptionsHandler class. | |
678 IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, ChromeOSDeviceFetchPrefs) { | |
679 std::string observed_json; | |
680 | |
681 // Boolean pref. | |
682 pref_names_.push_back(chromeos::kAccountsPrefAllowGuest); | |
683 default_values_.push_back(base::MakeUnique<base::Value>(true)); | |
684 | |
685 // String pref. | |
686 pref_names_.push_back(chromeos::kReleaseChannel); | |
687 default_values_.push_back(base::MakeUnique<base::Value>("")); | |
688 | |
689 // List pref. | |
690 pref_names_.push_back(chromeos::kAccountsPrefUsers); | |
691 default_values_.push_back(base::MakeUnique<base::ListValue>()); | |
692 | |
693 // Verify notifications when default values are in effect. | |
694 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
695 VerifyObservedPrefs(observed_json, pref_names_, default_values_, "owner", | |
696 true, false); | |
697 } | |
698 | |
699 // Verifies that initializing the JavaScript Preferences class fires the correct | |
700 // notifications in JavaScript for non-privileged pref values handled by the | |
701 // CoreChromeOSOptionsHandler class. | |
702 IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, | |
703 ChromeOSDeviceFetchNonPrivilegedPrefs) { | |
704 std::vector<std::unique_ptr<base::Value>> decorated_non_default_values; | |
705 std::string observed_json; | |
706 | |
707 // Non-privileged string pref. | |
708 pref_names_.push_back(chromeos::kSystemTimezone); | |
709 default_values_.push_back( | |
710 base::MakeUnique<base::Value>("America/Los_Angeles")); | |
711 non_default_values_.push_back( | |
712 base::MakeUnique<base::Value>("America/New_York")); | |
713 decorated_non_default_values.push_back( | |
714 non_default_values_.back()->CreateDeepCopy()); | |
715 | |
716 // Verify notifications when default values are in effect. | |
717 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
718 VerifyObservedPrefs(observed_json, pref_names_, default_values_, | |
719 std::string(), false, false); | |
720 | |
721 chromeos::CrosSettings* cros_settings = chromeos::CrosSettings::Get(); | |
722 cros_settings->Set(pref_names_[0], *non_default_values_[0]); | |
723 | |
724 // Verify notifications when non-default values are in effect. | |
725 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
726 VerifyObservedPrefs(observed_json, pref_names_, decorated_non_default_values, | |
727 std::string(), false, false); | |
728 } | |
729 | |
730 class ManagedPreferencesBrowserTest : public PreferencesBrowserTest { | |
731 protected: | |
732 // PreferencesBrowserTest implementation: | |
733 void SetUpInProcessBrowserTestFixture() override { | |
734 // Set up fake install attributes. | |
735 std::unique_ptr<chromeos::StubInstallAttributes> attributes = | |
736 base::MakeUnique<chromeos::StubInstallAttributes>(); | |
737 attributes->SetCloudManaged("example.com", "fake-id"); | |
738 policy::BrowserPolicyConnectorChromeOS::SetInstallAttributesForTesting( | |
739 attributes.release()); | |
740 | |
741 PreferencesBrowserTest::SetUpInProcessBrowserTestFixture(); | |
742 } | |
743 }; | |
744 | |
745 // Verifies that initializing the JavaScript Preferences class fires the correct | |
746 // notifications in JavaScript for pref values handled by the | |
747 // CoreChromeOSOptionsHandler class for a managed device. | |
748 IN_PROC_BROWSER_TEST_F(ManagedPreferencesBrowserTest, | |
749 ChromeOSDeviceFetchPrefs) { | |
750 std::vector<std::unique_ptr<base::Value>> decorated_non_default_values; | |
751 std::string observed_json; | |
752 | |
753 // Boolean pref. | |
754 pref_names_.push_back(chromeos::kAccountsPrefAllowGuest); | |
755 non_default_values_.push_back(base::MakeUnique<base::Value>(false)); | |
756 decorated_non_default_values.push_back( | |
757 non_default_values_.back()->CreateDeepCopy()); | |
758 | |
759 // String pref. | |
760 pref_names_.push_back(chromeos::kReleaseChannel); | |
761 non_default_values_.push_back( | |
762 base::MakeUnique<base::Value>("stable-channel")); | |
763 decorated_non_default_values.push_back( | |
764 non_default_values_.back()->CreateDeepCopy()); | |
765 | |
766 // List pref. | |
767 pref_names_.push_back(chromeos::kAccountsPrefUsers); | |
768 auto list = base::MakeUnique<base::ListValue>(); | |
769 list->AppendString("me@google.com"); | |
770 list->AppendString("you@google.com"); | |
771 non_default_values_.push_back(std::move(list)); | |
772 list = base::MakeUnique<base::ListValue>(); | |
773 auto dict = base::MakeUnique<base::DictionaryValue>(); | |
774 dict->SetString("username", "me@google.com"); | |
775 dict->SetString("name", "me@google.com"); | |
776 dict->SetString("email", ""); | |
777 dict->SetBoolean("owner", false); | |
778 list->Append(std::move(dict)); | |
779 dict = base::MakeUnique<base::DictionaryValue>(); | |
780 dict->SetString("username", "you@google.com"); | |
781 dict->SetString("name", "you@google.com"); | |
782 dict->SetString("email", ""); | |
783 dict->SetBoolean("owner", false); | |
784 list->Append(std::move(dict)); | |
785 decorated_non_default_values.push_back(std::move(list)); | |
786 | |
787 chromeos::CrosSettings* cros_settings = chromeos::CrosSettings::Get(); | |
788 for (size_t i = 0; i < pref_names_.size(); ++i) { | |
789 cros_settings->Set(pref_names_[i], *non_default_values_[i]); | |
790 } | |
791 | |
792 // Verify notifications when mandatory values are in effect. | |
793 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
794 VerifyObservedPrefs(observed_json, pref_names_, decorated_non_default_values, | |
795 "policy", true, false); | |
796 } | |
797 | |
798 // Verifies that initializing the JavaScript Preferences class fires the correct | |
799 // notifications in JavaScript for non-privileged pref values handled by the | |
800 // CoreChromeOSOptionsHandler class for a managed device. | |
801 IN_PROC_BROWSER_TEST_F(ManagedPreferencesBrowserTest, | |
802 ChromeOSDeviceFetchNonPrivilegedPrefs) { | |
803 std::vector<std::unique_ptr<base::Value>> decorated_non_default_values; | |
804 std::string observed_json; | |
805 | |
806 // Non-privileged string pref. | |
807 pref_names_.push_back(chromeos::kSystemTimezone); | |
808 non_default_values_.push_back( | |
809 base::MakeUnique<base::Value>("America/New_York")); | |
810 decorated_non_default_values.push_back( | |
811 non_default_values_.back()->CreateDeepCopy()); | |
812 | |
813 // Verify notifications when mandatory values are in effect. | |
814 chromeos::CrosSettings* cros_settings = chromeos::CrosSettings::Get(); | |
815 cros_settings->Set(pref_names_[0], *non_default_values_[0]); | |
816 | |
817 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
818 VerifyObservedPrefs(observed_json, pref_names_, decorated_non_default_values, | |
819 std::string(), false, false); | |
820 } | |
821 | |
822 namespace { | |
823 | |
824 const char* kUserProfilePath = "user_profile"; | |
825 | |
826 } // namespace | |
827 | |
828 class ProxyPreferencesBrowserTest : public PreferencesBrowserTest { | |
829 public: | |
830 void SetUpOnMainThread() override { | |
831 SetupNetworkEnvironment(); | |
832 content::RunAllPendingInMessageLoop(); | |
833 | |
834 std::unique_ptr<base::DictionaryValue> proxy_config_dict( | |
835 ProxyConfigDictionary::CreateFixedServers("127.0.0.1:8080", | |
836 "*.google.com, 1.2.3.4:22")); | |
837 | |
838 ProxyConfigDictionary proxy_config(std::move(proxy_config_dict)); | |
839 | |
840 const chromeos::NetworkState* network = GetDefaultNetwork(); | |
841 ASSERT_TRUE(network); | |
842 chromeos::proxy_config::SetProxyConfigForNetwork(proxy_config, *network); | |
843 | |
844 std::string url = base::StringPrintf("%s?network=%s", | |
845 chrome::kChromeUIProxySettingsURL, | |
846 network->guid().c_str()); | |
847 | |
848 ui_test_utils::NavigateToURL(browser(), GURL(url)); | |
849 SetUpPrefs(); | |
850 } | |
851 | |
852 protected: | |
853 void SetupNetworkEnvironment() { | |
854 chromeos::ShillProfileClient::TestInterface* profile_test = | |
855 chromeos::DBusThreadManager::Get()->GetShillProfileClient() | |
856 ->GetTestInterface(); | |
857 chromeos::ShillServiceClient::TestInterface* service_test = | |
858 chromeos::DBusThreadManager::Get()->GetShillServiceClient() | |
859 ->GetTestInterface(); | |
860 | |
861 profile_test->AddProfile(kUserProfilePath, "user"); | |
862 | |
863 service_test->ClearServices(); | |
864 service_test->AddService("stub_ethernet", | |
865 "stub_ethernet_guid", | |
866 "eth0", | |
867 shill::kTypeEthernet, | |
868 shill::kStateOnline, | |
869 true /* add_to_visible */ ); | |
870 service_test->SetServiceProperty("stub_ethernet", shill::kProfileProperty, | |
871 base::Value(kUserProfilePath)); | |
872 profile_test->AddService(kUserProfilePath, "stub_wifi2"); | |
873 } | |
874 | |
875 void SetONCPolicy(const char* policy_name, policy::PolicyScope scope) { | |
876 std::string onc_policy = | |
877 "{ \"NetworkConfigurations\": [" | |
878 " { \"GUID\": \"stub_ethernet_guid\"," | |
879 " \"Type\": \"Ethernet\"," | |
880 " \"Name\": \"My Ethernet\"," | |
881 " \"Ethernet\": {" | |
882 " \"Authentication\": \"None\" }," | |
883 " \"ProxySettings\": {" | |
884 " \"PAC\": \"http://domain.com/x\"," | |
885 " \"Type\": \"PAC\" }" | |
886 " }" | |
887 " ]," | |
888 " \"Type\": \"UnencryptedConfiguration\"" | |
889 "}"; | |
890 | |
891 policy::PolicyMap map; | |
892 map.Set(policy_name, policy::POLICY_LEVEL_MANDATORY, scope, | |
893 policy::POLICY_SOURCE_CLOUD, | |
894 base::MakeUnique<base::Value>(onc_policy), nullptr); | |
895 policy_provider_.UpdateChromePolicy(map); | |
896 | |
897 content::RunAllPendingInMessageLoop(); | |
898 } | |
899 | |
900 const chromeos::NetworkState* GetDefaultNetwork() { | |
901 chromeos::NetworkStateHandler* handler = | |
902 chromeos::NetworkHandler::Get()->network_state_handler(); | |
903 return handler->DefaultNetwork(); | |
904 } | |
905 | |
906 void SetProxyPref(const std::string& name, const base::Value& value) { | |
907 std::string type; | |
908 switch (value.GetType()) { | |
909 case base::Value::Type::BOOLEAN: | |
910 type = "Boolean"; | |
911 break; | |
912 case base::Value::Type::INTEGER: | |
913 type = "Integer"; | |
914 break; | |
915 case base::Value::Type::STRING: | |
916 type = "String"; | |
917 break; | |
918 default: | |
919 ASSERT_TRUE(false); | |
920 } | |
921 | |
922 std::string observed_json; | |
923 SetPref(name, type, value.CreateDeepCopy(), true, &observed_json); | |
924 } | |
925 | |
926 void VerifyCurrentProxyServer(const std::string& expected_server, | |
927 onc::ONCSource expected_source) { | |
928 const chromeos::NetworkState* network = GetDefaultNetwork(); | |
929 ASSERT_TRUE(network); | |
930 onc::ONCSource actual_source; | |
931 std::unique_ptr<ProxyConfigDictionary> proxy_dict = | |
932 chromeos::proxy_config::GetProxyConfigForNetwork( | |
933 g_browser_process->local_state(), pref_service(), *network, | |
934 &actual_source); | |
935 ASSERT_TRUE(proxy_dict); | |
936 std::string actual_proxy_server; | |
937 EXPECT_TRUE(proxy_dict->GetProxyServer(&actual_proxy_server)); | |
938 EXPECT_EQ(expected_server, actual_proxy_server); | |
939 EXPECT_EQ(expected_source, actual_source); | |
940 } | |
941 }; | |
942 | |
943 // Verifies that proxy settings are correctly pushed to JavaScript during | |
944 // initialization of the proxy settings page. | |
945 IN_PROC_BROWSER_TEST_F(ProxyPreferencesBrowserTest, ChromeOSInitializeProxy) { | |
946 // Boolean pref. | |
947 pref_names_.push_back(chromeos::proxy_cros_settings_parser::kProxySingle); | |
948 non_default_values_.push_back(base::MakeUnique<base::Value>(true)); | |
949 | |
950 // Integer prefs. | |
951 pref_names_.push_back( | |
952 chromeos::proxy_cros_settings_parser::kProxySingleHttpPort); | |
953 non_default_values_.push_back(base::MakeUnique<base::Value>(8080)); | |
954 | |
955 // String pref. | |
956 pref_names_.push_back(chromeos::proxy_cros_settings_parser::kProxySingleHttp); | |
957 non_default_values_.push_back(base::MakeUnique<base::Value>("127.0.0.1")); | |
958 | |
959 // List pref. | |
960 pref_names_.push_back(chromeos::proxy_cros_settings_parser::kProxyIgnoreList); | |
961 auto list = base::MakeUnique<base::ListValue>(); | |
962 list->AppendString("*.google.com"); | |
963 list->AppendString("1.2.3.4:22"); | |
964 non_default_values_.push_back(std::move(list)); | |
965 | |
966 // Verify that no policy is presented to the UI. This must be verified on the | |
967 // kProxyType and the kUseSharedProxies prefs. | |
968 pref_names_.push_back(chromeos::proxy_cros_settings_parser::kProxyType); | |
969 non_default_values_.push_back(base::MakeUnique<base::Value>(2)); | |
970 | |
971 pref_names_.push_back(proxy_config::prefs::kUseSharedProxies); | |
972 non_default_values_.push_back(base::MakeUnique<base::Value>(false)); | |
973 | |
974 std::string observed_json; | |
975 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
976 VerifyObservedPrefs(observed_json, pref_names_, non_default_values_, "", | |
977 false, false); | |
978 } | |
979 | |
980 IN_PROC_BROWSER_TEST_F(ProxyPreferencesBrowserTest, ONCPolicy) { | |
981 SetONCPolicy(policy::key::kOpenNetworkConfiguration, | |
982 policy::POLICY_SCOPE_USER); | |
983 | |
984 // Verify that per-network policy is presented to the UI. This must be | |
985 // verified on the kProxyType. | |
986 pref_names_.push_back(chromeos::proxy_cros_settings_parser::kProxyType); | |
987 non_default_values_.push_back(base::MakeUnique<base::Value>(3)); | |
988 | |
989 std::string observed_json; | |
990 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
991 VerifyObservedPrefs(observed_json, pref_names_, non_default_values_, "policy", | |
992 true, false); | |
993 | |
994 // Verify that 'use-shared-proxies' is not affected by per-network policy. | |
995 pref_names_.clear(); | |
996 non_default_values_.clear(); | |
997 pref_names_.push_back(proxy_config::prefs::kUseSharedProxies); | |
998 non_default_values_.push_back(base::MakeUnique<base::Value>(false)); | |
999 | |
1000 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
1001 VerifyObservedPrefs(observed_json, pref_names_, non_default_values_, "", | |
1002 false, false); | |
1003 } | |
1004 | |
1005 IN_PROC_BROWSER_TEST_F(ProxyPreferencesBrowserTest, DeviceONCPolicy) { | |
1006 SetONCPolicy(policy::key::kDeviceOpenNetworkConfiguration, | |
1007 policy::POLICY_SCOPE_MACHINE); | |
1008 | |
1009 // Verify that the policy is presented to the UI. This verification must be | |
1010 // done on the kProxyType pref. | |
1011 pref_names_.push_back(chromeos::proxy_cros_settings_parser::kProxyType); | |
1012 non_default_values_.push_back(base::MakeUnique<base::Value>(3)); | |
1013 | |
1014 std::string observed_json; | |
1015 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
1016 VerifyObservedPrefs(observed_json, pref_names_, non_default_values_, "policy", | |
1017 true, false); | |
1018 | |
1019 // Verify that 'use-shared-proxies' is not affected by per-network policy. | |
1020 pref_names_.clear(); | |
1021 non_default_values_.clear(); | |
1022 pref_names_.push_back(proxy_config::prefs::kUseSharedProxies); | |
1023 non_default_values_.push_back(base::MakeUnique<base::Value>(false)); | |
1024 | |
1025 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
1026 VerifyObservedPrefs(observed_json, pref_names_, non_default_values_, "", | |
1027 false, false); | |
1028 } | |
1029 | |
1030 IN_PROC_BROWSER_TEST_F(ProxyPreferencesBrowserTest, UserProxyPolicy) { | |
1031 policy_names_.push_back(policy::key::kProxyMode); | |
1032 default_values_.push_back( | |
1033 base::MakeUnique<base::Value>(ProxyPrefs::kAutoDetectProxyModeName)); | |
1034 SetUserPolicies(policy_names_, default_values_, | |
1035 policy::POLICY_LEVEL_MANDATORY); | |
1036 content::RunAllPendingInMessageLoop(); | |
1037 | |
1038 // Verify that the policy is presented to the UI. This verification must be | |
1039 // done on the kProxyType pref. | |
1040 pref_names_.push_back(chromeos::proxy_cros_settings_parser::kProxyType); | |
1041 non_default_values_.push_back(base::MakeUnique<base::Value>(3)); | |
1042 | |
1043 // Verify that 'use-shared-proxies' is controlled by the policy. | |
1044 pref_names_.push_back(proxy_config::prefs::kUseSharedProxies); | |
1045 non_default_values_.push_back(base::MakeUnique<base::Value>(false)); | |
1046 | |
1047 std::string observed_json; | |
1048 SetupJavaScriptTestEnvironment(pref_names_, &observed_json); | |
1049 VerifyObservedPrefs(observed_json, pref_names_, non_default_values_, "policy", | |
1050 true, false); | |
1051 } | |
1052 | |
1053 // Verifies that modifications to the proxy settings are correctly pushed from | |
1054 // JavaScript to the ProxyConfig property stored in the network configuration. | |
1055 IN_PROC_BROWSER_TEST_F(ProxyPreferencesBrowserTest, ChromeOSSetProxy) { | |
1056 ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL)); | |
1057 | |
1058 SetProxyPref(chromeos::proxy_cros_settings_parser::kProxySingleHttpPort, | |
1059 base::Value(123)); | |
1060 SetProxyPref(chromeos::proxy_cros_settings_parser::kProxySingleHttp, | |
1061 base::Value("www.adomain.xy")); | |
1062 | |
1063 VerifyCurrentProxyServer("www.adomain.xy:123", | |
1064 onc::ONC_SOURCE_NONE); | |
1065 } | |
1066 | |
1067 // Verify that default proxy ports are used and that ports can be updated | |
1068 // without affecting the previously set hosts. | |
1069 IN_PROC_BROWSER_TEST_F(ProxyPreferencesBrowserTest, ChromeOSProxyDefaultPorts) { | |
1070 ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL)); | |
1071 | |
1072 // Set to manual, per scheme proxy. | |
1073 SetProxyPref(chromeos::proxy_cros_settings_parser::kProxySingle, | |
1074 base::Value(false)); | |
1075 | |
1076 // Set hosts but no ports. | |
1077 SetProxyPref(chromeos::proxy_cros_settings_parser::kProxyHttpUrl, | |
1078 base::Value("a.com")); | |
1079 SetProxyPref(chromeos::proxy_cros_settings_parser::kProxyHttpsUrl, | |
1080 base::Value("4.3.2.1")); | |
1081 SetProxyPref(chromeos::proxy_cros_settings_parser::kProxyFtpUrl, | |
1082 base::Value("c.com")); | |
1083 SetProxyPref(chromeos::proxy_cros_settings_parser::kProxySocks, | |
1084 base::Value("d.com")); | |
1085 | |
1086 // Verify default ports. | |
1087 VerifyCurrentProxyServer( | |
1088 "http=a.com:80;https=4.3.2.1:80;ftp=c.com:80;socks=socks4://d.com:1080", | |
1089 onc::ONC_SOURCE_NONE); | |
1090 | |
1091 // Set and verify the ports. | |
1092 SetProxyPref(chromeos::proxy_cros_settings_parser::kProxyHttpPort, | |
1093 base::Value(1)); | |
1094 SetProxyPref(chromeos::proxy_cros_settings_parser::kProxyHttpsPort, | |
1095 base::Value(2)); | |
1096 SetProxyPref(chromeos::proxy_cros_settings_parser::kProxyFtpPort, | |
1097 base::Value(3)); | |
1098 SetProxyPref(chromeos::proxy_cros_settings_parser::kProxySocksPort, | |
1099 base::Value(4)); | |
1100 | |
1101 VerifyCurrentProxyServer( | |
1102 "http=a.com:1;https=4.3.2.1:2;ftp=c.com:3;socks=socks4://d.com:4", | |
1103 onc::ONC_SOURCE_NONE); | |
1104 } | |
1105 | |
1106 #endif | |
OLD | NEW |