Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(379)

Unified Diff: chrome/browser/resources/options/password_manager_list.js

Issue 489103004: Allow editing passwords in settings/passwords (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/options/password_manager_list.js
diff --git a/chrome/browser/resources/options/password_manager_list.js b/chrome/browser/resources/options/password_manager_list.js
index 2a77ea3281a64156448e79ac0329d683d30028e7..59f3ec871e45fbc590f79f5deeab74f809c455b9 100644
--- a/chrome/browser/resources/options/password_manager_list.js
+++ b/chrome/browser/resources/options/password_manager_list.js
@@ -6,6 +6,8 @@ cr.define('options.passwordManager', function() {
/** @const */ var ArrayDataModel = cr.ui.ArrayDataModel;
/** @const */ var DeletableItemList = options.DeletableItemList;
/** @const */ var DeletableItem = options.DeletableItem;
+ /** @const */ var InlineEditableItemList = options.InlineEditableItemList;
+ /** @const */ var InlineEditableItem = options.InlineEditableItem;
/** @const */ var List = cr.ui.List;
/**
@@ -16,7 +18,7 @@ cr.define('options.passwordManager', function() {
* @param {boolean} showPasswords If true, add a button to the element to
* allow the user to reveal the saved password.
* @constructor
- * @extends {cr.ui.ListItem}
+ * @extends {options.InlineEditableItem}
*/
function PasswordListItem(dataModel, entry, showPasswords) {
var el = cr.doc.createElement('div');
@@ -29,11 +31,15 @@ cr.define('options.passwordManager', function() {
}
PasswordListItem.prototype = {
- __proto__: DeletableItem.prototype,
+ __proto__: InlineEditableItem.prototype,
/** @override */
decorate: function(showPasswords) {
- DeletableItem.prototype.decorate.call(this);
+ InlineEditableItem.prototype.decorate.call(this);
+
+ // The user can edit the saved passwords if and only if he can reveal
+ // them.
+ this.editable = showPasswords;
// The URL of the site.
var urlLabel = this.ownerDocument.createElement('div');
@@ -72,8 +78,8 @@ cr.define('options.passwordManager', function() {
passwordInputDiv.appendChild(passwordInput);
this.passwordField = passwordInput;
- // The show/hide button.
if (showPasswords) {
+ // The show/hide button.
var button = this.ownerDocument.createElement('button');
button.hidden = true;
button.className = 'list-inline-button custom-appearance';
@@ -87,6 +93,11 @@ cr.define('options.passwordManager', function() {
}, false);
passwordInputDiv.appendChild(button);
this.passwordShowButton = button;
+
+ // Makes the password input field editable.
+ this.addEditField(passwordInput, null);
+ this.addEventListener('canceledit', this.onEditCancelled_);
+ this.addEventListener('commitedit', this.onEditCommitted_);
}
this.contentElement.appendChild(passwordInputDiv);
@@ -94,6 +105,8 @@ cr.define('options.passwordManager', function() {
/** @override */
selectionChanged: function() {
+ InlineEditableItem.prototype.selectionChanged.call(this);
+
var input = this.passwordField;
var button = this.passwordShowButton;
// The button doesn't exist when passwords can't be shown.
@@ -109,12 +122,24 @@ cr.define('options.passwordManager', function() {
}
},
+ /** @override */
+ get currentInputIsValid() {
+ return !!this.passwordField.value;
+ },
+
+ /** @override */
+ get hasBeenEdited() {
+ return this.passwordField.value != this.password;
+ },
+
/**
* Reveals the plain text password of this entry.
*/
showPassword: function(password) {
+ this.password = password;
this.passwordField.value = password;
this.passwordField.type = 'text';
+ this.passwordField.readOnly = false;
var button = this.passwordShowButton;
if (button)
@@ -126,6 +151,7 @@ cr.define('options.passwordManager', function() {
*/
hidePassword: function() {
this.passwordField.type = 'password';
+ this.passwordField.readOnly = true;
var button = this.passwordShowButton;
if (button)
@@ -157,6 +183,26 @@ cr.define('options.passwordManager', function() {
},
/**
+ * Called when cancelling a password edit. Resets the password input field.
+ * @param {Event} event The canceledit event.
+ * @private
+ */
+ onEditCancelled_: function(event) {
+ this.passwordField.value = this.password;
+ },
+
+ /**
+ * Called when committing a password edit. Updates the password.
+ * @param {Event} event The commitedit event.
+ * @private
+ */
+ onEditCommitted_: function(event) {
+ this.password = this.passwordField.value;
+ PasswordManager.updatePassword(
+ this.getOriginalIndex_(), this.passwordField.value);
+ },
+
+ /**
* Get and set the URL for the entry.
* @type {string}
*/
@@ -246,12 +292,12 @@ cr.define('options.passwordManager', function() {
/**
* Create a new passwords list.
* @constructor
- * @extends {cr.ui.List}
+ * @extends {options.InlineEditableItemList}
*/
var PasswordsList = cr.ui.define('list');
PasswordsList.prototype = {
- __proto__: DeletableItemList.prototype,
+ __proto__: InlineEditableItemList.prototype,
/**
* Whether passwords can be revealed or not.
@@ -262,7 +308,7 @@ cr.define('options.passwordManager', function() {
/** @override */
decorate: function() {
- DeletableItemList.prototype.decorate.call(this);
+ InlineEditableItemList.prototype.decorate.call(this);
Preferences.getInstance().addEventListener(
'profile.password_manager_allow_show_passwords',
this.onPreferenceChanged_.bind(this));

Powered by Google App Engine
This is Rietveld 408576698