| Index: chrome/browser/resources/options2/password_manager.js
|
| diff --git a/chrome/browser/resources/options2/password_manager.js b/chrome/browser/resources/options2/password_manager.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..273d2c01e472d5a5af17777708c9024463204864
|
| --- /dev/null
|
| +++ b/chrome/browser/resources/options2/password_manager.js
|
| @@ -0,0 +1,228 @@
|
| +// 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() {
|
| + const OptionsPage = options.OptionsPage;
|
| + const ArrayDataModel = cr.ui.ArrayDataModel;
|
| +
|
| + /////////////////////////////////////////////////////////////////////////////
|
| + // PasswordManager class:
|
| +
|
| + /**
|
| + * Encapsulated handling of password and exceptions page.
|
| + * @constructor
|
| + */
|
| + function PasswordManager() {
|
| + this.activeNavTab = null;
|
| + OptionsPage.call(this,
|
| + 'passwords',
|
| + templateData.passwordsPageTabTitle,
|
| + 'password-manager');
|
| + }
|
| +
|
| + cr.addSingletonGetter(PasswordManager);
|
| +
|
| + PasswordManager.prototype = {
|
| + __proto__: OptionsPage.prototype,
|
| +
|
| + /**
|
| + * The saved passwords list.
|
| + * @type {DeletableItemList}
|
| + * @private
|
| + */
|
| + savedPasswordsList_: null,
|
| +
|
| + /**
|
| + * The password exceptions list.
|
| + * @type {DeletableItemList}
|
| + * @private
|
| + */
|
| + passwordExceptionsList_: null,
|
| +
|
| + /**
|
| + * The timer id of the timer set on search query change events.
|
| + * @type {number}
|
| + * @private
|
| + */
|
| + queryDelayTimerId_: 0,
|
| +
|
| + /**
|
| + * The most recent search query, or null if the query is empty.
|
| + * @type {?string}
|
| + * @private
|
| + */
|
| + lastQuery_: null,
|
| +
|
| + /** @inheritDoc */
|
| + initializePage: function() {
|
| + OptionsPage.prototype.initializePage.call(this);
|
| +
|
| + $('password-search-box').addEventListener('search',
|
| + this.handleSearchQueryChange_.bind(this));
|
| +
|
| + this.createSavedPasswordsList_();
|
| + this.createPasswordExceptionsList_();
|
| + },
|
| +
|
| + /** @inheritDoc */
|
| + canShowPage: function() {
|
| + return !PersonalOptions.disablePasswordManagement();
|
| + },
|
| +
|
| + /** @inheritDoc */
|
| + didShowPage: function() {
|
| + // Updating the password lists may cause a blocking platform dialog pop up
|
| + // (Mac, Linux), so we delay this operation until the page is shown.
|
| + chrome.send('updatePasswordLists');
|
| + $('password-search-box').focus();
|
| + },
|
| +
|
| + /**
|
| + * Creates, decorates and initializes the saved passwords list.
|
| + * @private
|
| + */
|
| + createSavedPasswordsList_: function() {
|
| + this.savedPasswordsList_ = $('saved-passwords-list');
|
| + options.passwordManager.PasswordsList.decorate(this.savedPasswordsList_);
|
| + this.savedPasswordsList_.autoExpands = true;
|
| + },
|
| +
|
| + /**
|
| + * Creates, decorates and initializes the password exceptions list.
|
| + * @private
|
| + */
|
| + createPasswordExceptionsList_: function() {
|
| + this.passwordExceptionsList_ = $('password-exceptions-list');
|
| + options.passwordManager.PasswordExceptionsList.decorate(
|
| + this.passwordExceptionsList_);
|
| + this.passwordExceptionsList_.autoExpands = true;
|
| + },
|
| +
|
| + /**
|
| + * Handles search query changes.
|
| + * @param {!Event} e The event object.
|
| + * @private
|
| + */
|
| + handleSearchQueryChange_: function(e) {
|
| + if (this.queryDelayTimerId_)
|
| + window.clearTimeout(this.queryDelayTimerId_);
|
| +
|
| + // Searching cookies uses a timeout of 500ms. We use a shorter timeout
|
| + // because there are probably fewer passwords and we want the UI to be
|
| + // snappier since users will expect that it's "less work."
|
| + this.queryDelayTimerId_ = window.setTimeout(
|
| + this.searchPasswords_.bind(this), 250);
|
| + },
|
| +
|
| + /**
|
| + * Search passwords using text in |password-search-box|.
|
| + * @private
|
| + */
|
| + searchPasswords_: function() {
|
| + this.queryDelayTimerId_ = 0;
|
| + var filter = $('password-search-box').value;
|
| + filter = (filter == '') ? null : filter;
|
| + if (this.lastQuery_ != filter) {
|
| + this.lastQuery_ = filter;
|
| + // Searching for passwords has the side effect of requerying the
|
| + // underlying password store. This is done intentionally, as on OS X and
|
| + // Linux they can change from outside and we won't be notified of it.
|
| + chrome.send('updatePasswordLists');
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * Updates the visibility of the list and empty list placeholder.
|
| + * @param {!List} list The list to toggle visilibility for.
|
| + */
|
| + updateListVisibility_: function(list) {
|
| + var empty = list.dataModel.length == 0;
|
| + var listPlaceHolderID = list.id + '-empty-placeholder';
|
| + list.hidden = empty;
|
| + $(listPlaceHolderID).hidden = !empty;
|
| + },
|
| +
|
| + /**
|
| + * Updates the data model for the saved passwords list with the values from
|
| + * |entries|.
|
| + * @param {Array} entries The list of saved password data.
|
| + */
|
| + setSavedPasswordsList_: function(entries) {
|
| + if (this.lastQuery_) {
|
| + // Implement password searching here in javascript, rather than in C++.
|
| + // The number of saved passwords shouldn't be too big for us to handle.
|
| + var query = this.lastQuery_;
|
| + var filter = function(entry, index, list) {
|
| + // Search both URL and username.
|
| + if (entry[0].indexOf(query) >= 0 || entry[1].indexOf(query) >= 0) {
|
| + // Keep the original index so we can delete correctly. See also
|
| + // deleteItemAtIndex() in password_manager_list.js that uses this.
|
| + entry[3] = index;
|
| + return true;
|
| + }
|
| + return false;
|
| + };
|
| + entries = entries.filter(filter);
|
| + }
|
| + this.savedPasswordsList_.dataModel = new ArrayDataModel(entries);
|
| + this.updateListVisibility_(this.savedPasswordsList_);
|
| + },
|
| +
|
| + /**
|
| + * Updates the data model for the password exceptions list with the values
|
| + * from |entries|.
|
| + * @param {Array} entries The list of password exception data.
|
| + */
|
| + setPasswordExceptionsList_: function(entries) {
|
| + this.passwordExceptionsList_.dataModel = new ArrayDataModel(entries);
|
| + this.updateListVisibility_(this.passwordExceptionsList_);
|
| + },
|
| + };
|
| +
|
| + /**
|
| + * Call to remove a saved password.
|
| + * @param rowIndex indicating the row to remove.
|
| + */
|
| + PasswordManager.removeSavedPassword = function(rowIndex) {
|
| + chrome.send('removeSavedPassword', [String(rowIndex)]);
|
| + };
|
| +
|
| + /**
|
| + * Call to remove a password exception.
|
| + * @param rowIndex indicating the row to remove.
|
| + */
|
| + PasswordManager.removePasswordException = function(rowIndex) {
|
| + chrome.send('removePasswordException', [String(rowIndex)]);
|
| + };
|
| +
|
| + /**
|
| + * Call to remove all saved passwords.
|
| + * @param tab contentType of the tab currently on.
|
| + */
|
| + PasswordManager.removeAllPasswords = function() {
|
| + chrome.send('removeAllSavedPasswords');
|
| + };
|
| +
|
| + /**
|
| + * Call to remove all saved passwords.
|
| + * @param tab contentType of the tab currently on.
|
| + */
|
| + PasswordManager.removeAllPasswordExceptions = function() {
|
| + chrome.send('removeAllPasswordExceptions');
|
| + };
|
| +
|
| + PasswordManager.setSavedPasswordsList = function(entries) {
|
| + PasswordManager.getInstance().setSavedPasswordsList_(entries);
|
| + };
|
| +
|
| + PasswordManager.setPasswordExceptionsList = function(entries) {
|
| + PasswordManager.getInstance().setPasswordExceptionsList_(entries);
|
| + };
|
| +
|
| + // Export
|
| + return {
|
| + PasswordManager: PasswordManager
|
| + };
|
| +
|
| +});
|
|
|