blob: 3f3f200a237a55d4b174fc34e7b3d64d2a3246af [file] [log] [blame]
Tim van der Lippe83f02be2020-01-23 11:11:401// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Tim van der Lippe1ebfc502020-01-15 13:45:094
Tim van der Lippe66684e92020-01-24 14:01:185import * as Common from '../common/common.js';
6import * as UI from '../ui/ui.js';
7
Blink Reformat4c46d092018-04-07 15:32:378/**
9 * @implements {UI.ListWidget.Delegate}
10 * @unrestricted
11 */
Tim van der Lippe66684e92020-01-24 14:01:1812export class FrameworkBlackboxSettingsTab extends UI.Widget.VBox {
Blink Reformat4c46d092018-04-07 15:32:3713 constructor() {
14 super(true);
15 this.registerRequiredCSS('settings/frameworkBlackboxSettingsTab.css');
16
Chandani Shrestha97a703ee2019-06-03 22:45:1117 const header = this.contentElement.createChild('div', 'header');
18 header.textContent = ls`Framework Blackboxing`;
19 UI.ARIAUtils.markAsHeading(header, 1);
Harley Li4ca27832019-05-23 23:14:5120 this.contentElement.createChild('div', 'intro').textContent =
21 ls`Debugger will skip through the scripts and will not stop on exceptions thrown by them.`;
22
23 const blackboxContentScripts = this.contentElement.createChild('div', 'blackbox-content-scripts');
24 blackboxContentScripts.appendChild(UI.SettingsUI.createSettingCheckbox(
Paul Lewis4b64b3f2020-01-23 11:41:2025 ls`Blackbox content scripts`, self.Common.settings.moduleSetting('skipContentScripts'), true));
Harley Li4ca27832019-05-23 23:14:5126 blackboxContentScripts.title = ls`Blackbox content scripts (extension scripts in the page)`;
Blink Reformat4c46d092018-04-07 15:32:3727
Tim van der Lippe66684e92020-01-24 14:01:1828 this._blackboxLabel = Common.UIString.UIString('Blackbox');
29 this._disabledLabel = Common.UIString.UIString('Disabled');
Blink Reformat4c46d092018-04-07 15:32:3730
Tim van der Lippe66684e92020-01-24 14:01:1831 this._list = new UI.ListWidget.ListWidget(this);
Blink Reformat4c46d092018-04-07 15:32:3732 this._list.element.classList.add('blackbox-list');
33 this._list.registerRequiredCSS('settings/frameworkBlackboxSettingsTab.css');
34
35 const placeholder = createElementWithClass('div', 'blackbox-list-empty');
Tim van der Lippe66684e92020-01-24 14:01:1836 placeholder.textContent = Common.UIString.UIString('No blackboxed patterns');
Blink Reformat4c46d092018-04-07 15:32:3737 this._list.setEmptyPlaceholder(placeholder);
38 this._list.show(this.contentElement);
Tim van der Lippe66684e92020-01-24 14:01:1839 const addPatternButton = UI.UIUtils.createTextButton(
40 Common.UIString.UIString('Add pattern...'), this._addButtonClicked.bind(this), 'add-button');
Blink Reformat4c46d092018-04-07 15:32:3741 this.contentElement.appendChild(addPatternButton);
42
Paul Lewis4b64b3f2020-01-23 11:41:2043 this._setting = self.Common.settings.moduleSetting('skipStackFramesPattern');
Blink Reformat4c46d092018-04-07 15:32:3744 this._setting.addChangeListener(this._settingUpdated, this);
45
46 this.setDefaultFocusedElement(addPatternButton);
Blink Reformat4c46d092018-04-07 15:32:3747 }
48
49 /**
50 * @override
51 */
52 wasShown() {
53 super.wasShown();
54 this._settingUpdated();
55 }
56
57 _settingUpdated() {
58 this._list.clear();
59 const patterns = this._setting.getAsArray();
Tim van der Lippe1d6e57a2019-09-30 11:55:3460 for (let i = 0; i < patterns.length; ++i) {
Blink Reformat4c46d092018-04-07 15:32:3761 this._list.appendItem(patterns[i], true);
Tim van der Lippe1d6e57a2019-09-30 11:55:3462 }
Blink Reformat4c46d092018-04-07 15:32:3763 }
64
65 _addButtonClicked() {
66 this._list.addNewItem(this._setting.getAsArray().length, {pattern: '', disabled: false});
67 }
68
69 /**
70 * @override
71 * @param {*} item
72 * @param {boolean} editable
73 * @return {!Element}
74 */
75 renderItem(item, editable) {
76 const element = createElementWithClass('div', 'blackbox-list-item');
77 const pattern = element.createChild('div', 'blackbox-pattern');
78 pattern.textContent = item.pattern;
Mandy Chen31930c42019-06-05 00:47:0879 pattern.title = ls`Blackbox scripts whose names match '${item.pattern}'`;
Blink Reformat4c46d092018-04-07 15:32:3780 element.createChild('div', 'blackbox-separator');
81 element.createChild('div', 'blackbox-behavior').textContent =
82 item.disabled ? this._disabledLabel : this._blackboxLabel;
Tim van der Lippe1d6e57a2019-09-30 11:55:3483 if (item.disabled) {
Blink Reformat4c46d092018-04-07 15:32:3784 element.classList.add('blackbox-disabled');
Tim van der Lippe1d6e57a2019-09-30 11:55:3485 }
Blink Reformat4c46d092018-04-07 15:32:3786 return element;
87 }
88
89 /**
90 * @override
91 * @param {*} item
92 * @param {number} index
93 */
94 removeItemRequested(item, index) {
95 const patterns = this._setting.getAsArray();
96 patterns.splice(index, 1);
97 this._setting.setAsArray(patterns);
98 }
99
100 /**
101 * @override
102 * @param {*} item
103 * @param {!UI.ListWidget.Editor} editor
104 * @param {boolean} isNew
105 */
106 commitEdit(item, editor, isNew) {
107 item.pattern = editor.control('pattern').value.trim();
108 item.disabled = editor.control('behavior').value === this._disabledLabel;
109
110 const list = this._setting.getAsArray();
Tim van der Lippe1d6e57a2019-09-30 11:55:34111 if (isNew) {
Blink Reformat4c46d092018-04-07 15:32:37112 list.push(item);
Tim van der Lippe1d6e57a2019-09-30 11:55:34113 }
Blink Reformat4c46d092018-04-07 15:32:37114 this._setting.setAsArray(list);
115 }
116
117 /**
118 * @override
119 * @param {*} item
120 * @return {!UI.ListWidget.Editor}
121 */
122 beginEdit(item) {
123 const editor = this._createEditor();
124 editor.control('pattern').value = item.pattern;
125 editor.control('behavior').value = item.disabled ? this._disabledLabel : this._blackboxLabel;
126 return editor;
127 }
128
129 /**
130 * @return {!UI.ListWidget.Editor}
131 */
132 _createEditor() {
Tim van der Lippe1d6e57a2019-09-30 11:55:34133 if (this._editor) {
Blink Reformat4c46d092018-04-07 15:32:37134 return this._editor;
Tim van der Lippe1d6e57a2019-09-30 11:55:34135 }
Blink Reformat4c46d092018-04-07 15:32:37136
137 const editor = new UI.ListWidget.Editor();
138 this._editor = editor;
139 const content = editor.contentElement();
140
141 const titles = content.createChild('div', 'blackbox-edit-row');
Tim van der Lippe66684e92020-01-24 14:01:18142 titles.createChild('div', 'blackbox-pattern').textContent = Common.UIString.UIString('Pattern');
Blink Reformat4c46d092018-04-07 15:32:37143 titles.createChild('div', 'blackbox-separator blackbox-separator-invisible');
Tim van der Lippe66684e92020-01-24 14:01:18144 titles.createChild('div', 'blackbox-behavior').textContent = Common.UIString.UIString('Behavior');
Blink Reformat4c46d092018-04-07 15:32:37145
146 const fields = content.createChild('div', 'blackbox-edit-row');
Chandani Shrestha97a703ee2019-06-03 22:45:11147 const pattern = editor.createInput('pattern', 'text', '/framework\\.js$', patternValidator.bind(this));
148 UI.ARIAUtils.setAccessibleName(pattern, ls`Pattern`);
149 fields.createChild('div', 'blackbox-pattern').appendChild(pattern);
Blink Reformat4c46d092018-04-07 15:32:37150 fields.createChild('div', 'blackbox-separator blackbox-separator-invisible');
Chandani Shrestha97a703ee2019-06-03 22:45:11151 const behavior = editor.createSelect('behavior', [this._blackboxLabel, this._disabledLabel], behaviorValidator);
152 UI.ARIAUtils.setAccessibleName(behavior, ls`Behavior`);
153 fields.createChild('div', 'blackbox-behavior').appendChild(behavior);
Blink Reformat4c46d092018-04-07 15:32:37154
155 return editor;
156
157 /**
158 * @param {*} item
159 * @param {number} index
160 * @param {!HTMLInputElement|!HTMLSelectElement} input
Tim van der Lippe1ebfc502020-01-15 13:45:09161 * @this {FrameworkBlackboxSettingsTab}
Amanda Bakerca502822019-07-02 00:01:28162 * @return {!UI.ListWidget.ValidatorResult}
Blink Reformat4c46d092018-04-07 15:32:37163 */
164 function patternValidator(item, index, input) {
165 const pattern = input.value.trim();
166 const patterns = this._setting.getAsArray();
Chandani Shrestha810233b2019-07-29 20:04:16167
Tim van der Lippe1d6e57a2019-09-30 11:55:34168 if (!pattern.length) {
Chandani Shrestha810233b2019-07-29 20:04:16169 return {valid: false, errorMessage: ls`Pattern cannot be empty`};
Tim van der Lippe1d6e57a2019-09-30 11:55:34170 }
Chandani Shrestha810233b2019-07-29 20:04:16171
Blink Reformat4c46d092018-04-07 15:32:37172 for (let i = 0; i < patterns.length; ++i) {
Tim van der Lippe1d6e57a2019-09-30 11:55:34173 if (i !== index && patterns[i].pattern === pattern) {
Chandani Shrestha810233b2019-07-29 20:04:16174 return {valid: false, errorMessage: ls`Pattern already exists`};
Tim van der Lippe1d6e57a2019-09-30 11:55:34175 }
Blink Reformat4c46d092018-04-07 15:32:37176 }
177
178 let regex;
179 try {
180 regex = new RegExp(pattern);
181 } catch (e) {
182 }
Tim van der Lippe1d6e57a2019-09-30 11:55:34183 if (!regex) {
Chandani Shrestha810233b2019-07-29 20:04:16184 return {valid: false, errorMessage: ls`Pattern must be a valid regular expression`};
Tim van der Lippe1d6e57a2019-09-30 11:55:34185 }
Mathias Bynensf06e8c02020-02-28 13:58:28186 return {valid: true};
Blink Reformat4c46d092018-04-07 15:32:37187 }
188
189 /**
190 * @param {*} item
191 * @param {number} index
192 * @param {!HTMLInputElement|!HTMLSelectElement} input
Amanda Bakerca502822019-07-02 00:01:28193 * @return {!UI.ListWidget.ValidatorResult}
Blink Reformat4c46d092018-04-07 15:32:37194 */
195 function behaviorValidator(item, index, input) {
Amanda Bakerca502822019-07-02 00:01:28196 return {valid: true};
Blink Reformat4c46d092018-04-07 15:32:37197 }
198 }
Paul Lewis5d4133e2019-11-27 13:06:01199}