blob: 168eaa5deaf864db9969e5b050f3ac4c2693f25a [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
Jan Schefflerd8380b62020-07-28 16:14:155// @ts-nocheck
6// TODO(crbug.com/1011811): Enable TypeScript compiler checks
7
Tim van der Lippe66684e92020-01-24 14:01:188import * as Common from '../common/common.js';
vidortegc1aeb632020-10-22 02:59:339import * as i18n from '../i18n/i18n.js';
Tim van der Lippe66684e92020-01-24 14:01:1810import * as UI from '../ui/ui.js';
11
vidortegc1aeb632020-10-22 02:59:3312export const UIStrings = {
13 /**
14 *@description Header text content in Framework Blackbox Settings Tab of the Settings
15 */
16 frameworkBlackboxing: 'Framework Blackboxing',
17 /**
18 *@description Text in Framework Blackbox Settings Tab of the Settings
19 */
20 debuggerWillSkipThroughThe: 'Debugger will skip through the scripts and will not stop on exceptions thrown by them.',
21 /**
22 *@description Text in Framework Blackbox Settings Tab of the Settings
23 */
24 blackboxContentScripts: 'Blackbox content scripts',
25 /**
26 *@description Blackbox content scripts title in Framework Blackbox Settings Tab of the Settings
27 */
28 blackboxContentScriptsExtension: 'Blackbox content scripts (extension scripts in the page)',
29 /**
30 *@description Blackbox label in Framework Blackbox Settings Tab of the Settings
31 */
32 blackbox: 'Blackbox',
33 /**
34 *@description Text to indicate something is not enabled
35 */
36 disabled: 'Disabled',
37 /**
38 *@description Placeholder text content in Framework Blackbox Settings Tab of the Settings
39 */
40 noBlackboxedPatterns: 'No blackboxed patterns',
41 /**
42 *@description Text of the add pattern button in Framework Blackbox Settings Tab of the Settings
43 */
44 addPattern: 'Add pattern...',
45 /**
46 *@description Aria accessible name in Framework Blackbox Settings Tab of the Settings
47 */
48 addFilenamePattern: 'Add filename pattern',
49 /**
50 *@description Pattern title in Framework Blackbox Settings Tab of the Settings
51 *@example {ad.*?} PH1
52 */
53 blackboxScriptsWhoseNamesMatchS: 'Blackbox scripts whose names match \'{PH1}\'',
54 /**
55 *@description Aria accessible name in Framework Blackbox Settings Tab of the Settings
56 */
57 pattern: 'Pattern',
58 /**
59 *@description Aria accessible name in Framework Blackbox Settings Tab of the Settings
60 */
61 behavior: 'Behavior',
62 /**
63 *@description Error message in Framework Blackbox settings pane that declares pattern must not be empty
64 */
65 patternCannotBeEmpty: 'Pattern cannot be empty',
66 /**
67 *@description Error message in Framework Blackbox settings pane that declares pattern already exits
68 */
69 patternAlreadyExists: 'Pattern already exists',
70 /**
71 *@description Error message in Framework Blackbox settings pane that declares pattern must be a valid regular expression
72 */
73 patternMustBeAValidRegular: 'Pattern must be a valid regular expression',
74};
75const str_ = i18n.i18n.registerUIStrings('settings/FrameworkBlackboxSettingsTab.js', UIStrings);
76const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
77
Blink Reformat4c46d092018-04-07 15:32:3778/**
79 * @implements {UI.ListWidget.Delegate}
80 * @unrestricted
81 */
Tim van der Lippe66684e92020-01-24 14:01:1882export class FrameworkBlackboxSettingsTab extends UI.Widget.VBox {
Blink Reformat4c46d092018-04-07 15:32:3783 constructor() {
84 super(true);
85 this.registerRequiredCSS('settings/frameworkBlackboxSettingsTab.css');
86
Chandani Shrestha97a703ee2019-06-03 22:45:1187 const header = this.contentElement.createChild('div', 'header');
vidortegc1aeb632020-10-22 02:59:3388 header.textContent = i18nString(UIStrings.frameworkBlackboxing);
Chandani Shrestha97a703ee2019-06-03 22:45:1189 UI.ARIAUtils.markAsHeading(header, 1);
vidortegc1aeb632020-10-22 02:59:3390 this.contentElement.createChild('div', 'intro').textContent = i18nString(UIStrings.debuggerWillSkipThroughThe);
Harley Li4ca27832019-05-23 23:14:5191
92 const blackboxContentScripts = this.contentElement.createChild('div', 'blackbox-content-scripts');
93 blackboxContentScripts.appendChild(UI.SettingsUI.createSettingCheckbox(
vidortegc1aeb632020-10-22 02:59:3394 i18nString(UIStrings.blackboxContentScripts),
95 Common.Settings.Settings.instance().moduleSetting('skipContentScripts'), true));
96 blackboxContentScripts.title = i18nString(UIStrings.blackboxContentScriptsExtension);
Blink Reformat4c46d092018-04-07 15:32:3797
vidortegc1aeb632020-10-22 02:59:3398 this._blackboxLabel = i18nString(UIStrings.blackbox);
99 this._disabledLabel = i18nString(UIStrings.disabled);
Blink Reformat4c46d092018-04-07 15:32:37100
Tim van der Lippe66684e92020-01-24 14:01:18101 this._list = new UI.ListWidget.ListWidget(this);
Blink Reformat4c46d092018-04-07 15:32:37102 this._list.element.classList.add('blackbox-list');
103 this._list.registerRequiredCSS('settings/frameworkBlackboxSettingsTab.css');
104
Tim van der Lippef49e2322020-05-01 15:03:09105 const placeholder = document.createElement('div');
106 placeholder.classList.add('blackbox-list-empty');
vidortegc1aeb632020-10-22 02:59:33107 placeholder.textContent = i18nString(UIStrings.noBlackboxedPatterns);
Blink Reformat4c46d092018-04-07 15:32:37108 this._list.setEmptyPlaceholder(placeholder);
109 this._list.show(this.contentElement);
vidortegc1aeb632020-10-22 02:59:33110 const addPatternButton =
111 UI.UIUtils.createTextButton(i18nString(UIStrings.addPattern), this._addButtonClicked.bind(this), 'add-button');
112 UI.ARIAUtils.setAccessibleName(addPatternButton, i18nString(UIStrings.addFilenamePattern));
Blink Reformat4c46d092018-04-07 15:32:37113 this.contentElement.appendChild(addPatternButton);
114
Paul Lewis2d7d65c2020-03-16 17:26:30115 this._setting = Common.Settings.Settings.instance().moduleSetting('skipStackFramesPattern');
Blink Reformat4c46d092018-04-07 15:32:37116 this._setting.addChangeListener(this._settingUpdated, this);
117
118 this.setDefaultFocusedElement(addPatternButton);
Blink Reformat4c46d092018-04-07 15:32:37119 }
120
121 /**
122 * @override
123 */
124 wasShown() {
125 super.wasShown();
126 this._settingUpdated();
127 }
128
129 _settingUpdated() {
130 this._list.clear();
131 const patterns = this._setting.getAsArray();
Tim van der Lippe1d6e57a2019-09-30 11:55:34132 for (let i = 0; i < patterns.length; ++i) {
Blink Reformat4c46d092018-04-07 15:32:37133 this._list.appendItem(patterns[i], true);
Tim van der Lippe1d6e57a2019-09-30 11:55:34134 }
Blink Reformat4c46d092018-04-07 15:32:37135 }
136
137 _addButtonClicked() {
138 this._list.addNewItem(this._setting.getAsArray().length, {pattern: '', disabled: false});
139 }
140
141 /**
142 * @override
143 * @param {*} item
144 * @param {boolean} editable
145 * @return {!Element}
146 */
147 renderItem(item, editable) {
Tim van der Lippef49e2322020-05-01 15:03:09148 const element = document.createElement('div');
149 element.classList.add('blackbox-list-item');
Blink Reformat4c46d092018-04-07 15:32:37150 const pattern = element.createChild('div', 'blackbox-pattern');
151 pattern.textContent = item.pattern;
vidortegc1aeb632020-10-22 02:59:33152 pattern.title = i18nString(UIStrings.blackboxScriptsWhoseNamesMatchS, {PH1: item.pattern});
Blink Reformat4c46d092018-04-07 15:32:37153 element.createChild('div', 'blackbox-separator');
154 element.createChild('div', 'blackbox-behavior').textContent =
155 item.disabled ? this._disabledLabel : this._blackboxLabel;
Tim van der Lippe1d6e57a2019-09-30 11:55:34156 if (item.disabled) {
Blink Reformat4c46d092018-04-07 15:32:37157 element.classList.add('blackbox-disabled');
Tim van der Lippe1d6e57a2019-09-30 11:55:34158 }
Blink Reformat4c46d092018-04-07 15:32:37159 return element;
160 }
161
162 /**
163 * @override
164 * @param {*} item
165 * @param {number} index
166 */
167 removeItemRequested(item, index) {
168 const patterns = this._setting.getAsArray();
169 patterns.splice(index, 1);
170 this._setting.setAsArray(patterns);
171 }
172
173 /**
174 * @override
175 * @param {*} item
176 * @param {!UI.ListWidget.Editor} editor
177 * @param {boolean} isNew
178 */
179 commitEdit(item, editor, isNew) {
180 item.pattern = editor.control('pattern').value.trim();
181 item.disabled = editor.control('behavior').value === this._disabledLabel;
182
183 const list = this._setting.getAsArray();
Tim van der Lippe1d6e57a2019-09-30 11:55:34184 if (isNew) {
Blink Reformat4c46d092018-04-07 15:32:37185 list.push(item);
Tim van der Lippe1d6e57a2019-09-30 11:55:34186 }
Blink Reformat4c46d092018-04-07 15:32:37187 this._setting.setAsArray(list);
188 }
189
190 /**
191 * @override
192 * @param {*} item
193 * @return {!UI.ListWidget.Editor}
194 */
195 beginEdit(item) {
196 const editor = this._createEditor();
197 editor.control('pattern').value = item.pattern;
198 editor.control('behavior').value = item.disabled ? this._disabledLabel : this._blackboxLabel;
199 return editor;
200 }
201
202 /**
203 * @return {!UI.ListWidget.Editor}
204 */
205 _createEditor() {
Tim van der Lippe1d6e57a2019-09-30 11:55:34206 if (this._editor) {
Blink Reformat4c46d092018-04-07 15:32:37207 return this._editor;
Tim van der Lippe1d6e57a2019-09-30 11:55:34208 }
Blink Reformat4c46d092018-04-07 15:32:37209
210 const editor = new UI.ListWidget.Editor();
211 this._editor = editor;
212 const content = editor.contentElement();
213
214 const titles = content.createChild('div', 'blackbox-edit-row');
vidortegc1aeb632020-10-22 02:59:33215 titles.createChild('div', 'blackbox-pattern').textContent = i18nString(UIStrings.pattern);
Blink Reformat4c46d092018-04-07 15:32:37216 titles.createChild('div', 'blackbox-separator blackbox-separator-invisible');
vidortegc1aeb632020-10-22 02:59:33217 titles.createChild('div', 'blackbox-behavior').textContent = i18nString(UIStrings.behavior);
Blink Reformat4c46d092018-04-07 15:32:37218
219 const fields = content.createChild('div', 'blackbox-edit-row');
Chandani Shrestha97a703ee2019-06-03 22:45:11220 const pattern = editor.createInput('pattern', 'text', '/framework\\.js$', patternValidator.bind(this));
vidortegc1aeb632020-10-22 02:59:33221 UI.ARIAUtils.setAccessibleName(pattern, i18nString(UIStrings.pattern));
Chandani Shrestha97a703ee2019-06-03 22:45:11222 fields.createChild('div', 'blackbox-pattern').appendChild(pattern);
Blink Reformat4c46d092018-04-07 15:32:37223 fields.createChild('div', 'blackbox-separator blackbox-separator-invisible');
Chandani Shrestha97a703ee2019-06-03 22:45:11224 const behavior = editor.createSelect('behavior', [this._blackboxLabel, this._disabledLabel], behaviorValidator);
vidortegc1aeb632020-10-22 02:59:33225 UI.ARIAUtils.setAccessibleName(behavior, i18nString(UIStrings.behavior));
Chandani Shrestha97a703ee2019-06-03 22:45:11226 fields.createChild('div', 'blackbox-behavior').appendChild(behavior);
Blink Reformat4c46d092018-04-07 15:32:37227
228 return editor;
229
230 /**
231 * @param {*} item
232 * @param {number} index
233 * @param {!HTMLInputElement|!HTMLSelectElement} input
Tim van der Lippe1ebfc502020-01-15 13:45:09234 * @this {FrameworkBlackboxSettingsTab}
Amanda Bakerca502822019-07-02 00:01:28235 * @return {!UI.ListWidget.ValidatorResult}
Blink Reformat4c46d092018-04-07 15:32:37236 */
237 function patternValidator(item, index, input) {
238 const pattern = input.value.trim();
239 const patterns = this._setting.getAsArray();
Chandani Shrestha810233b2019-07-29 20:04:16240
Tim van der Lippe1d6e57a2019-09-30 11:55:34241 if (!pattern.length) {
vidortegc1aeb632020-10-22 02:59:33242 return {valid: false, errorMessage: i18nString(UIStrings.patternCannotBeEmpty)};
Tim van der Lippe1d6e57a2019-09-30 11:55:34243 }
Chandani Shrestha810233b2019-07-29 20:04:16244
Blink Reformat4c46d092018-04-07 15:32:37245 for (let i = 0; i < patterns.length; ++i) {
Tim van der Lippe1d6e57a2019-09-30 11:55:34246 if (i !== index && patterns[i].pattern === pattern) {
vidortegc1aeb632020-10-22 02:59:33247 return {valid: false, errorMessage: i18nString(UIStrings.patternAlreadyExists)};
Tim van der Lippe1d6e57a2019-09-30 11:55:34248 }
Blink Reformat4c46d092018-04-07 15:32:37249 }
250
251 let regex;
252 try {
253 regex = new RegExp(pattern);
254 } catch (e) {
255 }
Tim van der Lippe1d6e57a2019-09-30 11:55:34256 if (!regex) {
vidortegc1aeb632020-10-22 02:59:33257 return {valid: false, errorMessage: i18nString(UIStrings.patternMustBeAValidRegular)};
Tim van der Lippe1d6e57a2019-09-30 11:55:34258 }
Mathias Bynensf06e8c02020-02-28 13:58:28259 return {valid: true};
Blink Reformat4c46d092018-04-07 15:32:37260 }
261
262 /**
263 * @param {*} item
264 * @param {number} index
265 * @param {!HTMLInputElement|!HTMLSelectElement} input
Amanda Bakerca502822019-07-02 00:01:28266 * @return {!UI.ListWidget.ValidatorResult}
Blink Reformat4c46d092018-04-07 15:32:37267 */
268 function behaviorValidator(item, index, input) {
Amanda Bakerca502822019-07-02 00:01:28269 return {valid: true};
Blink Reformat4c46d092018-04-07 15:32:37270 }
271 }
Paul Lewis5d4133e2019-11-27 13:06:01272}