content_settings_exceptions_area.js revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cr.define('options.contentSettings', function() { 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** @const */ var ControlledSettingIndicator = 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options.ControlledSettingIndicator; 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** @const */ var InlineEditableItemList = options.InlineEditableItemList; 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** @const */ var InlineEditableItem = options.InlineEditableItem; 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** @const */ var ArrayDataModel = cr.ui.ArrayDataModel; 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates a new exceptions list item. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} contentType The type of the list. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} mode The browser mode, 'otr' or 'normal'. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {boolean} enableAskOption Whether to show an 'ask every time' 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * option in the select. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Object} exception A dictionary that contains the data of the 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * exception. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @constructor 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extends {options.InlineEditableItem} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function ExceptionsListItem(contentType, mode, enableAskOption, exception) { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var el = cr.doc.createElement('div'); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.mode = mode; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.contentType = contentType; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.enableAskOption = enableAskOption; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.dataItem = exception; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.__proto__ = ExceptionsListItem.prototype; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.decorate(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return el; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionsListItem.prototype = { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __proto__: InlineEditableItem.prototype, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called when an element is decorated as a list item. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decorate: function() { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InlineEditableItem.prototype.decorate.call(this); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.isPlaceholder = !this.pattern; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var patternCell = this.createEditableTextCell(this.pattern); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) patternCell.className = 'exception-pattern'; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) patternCell.classList.add('weakrtl'); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.contentElement.appendChild(patternCell); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this.pattern) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.patternLabel = patternCell.querySelector('.static-text'); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var input = patternCell.querySelector('input'); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(stuartmorgan): Create an createEditableSelectCell abstracting 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this code. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setting label for display mode. |pattern| will be null for the 'add new 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exception' row. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this.pattern) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var settingLabel = cr.doc.createElement('span'); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settingLabel.textContent = this.settingForDisplay(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settingLabel.className = 'exception-setting'; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settingLabel.setAttribute('displaymode', 'static'); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.contentElement.appendChild(settingLabel); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.settingLabel = settingLabel; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setting select element for edit mode. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var select = cr.doc.createElement('select'); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var optionAllow = cr.doc.createElement('option'); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optionAllow.textContent = loadTimeData.getString('allowException'); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optionAllow.value = 'allow'; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select.appendChild(optionAllow); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this.enableAskOption) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var optionAsk = cr.doc.createElement('option'); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optionAsk.textContent = loadTimeData.getString('askException'); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optionAsk.value = 'ask'; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select.appendChild(optionAsk); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this.contentType == 'cookies') { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var optionSession = cr.doc.createElement('option'); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optionSession.textContent = loadTimeData.getString('sessionException'); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optionSession.value = 'session'; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select.appendChild(optionSession); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this.contentType != 'fullscreen') { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var optionBlock = cr.doc.createElement('option'); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optionBlock.textContent = loadTimeData.getString('blockException'); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optionBlock.value = 'block'; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select.appendChild(optionBlock); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this.isEmbeddingRule()) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.patternLabel.classList.add('sublabel'); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.editable = false; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this.setting == 'default') { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Items that don't have their own settings (parents of 'embedded on' 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // items) aren't deletable. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.deletable = false; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.editable = false; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.contentElement.appendChild(select); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select.className = 'exception-setting'; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this.pattern) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select.setAttribute('displaymode', 'edit'); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to track whether the URL pattern in the input is valid. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This will be true if the browser process has informed us that the 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current text in the input is valid. Changing the text resets this to 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // false, and getting a response from the browser sets it back to true. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It starts off as false for empty string (new exceptions) or true for 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // already-existing exceptions (which we assume are valid). 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.inputValidityKnown = this.pattern; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This one tracks the actual validity of the pattern in the input. This 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // starts off as true so as not to annoy the user when he adds a new and 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // empty input. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.inputIsValid = true; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.input = input; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.select = select; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.updateEditables(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Editing notifications, geolocation and media-stream is disabled for 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // now. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this.contentType == 'notifications' || 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.contentType == 'location' || 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.contentType == 'media-stream') { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.editable = false; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the source of the content setting exception is not a user 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // preference, that source controls the exception and the user cannot edit 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or delete it. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var controlledBy = 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.dataItem.source && this.dataItem.source != 'preference' ? 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.dataItem.source : null; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (controlledBy) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.setAttribute('controlled-by', controlledBy); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.deletable = false; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.editable = false; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (controlledBy == 'policy' || controlledBy == 'extension') { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.querySelector('.row-delete-button').hidden = true; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var indicator = ControlledSettingIndicator(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indicator.setAttribute('content-exception', this.contentType); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a synthetic pref change event decorated as 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CoreOptionsHandler::CreateValueForPref() does. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var event = new cr.Event(this.contentType); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.value = { controlledBy: controlledBy }; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indicator.handlePrefChange(event); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.appendChild(indicator); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the exception comes from a hosted app, display the name and the 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // icon of the app. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (controlledBy == 'HostedApp') { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.title = 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadTimeData.getString('set_by') + ' ' + this.dataItem.appName; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var button = this.querySelector('.row-delete-button'); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the host app's favicon (16px, match bigger size). 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See c/b/ui/webui/extensions/extension_icon_source.h 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for a description of the chrome://extension-icon URL. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) button.style.backgroundImage = 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'url(\'chrome://extension-icon/' + this.dataItem.appId + '/16/1\')'; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var listItem = this; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle events on the editable nodes. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input.oninput = function(event) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listItem.inputValidityKnown = false; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome.send('checkExceptionPatternValidity', 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [listItem.contentType, listItem.mode, input.value]); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Listen for edit events. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.addEventListener('canceledit', this.onEditCancelled_); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.addEventListener('commitedit', this.onEditCommitted_); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isEmbeddingRule: function() { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this.dataItem.embeddingOrigin && 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.dataItem.embeddingOrigin !== this.dataItem.origin; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The pattern (e.g., a URL) for the exception. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type {string} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get pattern() { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!this.isEmbeddingRule()) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this.dataItem.origin; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return loadTimeData.getStringF('embeddedOnHost', 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.dataItem.embeddingOrigin); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this.dataItem.displayPattern; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set pattern(pattern) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!this.editable) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) console.error('Tried to change uneditable pattern'); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.dataItem.displayPattern = pattern; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The setting (allow/block) for the exception. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type {string} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get setting() { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this.dataItem.setting; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set setting(setting) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.dataItem.setting = setting; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Gets a human-readable setting string. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type {string} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settingForDisplay: function() { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var setting = this.setting; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (setting == 'allow') 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return loadTimeData.getString('allowException'); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (setting == 'block') 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return loadTimeData.getString('blockException'); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (setting == 'ask') 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return loadTimeData.getString('askException'); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (setting == 'session') 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return loadTimeData.getString('sessionException'); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (setting == 'default') 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ''; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) console.error('Unknown setting: [' + setting + ']'); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ''; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Update this list item to reflect whether the input is a valid pattern. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {boolean} valid Whether said pattern is valid in the context of a 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * content exception setting. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setPatternValid: function(valid) { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (valid || !this.input.value) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.input.setCustomValidity(''); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.input.setCustomValidity(' '); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.inputIsValid = valid; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.inputValidityKnown = true; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the <input> to its original contents. Used when the user quits 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * editing. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resetInput: function() { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.input.value = this.pattern; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy the data model values to the editable nodes. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) updateEditables: function() { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.resetInput(); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var settingOption = 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.select.querySelector('[value=\'' + this.setting + '\']'); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (settingOption) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settingOption.selected = true; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** @inheritDoc */ 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get currentInputIsValid() { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this.inputValidityKnown && this.inputIsValid; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** @inheritDoc */ 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get hasBeenEdited() { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var livePattern = this.input.value; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var liveSetting = this.select.value; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return livePattern != this.pattern || liveSetting != this.setting; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called when committing an edit. 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Event} e The end event. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onEditCommitted_: function(e) { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var newPattern = this.input.value; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var newSetting = this.select.value; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.finishEdit(newPattern, newSetting); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called when cancelling an edit; resets the control states. 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Event} e The cancel event. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onEditCancelled_: function() { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.updateEditables(); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.setPatternValid(true); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Editing is complete; update the model. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} newPattern The pattern that the user entered. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} newSetting The setting the user chose. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) finishEdit: function(newPattern, newSetting) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.patternLabel.textContent = newPattern; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.settingLabel.textContent = this.settingForDisplay(); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var oldPattern = this.pattern; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.pattern = newPattern; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.setting = newSetting; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(estade): this will need to be updated if geolocation/notifications 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // become editable. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (oldPattern != newPattern) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome.send('removeException', 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [this.contentType, this.mode, oldPattern]); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome.send('setException', 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [this.contentType, this.mode, newPattern, newSetting]); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates a new list item for the Add New Item row, which doesn't represent 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * an actual entry in the exceptions list but allows the user to add new 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * exceptions. 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} contentType The type of the list. 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} mode The browser mode, 'otr' or 'normal'. 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {boolean} enableAskOption Whether to show an 'ask every time' option 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the select. 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @constructor 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extends {cr.ui.ExceptionsListItem} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function ExceptionsAddRowListItem(contentType, mode, enableAskOption) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var el = cr.doc.createElement('div'); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.mode = mode; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.contentType = contentType; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.enableAskOption = enableAskOption; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.dataItem = []; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.__proto__ = ExceptionsAddRowListItem.prototype; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.decorate(); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return el; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionsAddRowListItem.prototype = { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __proto__: ExceptionsListItem.prototype, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decorate: function() { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionsListItem.prototype.decorate.call(this); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.input.placeholder = 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadTimeData.getString('addNewExceptionInstructions'); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do we always want a default of allow? 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.setting = 'allow'; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Clear the <input> and let the placeholder text show again. 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resetInput: function() { 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.input.value = ''; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** @inheritDoc */ 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get hasBeenEdited() { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this.input.value != ''; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Editing is complete; update the model. As long as the pattern isn't 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * empty, we'll just add it. 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} newPattern The pattern that the user entered. 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} newSetting The setting the user chose. 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) finishEdit: function(newPattern, newSetting) { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.resetInput(); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome.send('setException', 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [this.contentType, this.mode, newPattern, newSetting]); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates a new exceptions list. 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @constructor 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extends {cr.ui.List} 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var ExceptionsList = cr.ui.define('list'); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionsList.prototype = { 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __proto__: InlineEditableItemList.prototype, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called when an element is decorated as a list. 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decorate: function() { 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InlineEditableItemList.prototype.decorate.call(this); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.classList.add('settings-list'); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var parentNode = this.parentNode; parentNode; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parentNode = parentNode.parentNode) { 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parentNode.hasAttribute('contentType')) { 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.contentType = parentNode.getAttribute('contentType'); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.mode = this.getAttribute('mode'); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the exceptions in this list allow an 'Ask every time' option. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.enableAskOption = this.contentType == 'plugins' || 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.contentType == 'pepper-flash-cameramic'; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.autoExpands = true; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.reset(); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates an item to go in the list. 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Object} entry The element from the data model for this row. 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) createItem: function(entry) { 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new ExceptionsListItem(this.contentType, 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.mode, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.enableAskOption, 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var addRowItem = new ExceptionsAddRowListItem(this.contentType, 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.mode, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.enableAskOption); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addRowItem.deletable = false; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return addRowItem; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Sets the exceptions in the js model. 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Object} entries A list of dictionaries of values, each dictionary 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * represents an exception. 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setExceptions: function(entries) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var deleteCount = this.dataModel.length; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this.isEditable()) { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't want to remove the Add New Exception row. 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deleteCount = deleteCount - 1; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var args = [0, deleteCount]; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push.apply(args, entries); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.dataModel.splice.apply(this.dataModel, args); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The browser has finished checking a pattern for validity. Update the list 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * item to reflect this. 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} pattern The pattern. 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {bool} valid Whether said pattern is valid in the context of a 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * content exception setting. 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) patternValidityCheckComplete: function(pattern, valid) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var listItems = this.items; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = 0; i < listItems.length; i++) { 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var listItem = listItems[i]; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't do anything for messages for the item if it is not the intended 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // recipient, or if the response is stale (i.e. the input value has 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changed since we sent the request to analyze it). 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pattern == listItem.input.value) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listItem.setPatternValid(valid); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns whether the rows are editable in this list. 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isEditable: function() { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Exceptions of the following lists are not editable for now. 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !(this.contentType == 'notifications' || 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.contentType == 'location' || 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.contentType == 'fullscreen' || 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.contentType == 'media-stream'); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Removes all exceptions from the js model. 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reset: function() { 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this.isEditable()) { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The null creates the Add New Exception row. 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.dataModel = new ArrayDataModel([null]); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.dataModel = new ArrayDataModel([]); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** @inheritDoc */ 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deleteItemAtIndex: function(index) { 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var listItem = this.getListItemByIndex(index); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!listItem.deletable) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var dataItem = listItem.dataItem; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var args = [listItem.contentType]; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (listItem.contentType == 'notifications') 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push(dataItem.origin, dataItem.setting); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push(listItem.mode, dataItem.origin, dataItem.embeddingOrigin); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome.send('removeException', args); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var OptionsPage = options.OptionsPage; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Encapsulated handling of content settings list subpage. 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @constructor 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function ContentSettingsExceptionsArea() { 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OptionsPage.call(this, 'contentExceptions', 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadTimeData.getString('contentSettingsPageTabTitle'), 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'content-settings-exceptions-area'); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cr.addSingletonGetter(ContentSettingsExceptionsArea); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsExceptionsArea.prototype = { 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __proto__: OptionsPage.prototype, 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initializePage: function() { 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OptionsPage.prototype.initializePage.call(this); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var exceptionsLists = this.pageDiv.querySelectorAll('list'); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = 0; i < exceptionsLists.length; i++) { 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options.contentSettings.ExceptionsList.decorate(exceptionsLists[i]); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsExceptionsArea.hideOTRLists(false); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the user types in the URL without a hash, show just cookies. 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.showList('cookies'); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $('content-settings-exceptions-overlay-confirm').onclick = 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OptionsPage.closeOverlay.bind(OptionsPage); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Shows one list and hides all others. 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type The content type. 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) showList: function(type) { 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var header = this.pageDiv.querySelector('h1'); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header.textContent = loadTimeData.getString(type + '_header'); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var divs = this.pageDiv.querySelectorAll('div[contentType]'); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = 0; i < divs.length; i++) { 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (divs[i].getAttribute('contentType') == type) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) divs[i].hidden = false; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) divs[i].hidden = true; 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called after the page has been shown. Show the content type for the 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * location's hash. 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) didShowPage: function() { 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var hash = location.hash; 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hash) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.showList(hash.slice(1)); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called when the last incognito window is closed. 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsExceptionsArea.OTRProfileDestroyed = function() { 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.hideOTRLists(true); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Hides the incognito exceptions lists and optionally clears them as well. 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {boolean} clear Whether to clear the lists. 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsExceptionsArea.hideOTRLists = function(clear) { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var otrLists = document.querySelectorAll('list[mode=otr]'); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = 0; i < otrLists.length; i++) { 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) otrLists[i].parentNode.hidden = true; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (clear) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) otrLists[i].reset(); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return { 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionsListItem: ExceptionsListItem, 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionsAddRowListItem: ExceptionsAddRowListItem, 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExceptionsList: ExceptionsList, 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsExceptionsArea: ContentSettingsExceptionsArea, 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}); 636