| Index: chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.js
|
| diff --git a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.js b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.js
|
| index 42fe312f06222977b1e0f6357f1b4d19daa2ba2f..a70b96c77bc1387c2298b0b78c0adb73a9d43d6d 100644
|
| --- a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.js
|
| +++ b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.js
|
| @@ -8,6 +8,154 @@
|
| * save any passwords.
|
| */
|
|
|
| +/**
|
| + * Interface for all callbacks to the password API.
|
| + * @interface
|
| + */
|
| +function PasswordManager() {}
|
| +
|
| +/** @typedef {chrome.passwordsPrivate.PasswordUiEntry} */
|
| +PasswordManager.PasswordUiEntry;
|
| +
|
| +/** @typedef {chrome.passwordsPrivate.LoginPair} */
|
| +PasswordManager.LoginPair;
|
| +
|
| +/** @typedef {chrome.passwordsPrivate.ExceptionPair} */
|
| +PasswordManager.ExceptionPair;
|
| +
|
| +/** @typedef {chrome.passwordsPrivate.PlaintextPasswordEventParameters} */
|
| +PasswordManager.PlaintextPasswordEvent;
|
| +
|
| +PasswordManager.prototype = {
|
| + /**
|
| + * Add an observer to the list of saved passwords.
|
| + * @param {function(!Array<!PasswordManager.PasswordUiEntry>):void} listener
|
| + */
|
| + addSavedPasswordListChangedListener: assertNotReached,
|
| +
|
| + /**
|
| + * Remove an observer from the list of saved passwords.
|
| + * @param {function(!Array<!PasswordManager.PasswordUiEntry>):void} listener
|
| + */
|
| + removeSavedPasswordListChangedListener: assertNotReached,
|
| +
|
| + /**
|
| + * Request the list of saved passwords.
|
| + * @param {function(!Array<!PasswordManager.PasswordUiEntry>):void} callback
|
| + */
|
| + getSavedPasswordList: assertNotReached,
|
| +
|
| + /**
|
| + * Should remove the saved password and notify that the list has changed.
|
| + * @param {!PasswordManager.LoginPair} loginPair The saved password that
|
| + * should be removed from the list. No-op if |loginPair| is not found.
|
| + */
|
| + removeSavedPassword: assertNotReached,
|
| +
|
| + /**
|
| + * Add an observer to the list of password exceptions.
|
| + * @param {function(!Array<!PasswordManager.ExceptionPair>):void} listener
|
| + */
|
| + addExceptionListChangedListener: assertNotReached,
|
| +
|
| + /**
|
| + * Remove an observer from the list of password exceptions.
|
| + * @param {function(!Array<!PasswordManager.ExceptionPair>):void} listener
|
| + */
|
| + removeExceptionListChangedListener: assertNotReached,
|
| +
|
| + /**
|
| + * Request the list of password exceptions.
|
| + * @param {function(!Array<!PasswordManager.ExceptionPair>):void} callback
|
| + */
|
| + getExceptionList: assertNotReached,
|
| +
|
| + /**
|
| + * Should remove the password exception and notify that the list has changed.
|
| + * @param {string} exception The exception that should be removed from the
|
| + * list. No-op if |exception| is not in the list.
|
| + */
|
| + removeException: assertNotReached,
|
| +
|
| + /**
|
| + * Gets the saved password for a given login pair.
|
| + * @param {!PasswordManager.LoginPair} loginPair The saved password that
|
| + * should be retrieved.
|
| + * @param {function(!PasswordManager.PlaintextPasswordEvent):void} callback
|
| + */
|
| + getPlaintextPassword: assertNotReached,
|
| +};
|
| +
|
| +/**
|
| + * Implementation that accesses the private API.
|
| + * @implements {PasswordManager}
|
| + * @constructor
|
| + */
|
| +function PasswordManagerImpl() {}
|
| +cr.addSingletonGetter(PasswordManagerImpl);
|
| +
|
| +PasswordManagerImpl.prototype = {
|
| + __proto__: PasswordManager,
|
| +
|
| + /** @override */
|
| + addSavedPasswordListChangedListener: function(listener) {
|
| + chrome.passwordsPrivate.onSavedPasswordsListChanged.addListener(listener);
|
| + },
|
| +
|
| + /** @override */
|
| + removeSavedPasswordListChangedListener: function(listener) {
|
| + chrome.passwordsPrivate.onSavedPasswordsListChanged.removeListener(
|
| + listener);
|
| + },
|
| +
|
| + /** @override */
|
| + getSavedPasswordList: function(callback) {
|
| + chrome.passwordsPrivate.getSavedPasswordList(callback);
|
| + },
|
| +
|
| + /** @override */
|
| + removeSavedPassword: function(loginPair) {
|
| + chrome.passwordsPrivate.removeSavedPassword(loginPair);
|
| + },
|
| +
|
| + /** @override */
|
| + addExceptionListChangedListener: function(listener) {
|
| + chrome.passwordsPrivate.onPasswordExceptionsListChanged.addListener(
|
| + listener);
|
| + },
|
| +
|
| + /** @override */
|
| + removeExceptionListChangedListener: function(listener) {
|
| + chrome.passwordsPrivate.onPasswordExceptionsListChanged.removeListener(
|
| + listener);
|
| + },
|
| +
|
| + /** @override */
|
| + getExceptionList: function(callback) {
|
| + chrome.passwordsPrivate.getPasswordExceptionList(callback);
|
| + },
|
| +
|
| + /** @override */
|
| + removeException: function(exception) {
|
| + chrome.passwordsPrivate.removePasswordException(exception);
|
| + },
|
| +
|
| + /** @override */
|
| + getPlaintextPassword: function(loginPair, callback) {
|
| + var listener = function(reply) {
|
| + // Only handle the reply for our loginPair request.
|
| + if (reply.loginPair.originUrl == loginPair.originUrl &&
|
| + reply.loginPair.username == loginPair.username) {
|
| + chrome.passwordsPrivate.onPlaintextPasswordRetrieved.removeListener(
|
| + listener);
|
| + callback(reply);
|
| + }
|
| + };
|
| + chrome.passwordsPrivate.onPlaintextPasswordRetrieved.addListener(listener);
|
| + chrome.passwordsPrivate.requestPlaintextPassword(loginPair);
|
| + },
|
| +};
|
| +
|
| /** @typedef {!{model: !{item: !chrome.passwordsPrivate.PasswordUiEntry}}} */
|
| var PasswordUiEntryEvent;
|
|
|
| @@ -31,21 +179,15 @@ Polymer({
|
|
|
| /**
|
| * An array of passwords to display.
|
| - * @type {!Array<!chrome.passwordsPrivate.PasswordUiEntry>}
|
| + * @type {!Array<!PasswordManager.PasswordUiEntry>}
|
| */
|
| - savedPasswords: {
|
| - type: Array,
|
| - value: function() { return []; },
|
| - },
|
| + savedPasswords: Array,
|
|
|
| /**
|
| * An array of sites to display.
|
| - * @type {!Array<!chrome.passwordsPrivate.ExceptionPair>}
|
| + * @type {!Array<!PasswordManager.ExceptionPair>}
|
| */
|
| - passwordExceptions: {
|
| - type: Array,
|
| - value: function() { return []; },
|
| - },
|
| + passwordExceptions: Array,
|
|
|
| /** @override */
|
| subpageRoute: {
|
| @@ -69,6 +211,66 @@ Polymer({
|
| },
|
| },
|
|
|
| + listeners: {
|
| + 'show-password': 'showPassword_',
|
| + },
|
| +
|
| + /**
|
| + * @type {PasswordManager}
|
| + * @private
|
| + */
|
| + passwordManager_: null,
|
| +
|
| + /**
|
| + * @type {?function(!Array<PasswordManager.PasswordUiEntry>):void}
|
| + * @private
|
| + */
|
| + setSavedPasswordsListener_: null,
|
| +
|
| + /**
|
| + * @type {?function(!Array<PasswordManager.ExceptionPair>):void}
|
| + * @private
|
| + */
|
| + setPasswordExceptionsListener_: null,
|
| +
|
| + /** @override */
|
| + ready: function() {
|
| + // Create listener functions.
|
| + var setSavedPasswordsListener = function(list) {
|
| + this.savedPasswords = list;
|
| + }.bind(this);
|
| +
|
| + var setPasswordExceptionsListener = function(list) {
|
| + this.passwordExceptions = list;
|
| + }.bind(this);
|
| +
|
| + this.setSavedPasswordsListener_ = setSavedPasswordsListener;
|
| + this.setPasswordExceptionsListener_ = setPasswordExceptionsListener;
|
| +
|
| + // Set the manager. These can be overridden by tests.
|
| + this.passwordManager_ = PasswordManagerImpl.getInstance();
|
| +
|
| + // Request initial data.
|
| + this.passwordManager_.getSavedPasswordList(setSavedPasswordsListener);
|
| + this.passwordManager_.getExceptionList(setPasswordExceptionsListener);
|
| +
|
| + // Listen for changes.
|
| + this.passwordManager_.addSavedPasswordListChangedListener(
|
| + setSavedPasswordsListener);
|
| + this.passwordManager_.addExceptionListChangedListener(
|
| + setPasswordExceptionsListener);
|
| + },
|
| +
|
| + /** @override */
|
| + detached: function() {
|
| + this.passwordManager_.removeSavedPasswordListChangedListener(
|
| + /** @type {function(!Array<PasswordManager.PasswordUiEntry>):void} */(
|
| + this.setSavedPasswordsListener_));
|
| + this.passwordManager_.removeExceptionListChangedListener(
|
| + /** @type {function(!Array<PasswordManager.ExceptionPair>):void} */(
|
| + this.setPasswordExceptionsListener_));
|
| + },
|
| +
|
| /**
|
| * Sets the password in the current password dialog if the loginPair matches.
|
| * @param {!chrome.passwordsPrivate.LoginPair} loginPair
|
| @@ -130,7 +332,7 @@ Polymer({
|
| * @private
|
| */
|
| onMenuRemovePasswordTap_: function() {
|
| - this.fire('remove-saved-password', this.activePassword.loginPair);
|
| + this.passwordManager_.removeSavedPassword(this.activePassword.loginPair);
|
| /** @type {CrActionMenuElement} */(this.$.menu).close();
|
| },
|
|
|
| @@ -140,7 +342,7 @@ Polymer({
|
| * @private
|
| */
|
| onRemoveExceptionButtonTap_: function(e) {
|
| - this.fire('remove-password-exception', e.model.item.exceptionUrl);
|
| + this.passwordManager_.removeException(e.model.item.exceptionUrl);
|
| },
|
|
|
| /**
|
| @@ -175,5 +377,18 @@ Polymer({
|
| hasSome_: function(list) {
|
| return !!(list && list.length);
|
| },
|
| +
|
| + /**
|
| + * Listens for the show-password event, and calls the private API.
|
| + * @param {!Event} event
|
| + * @private
|
| + */
|
| + showPassword_: function(event) {
|
| + this.passwordManager_.getPlaintextPassword(
|
| + /** @type {!PasswordManager.LoginPair} */(event.detail),
|
| + function(item) {
|
| + this.setPassword(item.loginPair, item.plaintextPassword);
|
| + }.bind(this));
|
| + },
|
| });
|
| })();
|
|
|