Home | History | Annotate | Download | only in settings
      1 /*
      2  * Copyright 2014 The Chromium Authors. All rights reserved.
      3  * Use of this source code is governed by a BSD-style license that can be
      4  * found in the LICENSE file.
      5  */
      6 
      7 /**
      8  * @constructor
      9  * @extends {WebInspector.DialogDelegate}
     10  */
     11 WebInspector.FrameworkBlackboxDialog = function()
     12 {
     13     WebInspector.DialogDelegate.call(this);
     14 
     15     this.element = document.createElementWithClass("div", "blackbox-dialog dialog-contents");
     16 
     17     var header = this.element.createChild("div", "header");
     18     header.createChild("span").textContent = WebInspector.UIString("Framework blackbox patterns");
     19 
     20     var closeButton = header.createChild("div", "close-button-gray done-button");
     21     closeButton.addEventListener("click", this._onDoneClick.bind(this), false);
     22 
     23     var contents = this.element.createChild("div", "contents");
     24 
     25     var contentScriptsSection = contents.createChild("div", "blackbox-content-scripts");
     26     contentScriptsSection.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Blackbox content scripts"), WebInspector.settings.skipContentScripts, true));
     27 
     28     var blockHeader = contents.createChild("div", "columns-header");
     29     blockHeader.createChild("span").textContent = WebInspector.UIString("URI pattern");
     30     blockHeader.createChild("span").textContent = WebInspector.UIString("Behavior");
     31 
     32     var section = contents.createChild("div", "section");
     33     var container = section.createChild("div", "settings-list-container");
     34 
     35     this._blackboxLabel = WebInspector.UIString("Blackbox");
     36     this._disabledLabel = WebInspector.UIString("Disabled");
     37 
     38     var column1 = { id: "pattern", placeholder: "/framework\\.js$" };
     39     var column2 = { id: "value", options: [this._blackboxLabel, this._disabledLabel] };
     40 
     41     this._patternsList = new WebInspector.EditableSettingsList([column1, column2], this._patternValuesProvider.bind(this), this._patternValidate.bind(this), this._patternEdit.bind(this));
     42     this._patternsList.element.classList.add("blackbox-patterns-list");
     43     this._patternsList.addEventListener(WebInspector.SettingsList.Events.Removed, this._patternRemovedFromList.bind(this));
     44     container.appendChild(this._patternsList.element);
     45 
     46     /** @type {!StringMap.<string>} */
     47     this._entries = new StringMap();
     48     var patterns = WebInspector.settings.skipStackFramesPattern.getAsArray();
     49     for (var i = 0; i < patterns.length; ++i)
     50         this._addPattern(patterns[i].pattern, patterns[i].disabled);
     51 
     52     this.element.tabIndex = 0;
     53 }
     54 
     55 WebInspector.FrameworkBlackboxDialog.show = function(element)
     56 {
     57     WebInspector.Dialog.show(element, new WebInspector.FrameworkBlackboxDialog());
     58     var glassPane = document.getElementById("glass-pane");
     59     glassPane.classList.add("settings-glass-pane");
     60 }
     61 
     62 WebInspector.FrameworkBlackboxDialog.prototype = {
     63     /**
     64      * @param {!Element} element
     65      */
     66     show: function(element)
     67     {
     68         this._dialogElement = element;
     69         element.appendChild(this.element);
     70         element.classList.add("settings-dialog", "settings-tab");
     71     },
     72 
     73     _resize: function()
     74     {
     75         if (!this._dialogElement || !this._relativeToElement)
     76             return;
     77 
     78         const minWidth = 200;
     79         const minHeight = 150;
     80         var maxHeight = this._relativeToElement.offsetHeight - 10;
     81         maxHeight = Math.max(minHeight, maxHeight);
     82         var maxWidth = Math.min(540, this._relativeToElement.offsetWidth - 10);
     83         maxWidth = Math.max(minWidth, maxWidth);
     84         this._dialogElement.style.maxHeight = maxHeight + "px";
     85         this._dialogElement.style.width = maxWidth + "px";
     86 
     87         WebInspector.DialogDelegate.prototype.position(this._dialogElement, this._relativeToElement);
     88     },
     89 
     90     /**
     91      * @param {!Element} element
     92      * @param {!Element} relativeToElement
     93      */
     94     position: function(element, relativeToElement)
     95     {
     96         this._relativeToElement = relativeToElement;
     97         this._resize();
     98     },
     99 
    100     willHide: function(event)
    101     {
    102     },
    103 
    104     /**
    105      * @param {string} itemId
    106      * @param {string} columnId
    107      * @return {string}
    108      */
    109     _patternValuesProvider: function(itemId, columnId)
    110     {
    111         if (!itemId)
    112             return "";
    113         switch (columnId) {
    114         case "pattern":
    115             return itemId;
    116         case "value":
    117             return /** @type {string} */ (this._entries.get(itemId));
    118         default:
    119             console.assert("Should not be reached.");
    120         }
    121         return "";
    122     },
    123 
    124     /**
    125      * @param {?string} itemId
    126      * @param {!Object} data
    127      * @return {!Array.<string>}
    128      */
    129     _patternValidate: function(itemId, data)
    130     {
    131         var regex;
    132         var oldPattern = itemId;
    133         var newPattern = data["pattern"];
    134         try {
    135             if (newPattern && (oldPattern === newPattern || !this._entries.has(newPattern)))
    136                 regex = new RegExp(newPattern);
    137         } catch (e) {
    138         }
    139         return regex ? [] : ["pattern"];
    140     },
    141 
    142     /**
    143      * @param {?string} itemId
    144      * @param {!Object} data
    145      */
    146     _patternEdit: function(itemId, data)
    147     {
    148         var oldPattern = itemId;
    149         var newPattern = data["pattern"];
    150         if (!newPattern)
    151             return;
    152         var disabled = (data["value"] === this._disabledLabel);
    153 
    154         var patterns = WebInspector.settings.skipStackFramesPattern.getAsArray();
    155         for (var i = 0; i <= patterns.length; ++i) {
    156             if (i === patterns.length) {
    157                 patterns.push({ pattern: newPattern, disabled: disabled });
    158                 break;
    159             }
    160             if (patterns[i].pattern === oldPattern) {
    161                 patterns[i] = { pattern: newPattern, disabled: disabled };
    162                 break;
    163             }
    164         }
    165         WebInspector.settings.skipStackFramesPattern.setAsArray(patterns);
    166 
    167         if (oldPattern && oldPattern === newPattern) {
    168             this._entries.set(newPattern, disabled ? this._disabledLabel : this._blackboxLabel)
    169             this._patternsList.itemForId(oldPattern).classList.toggle("disabled", disabled);
    170             this._patternsList.refreshItem(newPattern);
    171             return;
    172         }
    173 
    174         if (oldPattern) {
    175             this._patternsList.removeItem(oldPattern);
    176             this._entries.remove(oldPattern);
    177         }
    178         this._addPattern(newPattern, disabled);
    179     },
    180 
    181     /**
    182      * @param {!WebInspector.Event} event
    183      */
    184     _patternRemovedFromList: function(event)
    185     {
    186         var pattern = /** @type{?string} */ (event.data);
    187         if (!pattern)
    188             return;
    189         this._entries.remove(pattern);
    190 
    191         var patterns = WebInspector.settings.skipStackFramesPattern.getAsArray();
    192         for (var i = 0; i < patterns.length; ++i) {
    193             if (patterns[i].pattern === pattern) {
    194                 patterns.splice(i, 1);
    195                 break;
    196             }
    197         }
    198         WebInspector.settings.skipStackFramesPattern.setAsArray(patterns);
    199     },
    200 
    201     /**
    202      * @param {string} pattern
    203      * @param {boolean=} disabled
    204      */
    205     _addPattern: function(pattern, disabled)
    206     {
    207         if (!pattern || this._entries.has(pattern))
    208             return;
    209         this._entries.set(pattern, disabled ? this._disabledLabel : this._blackboxLabel);
    210         var listItem = this._patternsList.addItem(pattern, null);
    211         listItem.classList.toggle("disabled", disabled);
    212         this._resize();
    213     },
    214 
    215     focus: function()
    216     {
    217         WebInspector.setCurrentFocusElement(this.element);
    218     },
    219 
    220     _onDoneClick: function()
    221     {
    222         WebInspector.Dialog.hide();
    223     },
    224 
    225     onEnter: function(event)
    226     {
    227         var focusElement = WebInspector.currentFocusElement();
    228         var nodeName = focusElement && focusElement.nodeName.toLowerCase();
    229         if (nodeName === "input" || nodeName === "select") {
    230             this.focus();
    231             event.consume(true);
    232             return;
    233         }
    234     },
    235 
    236     __proto__: WebInspector.DialogDelegate.prototype
    237 }
    238