OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 cr.define('options', function() { | 5 cr.define('options', function() { |
6 /** @const */ var Page = cr.ui.pageManager.Page; | 6 /** @const */ var Page = cr.ui.pageManager.Page; |
7 /** @const */ var PageManager = cr.ui.pageManager.PageManager; | 7 /** @const */ var PageManager = cr.ui.pageManager.PageManager; |
8 /** @const */ var ArrayDataModel = cr.ui.ArrayDataModel; | 8 /** @const */ var ArrayDataModel = cr.ui.ArrayDataModel; |
9 | 9 |
10 ///////////////////////////////////////////////////////////////////////////// | 10 ///////////////////////////////////////////////////////////////////////////// |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 */ | 48 */ |
49 queryDelayTimerId_: 0, | 49 queryDelayTimerId_: 0, |
50 | 50 |
51 /** | 51 /** |
52 * The most recent search query, or null if the query is empty. | 52 * The most recent search query, or null if the query is empty. |
53 * @type {?string} | 53 * @type {?string} |
54 * @private | 54 * @private |
55 */ | 55 */ |
56 lastQuery_: null, | 56 lastQuery_: null, |
57 | 57 |
| 58 /** |
| 59 * Whether a search query filter is applied to the current data model. |
| 60 * @type {boolean} |
| 61 * @private |
| 62 */ |
| 63 filterIsActive_: false, |
| 64 |
58 /** @override */ | 65 /** @override */ |
59 initializePage: function() { | 66 initializePage: function() { |
60 Page.prototype.initializePage.call(this); | 67 Page.prototype.initializePage.call(this); |
61 | 68 |
62 $('password-manager-confirm').onclick = function() { | 69 $('password-manager-confirm').onclick = function() { |
63 PageManager.closeOverlay(); | 70 PageManager.closeOverlay(); |
64 }; | 71 }; |
65 | 72 |
66 $('password-search-box').addEventListener('search', | 73 $('password-search-box').addEventListener('search', |
67 this.handleSearchQueryChange_.bind(this)); | 74 this.handleSearchQueryChange_.bind(this)); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 list.hidden = empty; | 158 list.hidden = empty; |
152 $(listPlaceHolderID).hidden = !empty; | 159 $(listPlaceHolderID).hidden = !empty; |
153 }, | 160 }, |
154 | 161 |
155 /** | 162 /** |
156 * Updates the data model for the saved passwords list with the values from | 163 * Updates the data model for the saved passwords list with the values from |
157 * |entries|. | 164 * |entries|. |
158 * @param {!Array} entries The list of saved password data. | 165 * @param {!Array} entries The list of saved password data. |
159 */ | 166 */ |
160 setSavedPasswordsList_: function(entries) { | 167 setSavedPasswordsList_: function(entries) { |
| 168 this.filterIsActive_ = !!this.lastQuery_; |
161 if (this.lastQuery_) { | 169 if (this.lastQuery_) { |
162 // Implement password searching here in javascript, rather than in C++. | 170 // Implement password searching here in javascript, rather than in C++. |
163 // The number of saved passwords shouldn't be too big for us to handle. | 171 // The number of saved passwords shouldn't be too big for us to handle. |
164 var query = this.lastQuery_; | 172 var query = this.lastQuery_; |
165 var filter = function(entry, index, list) { | 173 var filter = function(entry, index, list) { |
166 // Search both URL and username. | 174 // Search both URL and username. |
167 if (entry[0].toLowerCase().indexOf(query.toLowerCase()) >= 0 || | 175 if (entry[0].toLowerCase().indexOf(query.toLowerCase()) >= 0 || |
168 entry[1].toLowerCase().indexOf(query.toLowerCase()) >= 0) { | 176 entry[1].toLowerCase().indexOf(query.toLowerCase()) >= 0) { |
169 // Keep the original index so we can delete correctly. See also | 177 // Keep the original index so we can delete correctly. See also |
170 // deleteItemAtIndex() in password_manager_list.js that uses this. | 178 // deleteItemAtIndex() in password_manager_list.js that uses this. |
171 entry[3] = index; | 179 entry[3] = index; |
172 return true; | 180 return true; |
173 } | 181 } |
174 return false; | 182 return false; |
175 }; | 183 }; |
176 entries = entries.filter(filter); | 184 entries = entries.filter(filter); |
| 185 } else { |
| 186 // Adds the Add New Entry row. |
| 187 entries.push(null); |
177 } | 188 } |
178 this.savedPasswordsList_.dataModel = new ArrayDataModel(entries); | 189 this.savedPasswordsList_.dataModel = new ArrayDataModel(entries); |
179 this.updateListVisibility_(this.savedPasswordsList_); | 190 this.updateListVisibility_(this.savedPasswordsList_); |
180 }, | 191 }, |
181 | 192 |
182 /** | 193 /** |
183 * Updates the data model for the password exceptions list with the values | 194 * Updates the data model for the password exceptions list with the values |
184 * from |entries|. | 195 * from |entries|. |
185 * @param {!Array} entries The list of password exception data. | 196 * @param {!Array} entries The list of password exception data. |
186 */ | 197 */ |
187 setPasswordExceptionsList_: function(entries) { | 198 setPasswordExceptionsList_: function(entries) { |
188 this.passwordExceptionsList_.dataModel = new ArrayDataModel(entries); | 199 this.passwordExceptionsList_.dataModel = new ArrayDataModel(entries); |
189 this.updateListVisibility_(this.passwordExceptionsList_); | 200 this.updateListVisibility_(this.passwordExceptionsList_); |
190 }, | 201 }, |
191 | 202 |
192 /** | 203 /** |
193 * Reveals the password for a saved password entry. This is called by the | 204 * Reveals the password for a saved password entry. This is called by the |
194 * backend after it has authenticated the user. | 205 * backend after it has authenticated the user. |
195 * @param {number} index The original index of the entry in the model. | 206 * @param {number} index The original index of the entry in the model. |
196 * @param {string} password The saved password. | 207 * @param {string} password The saved password. |
197 */ | 208 */ |
198 showPassword_: function(index, password) { | 209 showPassword_: function(index, password) { |
199 var model = this.savedPasswordsList_.dataModel; | 210 var model = this.savedPasswordsList_.dataModel; |
200 if (this.lastQuery_) { | 211 if (this.filterIsActive_) { |
201 // When a filter is active, |index| does not represent the current | 212 // When a filter is active, |index| does not represent the current |
202 // index in the model, but each entry stores its original index, so | 213 // index in the model, but each entry stores its original index, so |
203 // we can find the item using a linear search. | 214 // we can find the item using a linear search. |
204 for (var i = 0; i < model.length; ++i) { | 215 for (var i = 0; i < model.length; ++i) { |
205 if (model.item(i)[3] == index) { | 216 if (model.item(i)[3] == index) { |
206 index = i; | 217 index = i; |
207 break; | 218 break; |
208 } | 219 } |
209 } | 220 } |
210 } | 221 } |
211 | 222 |
212 // Reveal the password in the UI. | 223 // Reveal the password in the UI. |
213 var item = this.savedPasswordsList_.getListItemByIndex(index); | 224 var item = this.savedPasswordsList_.getListItemByIndex(index); |
214 item.showPassword(password); | 225 item.showPassword(password); |
215 }, | 226 }, |
| 227 |
| 228 /** |
| 229 * Forwards the validity of the origin to the Add New Entry row. |
| 230 * @param {string} url The origin. |
| 231 * @param {boolean} valid The validity of the origin for adding. |
| 232 * @private |
| 233 */ |
| 234 originValidityCheckComplete_: function(url, valid) { |
| 235 // There is no Add New Entry row when a filter is active. |
| 236 if (this.filterIsActive_) |
| 237 return; |
| 238 // Since no filter is active, the Add New Entry row always exists and its |
| 239 // item is the last one. |
| 240 var model = this.savedPasswordsList_.dataModel; |
| 241 assert(model.length > 0); |
| 242 var addRowItem = this.savedPasswordsList_.getListItemByIndex( |
| 243 model.length - 1); |
| 244 addRowItem.originValidityCheckComplete(url, valid); |
| 245 }, |
216 }; | 246 }; |
217 | 247 |
218 /** | 248 /** |
| 249 * Requests the browser to check the validity of the origin being edited by |
| 250 * the user in the Add New Entry row. |
| 251 * @param {string} url The origin being edited. |
| 252 */ |
| 253 PasswordManager.checkOriginValidityForAdding = function(url) { |
| 254 chrome.send('checkOriginValidityForAdding', [url]); |
| 255 }; |
| 256 |
| 257 /** |
| 258 * Adds a new password entry. |
| 259 * @param {string} url The origin. |
| 260 * @param {string} username The username value. |
| 261 * @param {string} password The password value. |
| 262 */ |
| 263 PasswordManager.addPassword = function(url, username, password) { |
| 264 chrome.send('addPassword', [url, username, password]); |
| 265 }; |
| 266 |
| 267 /** |
| 268 * Updates the password value of an entry. |
| 269 * @param {number} rowIndex The row to update. |
| 270 * @param {string} newPassword The new password value. |
| 271 */ |
| 272 PasswordManager.updatePassword = function(rowIndex, newPassword) { |
| 273 chrome.send('updatePassword', [String(rowIndex), newPassword]); |
| 274 }; |
| 275 |
| 276 /** |
219 * Removes a saved password. | 277 * Removes a saved password. |
220 * @param {number} rowIndex indicating the row to remove. | 278 * @param {number} rowIndex indicating the row to remove. |
221 */ | 279 */ |
222 PasswordManager.removeSavedPassword = function(rowIndex) { | 280 PasswordManager.removeSavedPassword = function(rowIndex) { |
223 chrome.send('removeSavedPassword', [String(rowIndex)]); | 281 chrome.send('removeSavedPassword', [String(rowIndex)]); |
224 }; | 282 }; |
225 | 283 |
226 /** | 284 /** |
227 * Removes a password exception. | 285 * Removes a password exception. |
228 * @param {number} rowIndex indicating the row to remove. | 286 * @param {number} rowIndex indicating the row to remove. |
229 */ | 287 */ |
230 PasswordManager.removePasswordException = function(rowIndex) { | 288 PasswordManager.removePasswordException = function(rowIndex) { |
231 chrome.send('removePasswordException', [String(rowIndex)]); | 289 chrome.send('removePasswordException', [String(rowIndex)]); |
232 }; | 290 }; |
233 | 291 |
234 PasswordManager.requestShowPassword = function(index) { | 292 PasswordManager.requestShowPassword = function(index) { |
235 chrome.send('requestShowPassword', [index]); | 293 chrome.send('requestShowPassword', [index]); |
236 }; | 294 }; |
237 | 295 |
238 // Forward public APIs to private implementations on the singleton instance. | 296 // Forward public APIs to private implementations on the singleton instance. |
239 cr.makePublic(PasswordManager, [ | 297 cr.makePublic(PasswordManager, [ |
240 'setSavedPasswordsList', | 298 'setSavedPasswordsList', |
241 'setPasswordExceptionsList', | 299 'setPasswordExceptionsList', |
242 'showPassword' | 300 'showPassword', |
| 301 'originValidityCheckComplete' |
243 ]); | 302 ]); |
244 | 303 |
245 // Export | 304 // Export |
246 return { | 305 return { |
247 PasswordManager: PasswordManager | 306 PasswordManager: PasswordManager |
248 }; | 307 }; |
249 | 308 |
250 }); | 309 }); |
OLD | NEW |