blob: c7a581b38122ca1664f547b5f0bc5941d7288ed7 [file] [log] [blame]
/*
* Copyright 2014 The Chromium Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/**
* @constructor
* @extends {WebInspector.DialogDelegate}
*/
WebInspector.FrameworkBlackboxDialog = function()
{
WebInspector.DialogDelegate.call(this);
this.element.classList.add("blackbox-dialog", "dialog-contents");
var header = this.element.createChild("div", "header");
header.createChild("span").textContent = WebInspector.UIString("Framework blackbox patterns");
var closeButton = header.createChild("div", "done-button", "dt-close-button");
closeButton.gray = true;
closeButton.addEventListener("click", this._onDoneClick.bind(this), false);
var contents = this.element.createChild("div", "contents");
var contentScriptsSection = contents.createChild("div", "blackbox-content-scripts");
contentScriptsSection.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Blackbox content scripts"), WebInspector.moduleSetting("skipContentScripts"), true));
var blockHeader = contents.createChild("div", "columns-header");
blockHeader.createChild("span").textContent = WebInspector.UIString("URI pattern");
blockHeader.createChild("span").textContent = WebInspector.UIString("Behavior");
var section = contents.createChild("div", "section");
var container = section.createChild("div", "settings-list-container");
this._blackboxLabel = WebInspector.UIString("Blackbox");
this._disabledLabel = WebInspector.UIString("Disabled");
var column1 = { id: "pattern", placeholder: "/framework\\.js$" };
var column2 = { id: "value", options: [this._blackboxLabel, this._disabledLabel] };
this._patternsList = new WebInspector.EditableSettingsList([column1, column2], this._patternValuesProvider.bind(this), this._patternValidate.bind(this), this._patternEdit.bind(this));
this._patternsList.element.classList.add("blackbox-patterns-list");
this._patternsList.addEventListener(WebInspector.SettingsList.Events.Removed, this._patternRemovedFromList.bind(this));
container.appendChild(this._patternsList.element);
/** @type {!Map.<string, string>} */
this._entries = new Map();
var patterns = WebInspector.moduleSetting("skipStackFramesPattern").getAsArray();
for (var i = 0; i < patterns.length; ++i)
this._addPattern(patterns[i].pattern, patterns[i].disabled);
this.element.tabIndex = 0;
}
WebInspector.FrameworkBlackboxDialog.show = function()
{
var dialog = new WebInspector.FrameworkBlackboxDialog();
WebInspector.Dialog.show(dialog);
var glassPane = dialog.element.ownerDocument.getElementById("glass-pane");
glassPane.classList.add("settings-glass-pane");
}
WebInspector.FrameworkBlackboxDialog.prototype = {
/**
* @override
* @param {!Element} element
*/
show: function(element)
{
this._dialogElement = element;
element.appendChild(this.element);
element.classList.add("settings-dialog", "settings-tab");
},
_resize: function()
{
if (!this._dialogElement || !this._container)
return;
const minWidth = 200;
const minHeight = 150;
var maxHeight = this._container.offsetHeight - 10;
maxHeight = Math.max(minHeight, maxHeight);
var maxWidth = Math.min(540, this._container.offsetWidth - 10);
maxWidth = Math.max(minWidth, maxWidth);
this._dialogElement.style.maxHeight = maxHeight + "px";
this._dialogElement.style.width = maxWidth + "px";
WebInspector.DialogDelegate.prototype.position(this._dialogElement, this._container);
},
/**
* @override
* @param {!Element} element
* @param {!Element} container
*/
position: function(element, container)
{
this._container = container;
this._resize();
},
willHide: function(event)
{
},
/**
* @param {string} itemId
* @param {string} columnId
* @return {string}
*/
_patternValuesProvider: function(itemId, columnId)
{
if (!itemId)
return "";
switch (columnId) {
case "pattern":
return itemId;
case "value":
return /** @type {string} */ (this._entries.get(itemId));
default:
console.assert("Should not be reached.");
}
return "";
},
/**
* @param {?string} itemId
* @param {!Object} data
* @return {!Array.<string>}
*/
_patternValidate: function(itemId, data)
{
var regex;
var oldPattern = itemId;
var newPattern = data["pattern"];
try {
if (newPattern && (oldPattern === newPattern || !this._entries.has(newPattern)))
regex = new RegExp(newPattern);
} catch (e) {
}
return regex ? [] : ["pattern"];
},
/**
* @param {?string} itemId
* @param {!Object} data
*/
_patternEdit: function(itemId, data)
{
var oldPattern = itemId;
var newPattern = data["pattern"];
if (!newPattern)
return;
var disabled = (data["value"] === this._disabledLabel);
var patterns = WebInspector.moduleSetting("skipStackFramesPattern").getAsArray();
for (var i = 0; i <= patterns.length; ++i) {
if (i === patterns.length) {
patterns.push({ pattern: newPattern, disabled: disabled });
break;
}
if (patterns[i].pattern === oldPattern) {
patterns[i] = { pattern: newPattern, disabled: disabled };
break;
}
}
WebInspector.moduleSetting("skipStackFramesPattern").setAsArray(patterns);
if (oldPattern && oldPattern === newPattern) {
this._entries.set(newPattern, disabled ? this._disabledLabel : this._blackboxLabel);
this._patternsList.itemForId(oldPattern).classList.toggle("disabled", disabled);
this._patternsList.refreshItem(newPattern);
return;
}
if (oldPattern) {
this._patternsList.removeItem(oldPattern);
this._entries.remove(oldPattern);
}
this._addPattern(newPattern, disabled);
},
/**
* @param {!WebInspector.Event} event
*/
_patternRemovedFromList: function(event)
{
var pattern = /** @type{?string} */ (event.data);
if (!pattern)
return;
this._entries.remove(pattern);
var patterns = WebInspector.moduleSetting("skipStackFramesPattern").getAsArray();
for (var i = 0; i < patterns.length; ++i) {
if (patterns[i].pattern === pattern) {
patterns.splice(i, 1);
break;
}
}
WebInspector.moduleSetting("skipStackFramesPattern").setAsArray(patterns);
},
/**
* @param {string} pattern
* @param {boolean=} disabled
*/
_addPattern: function(pattern, disabled)
{
if (!pattern || this._entries.has(pattern))
return;
this._entries.set(pattern, disabled ? this._disabledLabel : this._blackboxLabel);
var listItem = this._patternsList.addItem(pattern, null);
listItem.classList.toggle("disabled", disabled);
this._resize();
},
focus: function()
{
WebInspector.setCurrentFocusElement(this.element);
},
_onDoneClick: function()
{
WebInspector.Dialog.hide();
},
onEnter: function(event)
{
var focusElement = WebInspector.currentFocusElement();
var nodeName = focusElement && focusElement.nodeName.toLowerCase();
if (nodeName === "input" || nodeName === "select") {
this.focus();
event.consume(true);
return;
}
},
__proto__: WebInspector.DialogDelegate.prototype
}