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

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

Issue 5935003: DOMUI: Implement new-style password manager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Selection transitions. Created 10 years 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 c814fe5b133a30f53d866532531668e520582f4f..6b057cd57fcd748376fa854e8b91d46a16e55d7f 100644
--- a/chrome/browser/resources/options/password_manager_list.js
+++ b/chrome/browser/resources/options/password_manager_list.js
@@ -3,50 +3,95 @@
// found in the LICENSE file.
cr.define('options.passwordManager', function() {
-
+ const ArrayDataModel = cr.ui.ArrayDataModel;
+ const DeletableItemList = options.DeletableItemList;
const List = cr.ui.List;
const ListItem = cr.ui.ListItem;
- const ArrayDataModel = cr.ui.ArrayDataModel;
/**
* Creates a new passwords list item.
- * @param {Array} entry A pair of the form [url, username].
+ * @param {Array} entry An array of the form [url, username, password].
* @constructor
* @extends {cr.ui.ListItem}
*/
- function PasswordsListItem(entry) {
- var el = cr.doc.createElement('li');
+ function PasswordListItem(entry) {
+ var el = cr.doc.createElement('div');
el.dataItem = entry;
- el.__proto__ = PasswordsListItem.prototype;
+ el.__proto__ = PasswordListItem.prototype;
el.decorate();
return el;
}
- PasswordsListItem.prototype = {
+ PasswordListItem.prototype = {
__proto__: ListItem.prototype,
- /**
- * Call when an element is decorated as a list item.
- */
+ /** @inheritDoc */
decorate: function() {
ListItem.prototype.decorate.call(this);
- // Labels for display
- var urlLabel = cr.doc.createElement('span');
+ // The URL of the site.
+ var urlLabel = this.ownerDocument.createElement('div');
+ urlLabel.className = 'url';
+ urlLabel.classList.add('favicon-cell');
urlLabel.textContent = this.url;
+ urlLabel.style.backgroundImage = url('chrome://favicon/' + this.url);
this.appendChild(urlLabel);
- this.urlLabel = urlLabel;
- var usernameLabel = cr.doc.createElement('span');
+ // The stored username.
+ var usernameLabel = this.ownerDocument.createElement('div');
+ usernameLabel.className = 'name';
usernameLabel.textContent = this.username;
- usernameLabel.className = 'passwordsUsername';
this.appendChild(usernameLabel);
- this.usernameLabel = usernameLabel;
+
+ // The stored password.
+ var passwordInputDiv = this.ownerDocument.createElement('div');
+ passwordInputDiv.className = 'password';
+
+ // The password input field.
+ var passwordInput = this.ownerDocument.createElement('input');
+ passwordInput.className = 'inactive-password';
+ passwordInput.type = 'password';
+ passwordInput.value = this.password;
+ passwordInputDiv.appendChild(passwordInput);
+
+ // The show/hide button.
+ var buttonSpan = this.ownerDocument.createElement('span');
+ buttonSpan.className = 'hidden';
+ buttonSpan.addEventListener('click', this.onClick_, true);
+ passwordInputDiv.appendChild(buttonSpan);
+
+ this.appendChild(passwordInputDiv);
+ },
+
+ /** @inheritDoc */
+ selectionChanged: function() {
+ var passwordInput = this.querySelector('input[type=password]');
+ var buttonSpan = passwordInput.nextSibling;
+ if (this.selected) {
+ passwordInput.classList.remove('inactive-password');
+ buttonSpan.classList.remove('hidden');
+ } else {
+ passwordInput.classList.add('inactive-password');
+ buttonSpan.classList.add('hidden');
+ }
},
/**
- * Get the url for the entry.
+ * On-click event handler. Swaps the type of the input field from password
+ * to text and back.
+ * @private
+ */
+ onClick_: function(event) {
+ // The password is the input element previous to the button span.
+ var buttonSpan = event.currentTarget;
+ var passwordInput = buttonSpan.previousSibling;
+ var type = passwordInput.type;
+ passwordInput.type = type == 'password' ? 'text' : 'password';
+ },
+
+ /**
+ * Get and set the URL for the entry.
* @type {string}
*/
get url() {
@@ -57,15 +102,26 @@ cr.define('options.passwordManager', function() {
},
/**
- * Get the username for the entry.
+ * Get and set the username for the entry.
* @type {string}
*/
get username() {
return this.dataItem[1];
- },
- set username(username) {
+ },
+ set username(username) {
this.dataItem[1] = username;
- },
+ },
+
+ /**
+ * Get and set the password for the entry.
+ * @type {string}
+ */
+ get password() {
+ return this.dataItem[2];
+ },
+ set password(password) {
+ this.dataItem[2] = password;
+ },
};
/**
@@ -75,7 +131,7 @@ cr.define('options.passwordManager', function() {
* @extends {cr.ui.ListItem}
*/
function PasswordExceptionsListItem(entry) {
- var el = cr.doc.createElement('li');
+ var el = cr.doc.createElement('div');
el.dataItem = entry;
el.__proto__ = PasswordExceptionsListItem.prototype;
el.decorate();
@@ -92,11 +148,13 @@ cr.define('options.passwordManager', function() {
decorate: function() {
ListItem.prototype.decorate.call(this);
- // Labels for display
- var urlLabel = cr.doc.createElement('span');
+ // The URL of the site.
+ var urlLabel = this.ownerDocument.createElement('div');
+ urlLabel.className = 'url';
+ urlLabel.classList.add('favicon-cell');
urlLabel.textContent = this.url;
+ urlLabel.style.backgroundImage = url('chrome://favicon/' + this.url);
this.appendChild(urlLabel);
- this.urlLabel = urlLabel;
},
/**
@@ -111,7 +169,6 @@ cr.define('options.passwordManager', function() {
},
};
-
/**
* Create a new passwords list.
* @constructor
@@ -120,52 +177,16 @@ cr.define('options.passwordManager', function() {
var PasswordsList = cr.ui.define('list');
PasswordsList.prototype = {
- __proto__: List.prototype,
- /**
- * Called when an element is decorated as a list.
- */
- decorate: function() {
- List.prototype.decorate.call(this);
-
- this.dataModel = new ArrayDataModel([]);
- },
-
- /**
- * Creates an item to go in the list.
- * @param {Object} entry The element from the data model for this row.
- */
- createItem: function(entry) {
- return new PasswordsListItem(entry);
- },
+ __proto__: DeletableItemList.prototype,
- /**
- * Adds an entry to the js model.
- * @param {Array} entry A pair of the form [url, username].
- */
- addEntry: function(entry) {
- this.dataModel.push(entry);
- this.listArea.updateButtonSensitivity();
+ /** @inheritDoc */
+ createItemContents: function(entry) {
+ return new PasswordListItem(entry);
},
- /**
- * Remove all entries from the js model.
- */
- clear: function() {
- this.dataModel = new ArrayDataModel([]);
- this.listArea.updateButtonSensitivity();
- },
-
- /**
- * Remove selected row from browser's model.
- */
- removeSelectedRow: function() {
- var selectedIndex = this.selectionModel.selectedIndex;
- PasswordManager.removeSavedPassword(selectedIndex);
- },
-
- showSelectedPassword: function() {
- var selectedIndex = this.selectionModel.selectedIndex;
- PasswordManager.showSelectedPassword(selectedIndex);
+ /** @inheritDoc */
+ deleteItemAtIndex: function(index) {
+ PasswordManager.removeSavedPassword(index);
},
/**
@@ -184,47 +205,16 @@ cr.define('options.passwordManager', function() {
var PasswordExceptionsList = cr.ui.define('list');
PasswordExceptionsList.prototype = {
- __proto__: List.prototype,
- /**
- * Called when an element is decorated as a list.
- */
- decorate: function() {
- List.prototype.decorate.call(this);
-
- this.dataModel = new ArrayDataModel([]);
- },
+ __proto__: DeletableItemList.prototype,
- /**
- * Creates an item to go in the list.
- * @param {Object} entry The element from the data model for this row.
- */
- createItem: function(entry) {
+ /** @inheritDoc */
+ createItemContents: function(entry) {
return new PasswordExceptionsListItem(entry);
},
- /**
- * Adds an entry to the js model.
- * @param {Array} entry A pair of the form [url, username].
- */
- addEntry: function(entry) {
- this.dataModel.push(entry);
- this.listArea.updateButtonSensitivity();
- },
-
- /**
- * Remove all entries from the js model.
- */
- clear: function() {
- this.dataModel = new ArrayDataModel([]);
- this.listArea.updateButtonSensitivity();
- },
-
- /**
- * Remove selected row from browser's model.
- */
- removeSelectedRow: function() {
- var selectedIndex = this.selectionModel.selectedIndex;
- PasswordManager.removePasswordException(selectedIndex);
+ /** @inheritDoc */
+ deleteItemAtIndex: function(index) {
+ PasswordManager.removePasswordException(index);
},
/**
@@ -235,165 +225,10 @@ cr.define('options.passwordManager', function() {
},
};
- /**
- * Create a new passwords list area.
- * @constructor
- * @extends {cr.ui.div}
- */
- var PasswordsListArea = cr.ui.define('div');
-
- PasswordsListArea.prototype = {
- __proto__: HTMLDivElement.prototype,
-
- decorate: function() {
- this.passwordsList = this.querySelector('list');
- this.passwordsList.listArea = this;
-
- PasswordsList.decorate(this.passwordsList);
- this.passwordsList.selectionModel.addEventListener(
- 'change', this.handleOnSelectionChange_.bind(this));
-
- var removeRow = cr.doc.createElement('button');
- removeRow.textContent = templateData.passwordsRemoveButton;
- this.appendChild(removeRow);
- this.removeRow = removeRow;
-
- var removeAll = cr.doc.createElement('button');
- removeAll.textContent = templateData.passwordsRemoveAllButton;
- this.appendChild(removeAll);
- this.removeAll = removeAll;
-
- var showHidePassword = cr.doc.createElement('button');
- showHidePassword.textContent = templateData.passwordsShowButton;
- this.appendChild(showHidePassword);
- this.showHidePassword = showHidePassword;
- this.showingPassword = false
-
- var passwordLabel = cr.doc.createElement('span');
- this.appendChild(passwordLabel);
- this.passwordLabel = passwordLabel;
-
- var self = this;
- removeRow.onclick = function(event) {
- self.passwordsList.removeSelectedRow();
- };
-
- removeAll.onclick = function(event) {
- AlertOverlay.show(
- undefined,
- localStrings.getString('passwordsRemoveAllWarning'),
- localStrings.getString('yesButtonLabel'),
- localStrings.getString('noButtonLabel'),
- function() { PasswordManager.removeAllPasswords(); });
- };
-
- showHidePassword.onclick = function(event) {
- if(self.showingPassword) {
- self.passwordLabel.textContent = "";
- this.textContent = templateData.passwordsShowButton;
- } else {
- self.passwordsList.showSelectedPassword();
- this.textContent = templateData.passwordsHideButton;
- }
- self.showingPassword = !self.showingPassword;
- };
-
- this.updateButtonSensitivity();
- },
-
- displayReturnedPassword: function(password) {
- this.passwordLabel.textContent = password;
- },
-
- /**
- * Update the button's states
- */
- updateButtonSensitivity: function() {
- var selectionSize = this.passwordsList.selectedItems.length;
- this.removeRow.disabled = selectionSize == 0;
- this.showHidePassword.disabled = selectionSize == 0;
- this.removeAll.disabled = this.passwordsList.length == 0;
- },
-
- /**
- * Callback from selection model
- * @param {!cr.Event} ce Event with change info.
- * @private
- */
- handleOnSelectionChange_: function(ce) {
- this.passwordLabel.textContent = "";
- this.showHidePassword.textContent = templateData.passwordsShowButton;
- this.showingPassword = false;
- this.updateButtonSensitivity();
- },
- };
-
- /**
- * Create a new passwords list area.
- * @constructor
- * @extends {cr.ui.div}
- */
- var PasswordExceptionsListArea = cr.ui.define('div');
-
- PasswordExceptionsListArea.prototype = {
- __proto__: HTMLDivElement.prototype,
-
- decorate: function() {
- this.passwordExceptionsList = this.querySelector('list');
- this.passwordExceptionsList.listArea = this;
-
- PasswordExceptionsList.decorate(this.passwordExceptionsList);
- this.passwordExceptionsList.selectionModel.addEventListener(
- 'change', this.handleOnSelectionChange_.bind(this));
-
- var removeRow = cr.doc.createElement('button');
- removeRow.textContent = templateData.passwordsRemoveButton;
- this.appendChild(removeRow);
- this.removeRow = removeRow;
-
- var removeAll = cr.doc.createElement('button');
- removeAll.textContent = templateData.passwordsRemoveAllButton;
- this.appendChild(removeAll);
- this.removeAll = removeAll;
-
- var self = this;
- removeRow.onclick = function(event) {
- self.passwordExceptionsList.removeSelectedRow();
- };
-
- removeAll.onclick = function(event) {
- PasswordManager.removeAllPasswordExceptions();
- };
-
- this.updateButtonSensitivity();
- },
-
- /**
- * Update the button's states
- */
- updateButtonSensitivity: function() {
- var selectionSize = this.passwordExceptionsList.selectedItems.length;
- this.removeRow.disabled = selectionSize == 0;
- this.removeAll.disabled = this.passwordExceptionsList.length == 0;
- },
-
- /**
- * Callback from selection model
- * @param {!cr.Event} ce Event with change info.
- * @private
- */
- handleOnSelectionChange_: function(ce) {
- this.updateButtonSensitivity();
- },
- };
-
-
return {
- PasswordsListItem: PasswordsListItem,
+ PasswordListItem: PasswordListItem,
PasswordExceptionsListItem: PasswordExceptionsListItem,
PasswordsList: PasswordsList,
PasswordExceptionsList: PasswordExceptionsList,
- PasswordsListArea: PasswordsListArea,
- PasswordExceptionsListArea: PasswordExceptionsListArea
};
});
« no previous file with comments | « chrome/browser/resources/options/password_manager_list.css ('k') | chrome/browser/resources/options/personal_options.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698