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

Side by Side Diff: chrome/browser/resources/options2/content_settings_exceptions_area.js

Issue 10537099: add "always allow" option to the mediastream infobar and allow user to allow/not allow acces to devi (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Check the exceptions before the default setting, sites in the exceptions list can access the device… Created 8 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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.contentSettings', function() { 5 cr.define('options.contentSettings', function() {
6 /** @const */ var InlineEditableItemList = options.InlineEditableItemList; 6 /** @const */ var InlineEditableItemList = options.InlineEditableItemList;
7 /** @const */ var InlineEditableItem = options.InlineEditableItem; 7 /** @const */ var InlineEditableItem = options.InlineEditableItem;
8 /** @const */ var ArrayDataModel = cr.ui.ArrayDataModel; 8 /** @const */ var ArrayDataModel = cr.ui.ArrayDataModel;
9 9
10 /** 10 /**
11 * Creates a new exceptions list item. 11 * Creates a new exceptions list item.
12 *
12 * @param {string} contentType The type of the list. 13 * @param {string} contentType The type of the list.
13 * @param {string} mode The browser mode, 'otr' or 'normal'. 14 * @param {string} mode The browser mode, 'otr' or 'normal'.
14 * @param {boolean} enableAskOption Whether to show an 'ask every time' 15 * @param {boolean} enableAskOption Whether to show an 'ask every time' option
15 * option in the select. 16 * in the select.
Evan Stade 2012/06/18 19:12:58 I believe the indentation was correct before.
no longer working on chromium 2012/06/19 12:23:17 Sorry, mistake made by eclipse, correct now.
16 * @param {Object} exception A dictionary that contains the data of the 17 * @param {Object} exception A dictionary that contains the data of the
17 * exception. 18 * exception.
18 * @constructor 19 * @constructor
19 * @extends {options.InlineEditableItem} 20 * @extends {options.InlineEditableItem}
20 */ 21 */
21 function ExceptionsListItem(contentType, mode, enableAskOption, exception) { 22 function ExceptionsListItem(contentType, mode, enableAskOption, exception) {
22 var el = cr.doc.createElement('div'); 23 var el = cr.doc.createElement('div');
23 el.mode = mode; 24 el.mode = mode;
24 el.contentType = contentType; 25 el.contentType = contentType;
25 el.enableAskOption = enableAskOption; 26 el.enableAskOption = enableAskOption;
26 el.dataItem = exception; 27 el.dataItem = exception;
27 el.__proto__ = ExceptionsListItem.prototype; 28 el.__proto__ = ExceptionsListItem.prototype;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 // This one tracks the actual validity of the pattern in the input. This 105 // This one tracks the actual validity of the pattern in the input. This
105 // starts off as true so as not to annoy the user when he adds a new and 106 // starts off as true so as not to annoy the user when he adds a new and
106 // empty input. 107 // empty input.
107 this.inputIsValid = true; 108 this.inputIsValid = true;
108 109
109 this.input = input; 110 this.input = input;
110 this.select = select; 111 this.select = select;
111 112
112 this.updateEditables(); 113 this.updateEditables();
113 114
114 // Editing notifications and geolocation is disabled for now. 115 // Editing notifications, geolocation and media-stream is disabled for
116 // now.
115 if (this.contentType == 'notifications' || 117 if (this.contentType == 'notifications' ||
116 this.contentType == 'location') { 118 this.contentType == 'location' ||
119 this.contentType == 'media-stream') {
117 this.editable = false; 120 this.editable = false;
118 } 121 }
119 122
120 // If the source of the content setting exception is not the user 123 // If the source of the content setting exception is not the user
121 // preference, then the content settings exception is managed and the user 124 // preference, then the content settings exception is managed and the user
122 // can't edit it. 125 // can't edit it.
123 if (this.dataItem.source && 126 if (this.dataItem.source &&
124 this.dataItem.source != 'preference') { 127 this.dataItem.source != 'preference') {
125 this.setAttribute('managedby', this.dataItem.source); 128 this.setAttribute('managedby', this.dataItem.source);
126 this.deletable = false; 129 this.deletable = false;
(...skipping 21 matching lines...) Expand all
148 [listItem.contentType, listItem.mode, input.value]); 151 [listItem.contentType, listItem.mode, input.value]);
149 }; 152 };
150 153
151 // Listen for edit events. 154 // Listen for edit events.
152 this.addEventListener('canceledit', this.onEditCancelled_); 155 this.addEventListener('canceledit', this.onEditCancelled_);
153 this.addEventListener('commitedit', this.onEditCommitted_); 156 this.addEventListener('commitedit', this.onEditCommitted_);
154 }, 157 },
155 158
156 /** 159 /**
157 * The pattern (e.g., a URL) for the exception. 160 * The pattern (e.g., a URL) for the exception.
161 *
158 * @type {string} 162 * @type {string}
159 */ 163 */
160 get pattern() { 164 get pattern() {
161 return this.dataItem['displayPattern']; 165 return this.dataItem['displayPattern'];
162 }, 166 },
163 set pattern(pattern) { 167 set pattern(pattern) {
164 this.dataItem['displayPattern'] = pattern; 168 this.dataItem['displayPattern'] = pattern;
165 }, 169 },
166 170
167 /** 171 /**
168 * The setting (allow/block) for the exception. 172 * The setting (allow/block) for the exception.
173 *
169 * @type {string} 174 * @type {string}
170 */ 175 */
171 get setting() { 176 get setting() {
172 return this.dataItem['setting']; 177 return this.dataItem['setting'];
173 }, 178 },
174 set setting(setting) { 179 set setting(setting) {
175 this.dataItem['setting'] = setting; 180 this.dataItem['setting'] = setting;
176 }, 181 },
177 182
178 /** 183 /**
179 * Gets a human-readable setting string. 184 * Gets a human-readable setting string.
185 *
180 * @type {string} 186 * @type {string}
181 */ 187 */
182 settingForDisplay: function() { 188 settingForDisplay: function() {
183 var setting = this.setting; 189 var setting = this.setting;
184 if (setting == 'allow') 190 if (setting == 'allow')
185 return loadTimeData.getString('allowException'); 191 return loadTimeData.getString('allowException');
186 else if (setting == 'block') 192 else if (setting == 'block')
187 return loadTimeData.getString('blockException'); 193 return loadTimeData.getString('blockException');
188 else if (setting == 'ask') 194 else if (setting == 'ask')
189 return loadTimeData.getString('askException'); 195 return loadTimeData.getString('askException');
190 else if (setting == 'session') 196 else if (setting == 'session')
191 return loadTimeData.getString('sessionException'); 197 return loadTimeData.getString('sessionException');
192 }, 198 },
193 199
194 /** 200 /**
195 * Update this list item to reflect whether the input is a valid pattern. 201 * Update this list item to reflect whether the input is a valid pattern.
196 * @param {boolean} valid Whether said pattern is valid in the context of 202 *
197 * a content exception setting. 203 * @param {boolean} valid Whether said pattern is valid in the context of a
204 * content exception setting.
198 */ 205 */
199 setPatternValid: function(valid) { 206 setPatternValid: function(valid) {
200 if (valid || !this.input.value) 207 if (valid || !this.input.value)
201 this.input.setCustomValidity(''); 208 this.input.setCustomValidity('');
202 else 209 else
203 this.input.setCustomValidity(' '); 210 this.input.setCustomValidity(' ');
204 this.inputIsValid = valid; 211 this.inputIsValid = valid;
205 this.inputValidityKnown = true; 212 this.inputValidityKnown = true;
206 }, 213 },
207 214
(...skipping 24 matching lines...) Expand all
232 239
233 /** @inheritDoc */ 240 /** @inheritDoc */
234 get hasBeenEdited() { 241 get hasBeenEdited() {
235 var livePattern = this.input.value; 242 var livePattern = this.input.value;
236 var liveSetting = this.select.value; 243 var liveSetting = this.select.value;
237 return livePattern != this.pattern || liveSetting != this.setting; 244 return livePattern != this.pattern || liveSetting != this.setting;
238 }, 245 },
239 246
240 /** 247 /**
241 * Called when committing an edit. 248 * Called when committing an edit.
249 *
242 * @param {Event} e The end event. 250 * @param {Event} e The end event.
243 * @private 251 * @private
244 */ 252 */
245 onEditCommitted_: function(e) { 253 onEditCommitted_: function(e) {
246 var newPattern = this.input.value; 254 var newPattern = this.input.value;
247 var newSetting = this.select.value; 255 var newSetting = this.select.value;
248 256
249 this.finishEdit(newPattern, newSetting); 257 this.finishEdit(newPattern, newSetting);
250 }, 258 },
251 259
252 /** 260 /**
253 * Called when cancelling an edit; resets the control states. 261 * Called when cancelling an edit; resets the control states.
262 *
254 * @param {Event} e The cancel event. 263 * @param {Event} e The cancel event.
255 * @private 264 * @private
256 */ 265 */
257 onEditCancelled_: function() { 266 onEditCancelled_: function() {
258 this.updateEditables(); 267 this.updateEditables();
259 this.setPatternValid(true); 268 this.setPatternValid(true);
260 }, 269 },
261 270
262 /** 271 /**
263 * Editing is complete; update the model. 272 * Editing is complete; update the model.
273 *
264 * @param {string} newPattern The pattern that the user entered. 274 * @param {string} newPattern The pattern that the user entered.
265 * @param {string} newSetting The setting the user chose. 275 * @param {string} newSetting The setting the user chose.
266 */ 276 */
267 finishEdit: function(newPattern, newSetting) { 277 finishEdit: function(newPattern, newSetting) {
268 this.patternLabel.textContent = newPattern; 278 this.patternLabel.textContent = newPattern;
269 this.settingLabel.textContent = this.settingForDisplay(); 279 this.settingLabel.textContent = this.settingForDisplay();
270 var oldPattern = this.pattern; 280 var oldPattern = this.pattern;
271 this.pattern = newPattern; 281 this.pattern = newPattern;
272 this.setting = newSetting; 282 this.setting = newSetting;
273 283
274 // TODO(estade): this will need to be updated if geolocation/notifications 284 // TODO(estade): this will need to be updated if geolocation/notifications
275 // become editable. 285 // become editable.
276 if (oldPattern != newPattern) { 286 if (oldPattern != newPattern) {
277 chrome.send('removeException', 287 chrome.send('removeException',
278 [this.contentType, this.mode, oldPattern]); 288 [this.contentType, this.mode, oldPattern]);
279 } 289 }
280 290
281 chrome.send('setException', 291 chrome.send('setException',
282 [this.contentType, this.mode, newPattern, newSetting]); 292 [this.contentType, this.mode, newPattern, newSetting]);
283 } 293 }
284 }; 294 };
285 295
286 /** 296 /**
287 * Creates a new list item for the Add New Item row, which doesn't represent 297 * Creates a new list item for the Add New Item row, which doesn't represent
288 * an actual entry in the exceptions list but allows the user to add new 298 * an actual entry in the exceptions list but allows the user to add new
289 * exceptions. 299 * exceptions.
300 *
290 * @param {string} contentType The type of the list. 301 * @param {string} contentType The type of the list.
291 * @param {string} mode The browser mode, 'otr' or 'normal'. 302 * @param {string} mode The browser mode, 'otr' or 'normal'.
292 * @param {boolean} enableAskOption Whether to show an 'ask every time' 303 * @param {boolean} enableAskOption Whether to show an 'ask every time' option
293 * option in the select. 304 * in the select.
294 * @constructor 305 * @constructor
295 * @extends {cr.ui.ExceptionsListItem} 306 * @extends {cr.ui.ExceptionsListItem}
296 */ 307 */
297 function ExceptionsAddRowListItem(contentType, mode, enableAskOption) { 308 function ExceptionsAddRowListItem(contentType, mode, enableAskOption) {
298 var el = cr.doc.createElement('div'); 309 var el = cr.doc.createElement('div');
299 el.mode = mode; 310 el.mode = mode;
300 el.contentType = contentType; 311 el.contentType = contentType;
301 el.enableAskOption = enableAskOption; 312 el.enableAskOption = enableAskOption;
302 el.dataItem = []; 313 el.dataItem = [];
303 el.__proto__ = ExceptionsAddRowListItem.prototype; 314 el.__proto__ = ExceptionsAddRowListItem.prototype;
(...skipping 23 matching lines...) Expand all
327 }, 338 },
328 339
329 /** @inheritDoc */ 340 /** @inheritDoc */
330 get hasBeenEdited() { 341 get hasBeenEdited() {
331 return this.input.value != ''; 342 return this.input.value != '';
332 }, 343 },
333 344
334 /** 345 /**
335 * Editing is complete; update the model. As long as the pattern isn't 346 * Editing is complete; update the model. As long as the pattern isn't
336 * empty, we'll just add it. 347 * empty, we'll just add it.
348 *
337 * @param {string} newPattern The pattern that the user entered. 349 * @param {string} newPattern The pattern that the user entered.
338 * @param {string} newSetting The setting the user chose. 350 * @param {string} newSetting The setting the user chose.
339 */ 351 */
340 finishEdit: function(newPattern, newSetting) { 352 finishEdit: function(newPattern, newSetting) {
341 this.resetInput(); 353 this.resetInput();
342 chrome.send('setException', 354 chrome.send('setException',
343 [this.contentType, this.mode, newPattern, newSetting]); 355 [this.contentType, this.mode, newPattern, newSetting]);
344 }, 356 },
345 }; 357 };
346 358
347 /** 359 /**
348 * Creates a new exceptions list. 360 * Creates a new exceptions list.
361 *
349 * @constructor 362 * @constructor
350 * @extends {cr.ui.List} 363 * @extends {cr.ui.List}
351 */ 364 */
352 var ExceptionsList = cr.ui.define('list'); 365 var ExceptionsList = cr.ui.define('list');
353 366
354 ExceptionsList.prototype = { 367 ExceptionsList.prototype = {
355 __proto__: InlineEditableItemList.prototype, 368 __proto__: InlineEditableItemList.prototype,
356 369
357 /** 370 /**
358 * Called when an element is decorated as a list. 371 * Called when an element is decorated as a list.
(...skipping 18 matching lines...) Expand all
377 // Whether the exceptions in this list allow an 'Ask every time' option. 390 // Whether the exceptions in this list allow an 'Ask every time' option.
378 this.enableAskOption = this.contentType == 'plugins' || 391 this.enableAskOption = this.contentType == 'plugins' ||
379 this.contentType == 'pepper-flash-cameramic'; 392 this.contentType == 'pepper-flash-cameramic';
380 393
381 this.autoExpands = true; 394 this.autoExpands = true;
382 this.reset(); 395 this.reset();
383 }, 396 },
384 397
385 /** 398 /**
386 * Creates an item to go in the list. 399 * Creates an item to go in the list.
400 *
387 * @param {Object} entry The element from the data model for this row. 401 * @param {Object} entry The element from the data model for this row.
388 */ 402 */
389 createItem: function(entry) { 403 createItem: function(entry) {
390 if (entry) { 404 if (entry) {
391 return new ExceptionsListItem(this.contentType, 405 return new ExceptionsListItem(this.contentType,
392 this.mode, 406 this.mode,
393 this.enableAskOption, 407 this.enableAskOption,
394 entry); 408 entry);
395 } else { 409 } else {
396 var addRowItem = new ExceptionsAddRowListItem(this.contentType, 410 var addRowItem = new ExceptionsAddRowListItem(this.contentType,
397 this.mode, 411 this.mode,
398 this.enableAskOption); 412 this.enableAskOption);
399 addRowItem.deletable = false; 413 addRowItem.deletable = false;
400 return addRowItem; 414 return addRowItem;
401 } 415 }
402 }, 416 },
403 417
404 /** 418 /**
405 * Sets the exceptions in the js model. 419 * Sets the exceptions in the js model.
420 *
406 * @param {Object} entries A list of dictionaries of values, each dictionary 421 * @param {Object} entries A list of dictionaries of values, each dictionary
407 * represents an exception. 422 * represents an exception.
408 */ 423 */
409 setExceptions: function(entries) { 424 setExceptions: function(entries) {
410 var deleteCount = this.dataModel.length; 425 var deleteCount = this.dataModel.length;
411 426
412 if (this.isEditable()) { 427 if (this.isEditable()) {
413 // We don't want to remove the Add New Exception row. 428 // We don't want to remove the Add New Exception row.
414 deleteCount = deleteCount - 1; 429 deleteCount = deleteCount - 1;
415 } 430 }
416 431
417 var args = [0, deleteCount]; 432 var args = [0, deleteCount];
418 args.push.apply(args, entries); 433 args.push.apply(args, entries);
419 this.dataModel.splice.apply(this.dataModel, args); 434 this.dataModel.splice.apply(this.dataModel, args);
420 }, 435 },
421 436
422 /** 437 /**
423 * The browser has finished checking a pattern for validity. Update the 438 * The browser has finished checking a pattern for validity. Update the list
424 * list item to reflect this. 439 * item to reflect this.
440 *
425 * @param {string} pattern The pattern. 441 * @param {string} pattern The pattern.
426 * @param {bool} valid Whether said pattern is valid in the context of 442 * @param {bool} valid Whether said pattern is valid in the context of a
427 * a content exception setting. 443 * content exception setting.
428 */ 444 */
429 patternValidityCheckComplete: function(pattern, valid) { 445 patternValidityCheckComplete: function(pattern, valid) {
430 var listItems = this.items; 446 var listItems = this.items;
431 for (var i = 0; i < listItems.length; i++) { 447 for (var i = 0; i < listItems.length; i++) {
432 var listItem = listItems[i]; 448 var listItem = listItems[i];
433 // Don't do anything for messages for the item if it is not the intended 449 // Don't do anything for messages for the item if it is not the intended
434 // recipient, or if the response is stale (i.e. the input value has 450 // recipient, or if the response is stale (i.e. the input value has
435 // changed since we sent the request to analyze it). 451 // changed since we sent the request to analyze it).
436 if (pattern == listItem.input.value) 452 if (pattern == listItem.input.value)
437 listItem.setPatternValid(valid); 453 listItem.setPatternValid(valid);
438 } 454 }
439 }, 455 },
440 456
441 /** 457 /**
442 * Returns whether the rows are editable in this list. 458 * Returns whether the rows are editable in this list.
443 */ 459 */
444 isEditable: function() { 460 isEditable: function() {
445 // Editing notifications and geolocation is disabled for now. 461 // Exceptions of the following lists are not editable for now.
446 return !(this.contentType == 'notifications' || 462 return !(this.contentType == 'notifications' ||
447 this.contentType == 'location' || 463 this.contentType == 'location' ||
448 this.contentType == 'fullscreen'); 464 this.contentType == 'fullscreen' ||
465 this.contentType == 'media-stream');
449 }, 466 },
450 467
451 /** 468 /**
452 * Removes all exceptions from the js model. 469 * Removes all exceptions from the js model.
453 */ 470 */
454 reset: function() { 471 reset: function() {
455 if (this.isEditable()) { 472 if (this.isEditable()) {
456 // The null creates the Add New Exception row. 473 // The null creates the Add New Exception row.
457 this.dataModel = new ArrayDataModel([null]); 474 this.dataModel = new ArrayDataModel([null]);
458 } else { 475 } else {
(...skipping 17 matching lines...) Expand all
476 args.push(listItem.mode, listItem.pattern); 493 args.push(listItem.mode, listItem.pattern);
477 494
478 chrome.send('removeException', args); 495 chrome.send('removeException', args);
479 }, 496 },
480 }; 497 };
481 498
482 var OptionsPage = options.OptionsPage; 499 var OptionsPage = options.OptionsPage;
483 500
484 /** 501 /**
485 * Encapsulated handling of content settings list subpage. 502 * Encapsulated handling of content settings list subpage.
503 *
486 * @constructor 504 * @constructor
487 */ 505 */
488 function ContentSettingsExceptionsArea() { 506 function ContentSettingsExceptionsArea() {
489 OptionsPage.call(this, 'contentExceptions', 507 OptionsPage.call(this, 'contentExceptions',
490 loadTimeData.getString('contentSettingsPageTabTitle'), 508 loadTimeData.getString('contentSettingsPageTabTitle'),
491 'content-settings-exceptions-area'); 509 'content-settings-exceptions-area');
492 } 510 }
493 511
494 cr.addSingletonGetter(ContentSettingsExceptionsArea); 512 cr.addSingletonGetter(ContentSettingsExceptionsArea);
495 513
(...skipping 12 matching lines...) Expand all
508 526
509 // If the user types in the URL without a hash, show just cookies. 527 // If the user types in the URL without a hash, show just cookies.
510 this.showList('cookies'); 528 this.showList('cookies');
511 529
512 $('content-settings-exceptions-overlay-confirm').onclick = 530 $('content-settings-exceptions-overlay-confirm').onclick =
513 OptionsPage.closeOverlay.bind(OptionsPage); 531 OptionsPage.closeOverlay.bind(OptionsPage);
514 }, 532 },
515 533
516 /** 534 /**
517 * Shows one list and hides all others. 535 * Shows one list and hides all others.
536 *
518 * @param {string} type The content type. 537 * @param {string} type The content type.
519 */ 538 */
520 showList: function(type) { 539 showList: function(type) {
521 var header = this.pageDiv.querySelector('h1'); 540 var header = this.pageDiv.querySelector('h1');
522 header.textContent = loadTimeData.getString(type + '_header'); 541 header.textContent = loadTimeData.getString(type + '_header');
523 542
524 var divs = this.pageDiv.querySelectorAll('div[contentType]'); 543 var divs = this.pageDiv.querySelectorAll('div[contentType]');
525 for (var i = 0; i < divs.length; i++) { 544 for (var i = 0; i < divs.length; i++) {
526 if (divs[i].getAttribute('contentType') == type) 545 if (divs[i].getAttribute('contentType') == type)
527 divs[i].hidden = false; 546 divs[i].hidden = false;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 } 579 }
561 }; 580 };
562 581
563 return { 582 return {
564 ExceptionsListItem: ExceptionsListItem, 583 ExceptionsListItem: ExceptionsListItem,
565 ExceptionsAddRowListItem: ExceptionsAddRowListItem, 584 ExceptionsAddRowListItem: ExceptionsAddRowListItem,
566 ExceptionsList: ExceptionsList, 585 ExceptionsList: ExceptionsList,
567 ContentSettingsExceptionsArea: ContentSettingsExceptionsArea, 586 ContentSettingsExceptionsArea: ContentSettingsExceptionsArea,
568 }; 587 };
569 }); 588 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698