diff options
author | antrim@chromium.org <antrim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-05 15:02:32 +0000 |
---|---|---|
committer | antrim@chromium.org <antrim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-05 15:02:32 +0000 |
commit | 8db13f3284cbac2cc03713c2cd952575c30be14c (patch) | |
tree | 26e92494f418c24f16b5e9b90abc91bb15cff120 | |
parent | 11e76c7372306a1b2023c7d2934a805ff135fcec (diff) | |
download | chromium_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
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[]; |