15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/options/preferences_browsertest.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <iostream>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sstream>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/callback.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/browser/browser_policy_connector.h"
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/external_data_fetcher.h"
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_map.h"
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_types.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "policy/policy_constants.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/stringprintf.h"
38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/browser_process.h"
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/net/proxy_config_handler.h"
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/policy/stub_enterprise_install_attributes.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/proxy_cros_settings_parser.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/prefs/proxy_config_dictionary.h"
45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chromeos/dbus/dbus_thread_manager.h"
46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chromeos/dbus/shill_profile_client.h"
47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chromeos/dbus/shill_service_client.h"
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_state.h"
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_state_handler.h"
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/settings/cros_settings_names.h"
51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/test/test_utils.h"
52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/cros_system_api/dbus/service_constants.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AllOf;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Mock;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Property;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper for using EXPECT_EQ() with base::Value.
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool operator==(const base::Value& first, const base::Value& second) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return first.Equals(&second);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper for pretty-printing the contents of base::Value in case of failures.
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintTo(const base::Value& value, std::ostream* stream) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string json;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JSONWriter::Write(&value, &json);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *stream << json;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Googlemock matcher for base::Value.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(EqualsValue, expected, "") {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return arg && arg->Equals(expected);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PreferencesBrowserTest::PreferencesBrowserTest() {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PreferencesBrowserTest::~PreferencesBrowserTest() {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Navigates to the settings page, causing the JavaScript pref handling code to
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// load and injects JavaScript testing code.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::SetUpOnMainThread() {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               GURL(chrome::kChromeUISettingsFrameURL));
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetUpPrefs();
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PreferencesBrowserTest::SetUpPrefs() {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebContents* web_contents =
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(web_contents);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_view_host_ = web_contents->GetRenderViewHost();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(render_view_host_);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_ = browser()->profile()->GetPrefs();
103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  pref_change_registrar_.Init(pref_service_);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScript(render_view_host_,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "function TestEnv() {"
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  this.sentinelName_ = 'download.prompt_for_download';"
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  this.prefs_ = [];"
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  TestEnv.instance_ = this;"
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "}"
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ""
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "TestEnv.handleEvent = function(event) {"
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  var env = TestEnv.instance_;"
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  var name = event.type;"
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  env.removePrefListener_(name);"
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  if (name == TestEnv.sentinelName_)"
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    env.sentinelValue_ = event.value.value;"
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  else"
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    env.reply_[name] = event.value;"
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  if (env.fetching_ && !--env.fetching_ ||"
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "      !env.fetching_ && name == env.sentinelName_) {"
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    env.removePrefListeners_();"
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    window.domAutomationController.send(JSON.stringify(env.reply_));"
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    delete env.reply_;"
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  }"
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "};"
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ""
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "TestEnv.prototype = {"
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  addPrefListener_: function(name) {"
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    Preferences.getInstance().addEventListener(name,"
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "                                               TestEnv.handleEvent);"
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  },"
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ""
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  addPrefListeners_: function() {"
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    for (var i in this.prefs_)"
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "      this.addPrefListener_(this.prefs_[i]);"
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  },"
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ""
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  removePrefListener_: function(name) {"
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    Preferences.getInstance().removeEventListener(name,"
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "                                                  TestEnv.handleEvent);"
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  },"
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ""
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  removePrefListeners_: function() {"
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    for (var i in this.prefs_)"
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "      this.removePrefListener_(this.prefs_[i]);"
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  },"
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ""
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ""
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  addPref: function(name) {"
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    this.prefs_.push(name);"
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  },"
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ""
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  setupAndReply: function() {"
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    this.reply_ = {};"
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    Preferences.instance_ = new Preferences();"
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    this.addPref(this.sentinelName_);"
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    this.fetching_ = this.prefs_.length;"
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    this.addPrefListeners_();"
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    Preferences.getInstance().initialize();"
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  },"
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ""
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  runAndReply: function(test) {"
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    this.reply_ = {};"
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    this.addPrefListeners_();"
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    test();"
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    this.sentinelValue_ = !this.sentinelValue_;"
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    Preferences.setBooleanPref(this.sentinelName_, this.sentinelValue_,"
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "                               true);"
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  },"
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ""
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  startObserving: function() {"
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    this.reply_ = {};"
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    this.addPrefListeners_();"
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  },"
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ""
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  finishObservingAndReply: function() {"
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    this.sentinelValue_ = !this.sentinelValue_;"
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    Preferences.setBooleanPref(this.sentinelName_, this.sentinelValue_,"
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "                               true);"
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "  }"
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "};"));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Forwards notifications received when pref values change in the backend.
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PreferencesBrowserTest::OnPreferenceChanged(const std::string& pref_name) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnCommit(pref_service_->FindPreference(pref_name.c_str()));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::SetUpInProcessBrowserTestFixture() {
190ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Sets up a mock policy provider for user and device policies.
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(policy_provider_, IsInitializationComplete(_))
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(true));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy::BrowserPolicyConnector::SetPolicyProviderForTesting(
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &policy_provider_);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::SetUserPolicies(
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<std::string>& names,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<base::Value*>& values,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    policy::PolicyLevel level) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy::PolicyMap map;
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  for (size_t i = 0; i < names.size(); ++i) {
2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    map.Set(names[i], level, policy::POLICY_SCOPE_USER,
2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            values[i]->DeepCopy(), NULL);
2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_provider_.UpdateChromePolicy(map);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::ClearUserPolicies() {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy::PolicyMap empty_policy_map;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_provider_.UpdateChromePolicy(empty_policy_map);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::SetUserValues(
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<std::string>& names,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<base::Value*>& values) {
2170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (size_t i = 0; i < names.size(); ++i) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref_service_->Set(names[i].c_str(), *values[i]);
2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PreferencesBrowserTest::VerifyKeyValue(const base::DictionaryValue& dict,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const std::string& key,
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            const base::Value& expected) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Value* actual = NULL;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(dict.Get(key, &actual)) << "Was checking key: " << key;
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (actual)
2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(expected, *actual) << "Was checking key: " << key;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::VerifyPref(const base::DictionaryValue* prefs,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const std::string& name,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const base::Value* value,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const std::string& controlledBy,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        bool disabled,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        bool uncommitted) {
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const base::Value* pref = NULL;
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const base::DictionaryValue* dict = NULL;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(prefs->GetWithoutPathExpansion(name, &pref));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(pref->GetAsDictionary(&dict));
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyKeyValue(*dict, "value", *value);
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!controlledBy.empty())
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyKeyValue(*dict, "controlledBy", base::StringValue(controlledBy));
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  else
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(dict->HasKey("controlledBy"));
2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (disabled)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyKeyValue(*dict, "disabled", base::FundamentalValue(true));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (dict->HasKey("disabled"))
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyKeyValue(*dict, "disabled", base::FundamentalValue(false));
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (uncommitted)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyKeyValue(*dict, "uncommitted", base::FundamentalValue(true));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (dict->HasKey("uncommitted"))
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyKeyValue(*dict, "uncommitted", base::FundamentalValue(false));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::VerifyObservedPref(const std::string& json,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const std::string& name,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const base::Value* value,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const std::string& controlledBy,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                bool disabled,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                bool uncommitted) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> observed_value_ptr(base::JSONReader::Read(json));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::DictionaryValue* observed_dict;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(observed_value_ptr.get());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(observed_value_ptr->GetAsDictionary(&observed_dict));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyPref(observed_dict, name, value, controlledBy, disabled, uncommitted);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::VerifyObservedPrefs(
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& json,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<std::string>& names,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<base::Value*>& values,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& controlledBy,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool disabled,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool uncommitted) {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> observed_value_ptr(base::JSONReader::Read(json));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::DictionaryValue* observed_dict;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(observed_value_ptr.get());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(observed_value_ptr->GetAsDictionary(&observed_dict));
2820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (size_t i = 0; i < names.size(); ++i) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifyPref(observed_dict, names[i], values[i], controlledBy, disabled,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               uncommitted);
2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::ExpectNoCommit(const std::string& name) {
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref_change_registrar_.Add(
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      name.c_str(),
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&PreferencesBrowserTest::OnPreferenceChanged,
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnCommit(Property(&PrefService::Preference::name, name)))
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(0);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::ExpectSetCommit(const std::string& name,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const base::Value* value) {
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref_change_registrar_.Add(
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      name.c_str(),
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&PreferencesBrowserTest::OnPreferenceChanged,
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnCommit(AllOf(
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Property(&PrefService::Preference::name, name),
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Property(&PrefService::Preference::IsUserControlled, true),
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Property(&PrefService::Preference::GetValue, EqualsValue(value)))));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::ExpectClearCommit(const std::string& name) {
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref_change_registrar_.Add(
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      name.c_str(),
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&PreferencesBrowserTest::OnPreferenceChanged,
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnCommit(AllOf(
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Property(&PrefService::Preference::name, name),
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Property(&PrefService::Preference::IsUserControlled, false))));
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::VerifyAndClearExpectations() {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_change_registrar_.RemoveAll();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::SetupJavaScriptTestEnvironment(
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<std::string>& pref_names,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* observed_json) const {
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::stringstream javascript;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  javascript << "var testEnv = new TestEnv();";
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<std::string>::const_iterator name = pref_names.begin();
3300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch       name != pref_names.end(); ++name) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    javascript << "testEnv.addPref('" << name->c_str() << "');";
3320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  javascript << "testEnv.setupAndReply();";
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string temp_observed_json;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!observed_json)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observed_json = &temp_observed_json;
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_host_, javascript.str(), observed_json));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PreferencesBrowserTest::SetPref(const std::string& name,
34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                     const std::string& type,
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                     const base::Value* value,
34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                     bool commit,
34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                     std::string* observed_json) {
34690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<base::Value> commit_ptr(new base::FundamentalValue(commit));
34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::stringstream javascript;
34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  javascript << "testEnv.runAndReply(function() {"
34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)             << "  Preferences.set" << type << "Pref("
35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)             << "      '" << name << "',"
35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)             << "      " << *value << ","
35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)             << "      " << *commit_ptr << ");"
35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)             << "});";
35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      render_view_host_, javascript.str(), observed_json));
35690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::VerifySetPref(const std::string& name,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const std::string& type,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const base::Value* value,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           bool commit) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (commit)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectSetCommit(name, value);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectNoCommit(name);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string observed_json;
36790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetPref(name, type, value, commit, &observed_json);
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VerifyObservedPref(observed_json, name, value, std::string(), false, !commit);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyAndClearExpectations();
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::VerifyClearPref(const std::string& name,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const base::Value* value,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             bool commit) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (commit)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectClearCommit(name);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectNoCommit(name);
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> commit_ptr(new base::FundamentalValue(commit));
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string commit_json;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONWriter::Write(commit_ptr.get(), &commit_json);
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::stringstream javascript;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  javascript << "testEnv.runAndReply(function() {"
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << "    Preferences.clearPref("
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << "      '" << name.c_str() << "',"
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << "      " << commit_json.c_str() << ");});";
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string observed_json;
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_host_, javascript.str(), &observed_json));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyObservedPref(observed_json, name, value, "recommended", false, !commit);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyAndClearExpectations();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::VerifyCommit(const std::string& name,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const base::Value* value,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const std::string& controlledBy) {
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::stringstream javascript;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  javascript << "testEnv.runAndReply(function() {"
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << "    Preferences.getInstance().commitPref("
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << "        '" << name.c_str() << "');});";
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string observed_json;
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_host_, javascript.str(), &observed_json));
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyObservedPref(observed_json, name, value, controlledBy, false, false);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::VerifySetCommit(const std::string& name,
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const base::Value* value) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSetCommit(name, value);
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VerifyCommit(name, value, std::string());
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyAndClearExpectations();
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::VerifyClearCommit(const std::string& name,
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               const base::Value* value) {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectClearCommit(name);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyCommit(name, value, "recommended");
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyAndClearExpectations();
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::VerifyRollback(const std::string& name,
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const base::Value* value,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const std::string& controlledBy) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoCommit(name);
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::stringstream javascript;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  javascript << "testEnv.runAndReply(function() {"
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << "    Preferences.getInstance().rollbackPref("
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << "        '" << name.c_str() << "');});";
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string observed_json;
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_host_, javascript.str(), &observed_json));
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyObservedPref(observed_json, name, value, controlledBy, false, true);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyAndClearExpectations();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::StartObserving() {
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScript(
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_host_, "testEnv.startObserving();"));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::FinishObserving(std::string* observed_json) {
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_host_,
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "testEnv.finishObservingAndReply();",
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      observed_json));
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PreferencesBrowserTest::UseDefaultTestPrefs(bool includeListPref) {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Boolean pref.
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types_.push_back("Boolean");
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_names_.push_back(prefs::kAlternateErrorPagesEnabled);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_names_.push_back(policy::key::kAlternateErrorPagesEnabled);
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  non_default_values_.push_back(new base::FundamentalValue(false));
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Integer pref.
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types_.push_back("Integer");
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_names_.push_back(prefs::kRestoreOnStartup);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_names_.push_back(policy::key::kRestoreOnStartup);
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  non_default_values_.push_back(new base::FundamentalValue(4));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List pref.
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (includeListPref) {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    types_.push_back("List");
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref_names_.push_back(prefs::kURLsToRestoreOnStartup);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    policy_names_.push_back(policy::key::kRestoreOnStartupURLs);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ListValue* list = new base::ListValue;
4670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    list->Append(new base::StringValue("http://www.example.com"));
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    list->Append(new base::StringValue("http://example.com"));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    non_default_values_.push_back(list);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieve default values.
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<std::string>::const_iterator name = pref_names_.begin();
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name != pref_names_.end(); ++name) {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_values_.push_back(
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pref_service_->GetDefaultPrefValue(name->c_str())->DeepCopy());
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that initializing the JavaScript Preferences class fires the correct
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notifications in JavaScript.
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, FetchPrefs) {
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UseDefaultTestPrefs(true);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string observed_json;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify notifications when default values are in effect.
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VerifyObservedPrefs(
4890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      observed_json, pref_names_, default_values_.get(),
4900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      std::string(), false, false);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify notifications when recommended values are in effect.
4930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetUserPolicies(policy_names_, non_default_values_.get(),
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  policy::POLICY_LEVEL_RECOMMENDED);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
4960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyObservedPrefs(observed_json, pref_names_, non_default_values_.get(),
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "recommended", false, false);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify notifications when mandatory values are in effect.
5000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetUserPolicies(policy_names_, non_default_values_.get(),
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  policy::POLICY_LEVEL_MANDATORY);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
5030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyObservedPrefs(observed_json, pref_names_, non_default_values_.get(),
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "policy", true, false);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify notifications when user-modified values are in effect.
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearUserPolicies();
5080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetUserValues(pref_names_, non_default_values_.get());
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VerifyObservedPrefs(observed_json,
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      pref_names_,
5120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      non_default_values_.get(),
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      std::string(),
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      false,
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      false);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that setting a user-modified pref value through the JavaScript
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Preferences class fires the correct notification in JavaScript and causes the
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// change to be committed to the C++ backend.
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, SetPrefs) {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UseDefaultTestPrefs(false);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL));
5250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (size_t i = 0; i < pref_names_.size(); ++i) {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifySetPref(pref_names_[i], types_[i], non_default_values_[i], true);
5270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that clearing a user-modified pref value through the JavaScript
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Preferences class fires the correct notification in JavaScript and causes the
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// change to be committed to the C++ backend.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, ClearPrefs) {
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UseDefaultTestPrefs(false);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetUserPolicies(policy_names_, default_values_.get(),
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  policy::POLICY_LEVEL_RECOMMENDED);
5380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetUserValues(pref_names_, non_default_values_.get());
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL));
5400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (size_t i = 0; i < pref_names_.size(); ++i) {
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifyClearPref(pref_names_[i], default_values_[i], true);
5420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that when the user-modified value of a dialog pref is set and the
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// change then committed through the JavaScript Preferences class, the correct
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notifications fire and a commit to the C++ backend occurs in the latter step
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// only.
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, DialogPrefsSetCommit) {
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UseDefaultTestPrefs(false);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL));
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pref_names_.size(); ++i) {
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifySetPref(pref_names_[i], types_[i], non_default_values_[i], false);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifySetCommit(pref_names_[i], non_default_values_[i]);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that when the user-modified value of a dialog pref is set and the
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// change then rolled back through the JavaScript Preferences class, the correct
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notifications fire and no commit to the C++ backend occurs.
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, DialogPrefsSetRollback) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UseDefaultTestPrefs(false);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify behavior when default values are in effect.
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL));
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pref_names_.size(); ++i) {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifySetPref(pref_names_[i], types_[i], non_default_values_[i], false);
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    VerifyRollback(pref_names_[i], default_values_[i], std::string());
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify behavior when recommended values are in effect.
5730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetUserPolicies(policy_names_, default_values_.get(),
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  policy::POLICY_LEVEL_RECOMMENDED);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pref_names_.size(); ++i) {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifySetPref(pref_names_[i], types_[i], non_default_values_[i], false);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifyRollback(pref_names_[i], default_values_[i], "recommended");
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that when the user-modified value of a dialog pref is cleared and
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the change then committed through the JavaScript Preferences class, the
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correct notifications fire and a commit to the C++ backend occurs in the
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// latter step only.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, DialogPrefsClearCommit) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UseDefaultTestPrefs(false);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetUserPolicies(policy_names_, default_values_.get(),
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  policy::POLICY_LEVEL_RECOMMENDED);
5910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetUserValues(pref_names_, non_default_values_.get());
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pref_names_.size(); ++i) {
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifyClearPref(pref_names_[i], default_values_[i], false);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifyClearCommit(pref_names_[i], default_values_[i]);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that when the user-modified value of a dialog pref is cleared and
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the change then rolled back through the JavaScript Preferences class, the
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correct notifications fire and no commit to the C++ backend occurs.
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, DialogPrefsClearRollback) {
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UseDefaultTestPrefs(false);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetUserPolicies(policy_names_, default_values_.get(),
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  policy::POLICY_LEVEL_RECOMMENDED);
6070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetUserValues(pref_names_, non_default_values_.get());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < pref_names_.size(); ++i) {
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifyClearPref(pref_names_[i], default_values_[i], false);
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    VerifyRollback(pref_names_[i], non_default_values_[i], std::string());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that when preference values change in the C++ backend, the correct
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notifications fire in JavaScript.
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, NotificationsOnBackendChanges) {
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UseDefaultTestPrefs(false);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string observed_json;
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL));
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify notifications when recommended values come into effect.
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartObserving();
6250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetUserPolicies(policy_names_, non_default_values_.get(),
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  policy::POLICY_LEVEL_RECOMMENDED);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FinishObserving(&observed_json);
6280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyObservedPrefs(observed_json, pref_names_, non_default_values_.get(),
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "recommended", false, false);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify notifications when mandatory values come into effect.
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartObserving();
6330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetUserPolicies(policy_names_, non_default_values_.get(),
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  policy::POLICY_LEVEL_MANDATORY);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FinishObserving(&observed_json);
6360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyObservedPrefs(observed_json, pref_names_, non_default_values_.get(),
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "policy", true, false);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify notifications when default values come into effect.
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartObserving();
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearUserPolicies();
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FinishObserving(&observed_json);
643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VerifyObservedPrefs(
6440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      observed_json, pref_names_, default_values_.get(),
6450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      std::string(), false, false);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify notifications when user-modified values come into effect.
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartObserving();
6490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetUserValues(pref_names_, non_default_values_.get());
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FinishObserving(&observed_json);
651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VerifyObservedPrefs(observed_json,
652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      pref_names_,
6530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      non_default_values_.get(),
654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      std::string(),
655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      false,
656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      false);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that initializing the JavaScript Preferences class fires the correct
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notifications in JavaScript for pref values handled by the
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CoreChromeOSOptionsHandler class.
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PreferencesBrowserTest, ChromeOSDeviceFetchPrefs) {
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string observed_json;
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Boolean pref.
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_names_.push_back(chromeos::kAccountsPrefAllowGuest);
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  default_values_.push_back(new base::FundamentalValue(true));
6700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // String pref.
6720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  pref_names_.push_back(chromeos::kReleaseChannel);
6730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  default_values_.push_back(new base::StringValue(""));
6740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // List pref.
6760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  pref_names_.push_back(chromeos::kAccountsPrefUsers);
6770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  default_values_.push_back(new base::ListValue);
6780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Verify notifications when default values are in effect.
6800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
6810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyObservedPrefs(observed_json, pref_names_, default_values_.get(),
6820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      "owner", true, false);
6830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
6840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Verifies that initializing the JavaScript Preferences class fires the correct
6860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// notifications in JavaScript for non-privileged pref values handled by the
6870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// CoreChromeOSOptionsHandler class.
6880529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(PreferencesBrowserTest,
6890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                       ChromeOSDeviceFetchNonPrivilegedPrefs) {
6900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedVector<base::Value> decorated_non_default_values;
6910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string observed_json;
6920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Non-privileged string pref.
6940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  pref_names_.push_back(chromeos::kSystemTimezone);
6950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  default_values_.push_back(new base::StringValue("America/Los_Angeles"));
6960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  non_default_values_.push_back(new base::StringValue("America/New_York"));
6970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  decorated_non_default_values.push_back(
6980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      non_default_values_.back()->DeepCopy());
6990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Verify notifications when default values are in effect.
7010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
7020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyObservedPrefs(observed_json, pref_names_, default_values_.get(),
7030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      std::string(), false, false);
7040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  chromeos::CrosSettings* cros_settings = chromeos::CrosSettings::Get();
7060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  cros_settings->Set(pref_names_[0], *non_default_values_[0]);
7070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Verify notifications when non-default values are in effect.
7090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
7100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyObservedPrefs(observed_json, pref_names_,
7110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      decorated_non_default_values.get(),
7120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      std::string(), false, false);
7130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
7140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass ManagedPreferencesBrowserTest : public PreferencesBrowserTest {
7160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch protected:
7170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // PreferencesBrowserTest implementation:
7180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
7190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Set up fake install attributes.
7200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    scoped_ptr<policy::StubEnterpriseInstallAttributes> attributes(
7210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        new policy::StubEnterpriseInstallAttributes());
7220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    attributes->SetDomain("example.com");
7230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    attributes->SetRegistrationUser("user@example.com");
7240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    policy::BrowserPolicyConnectorChromeOS::SetInstallAttributesForTesting(
7250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        attributes.release());
7260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    PreferencesBrowserTest::SetUpInProcessBrowserTestFixture();
7280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
7290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
7300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Verifies that initializing the JavaScript Preferences class fires the correct
7320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// notifications in JavaScript for pref values handled by the
7330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// CoreChromeOSOptionsHandler class for a managed device.
7340529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(ManagedPreferencesBrowserTest,
7350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                       ChromeOSDeviceFetchPrefs) {
7360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedVector<base::Value> decorated_non_default_values;
7370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string observed_json;
7380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Boolean pref.
7400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  pref_names_.push_back(chromeos::kAccountsPrefAllowGuest);
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  non_default_values_.push_back(new base::FundamentalValue(false));
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decorated_non_default_values.push_back(
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      non_default_values_.back()->DeepCopy());
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // String pref.
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_names_.push_back(chromeos::kReleaseChannel);
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  non_default_values_.push_back(new base::StringValue("stable-channel"));
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decorated_non_default_values.push_back(
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      non_default_values_.back()->DeepCopy());
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List pref.
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_names_.push_back(chromeos::kAccountsPrefUsers);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* list = new base::ListValue;
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  list->Append(new base::StringValue("me@google.com"));
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  list->Append(new base::StringValue("you@google.com"));
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  non_default_values_.push_back(list);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list = new base::ListValue;
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue;
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("username", "me@google.com");
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("name", "me@google.com");
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("email", "");
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetBoolean("owner", false);
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list->Append(dict);
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict = new base::DictionaryValue;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("username", "you@google.com");
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("name", "you@google.com");
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("email", "");
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetBoolean("owner", false);
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list->Append(dict);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decorated_non_default_values.push_back(list);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  chromeos::CrosSettings* cros_settings = chromeos::CrosSettings::Get();
7730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (size_t i = 0; i < pref_names_.size(); ++i) {
7740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    cros_settings->Set(pref_names_[i], *non_default_values_[i]);
7750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
7760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Verify notifications when mandatory values are in effect.
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
7790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyObservedPrefs(observed_json, pref_names_,
7800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      decorated_non_default_values.get(),
7810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      "policy", true, false);
7820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
7830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Verifies that initializing the JavaScript Preferences class fires the correct
7850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// notifications in JavaScript for non-privileged pref values handled by the
7860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// CoreChromeOSOptionsHandler class for a managed device.
7870529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(ManagedPreferencesBrowserTest,
7880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                       ChromeOSDeviceFetchNonPrivilegedPrefs) {
7890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedVector<base::Value> decorated_non_default_values;
7900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string observed_json;
7910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Non-privileged string pref.
7930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  pref_names_.push_back(chromeos::kSystemTimezone);
7940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  non_default_values_.push_back(new base::StringValue("America/New_York"));
7950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  decorated_non_default_values.push_back(
7960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      non_default_values_.back()->DeepCopy());
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify notifications when mandatory values are in effect.
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::CrosSettings* cros_settings = chromeos::CrosSettings::Get();
8000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  cros_settings->Set(pref_names_[0], *non_default_values_[0]);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
8030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyObservedPrefs(observed_json, pref_names_,
8040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      decorated_non_default_values.get(),
8050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      std::string(), false, false);
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
808ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace {
809ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
810ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char* kUserProfilePath = "user_profile";
811ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
812ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace
813ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
81490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ProxyPreferencesBrowserTest : public PreferencesBrowserTest {
81590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
81690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
817ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    SetupNetworkEnvironment();
818ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    content::RunAllPendingInMessageLoop();
819ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
82090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    scoped_ptr<base::DictionaryValue> proxy_config_dict(
821ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        ProxyConfigDictionary::CreateFixedServers("127.0.0.1:8080",
822ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                                  "*.google.com, 1.2.3.4:22"));
82390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ProxyConfigDictionary proxy_config(proxy_config_dict.get());
82590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
826f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const chromeos::NetworkState* network = GetDefaultNetwork();
8274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(network);
828f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    chromeos::proxy_config::SetProxyConfigForNetwork(proxy_config, *network);
82990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    std::string url = base::StringPrintf("%s?network=%s",
831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                         chrome::kChromeUIProxySettingsURL,
832868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                         network->path().c_str());
833868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), GURL(url));
83590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SetUpPrefs();
83690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
83790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
83890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected:
839ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void SetupNetworkEnvironment() {
840ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    chromeos::ShillProfileClient::TestInterface* profile_test =
841ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        chromeos::DBusThreadManager::Get()->GetShillProfileClient()
842ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            ->GetTestInterface();
843ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    chromeos::ShillServiceClient::TestInterface* service_test =
844ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        chromeos::DBusThreadManager::Get()->GetShillServiceClient()
845ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            ->GetTestInterface();
846ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
847ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    profile_test->AddProfile(kUserProfilePath, "user");
848ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
849ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    service_test->ClearServices();
850ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    service_test->AddService("stub_ethernet",
851116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             "stub_ethernet_guid",
852ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                             "eth0",
85368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             shill::kTypeEthernet,
85468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             shill::kStateOnline,
85546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             true /* add_to_visible */ );
856ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    service_test->SetServiceProperty("stub_ethernet",
85768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                     shill::kProfileProperty,
858ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                     base::StringValue(kUserProfilePath));
859ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    profile_test->AddService(kUserProfilePath, "stub_wifi2");
860ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
861ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
862ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void SetONCPolicy(const char* policy_name, policy::PolicyScope scope) {
863ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    std::string onc_policy =
864ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        "{ \"NetworkConfigurations\": ["
865116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "    { \"GUID\": \"stub_ethernet_guid\","
866ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        "      \"Type\": \"Ethernet\","
867ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        "      \"Name\": \"My Ethernet\","
868ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        "      \"Ethernet\": {"
869ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        "        \"Authentication\": \"None\" },"
870ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        "      \"ProxySettings\": {"
871ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        "        \"PAC\": \"http://domain.com/x\","
872ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        "        \"Type\": \"PAC\" }"
873ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        "    }"
874ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        "  ],"
875ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        "  \"Type\": \"UnencryptedConfiguration\""
876ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        "}";
877ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
878ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    policy::PolicyMap map;
879ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    map.Set(policy_name,
880ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            policy::POLICY_LEVEL_MANDATORY,
881ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            scope,
882ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            new base::StringValue(onc_policy),
883ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            NULL);
884ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    policy_provider_.UpdateChromePolicy(map);
885ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
886ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    content::RunAllPendingInMessageLoop();
887ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
888ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
889f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const chromeos::NetworkState* GetDefaultNetwork() {
8904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    chromeos::NetworkStateHandler* handler =
8914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        chromeos::NetworkHandler::Get()->network_state_handler();
892f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return handler->DefaultNetwork();
89390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
89490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
89590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetProxyPref(const std::string& name, const base::Value& value) {
89690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    std::string type;
89790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    switch (value.GetType()) {
89890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case base::Value::TYPE_BOOLEAN:
89990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        type = "Boolean";
90090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
90190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case base::Value::TYPE_INTEGER:
90290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        type = "Integer";
90390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
90490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      case base::Value::TYPE_STRING:
90590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        type = "String";
90690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        break;
90790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      default:
90890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ASSERT_TRUE(false);
90990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
91090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
91190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    std::string observed_json;
91290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SetPref(name, type, &value, true, &observed_json);
91390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
91490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
915ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void VerifyCurrentProxyServer(const std::string& expected_server,
9164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                onc::ONCSource expected_source) {
917f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const chromeos::NetworkState* network = GetDefaultNetwork();
9184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(network);
9194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    onc::ONCSource actual_source;
920ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    scoped_ptr<ProxyConfigDictionary> proxy_dict =
921f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        chromeos::proxy_config::GetProxyConfigForNetwork(
922ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            pref_service_,
923ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            g_browser_process->local_state(),
9244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            *network,
925ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            &actual_source);
9264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(proxy_dict);
92790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    std::string actual_proxy_server;
928868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(proxy_dict->GetProxyServer(&actual_proxy_server));
92990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_EQ(expected_server, actual_proxy_server);
930ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_EQ(expected_source, actual_source);
93190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
93290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
93390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
93490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Verifies that proxy settings are correctly pushed to JavaScript during
93590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// initialization of the proxy settings page.
936ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(ProxyPreferencesBrowserTest, ChromeOSInitializeProxy) {
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Boolean pref.
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_names_.push_back(chromeos::kProxySingle);
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  non_default_values_.push_back(new base::FundamentalValue(true));
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
941ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Integer prefs.
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_names_.push_back(chromeos::kProxySingleHttpPort);
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  non_default_values_.push_back(new base::FundamentalValue(8080));
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // String pref.
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_names_.push_back(chromeos::kProxySingleHttp);
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  non_default_values_.push_back(new base::StringValue("127.0.0.1"));
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List pref.
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_names_.push_back(chromeos::kProxyIgnoreList);
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* list = new base::ListValue();
95290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  list->Append(new base::StringValue("*.google.com"));
95390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  list->Append(new base::StringValue("1.2.3.4:22"));
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  non_default_values_.push_back(list);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
956ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Verify that no policy is presented to the UI. This must be verified on the
957ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // kProxyType and the kUseSharedProxies prefs.
958ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  pref_names_.push_back(chromeos::kProxyType);
959ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  non_default_values_.push_back(new base::FundamentalValue(2));
960ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
961ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  pref_names_.push_back(prefs::kUseSharedProxies);
962ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  non_default_values_.push_back(new base::FundamentalValue(false));
963ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
96490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string observed_json;
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
966ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  VerifyObservedPrefs(
9670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      observed_json, pref_names_, non_default_values_.get(), "", false, false);
968ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
969ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
970ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(ProxyPreferencesBrowserTest, ONCPolicy) {
971ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  SetONCPolicy(policy::key::kOpenNetworkConfiguration,
972ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch               policy::POLICY_SCOPE_USER);
973ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
974ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Verify that per-network policy is presented to the UI. This must be
975ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // verified on the kProxyType.
976ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  pref_names_.push_back(chromeos::kProxyType);
977ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  non_default_values_.push_back(new base::FundamentalValue(3));
978ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
979ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::string observed_json;
980ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
981ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  VerifyObservedPrefs(
9820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      observed_json, pref_names_, non_default_values_.get(),
9830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      "policy", true, false);
984ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
985ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Verify that 'use-shared-proxies' is not affected by per-network policy.
986ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  pref_names_.clear();
9870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  non_default_values_.clear();
988ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  pref_names_.push_back(prefs::kUseSharedProxies);
989ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  non_default_values_.push_back(new base::FundamentalValue(false));
990ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
991ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
992ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  VerifyObservedPrefs(
9930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      observed_json, pref_names_, non_default_values_.get(), "", false, false);
994ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
995ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
996ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(ProxyPreferencesBrowserTest, DeviceONCPolicy) {
997ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  SetONCPolicy(policy::key::kDeviceOpenNetworkConfiguration,
998ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch               policy::POLICY_SCOPE_MACHINE);
999ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1000ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Verify that the policy is presented to the UI. This verification must be
1001ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // done on the kProxyType pref.
1002ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  pref_names_.push_back(chromeos::kProxyType);
1003ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  non_default_values_.push_back(new base::FundamentalValue(3));
1004ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1005ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::string observed_json;
1006ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
1007ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  VerifyObservedPrefs(
10080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      observed_json, pref_names_, non_default_values_.get(),
10090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      "policy", true, false);
1010ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1011ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Verify that 'use-shared-proxies' is not affected by per-network policy.
1012ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  pref_names_.clear();
10130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  non_default_values_.clear();
1014ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  pref_names_.push_back(prefs::kUseSharedProxies);
1015ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  non_default_values_.push_back(new base::FundamentalValue(false));
1016ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1017ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
1018ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  VerifyObservedPrefs(
10190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      observed_json, pref_names_, non_default_values_.get(), "", false, false);
1020ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1021ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1022ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(ProxyPreferencesBrowserTest, UserProxyPolicy) {
1023ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  policy_names_.push_back(policy::key::kProxyMode);
1024ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  default_values_.push_back(
1025ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      new base::StringValue(ProxyPrefs::kAutoDetectProxyModeName));
1026ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  SetUserPolicies(
10270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      policy_names_, default_values_.get(), policy::POLICY_LEVEL_MANDATORY);
1028ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  content::RunAllPendingInMessageLoop();
1029ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1030ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Verify that the policy is presented to the UI. This verification must be
1031ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // done on the kProxyType pref.
1032ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  pref_names_.push_back(chromeos::kProxyType);
1033ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  non_default_values_.push_back(new base::FundamentalValue(3));
1034ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1035ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Verify that 'use-shared-proxies' is controlled by the policy.
1036ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  pref_names_.push_back(prefs::kUseSharedProxies);
1037ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  non_default_values_.push_back(new base::FundamentalValue(false));
1038ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1039ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::string observed_json;
1040ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  SetupJavaScriptTestEnvironment(pref_names_, &observed_json);
1041ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  VerifyObservedPrefs(
10420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      observed_json, pref_names_, non_default_values_.get(),
10430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      "policy", true, false);
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Verifies that modifications to the proxy settings are correctly pushed from
104790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// JavaScript to the ProxyConfig property stored in the network configuration.
104890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ProxyPreferencesBrowserTest, ChromeOSSetProxy) {
104990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL));
105090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
105190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetProxyPref(chromeos::kProxySingleHttpPort, base::FundamentalValue(123));
105290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetProxyPref(chromeos::kProxySingleHttp, base::StringValue("www.adomain.xy"));
105390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1054ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  VerifyCurrentProxyServer("www.adomain.xy:123",
10554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           onc::ONC_SOURCE_NONE);
105690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
105790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
105890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Verify that default proxy ports are used and that ports can be updated
105990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// without affecting the previously set hosts.
106090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ProxyPreferencesBrowserTest, ChromeOSProxyDefaultPorts) {
106190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(SetupJavaScriptTestEnvironment(pref_names_, NULL));
106290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
106390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Set to manual, per scheme proxy.
106490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetProxyPref(chromeos::kProxySingle, base::FundamentalValue(false));
106590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
106690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Set hosts but no ports.
106790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetProxyPref(chromeos::kProxyHttpUrl, base::StringValue("a.com"));
106890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetProxyPref(chromeos::kProxyHttpsUrl, base::StringValue("4.3.2.1"));
106990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetProxyPref(chromeos::kProxyFtpUrl, base::StringValue("c.com"));
107090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetProxyPref(chromeos::kProxySocks, base::StringValue("d.com"));
107190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
107290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Verify default ports.
107390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  VerifyCurrentProxyServer(
1074ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "http=a.com:80;https=4.3.2.1:80;ftp=c.com:80;socks=socks4://d.com:1080",
10754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      onc::ONC_SOURCE_NONE);
107690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
107790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Set and verify the ports.
107890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetProxyPref(chromeos::kProxyHttpPort, base::FundamentalValue(1));
107990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetProxyPref(chromeos::kProxyHttpsPort, base::FundamentalValue(2));
108090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetProxyPref(chromeos::kProxyFtpPort, base::FundamentalValue(3));
108190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetProxyPref(chromeos::kProxySocksPort, base::FundamentalValue(4));
108290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
108390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  VerifyCurrentProxyServer(
1084ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "http=a.com:1;https=4.3.2.1:2;ftp=c.com:3;socks=socks4://d.com:4",
10854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      onc::ONC_SOURCE_NONE);
108690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
108790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1089