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