Index: chrome/browser/resources/options2/personal_options.js |
diff --git a/chrome/browser/resources/options2/personal_options.js b/chrome/browser/resources/options2/personal_options.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..78d40dc84b334a2232e8983561f3af60e4136ab4 |
--- /dev/null |
+++ b/chrome/browser/resources/options2/personal_options.js |
@@ -0,0 +1,372 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+cr.define('options', function() { |
+ |
+ var OptionsPage = options.OptionsPage; |
+ var ArrayDataModel = cr.ui.ArrayDataModel; |
+ |
+ /** |
+ * Encapsulated handling of personal options page. |
+ * @constructor |
+ */ |
+ function PersonalOptions() { |
+ OptionsPage.call(this, 'personal', |
+ templateData.personalPageTabTitle, |
+ 'personal-page'); |
+ if (cr.isChromeOS) { |
+ // Username (canonical email) of the currently logged in user or |
+ // |kGuestUser| if a guest session is active. |
+ this.username_ = localStrings.getString('username'); |
+ } |
+ } |
+ |
+ cr.addSingletonGetter(PersonalOptions); |
+ |
+ PersonalOptions.prototype = { |
+ // Inherit PersonalOptions from OptionsPage. |
+ __proto__: options.OptionsPage.prototype, |
+ |
+ // State variables. |
+ syncEnabled: false, |
+ syncSetupCompleted: false, |
+ |
+ // Initialize PersonalOptions page. |
+ initializePage: function() { |
+ // Call base class implementation to start preference initialization. |
+ OptionsPage.prototype.initializePage.call(this); |
+ |
+ var self = this; |
+ |
+ // Sync. |
+ $('sync-action-link').onclick = function(event) { |
+ SyncSetupOverlay.showErrorUI(); |
+ }; |
+ $('start-stop-sync').onclick = function(event) { |
+ if (self.syncSetupCompleted) |
+ SyncSetupOverlay.showStopSyncingUI(); |
+ else |
+ SyncSetupOverlay.showSetupUI(); |
+ }; |
+ $('customize-sync').onclick = function(event) { |
+ SyncSetupOverlay.showSetupUI(); |
+ }; |
+ |
+ // Profiles. |
+ var profilesList = $('profiles-list'); |
+ options.personal_options.ProfileList.decorate(profilesList); |
+ profilesList.autoExpands = true; |
+ |
+ profilesList.onchange = self.setProfileViewButtonsStatus_; |
+ $('profiles-create').onclick = function(event) { |
+ chrome.send('createProfile'); |
+ }; |
+ $('profiles-manage').onclick = function(event) { |
+ var selectedProfile = self.getSelectedProfileItem_(); |
+ if (selectedProfile) |
+ ManageProfileOverlay.showManageDialog(selectedProfile); |
+ }; |
+ $('profiles-delete').onclick = function(event) { |
+ var selectedProfile = self.getSelectedProfileItem_(); |
+ if (selectedProfile) |
+ ManageProfileOverlay.showDeleteDialog(selectedProfile); |
+ }; |
+ |
+ // Passwords. |
+ $('manage-passwords').onclick = function(event) { |
+ OptionsPage.navigateToPage('passwords'); |
+ OptionsPage.showTab($('passwords-nav-tab')); |
+ chrome.send('coreOptionsUserMetricsAction', |
+ ['Options_ShowPasswordManager']); |
+ }; |
+ |
+ // Autofill. |
+ $('autofill-settings').onclick = function(event) { |
+ OptionsPage.navigateToPage('autofill'); |
+ chrome.send('coreOptionsUserMetricsAction', |
+ ['Options_ShowAutofillSettings']); |
+ }; |
+ if (cr.isChromeOS && cr.commandLine && cr.commandLine.options['--bwsi']) { |
+ // Hide Autofill options for the guest user. |
+ $('autofill-section').hidden = true; |
+ } |
+ |
+ // Appearance. |
+ $('themes-reset').onclick = function(event) { |
+ chrome.send('themesReset'); |
+ }; |
+ |
+ if (!cr.isChromeOS) { |
+ $('import-data').onclick = function(event) { |
+ // Make sure that any previous import success message is hidden, and |
+ // we're showing the UI to import further data. |
+ $('import-data-configure').hidden = false; |
+ $('import-data-success').hidden = true; |
+ OptionsPage.navigateToPage('importData'); |
+ chrome.send('coreOptionsUserMetricsAction', ['Import_ShowDlg']); |
+ }; |
+ |
+ if ($('themes-GTK-button')) { |
+ $('themes-GTK-button').onclick = function(event) { |
+ chrome.send('themesSetGTK'); |
+ }; |
+ } |
+ } else { |
+ $('change-picture-button').onclick = function(event) { |
+ OptionsPage.navigateToPage('changePicture'); |
+ }; |
+ this.updateAccountPicture_(); |
+ |
+ if (cr.commandLine && cr.commandLine.options['--bwsi']) { |
+ // Disable the screen lock checkbox and change-picture-button in |
+ // guest mode. |
+ $('enable-screen-lock').disabled = true; |
+ $('change-picture-button').disabled = true; |
+ } |
+ } |
+ |
+ if (PersonalOptions.disablePasswordManagement()) { |
+ // Disable the Password Manager in guest mode. |
+ $('passwords-offersave').disabled = true; |
+ $('passwords-neversave').disabled = true; |
+ $('passwords-offersave').value = false; |
+ $('passwords-neversave').value = true; |
+ $('manage-passwords').disabled = true; |
+ } |
+ |
+ $('mac-passwords-warning').hidden = |
+ !(localStrings.getString('macPasswordsWarning')); |
+ |
+ if (PersonalOptions.disableAutofillManagement()) { |
+ $('autofill-settings').disabled = true; |
+ |
+ // Disable and turn off autofill. |
+ var autofillEnabled = $('autofill-enabled'); |
+ autofillEnabled.disabled = true; |
+ autofillEnabled.checked = false; |
+ cr.dispatchSimpleEvent(autofillEnabled, 'change'); |
+ } |
+ }, |
+ |
+ setSyncEnabled_: function(enabled) { |
+ this.syncEnabled = enabled; |
+ }, |
+ |
+ setAutoLoginVisible_ : function(visible) { |
+ $('enable-auto-login-checkbox').hidden = !visible; |
+ }, |
+ |
+ setSyncSetupCompleted_: function(completed) { |
+ this.syncSetupCompleted = completed; |
+ $('customize-sync').hidden = !completed; |
+ }, |
+ |
+ setSyncStatus_: function(status) { |
+ var statusSet = status != ''; |
+ $('sync-overview').hidden = statusSet; |
+ $('sync-status').hidden = !statusSet; |
+ $('sync-status-text').innerHTML = status; |
+ }, |
+ |
+ setSyncStatusErrorVisible_: function(visible) { |
+ visible ? $('sync-status').classList.add('sync-error') : |
+ $('sync-status').classList.remove('sync-error'); |
+ }, |
+ |
+ setCustomizeSyncButtonEnabled_: function(enabled) { |
+ $('customize-sync').disabled = !enabled; |
+ }, |
+ |
+ setSyncActionLinkEnabled_: function(enabled) { |
+ $('sync-action-link').disabled = !enabled; |
+ }, |
+ |
+ setSyncActionLinkLabel_: function(status) { |
+ $('sync-action-link').textContent = status; |
+ |
+ // link-button does is not zero-area when the contents of the button are |
+ // empty, so explicitly hide the element. |
+ $('sync-action-link').hidden = !status.length; |
+ }, |
+ |
+ /** |
+ * Display or hide the profiles section of the page. This is used for |
+ * multi-profile settings. |
+ * @param {boolean} visible True to show the section. |
+ * @private |
+ */ |
+ setProfilesSectionVisible_: function(visible) { |
+ $('profiles-section').hidden = !visible; |
+ }, |
+ |
+ /** |
+ * Get the selected profile item from the profile list. This also works |
+ * correctly if the list is not displayed. |
+ * @return {Object} the profile item object, or null if nothing is selected. |
+ * @private |
+ */ |
+ getSelectedProfileItem_: function() { |
+ var profilesList = $('profiles-list'); |
+ if (profilesList.hidden) { |
+ if (profilesList.dataModel.length > 0) |
+ return profilesList.dataModel.item(0); |
+ } else { |
+ return profilesList.selectedItem; |
+ } |
+ return null; |
+ }, |
+ |
+ /** |
+ * Helper function to set the status of profile view buttons to disabled or |
+ * enabled, depending on the number of profiles and selection status of the |
+ * profiles list. |
+ */ |
+ setProfileViewButtonsStatus_: function() { |
+ var profilesList = $('profiles-list'); |
+ var selectedProfile = profilesList.selectedItem; |
+ var hasSelection = selectedProfile != null; |
+ var hasSingleProfile = profilesList.dataModel.length == 1; |
+ $('profiles-manage').disabled = !hasSelection || |
+ !selectedProfile.isCurrentProfile; |
+ $('profiles-delete').disabled = !hasSelection && !hasSingleProfile; |
+ }, |
+ |
+ /** |
+ * Display the correct dialog layout, depending on how many profiles are |
+ * available. |
+ * @param {number} numProfiles The number of profiles to display. |
+ */ |
+ setProfileViewSingle_: function(numProfiles) { |
+ var hasSingleProfile = numProfiles == 1; |
+ $('profiles-list').hidden = hasSingleProfile; |
+ $('profiles-single-message').hidden = !hasSingleProfile; |
+ $('profiles-manage').hidden = hasSingleProfile; |
+ $('profiles-delete').textContent = hasSingleProfile ? |
+ templateData.profilesDeleteSingle : |
+ templateData.profilesDelete; |
+ }, |
+ |
+ /** |
+ * Adds all |profiles| to the list. |
+ * @param {Array.<Object>} An array of profile info objects. |
+ * each object is of the form: |
+ * profileInfo = { |
+ * name: "Profile Name", |
+ * iconURL: "chrome://path/to/icon/image", |
+ * filePath: "/path/to/profile/data/on/disk", |
+ * isCurrentProfile: false |
+ * }; |
+ */ |
+ setProfilesInfo_: function(profiles) { |
+ this.setProfileViewSingle_(profiles.length); |
+ // add it to the list, even if the list is hidden so we can access it |
+ // later. |
+ $('profiles-list').dataModel = new ArrayDataModel(profiles); |
+ this.setProfileViewButtonsStatus_(); |
+ }, |
+ |
+ setStartStopButtonVisible_: function(visible) { |
+ $('start-stop-sync').hidden = !visible; |
+ }, |
+ |
+ setStartStopButtonEnabled_: function(enabled) { |
+ $('start-stop-sync').disabled = !enabled; |
+ }, |
+ |
+ setStartStopButtonLabel_: function(label) { |
+ $('start-stop-sync').textContent = label; |
+ }, |
+ |
+ setGtkThemeButtonEnabled_: function(enabled) { |
+ if (!cr.isChromeOS && navigator.platform.match(/linux|BSD/i)) { |
+ $('themes-GTK-button').disabled = !enabled; |
+ } |
+ }, |
+ |
+ setThemesResetButtonEnabled_: function(enabled) { |
+ $('themes-reset').disabled = !enabled; |
+ }, |
+ |
+ hideSyncSection_: function() { |
+ $('sync-section').hidden = true; |
+ }, |
+ |
+ /** |
+ * Get the start/stop sync button DOM element. |
+ * @return {DOMElement} The start/stop sync button. |
+ * @private |
+ */ |
+ getStartStopSyncButton_: function() { |
+ return $('start-stop-sync'); |
+ }, |
+ |
+ /** |
+ * (Re)loads IMG element with current user account picture. |
+ */ |
+ updateAccountPicture_: function() { |
+ $('account-picture').src = |
+ 'chrome://userimage/' + this.username_ + |
+ '?id=' + (new Date()).getTime(); |
+ }, |
+ }; |
+ |
+ /** |
+ * Returns whether the user should be able to manage (view and edit) their |
+ * stored passwords. Password management is disabled in guest mode. |
+ * @return {boolean} True if password management should be disabled. |
+ */ |
+ PersonalOptions.disablePasswordManagement = function() { |
+ return cr.commandLine && cr.commandLine.options['--bwsi']; |
+ }; |
+ |
+ /** |
+ * Returns whether the user should be able to manage autofill settings. |
+ * @return {boolean} True if password management should be disabled. |
+ */ |
+ PersonalOptions.disableAutofillManagement = function() { |
+ return cr.commandLine && cr.commandLine.options['--bwsi']; |
+ }; |
+ |
+ if (cr.isChromeOS) { |
+ /** |
+ * Returns username (canonical email) of the user logged in (ChromeOS only). |
+ * @return {string} user email. |
+ */ |
+ PersonalOptions.getLoggedInUsername = function() { |
+ return PersonalOptions.getInstance().username_; |
+ }; |
+ } |
+ |
+ // Forward public APIs to private implementations. |
+ [ |
+ 'getStartStopSyncButton', |
+ 'hideSyncSection', |
+ 'setAutoLoginVisible', |
+ 'setCustomizeSyncButtonEnabled', |
+ 'setGtkThemeButtonEnabled', |
+ 'setProfilesInfo', |
+ 'setProfilesSectionVisible', |
+ 'setStartStopButtonEnabled', |
+ 'setStartStopButtonLabel', |
+ 'setStartStopButtonVisible', |
+ 'setSyncActionLinkEnabled', |
+ 'setSyncActionLinkLabel', |
+ 'setSyncEnabled', |
+ 'setSyncSetupCompleted', |
+ 'setSyncStatus', |
+ 'setSyncStatusErrorVisible', |
+ 'setThemesResetButtonEnabled', |
+ 'updateAccountPicture', |
+ ].forEach(function(name) { |
+ PersonalOptions[name] = function(value) { |
+ return PersonalOptions.getInstance()[name + '_'](value); |
+ }; |
+ }); |
+ |
+ // Export |
+ return { |
+ PersonalOptions: PersonalOptions |
+ }; |
+ |
+}); |