Index: chrome/browser/resources/options2/password_manager_list.js |
diff --git a/chrome/browser/resources/options2/password_manager_list.js b/chrome/browser/resources/options2/password_manager_list.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c3b822a43f243df659a432f67d5f848fcf657007 |
--- /dev/null |
+++ b/chrome/browser/resources/options2/password_manager_list.js |
@@ -0,0 +1,283 @@ |
+// 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.passwordManager', function() { |
+ const ArrayDataModel = cr.ui.ArrayDataModel; |
+ const DeletableItemList = options.DeletableItemList; |
+ const DeletableItem = options.DeletableItem; |
+ const List = cr.ui.List; |
+ |
+ /** |
+ * Creates a new passwords list item. |
+ * @param {Array} entry An array of the form [url, username, password]. When |
+ * the list has been filtered, a fourth element [index] may be present. |
+ * @constructor |
+ * @extends {cr.ui.ListItem} |
+ */ |
+ function PasswordListItem(entry, showPasswords) { |
+ var el = cr.doc.createElement('div'); |
+ el.dataItem = entry; |
+ el.__proto__ = PasswordListItem.prototype; |
+ el.decorate(showPasswords); |
+ |
+ return el; |
+ } |
+ |
+ PasswordListItem.prototype = { |
+ __proto__: DeletableItem.prototype, |
+ |
+ /** @inheritDoc */ |
+ decorate: function(showPasswords) { |
+ DeletableItem.prototype.decorate.call(this); |
+ |
+ // The URL of the site. |
+ var urlLabel = this.ownerDocument.createElement('div'); |
+ urlLabel.classList.add('favicon-cell'); |
+ urlLabel.classList.add('weakrtl'); |
+ urlLabel.classList.add('url'); |
+ urlLabel.setAttribute('title', this.url); |
+ urlLabel.textContent = this.url; |
+ urlLabel.style.backgroundImage = url('chrome://favicon/' + this.url); |
+ this.contentElement.appendChild(urlLabel); |
+ |
+ // The stored username. |
+ var usernameLabel = this.ownerDocument.createElement('div'); |
+ usernameLabel.className = 'name'; |
+ usernameLabel.textContent = this.username; |
+ this.contentElement.appendChild(usernameLabel); |
+ |
+ // The stored password. |
+ var passwordInputDiv = this.ownerDocument.createElement('div'); |
+ passwordInputDiv.className = 'password'; |
+ |
+ // The password input field. |
+ var passwordInput = this.ownerDocument.createElement('input'); |
+ passwordInput.type = 'password'; |
+ passwordInput.className = 'inactive-password'; |
+ passwordInput.readOnly = true; |
+ passwordInput.value = showPasswords ? this.password : '********'; |
+ passwordInputDiv.appendChild(passwordInput); |
+ |
+ // The show/hide button. |
+ if (showPasswords) { |
+ var button = this.ownerDocument.createElement('button'); |
+ button.hidden = true; |
+ button.classList.add('password-button'); |
+ button.textContent = localStrings.getString('passwordShowButton'); |
+ button.addEventListener('click', this.onClick_, true); |
+ passwordInputDiv.appendChild(button); |
+ } |
+ |
+ this.contentElement.appendChild(passwordInputDiv); |
+ }, |
+ |
+ /** @inheritDoc */ |
+ selectionChanged: function() { |
+ var passwordInput = this.querySelector('input[type=password]'); |
+ var textInput = this.querySelector('input[type=text]'); |
+ var input = passwordInput || textInput; |
+ var button = input.nextSibling; |
+ // |button| doesn't exist when passwords can't be shown. |
+ if (!button) |
+ return; |
+ if (this.selected) { |
+ input.classList.remove('inactive-password'); |
+ button.hidden = false; |
+ } else { |
+ input.classList.add('inactive-password'); |
+ button.hidden = true; |
+ } |
+ }, |
+ |
+ /** |
+ * 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. |
+ var button = event.currentTarget; |
+ var passwordInput = button.previousSibling; |
+ if (passwordInput.type == 'password') { |
+ passwordInput.type = 'text'; |
+ button.textContent = localStrings.getString('passwordHideButton'); |
+ } else { |
+ passwordInput.type = 'password'; |
+ button.textContent = localStrings.getString('passwordShowButton'); |
+ } |
+ }, |
+ |
+ /** |
+ * Get and set the URL for the entry. |
+ * @type {string} |
+ */ |
+ get url() { |
+ return this.dataItem[0]; |
+ }, |
+ set url(url) { |
+ this.dataItem[0] = url; |
+ }, |
+ |
+ /** |
+ * Get and set the username for the entry. |
+ * @type {string} |
+ */ |
+ get username() { |
+ return this.dataItem[1]; |
+ }, |
+ 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; |
+ }, |
+ }; |
+ |
+ /** |
+ * Creates a new PasswordExceptions list item. |
+ * @param {Array} entry A pair of the form [url, username]. |
+ * @constructor |
+ * @extends {Deletable.ListItem} |
+ */ |
+ function PasswordExceptionsListItem(entry) { |
+ var el = cr.doc.createElement('div'); |
+ el.dataItem = entry; |
+ el.__proto__ = PasswordExceptionsListItem.prototype; |
+ el.decorate(); |
+ |
+ return el; |
+ } |
+ |
+ PasswordExceptionsListItem.prototype = { |
+ __proto__: DeletableItem.prototype, |
+ |
+ /** |
+ * Call when an element is decorated as a list item. |
+ */ |
+ decorate: function() { |
+ DeletableItem.prototype.decorate.call(this); |
+ |
+ // The URL of the site. |
+ var urlLabel = this.ownerDocument.createElement('div'); |
+ urlLabel.className = 'url'; |
+ urlLabel.classList.add('favicon-cell'); |
+ urlLabel.classList.add('weakrtl'); |
+ urlLabel.textContent = this.url; |
+ urlLabel.style.backgroundImage = url('chrome://favicon/' + this.url); |
+ this.contentElement.appendChild(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 |
+ * @extends {cr.ui.List} |
+ */ |
+ var PasswordsList = cr.ui.define('list'); |
+ |
+ PasswordsList.prototype = { |
+ __proto__: DeletableItemList.prototype, |
+ |
+ /** |
+ * Whether passwords can be revealed or not. |
+ * @type {boolean} |
+ * @private |
+ */ |
+ showPasswords_: true, |
+ |
+ /** @inheritDoc */ |
+ decorate: function() { |
+ DeletableItemList.prototype.decorate.call(this); |
+ Preferences.getInstance().addEventListener( |
+ "profile.password_manager_allow_show_passwords", |
+ this.onPreferenceChanged_.bind(this)); |
+ }, |
+ |
+ /** |
+ * Listener for changes on the preference. |
+ * @param {Event} event The preference update event. |
+ * @private |
+ */ |
+ onPreferenceChanged_: function(event) { |
+ this.showPasswords_ = event.value.value; |
+ this.redraw(); |
+ }, |
+ |
+ /** @inheritDoc */ |
+ createItem: function(entry) { |
+ return new PasswordListItem(entry, this.showPasswords_); |
+ }, |
+ |
+ /** @inheritDoc */ |
+ deleteItemAtIndex: function(index) { |
+ var item = this.dataModel.item(index); |
+ if (item && item.length > 3) { |
+ // The fourth element, if present, is the original index to delete. |
+ index = item[3]; |
+ } |
+ PasswordManager.removeSavedPassword(index); |
+ }, |
+ |
+ /** |
+ * The length of the list. |
+ */ |
+ get length() { |
+ return this.dataModel.length; |
+ }, |
+ }; |
+ |
+ /** |
+ * Create a new passwords list. |
+ * @constructor |
+ * @extends {cr.ui.List} |
+ */ |
+ var PasswordExceptionsList = cr.ui.define('list'); |
+ |
+ PasswordExceptionsList.prototype = { |
+ __proto__: DeletableItemList.prototype, |
+ |
+ /** @inheritDoc */ |
+ createItem: function(entry) { |
+ return new PasswordExceptionsListItem(entry); |
+ }, |
+ |
+ /** @inheritDoc */ |
+ deleteItemAtIndex: function(index) { |
+ PasswordManager.removePasswordException(index); |
+ }, |
+ |
+ /** |
+ * The length of the list. |
+ */ |
+ get length() { |
+ return this.dataModel.length; |
+ }, |
+ }; |
+ |
+ return { |
+ PasswordListItem: PasswordListItem, |
+ PasswordExceptionsListItem: PasswordExceptionsListItem, |
+ PasswordsList: PasswordsList, |
+ PasswordExceptionsList: PasswordExceptionsList, |
+ }; |
+}); |