summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorantrim@chromium.org <antrim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-05 15:02:32 +0000
committerantrim@chromium.org <antrim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-05 15:02:32 +0000
commit8db13f3284cbac2cc03713c2cd952575c30be14c (patch)
tree26e92494f418c24f16b5e9b90abc91bb15cff120
parent11e76c7372306a1b2023c7d2934a805ff135fcec (diff)
downloadchromium_src-8db13f3284cbac2cc03713c2cd952575c30be14c.zip
chromium_src-8db13f3284cbac2cc03713c2cd952575c30be14c.tar.gz
chromium_src-8db13f3284cbac2cc03713c2cd952575c30be14c.tar.bz2
Add manager selection for locally managed account
BUG=171923 Review URL: https://chromiumcodereview.appspot.com/12087108 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@180698 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/app/chromeos_strings.grdp6
-rw-r--r--chrome/browser/resources/chromeos/login/managed_user_creation.css47
-rw-r--r--chrome/browser/resources/chromeos/login/managed_user_creation.html18
-rw-r--r--chrome/browser/resources/chromeos/login/managed_user_creation.js179
-rw-r--r--chrome/browser/resources/chromeos/login/screen_gaia_signin.js2
-rw-r--r--chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc109
-rw-r--r--chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h9
-rw-r--r--chromeos/chromeos_switches.cc4
-rw-r--r--chromeos/chromeos_switches.h1
9 files changed, 345 insertions, 30 deletions
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 1fad000..5bcd925 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -433,6 +433,12 @@ Press any key to continue exploring.
<message name="IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_CONFIRM_HINT" desc="Text shown as a hint in the password confirmation field in locally managed user creation dialog.">
Confirm password
</message>
+ <message name="IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_SELECT_MANAGER_TEXT" desc="Text shown as a title for list of possible managers (existing accounts) for locally managed user.">
+ Choose the manager for this user
+ </message>
+ <message name="IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_MANAGER_PASSWORD_HINT" desc="Text shown as a hint in the user password field when this user is selected as a manager for locally managed user.">
+ Manager's password
+ </message>
<message name="IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_CONTINUE_BUTTON_TEXT" desc="Text shown on continue button in locally managed user creation dialog.">
Continue
</message>
diff --git a/chrome/browser/resources/chromeos/login/managed_user_creation.css b/chrome/browser/resources/chromeos/login/managed_user_creation.css
index eadcd14..a1dd0ef 100644
--- a/chrome/browser/resources/chromeos/login/managed_user_creation.css
+++ b/chrome/browser/resources/chromeos/login/managed_user_creation.css
@@ -59,3 +59,50 @@
padding-left: 28px;
visibility: visible;
}
+
+#managed-user-creation-managers-pane {
+ height: 200px;
+ overflow-y: auto;
+ width: 330px;
+}
+
+.manager-pod {
+ margin-bottom: 8px;
+ opacity: 0.8;
+ width: 300px;
+}
+
+#managed-user-creation-managers-pane .focused {
+ opacity: 1;
+}
+
+.manager-pod .managed-user-creation-manager-info-block {
+ height: 48px;
+}
+
+.manager-pod .managed-user-creation-manager-image {
+ display: inline-block;
+ height: 40px;
+ width: 40px;
+}
+
+.manager-pod .managed-user-creation-manager-info {
+ display: inline-block;
+ margin: 0 8px;
+ min-height: 40px;
+}
+
+.manager-pod .managed-user-creation-manager-info-text {
+ display: inline-block;
+ min-height: 40px;
+ vertical-align: top;
+}
+
+.manager-pod .managed-user-creation-manager-email {
+ color: #666;
+ margin-top: 2px;
+}
+
+.manager-pod .managed-user-creation-manager-name {
+ margin-top: 2px;
+}
diff --git a/chrome/browser/resources/chromeos/login/managed_user_creation.html b/chrome/browser/resources/chromeos/login/managed_user_creation.html
index 430ad99..a5580f0 100644
--- a/chrome/browser/resources/chromeos/login/managed_user_creation.html
+++ b/chrome/browser/resources/chromeos/login/managed_user_creation.html
@@ -17,7 +17,25 @@
i18n-values="placeholder:createManagedUserPasswordConfirmHint"/>
</div>
<div id="managed-user-creation-password-error" class="no-error"></div>
+ <div id="managed-user-creation-managers-block" hidden>
+ <div id="managed-user-creation-managers-block-title"
+ i18n-content="createManagedUserSelectManagerTitle"></div>
+ <div id="managed-user-creation-managers-pane"></div>
+ </div>
</div>
<div id="managed-user-creation-controls" class="step-controls"></div>
<div id="managed-user-creation-cancel-button" class="close-button"></div>
+ <div id="managed-user-creation-manager-template" hidden class="manager-pod">
+ <div class="managed-user-creation-manager-info-block">
+ <img class="managed-user-creation-manager-image" alt="">
+ <div class="managed-user-creation-manager-info-text">
+ <div class="managed-user-creation-manager-name"></div>
+ <div class="managed-user-creation-manager-email"></div>
+ </div>
+ </div>
+ <div class="managed-user-creation-manager-password-block" hidden>
+ <input class="managed-user-creation-manager-password" type="password"
+ i18n-values="placeholder:createManagedUserManagerPasswordHint"/>
+ </div>
+ </div>
</div> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/login/managed_user_creation.js b/chrome/browser/resources/chromeos/login/managed_user_creation.js
index 8087129..5637a1e 100644
--- a/chrome/browser/resources/chromeos/login/managed_user_creation.js
+++ b/chrome/browser/resources/chromeos/login/managed_user_creation.js
@@ -7,6 +7,166 @@
*/
cr.define('login', function() {
+ var ManagerPod = cr.ui.define(function() {
+ var node = $('managed-user-creation-manager-template').cloneNode(true);
+ node.removeAttribute('id');
+ node.removeAttribute('hidden');
+ return node;
+ });
+
+ ManagerPod.userImageSalt_ = {};
+
+ /**
+ * UI element for displaying single account in list of possible managers for
+ * new locally managed user.
+ * @type {Object}
+ */
+ ManagerPod.prototype = {
+ __proto__: HTMLDivElement.prototype,
+
+ /** @override */
+ decorate: function() {
+ // Mousedown has to be used instead of click to be able to prevent 'focus'
+ // event later.
+ this.addEventListener('mousedown',
+ this.handleMouseDown_.bind(this));
+ },
+
+ /**
+ * Updates UI elements from user data.
+ */
+ update: function() {
+ this.imageElement.src = 'chrome://userimage/' + this.user.username +
+ '?id=' + ManagerPod.userImageSalt_[this.user.username];
+
+ this.nameElement.textContent = this.user.displayName;
+ this.emailElement.textContent = this.user.emailAddress;
+ },
+
+ /**
+ * Brings focus to password field.
+ */
+ focusInput: function() {
+ this.passwordElement.focus();
+ },
+
+ /**
+ * Gets image element.
+ * @type {!HTMLImageElement}
+ */
+ get imageElement() {
+ return this.querySelector('.managed-user-creation-manager-image');
+ },
+
+ /**
+ * Gets name element.
+ * @type {!HTMLDivElement}
+ */
+ get nameElement() {
+ return this.querySelector('.managed-user-creation-manager-name');
+ },
+
+ /**
+ * Gets e-mail element.
+ * @type {!HTMLDivElement}
+ */
+ get emailElement() {
+ return this.querySelector('.managed-user-creation-manager-email');
+ },
+
+ /**
+ * Gets password element.
+ * @type {!HTMLDivElement}
+ */
+ get passwordElement() {
+ return this.querySelector('.managed-user-creation-manager-password');
+ },
+
+ /**
+ * Gets password enclosing block.
+ * @type {!HTMLDivElement}
+ */
+ get passwordBlock() {
+ return this.querySelector(
+ '.managed-user-creation-manager-password-block');
+ },
+
+ /** @override */
+ handleMouseDown_: function(e) {
+ this.parentNode.selectPod(this);
+ // Prevent default so that we don't trigger 'focus' event.
+ e.preventDefault();
+ },
+
+
+ /**
+ * The user that this pod represents.
+ * @type {!Object}
+ */
+ user_: undefined,
+ get user() {
+ return this.user_;
+ },
+ set user(userDict) {
+ this.user_ = userDict;
+ this.update();
+ },
+ };
+
+ var ManagerPodList = cr.ui.define('managerList');
+
+ /**
+ * UI element for selecting manager account for new managed user.
+ * @type {Object}
+ */
+ ManagerPodList.prototype = {
+ __proto__: HTMLDivElement.prototype,
+
+ selectedPod_: null,
+
+ /** @override */
+ decorate: function() {
+ },
+
+ /**
+ * Returns all the pods in this pod list.
+ * @type {NodeList}
+ */
+ get pods() {
+ return this.children;
+ },
+
+ addPod: function(manager) {
+ var managerPod = new ManagerPod({user: manager});
+ this.appendChild(managerPod);
+ managerPod.update();
+ },
+
+ clearPods: function() {
+ this.innerHTML = '';
+ this.selectedPod_ = null;
+ },
+
+ selectPod: function(podToSelect) {
+ if (this.selectedPod_ == podToSelect) {
+ podToSelect.focusInput();
+ return;
+ }
+ this.selectedPod_ = podToSelect;
+ for (var i = 0, pod; pod = this.pods[i]; ++i) {
+ if (pod != podToSelect) {
+ pod.classList.remove('focused');
+ pod.passwordElement.value = '';
+ pod.passwordBlock.hidden = true;
+ }
+ }
+ podToSelect.classList.add('focused');
+ podToSelect.passwordBlock.hidden = false;
+ podToSelect.passwordElement.value = '';
+ podToSelect.focusInput();
+ },
+ };
+
/**
* Creates a new managed user creation screen div.
* @constructor
@@ -28,9 +188,13 @@ cr.define('login', function() {
lastVerifiedName_: null,
lastIncorrectUserName_: null,
+ managerList_: null,
/** @override */
decorate: function() {
+ this.managerList_ = new ManagerPodList();
+ $('managed-user-creation-managers-pane').appendChild(this.managerList_);
+
var closeButton = $('managed-user-creation-cancel-button');
var userNameField = $('managed-user-creation-name');
var passwordField = $('managed-user-creation-password');
@@ -279,6 +443,16 @@ cr.define('login', function() {
$('login-header-bar').disabled = value;
},
+ /**
+ * Called by backend part to propagate list of possible managers.
+ * @param {Array} userList - list of users that can be managers.
+ */
+ loadManagers: function(userList) {
+ $('managed-user-creation-managers-block').hidden = false;
+ this.managerList_.clearPods();
+ for (var i = 0; i < userList.length; ++i)
+ this.managerList_.addPod(userList[i]);
+ },
};
/**
@@ -317,6 +491,11 @@ cr.define('login', function() {
screen.showPasswordError(error);
};
+ ManagedUserCreationScreen.loadManagers = function(userList) {
+ var screen = $('managed-user-creation');
+ screen.loadManagers(userList);
+ };
+
return {
ManagedUserCreationScreen: ManagedUserCreationScreen
};
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
index 7977c3d..ddbc3bb 100644
--- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
+++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
@@ -435,7 +435,7 @@ cr.define('login', function() {
chrome.send('launchIncognito');
};
$('createLocallyManagedUserLink').onclick = function() {
- Oobe.showManagedUserCreationScreen();
+ chrome.send('showLocallyManagedUserCreationScreen');
};
},
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
index d9dc1df..7fed64a 100644
--- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -42,6 +42,7 @@
#include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
+#include "chromeos/chromeos_switches.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/power_manager_client.h"
#include "content/public/browser/render_view_host.h"
@@ -80,6 +81,7 @@ const char kKeyPublicAccount[] = "publicAccount";
const char kKeyLocallyManagedUser[] = "locallyManagedUser";
const char kKeySignedIn[] = "signedIn";
const char kKeyCanRemove[] = "canRemove";
+const char kKeyIsOwner[] = "isOwner";
const char kKeyOauthTokenStatus[] = "oauthTokenStatus";
// Max number of users to show.
@@ -132,7 +134,7 @@ void UpdateAuthParamsFromSettings(DictionaryValue* params,
// chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner);
const CommandLine* command_line = CommandLine::ForCurrentProcess();
params->SetBoolean("createLocallyManagedUser",
- command_line->HasSwitch(switches::kEnableManagedUsers));
+ command_line->HasSwitch(::switches::kEnableManagedUsers));
}
bool IsProxyError(NetworkStateInformer::State state,
@@ -354,6 +356,13 @@ void SigninScreenHandler::GetLocalizedStrings(
l10n_util::GetStringUTF16(
IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_MISMATCH_ERROR));
+ localized_strings->SetString("createManagedUserSelectManagerTitle",
+ l10n_util::GetStringUTF16(
+ IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_SELECT_MANAGER_TEXT));
+ localized_strings->SetString("createManagedUserManagerPasswordHint",
+ l10n_util::GetStringUTF16(
+ IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_MANAGER_PASSWORD_HINT));
+
if (chromeos::KioskModeSettings::Get()->IsKioskModeEnabled()) {
localized_strings->SetString("demoLoginMessage",
l10n_util::GetStringUTF16(IDS_KIOSK_MODE_LOGIN_MESSAGE));
@@ -425,6 +434,10 @@ void SigninScreenHandler::UpdateUIState(UIState ui_state,
ui_state_ = UI_STATE_ACCOUNT_PICKER;
ShowScreen(OobeUI::kScreenAccountPicker, params);
break;
+ case UI_STATE_LOCALLY_MANAGED_USER_CREATION:
+ ui_state_ = UI_STATE_LOCALLY_MANAGED_USER_CREATION;
+ ShowScreen(OobeUI::kScreenManagedUserCreation, params);
+ break;
default:
NOTREACHED();
break;
@@ -648,6 +661,10 @@ void SigninScreenHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback("launchIncognito",
base::Bind(&SigninScreenHandler::HandleLaunchIncognito,
base::Unretained(this)));
+ web_ui()->RegisterMessageCallback("showLocallyManagedUserCreationScreen",
+ base::Bind(
+ &SigninScreenHandler::HandleShowLocallyManagedUserCreationScreen,
+ base::Unretained(this)));
web_ui()->RegisterMessageCallback("launchPublicAccount",
base::Bind(&SigninScreenHandler::HandleLaunchPublicAccount,
base::Unretained(this)));
@@ -971,13 +988,13 @@ void SigninScreenHandler::LoadAuthExtension(
params.SetString("gaiaOrigin", GaiaUrls::GetInstance()->gaia_origin_url());
const CommandLine* command_line = CommandLine::ForCurrentProcess();
- if (command_line->HasSwitch(switches::kGaiaUrlPath)) {
+ if (command_line->HasSwitch(::switches::kGaiaUrlPath)) {
params.SetString("gaiaUrlPath",
- command_line->GetSwitchValueASCII(switches::kGaiaUrlPath));
+ command_line->GetSwitchValueASCII(::switches::kGaiaUrlPath));
}
// Test automation data:
- if (command_line->HasSwitch(switches::kAuthExtensionPath)) {
+ if (command_line->HasSwitch(::switches::kAuthExtensionPath)) {
if (!test_user_.empty()) {
params.SetString("test_email", test_user_);
test_user_.clear();
@@ -1047,6 +1064,31 @@ void SigninScreenHandler::HandleLaunchIncognito(const base::ListValue* args) {
delegate_->LoginAsGuest();
}
+void SigninScreenHandler::HandleShowLocallyManagedUserCreationScreen(
+ const base::ListValue* args) {
+ const CommandLine* command_line = CommandLine::ForCurrentProcess();
+ if (command_line->HasSwitch(
+ chromeos::switches::kEnableLocallyManagedUserUIExperiments)) {
+ ListValue users_list;
+ const UserList& users = delegate_->GetUsers();
+ std::string owner;
+ chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner);
+
+ for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) {
+ if ((*it)->GetType() != User::USER_TYPE_REGULAR)
+ continue;
+ bool is_owner = ((*it)->email() == owner);
+ DictionaryValue* user_dict = new DictionaryValue();
+ FillUserDictionary(*it, is_owner, user_dict);
+ users_list.Append(user_dict);
+ }
+ web_ui()->
+ CallJavascriptFunction("login.ManagedUserCreationScreen.loadManagers",
+ users_list);
+ }
+ UpdateUIState(UI_STATE_LOCALLY_MANAGED_USER_CREATION, NULL);
+}
+
void SigninScreenHandler::HandleLaunchPublicAccount(
const base::ListValue* args) {
if (!delegate_)
@@ -1159,6 +1201,37 @@ void SigninScreenHandler::HandleLaunchHelpApp(const base::ListValue* args) {
static_cast<HelpAppLauncher::HelpTopic>(help_topic_id));
}
+void SigninScreenHandler::FillUserDictionary(User* user,
+ bool is_owner,
+ DictionaryValue* user_dict) {
+ const std::string& email = user->email();
+ bool is_public_account =
+ user->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT;
+ bool is_locally_managed_user =
+ user->GetType() == User::USER_TYPE_LOCALLY_MANAGED;
+ bool signed_in = user == UserManager::Get()->GetLoggedInUser();
+
+ user_dict->SetString(kKeyUsername, email);
+ user_dict->SetString(kKeyEmailAddress, user->display_email());
+ user_dict->SetString(kKeyDisplayName, user->GetDisplayName());
+ user_dict->SetString(kKeyNameTooltip, user->display_email());
+ user_dict->SetBoolean(kKeyPublicAccount, is_public_account);
+ user_dict->SetBoolean(kKeyLocallyManagedUser, is_locally_managed_user);
+ user_dict->SetInteger(kKeyOauthTokenStatus, user->oauth_token_status());
+ user_dict->SetBoolean(kKeySignedIn, signed_in);
+ user_dict->SetBoolean(kKeyIsOwner, is_owner);
+
+ if (is_public_account) {
+ policy::BrowserPolicyConnector* policy_connector =
+ g_browser_process->browser_policy_connector();
+
+ if (policy_connector->IsEnterpriseManaged()) {
+ user_dict->SetString(kKeyEnterpriseDomain,
+ policy_connector->GetEnterpriseDomain());
+ }
+ }
+}
+
void SigninScreenHandler::SendUserList(bool animated) {
if (!delegate_)
return;
@@ -1175,33 +1248,13 @@ void SigninScreenHandler::SendUserList(bool animated) {
std::string owner;
chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner);
bool is_owner = (email == owner);
- bool is_public_account =
- ((*it)->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT);
- bool is_locally_managed_user =
- ((*it)->GetType() == User::USER_TYPE_LOCALLY_MANAGED);
- bool signed_in = *it == UserManager::Get()->GetLoggedInUser();
if (non_owner_count < max_non_owner_users || is_owner) {
DictionaryValue* user_dict = new DictionaryValue();
- user_dict->SetString(kKeyUsername, email);
- user_dict->SetString(kKeyEmailAddress, (*it)->display_email());
- user_dict->SetString(kKeyDisplayName, (*it)->GetDisplayName());
- user_dict->SetString(kKeyNameTooltip, (*it)->display_email());
- user_dict->SetBoolean(kKeyPublicAccount, is_public_account);
- user_dict->SetBoolean(kKeyLocallyManagedUser, is_locally_managed_user);
- user_dict->SetInteger(kKeyOauthTokenStatus, (*it)->oauth_token_status());
- user_dict->SetBoolean(kKeySignedIn, signed_in);
-
- if (is_public_account) {
- policy::BrowserPolicyConnector* policy_connector =
- g_browser_process->browser_policy_connector();
-
- if (policy_connector->IsEnterpriseManaged()) {
- user_dict->SetString(kKeyEnterpriseDomain,
- policy_connector->GetEnterpriseDomain());
- }
- }
-
+ FillUserDictionary(*it, is_owner, user_dict);
+ bool is_public_account =
+ ((*it)->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT);
+ bool signed_in = *it == UserManager::Get()->GetLoggedInUser();
// Single user check here is necessary because owner info might not be
// available when running into login screen on first boot.
// See http://crosbug.com/12723
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
index d9d396e..664f0d8 100644
--- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
@@ -185,7 +185,8 @@ class SigninScreenHandler
enum UIState {
UI_STATE_UNKNOWN = 0,
UI_STATE_GAIA_SIGNIN,
- UI_STATE_ACCOUNT_PICKER
+ UI_STATE_ACCOUNT_PICKER,
+ UI_STATE_LOCALLY_MANAGED_USER_CREATION
};
typedef base::hash_set<std::string> WebUIObservers;
@@ -291,9 +292,15 @@ class SigninScreenHandler
void HandleShowGaiaFrameError(const base::ListValue* args);
void HandleShowLoadingTimeoutError(const base::ListValue* args);
void HandleUpdateOfflineLogin(const base::ListValue* args);
+ void HandleShowLocallyManagedUserCreationScreen(const base::ListValue* args);
void HandleCheckLocallyManagedUserName(const base::ListValue* args);
void HandleTryCreateLocallyManagedUser(const base::ListValue* args);
+ // Fills |user_dict| with information about |user|.
+ void FillUserDictionary(User* user,
+ bool is_owner,
+ DictionaryValue* user_dict);
+
// Sends user list to account picker.
void SendUserList(bool animated);
diff --git a/chromeos/chromeos_switches.cc b/chromeos/chromeos_switches.cc
index 4fe2854..440e589 100644
--- a/chromeos/chromeos_switches.cc
+++ b/chromeos/chromeos_switches.cc
@@ -13,6 +13,10 @@ const char kChromeOSReleaseBoard[] = "chromeos-release-board";
// Forces the stub implementation of dbus clients.
const char kDbusStub[] = "dbus-stub";
+// Enables experiments in locally managed user creation ui.
+const char kEnableLocallyManagedUserUIExperiments[] =
+ "enable-locally-managed-users-ui-experiments";
+
// Enables the new NetworkChangeNotifier using the NetworkStateHandler class.
const char kEnableNewNetworkChangeNotifier[] =
"enable-new-network-change-notifier";
diff --git a/chromeos/chromeos_switches.h b/chromeos/chromeos_switches.h
index 233b986..6990982 100644
--- a/chromeos/chromeos_switches.h
+++ b/chromeos/chromeos_switches.h
@@ -22,6 +22,7 @@ namespace switches {
// Please keep alphabetized.
CHROMEOS_EXPORT extern const char kChromeOSReleaseBoard[];
CHROMEOS_EXPORT extern const char kDbusStub[];
+CHROMEOS_EXPORT extern const char kEnableLocallyManagedUserUIExperiments[];
CHROMEOS_EXPORT extern const char kEnableNewNetworkChangeNotifier[];
CHROMEOS_EXPORT extern const char kEnableScreensaverExtensions[];
CHROMEOS_EXPORT extern const char kSmsTestMessages[];