blob: ec6973c5639c1412748d4462ab9151bdf5a882fb [file] [log] [blame]
Blink Reformat4c46d092018-04-07 15:32:371/*
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 */
Tim van der Lippe1ebfc502020-01-15 13:45:096
Blink Reformat4c46d092018-04-07 15:32:377/**
8 * @implements {UI.ListWidget.Delegate}
9 * @unrestricted
10 */
Tim van der Lippe1ebfc502020-01-15 13:45:0911export class FrameworkBlackboxSettingsTab extends UI.VBox {
Blink Reformat4c46d092018-04-07 15:32:3712 constructor() {
13 super(true);
14 this.registerRequiredCSS('settings/frameworkBlackboxSettingsTab.css');
15
Chandani Shrestha97a703ee2019-06-03 22:45:1116 const header = this.contentElement.createChild('div', 'header');
17 header.textContent = ls`Framework Blackboxing`;
18 UI.ARIAUtils.markAsHeading(header, 1);
Harley Li4ca27832019-05-23 23:14:5119 this.contentElement.createChild('div', 'intro').textContent =
20 ls`Debugger will skip through the scripts and will not stop on exceptions thrown by them.`;
21
22 const blackboxContentScripts = this.contentElement.createChild('div', 'blackbox-content-scripts');
23 blackboxContentScripts.appendChild(UI.SettingsUI.createSettingCheckbox(
Paul Lewis4b64b3f2020-01-23 11:41:2024 ls`Blackbox content scripts`, self.Common.settings.moduleSetting('skipContentScripts'), true));
Harley Li4ca27832019-05-23 23:14:5125 blackboxContentScripts.title = ls`Blackbox content scripts (extension scripts in the page)`;
Blink Reformat4c46d092018-04-07 15:32:3726
27 this._blackboxLabel = Common.UIString('Blackbox');
28 this._disabledLabel = Common.UIString('Disabled');
29
30 this._list = new UI.ListWidget(this);
31 this._list.element.classList.add('blackbox-list');
32 this._list.registerRequiredCSS('settings/frameworkBlackboxSettingsTab.css');
33
34 const placeholder = createElementWithClass('div', 'blackbox-list-empty');
35 placeholder.textContent = Common.UIString('No blackboxed patterns');
36 this._list.setEmptyPlaceholder(placeholder);
37 this._list.show(this.contentElement);
38 const addPatternButton =
39 UI.createTextButton(Common.UIString('Add pattern...'), this._addButtonClicked.bind(this), 'add-button');
40 this.contentElement.appendChild(addPatternButton);
41
Paul Lewis4b64b3f2020-01-23 11:41:2042 this._setting = self.Common.settings.moduleSetting('skipStackFramesPattern');
Blink Reformat4c46d092018-04-07 15:32:3743 this._setting.addChangeListener(this._settingUpdated, this);
44
45 this.setDefaultFocusedElement(addPatternButton);
Blink Reformat4c46d092018-04-07 15:32:3746 }
47
48 /**
49 * @override
50 */
51 wasShown() {
52 super.wasShown();
53 this._settingUpdated();
54 }
55
56 _settingUpdated() {
57 this._list.clear();
58 const patterns = this._setting.getAsArray();
Tim van der Lippe1d6e57a2019-09-30 11:55:3459 for (let i = 0; i < patterns.length; ++i) {
Blink Reformat4c46d092018-04-07 15:32:3760 this._list.appendItem(patterns[i], true);
Tim van der Lippe1d6e57a2019-09-30 11:55:3461 }
Blink Reformat4c46d092018-04-07 15:32:3762 }
63
64 _addButtonClicked() {
65 this._list.addNewItem(this._setting.getAsArray().length, {pattern: '', disabled: false});
66 }
67
68 /**
69 * @override
70 * @param {*} item
71 * @param {boolean} editable
72 * @return {!Element}
73 */
74 renderItem(item, editable) {
75 const element = createElementWithClass('div', 'blackbox-list-item');
76 const pattern = element.createChild('div', 'blackbox-pattern');
77 pattern.textContent = item.pattern;
Mandy Chen31930c42019-06-05 00:47:0878 pattern.title = ls`Blackbox scripts whose names match '${item.pattern}'`;
Blink Reformat4c46d092018-04-07 15:32:3779 element.createChild('div', 'blackbox-separator');
80 element.createChild('div', 'blackbox-behavior').textContent =
81 item.disabled ? this._disabledLabel : this._blackboxLabel;
Tim van der Lippe1d6e57a2019-09-30 11:55:3482 if (item.disabled) {
Blink Reformat4c46d092018-04-07 15:32:3783 element.classList.add('blackbox-disabled');
Tim van der Lippe1d6e57a2019-09-30 11:55:3484 }
Blink Reformat4c46d092018-04-07 15:32:3785 return element;
86 }
87
88 /**
89 * @override
90 * @param {*} item
91 * @param {number} index
92 */
93 removeItemRequested(item, index) {
94 const patterns = this._setting.getAsArray();
95 patterns.splice(index, 1);
96 this._setting.setAsArray(patterns);
97 }
98
99 /**
100 * @override
101 * @param {*} item
102 * @param {!UI.ListWidget.Editor} editor
103 * @param {boolean} isNew
104 */
105 commitEdit(item, editor, isNew) {
106 item.pattern = editor.control('pattern').value.trim();
107 item.disabled = editor.control('behavior').value === this._disabledLabel;
108
109 const list = this._setting.getAsArray();
Tim van der Lippe1d6e57a2019-09-30 11:55:34110 if (isNew) {
Blink Reformat4c46d092018-04-07 15:32:37111 list.push(item);
Tim van der Lippe1d6e57a2019-09-30 11:55:34112 }
Blink Reformat4c46d092018-04-07 15:32:37113 this._setting.setAsArray(list);
114 }
115
116 /**
117 * @override
118 * @param {*} item
119 * @return {!UI.ListWidget.Editor}
120 */
121 beginEdit(item) {
122 const editor = this._createEditor();
123 editor.control('pattern').value = item.pattern;
124 editor.control('behavior').value = item.disabled ? this._disabledLabel : this._blackboxLabel;
125 return editor;
126 }
127
128 /**
129 * @return {!UI.ListWidget.Editor}
130 */
131 _createEditor() {
Tim van der Lippe1d6e57a2019-09-30 11:55:34132 if (this._editor) {
Blink Reformat4c46d092018-04-07 15:32:37133 return this._editor;
Tim van der Lippe1d6e57a2019-09-30 11:55:34134 }
Blink Reformat4c46d092018-04-07 15:32:37135
136 const editor = new UI.ListWidget.Editor();
137 this._editor = editor;
138 const content = editor.contentElement();
139
140 const titles = content.createChild('div', 'blackbox-edit-row');
141 titles.createChild('div', 'blackbox-pattern').textContent = Common.UIString('Pattern');
142 titles.createChild('div', 'blackbox-separator blackbox-separator-invisible');
143 titles.createChild('div', 'blackbox-behavior').textContent = Common.UIString('Behavior');
144
145 const fields = content.createChild('div', 'blackbox-edit-row');
Chandani Shrestha97a703ee2019-06-03 22:45:11146 const pattern = editor.createInput('pattern', 'text', '/framework\\.js$', patternValidator.bind(this));
147 UI.ARIAUtils.setAccessibleName(pattern, ls`Pattern`);
148 fields.createChild('div', 'blackbox-pattern').appendChild(pattern);
Blink Reformat4c46d092018-04-07 15:32:37149 fields.createChild('div', 'blackbox-separator blackbox-separator-invisible');
Chandani Shrestha97a703ee2019-06-03 22:45:11150 const behavior = editor.createSelect('behavior', [this._blackboxLabel, this._disabledLabel], behaviorValidator);
151 UI.ARIAUtils.setAccessibleName(behavior, ls`Behavior`);
152 fields.createChild('div', 'blackbox-behavior').appendChild(behavior);
Blink Reformat4c46d092018-04-07 15:32:37153
154 return editor;
155
156 /**
157 * @param {*} item
158 * @param {number} index
159 * @param {!HTMLInputElement|!HTMLSelectElement} input
Tim van der Lippe1ebfc502020-01-15 13:45:09160 * @this {FrameworkBlackboxSettingsTab}
Amanda Bakerca502822019-07-02 00:01:28161 * @return {!UI.ListWidget.ValidatorResult}
Blink Reformat4c46d092018-04-07 15:32:37162 */
163 function patternValidator(item, index, input) {
164 const pattern = input.value.trim();
165 const patterns = this._setting.getAsArray();
Chandani Shrestha810233b2019-07-29 20:04:16166
Tim van der Lippe1d6e57a2019-09-30 11:55:34167 if (!pattern.length) {
Chandani Shrestha810233b2019-07-29 20:04:16168 return {valid: false, errorMessage: ls`Pattern cannot be empty`};
Tim van der Lippe1d6e57a2019-09-30 11:55:34169 }
Chandani Shrestha810233b2019-07-29 20:04:16170
Blink Reformat4c46d092018-04-07 15:32:37171 for (let i = 0; i < patterns.length; ++i) {
Tim van der Lippe1d6e57a2019-09-30 11:55:34172 if (i !== index && patterns[i].pattern === pattern) {
Chandani Shrestha810233b2019-07-29 20:04:16173 return {valid: false, errorMessage: ls`Pattern already exists`};
Tim van der Lippe1d6e57a2019-09-30 11:55:34174 }
Blink Reformat4c46d092018-04-07 15:32:37175 }
176
177 let regex;
178 try {
179 regex = new RegExp(pattern);
180 } catch (e) {
181 }
Tim van der Lippe1d6e57a2019-09-30 11:55:34182 if (!regex) {
Chandani Shrestha810233b2019-07-29 20:04:16183 return {valid: false, errorMessage: ls`Pattern must be a valid regular expression`};
Tim van der Lippe1d6e57a2019-09-30 11:55:34184 } else {
Chandani Shrestha810233b2019-07-29 20:04:16185 return {valid: true};
Tim van der Lippe1d6e57a2019-09-30 11:55:34186 }
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}