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

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

Issue 3177023: Implement Password Exceptions Tab (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: sync Created 10 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/passwords_exceptions_list.js
diff --git a/chrome/browser/resources/options/passwords_exceptions_list.js b/chrome/browser/resources/options/passwords_exceptions_list.js
index 8bf232e1a36eb9f97e8f275c7bfa5afe83aff74e..261a3b0d086a62da39f18505d4646919a6d41967 100644
--- a/chrome/browser/resources/options/passwords_exceptions_list.js
+++ b/chrome/browser/resources/options/passwords_exceptions_list.js
@@ -36,13 +36,12 @@ cr.define('options.passwordsExceptions', function() {
var urlLabel = cr.doc.createElement('span');
urlLabel.textContent = this.url;
this.appendChild(urlLabel);
+ this.urlLabel = urlLabel;
var usernameLabel = cr.doc.createElement('span');
usernameLabel.textContent = this.username;
usernameLabel.className = 'passwordsUsername';
this.appendChild(usernameLabel);
-
- this.urlLabel = urlLabel;
this.usernameLabel = usernameLabel;
},
@@ -63,12 +62,56 @@ cr.define('options.passwordsExceptions', function() {
*/
get username() {
return this.dataItem[1];
- },
- set username(username) {
+ },
+ set username(username) {
this.dataItem[1] = username;
+ },
+ };
+
+ /**
+ * Creates a new PasswordExceptions list item.
+ * @param {Array} entry A pair of the form [url, username].
+ * @constructor
+ * @extends {cr.ui.ListItem}
+ */
+ function PasswordExceptionsListItem(entry) {
+ var el = cr.doc.createElement('li');
+ el.dataItem = entry;
+ el.__proto__ = PasswordExceptionsListItem.prototype;
+ el.decorate();
+
+ return el;
+ }
+
+ PasswordExceptionsListItem.prototype = {
+ __proto__: ListItem.prototype,
+
+ /**
+ * Call when an element is decorated as a list item.
+ */
+ decorate: function() {
+ ListItem.prototype.decorate.call(this);
+
+ // Labels for display
+ var urlLabel = cr.doc.createElement('span');
+ urlLabel.textContent = this.url;
+ this.appendChild(urlLabel);
+ this.urlLabel = urlLabel;
+ },
+
+ /**
+ * Get the url for the entry.
+ * @type {string}
+ */
+ get url() {
+ return this.dataItem;
+ },
+ set url(url) {
+ this.dataItem = url;
},
};
+
/**
* Create a new passwords list.
* @constructor
@@ -101,6 +144,7 @@ cr.define('options.passwordsExceptions', function() {
*/
addEntry: function(entry) {
this.dataModel.push(entry);
+ this.listArea.updateButtonSensitivity();
},
/**
@@ -108,6 +152,7 @@ cr.define('options.passwordsExceptions', function() {
*/
clear: function() {
this.dataModel = new ArrayDataModel([]);
+ this.listArea.updateButtonSensitivity();
},
/**
@@ -115,7 +160,7 @@ cr.define('options.passwordsExceptions', function() {
*/
removeSelectedRow: function() {
var selectedIndex = this.selectionModel.selectedIndex;
- PasswordsExceptions.removeAutofillable(selectedIndex);
+ PasswordsExceptions.removeSavedPassword(selectedIndex);
},
showSelectedPassword: function() {
@@ -123,16 +168,86 @@ cr.define('options.passwordsExceptions', function() {
PasswordsExceptions.showSelectedPassword(selectedIndex);
},
+ /**
+ * The length of the list.
+ */
+ get length() {
+ return this.dataModel.length;
+ },
};
- var ListArea = cr.ui.define('div');
+ /**
+ * Create a new passwords list.
+ * @constructor
+ * @extends {cr.ui.List}
+ */
+ var PasswordExceptionsList = cr.ui.define('list');
- ListArea.prototype = {
+ 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([]);
+ },
+
+ /**
+ * 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 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;
+ PasswordsExceptions.removePasswordException(selectedIndex);
+ },
+
+ /**
+ * The length of the list.
+ */
+ get length() {
+ return this.dataModel.length;
+ },
+ };
+
+ /**
+ * 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.contentType = this.contentType;
+ this.passwordsList.listArea = this;
PasswordsList.decorate(this.passwordsList);
this.passwordsList.selectionModel.addEventListener(
@@ -143,6 +258,11 @@ cr.define('options.passwordsExceptions', function() {
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);
@@ -158,6 +278,10 @@ cr.define('options.passwordsExceptions', function() {
self.passwordsList.removeSelectedRow();
};
+ removeAll.onclick = function(event) {
+ OptionsPage.showOverlay('passwordsRemoveAllOverlay');
+ };
+
showHidePassword.onclick = function(event) {
if(self.showingPassword) {
self.passwordLabel.textContent = "";
@@ -172,17 +296,6 @@ cr.define('options.passwordsExceptions', function() {
this.updateButtonSensitivity();
},
- /**
- * The content type for the exceptions area, such as 'passwords'
- * @type {string}
- */
- get contentType() {
- return this.getAttribute('contentType');
- },
- set contentType(type) {
- return this.getAttribute('contentType', type);
- },
-
displayReturnedPassword: function(password) {
this.passwordLabel.textContent = password;
},
@@ -191,9 +304,10 @@ cr.define('options.passwordsExceptions', function() {
* Update the button's states
*/
updateButtonSensitivity: function() {
- var selectionSize = autofillableLoginsList.selectedItems.length;
+ var selectionSize = this.passwordsList.selectedItems.length;
this.removeRow.disabled = selectionSize == 0;
this.showHidePassword.disabled = selectionSize == 0;
+ this.removeAll.disabled = this.passwordsList.length == 0;
},
/**
@@ -209,9 +323,72 @@ cr.define('options.passwordsExceptions', function() {
},
};
+ /**
+ * 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', cr.bind(this.handleOnSelectionChange_, 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) {
+ PasswordsExceptions.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,
+ PasswordExceptionsListItem: PasswordExceptionsListItem,
PasswordsList: PasswordsList,
- ListArea: ListArea
+ PasswordExceptionsList: PasswordExceptionsList,
+ PasswordsListArea: PasswordsListArea,
+ PasswordExceptionsListArea: PasswordExceptionsListArea
};
});

Powered by Google App Engine
This is Rietveld 408576698