chrome-devtools-frontend 1.0.961907 → 1.0.962581
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +5 -4
- package/config/gni/devtools_grd_files.gni +1 -1
- package/front_end/core/protocol_client/InspectorBackend.ts +7 -7
- package/front_end/core/sdk/CSSProperty.ts +22 -110
- package/front_end/generated/protocol-tsconfig.json +2 -2
- package/front_end/generated/protocol.ts +16772 -0
- package/front_end/models/text_utils/text_utils-legacy.ts +0 -5
- package/front_end/models/text_utils/text_utils.ts +0 -2
- package/package.json +1 -1
- package/scripts/build/ninja/devtools_entrypoint.gni +25 -17
- package/scripts/devtools_paths.py +4 -0
- package/scripts/protocol_typescript/protocol_dts_generator.ts +4 -9
- package/front_end/generated/protocol.d.ts +0 -16771
- package/front_end/models/text_utils/CodeMirrorUtils.ts +0 -77
package/.eslintignore
CHANGED
@@ -5,13 +5,14 @@
|
|
5
5
|
// clang-format check also ignores that file
|
6
6
|
front_end/.eslintrc.js
|
7
7
|
front_end/diff/diff_match_patch.js
|
8
|
+
front_end/generated/protocol.ts
|
8
9
|
front_end/javascript_metadata/NativeFunctions.js
|
9
10
|
front_end/third_party/
|
11
|
+
node_modules
|
12
|
+
scripts/migration/**/*.js
|
13
|
+
scripts/protocol_typescript/*.js
|
14
|
+
test/**/fixtures/
|
10
15
|
test/e2e/**/*.js
|
11
16
|
test/shared/**/*.js
|
12
|
-
test/**/fixtures/
|
13
|
-
scripts/protocol_typescript/*.js
|
14
|
-
scripts/migration/**/*.js
|
15
|
-
node_modules
|
16
17
|
|
17
18
|
*.d.ts
|
@@ -659,6 +659,7 @@ grd_files_debug_sources = [
|
|
659
659
|
"front_end/generated/ARIAProperties.js",
|
660
660
|
"front_end/generated/InspectorBackendCommands.js",
|
661
661
|
"front_end/generated/SupportedCSSProperties.js",
|
662
|
+
"front_end/generated/protocol.js",
|
662
663
|
"front_end/legacy_test_runner/test_runner/TestRunner.js",
|
663
664
|
"front_end/models/bindings/BreakpointManager.js",
|
664
665
|
"front_end/models/bindings/CSSWorkspaceBinding.js",
|
@@ -735,7 +736,6 @@ grd_files_debug_sources = [
|
|
735
736
|
"front_end/models/persistence/WorkspaceSettingsTab.js",
|
736
737
|
"front_end/models/persistence/editFileSystemView.css.js",
|
737
738
|
"front_end/models/persistence/workspaceSettingsTab.css.js",
|
738
|
-
"front_end/models/text_utils/CodeMirrorUtils.js",
|
739
739
|
"front_end/models/text_utils/ContentProvider.js",
|
740
740
|
"front_end/models/text_utils/StaticContentProvider.js",
|
741
741
|
"front_end/models/text_utils/Text.js",
|
@@ -30,7 +30,7 @@
|
|
30
30
|
|
31
31
|
import {NodeURL} from './NodeURL.js';
|
32
32
|
import type * as ProtocolProxyApi from '../../generated/protocol-proxy-api.js';
|
33
|
-
import * as Protocol from '../../generated/protocol.js';
|
33
|
+
import type * as Protocol from '../../generated/protocol.js';
|
34
34
|
|
35
35
|
export const DevToolsStubErrorCode = -32015;
|
36
36
|
// TODO(dgozman): we are not reporting generic errors in tests, but we should
|
@@ -147,14 +147,14 @@ export class InspectorBackend {
|
|
147
147
|
|
148
148
|
registerEnum(type: QualifiedName, values: Object): void {
|
149
149
|
const [domain, name] = splitQualifiedName(type);
|
150
|
-
// @ts-ignore
|
151
|
-
if (!Protocol[domain]) {
|
152
|
-
// @ts-ignore
|
153
|
-
Protocol[domain] = {};
|
150
|
+
// @ts-ignore globalThis global namespace pollution
|
151
|
+
if (!globalThis.Protocol[domain]) {
|
152
|
+
// @ts-ignore globalThis global namespace pollution
|
153
|
+
globalThis.Protocol[domain] = {};
|
154
154
|
}
|
155
155
|
|
156
|
-
// @ts-ignore
|
157
|
-
Protocol[domain][name] = values;
|
156
|
+
// @ts-ignore globalThis global namespace pollution
|
157
|
+
globalThis.Protocol[domain][name] = values;
|
158
158
|
this.#initialized = true;
|
159
159
|
}
|
160
160
|
|
@@ -3,13 +3,10 @@
|
|
3
3
|
// found in the LICENSE file.
|
4
4
|
|
5
5
|
import * as TextUtils from '../../models/text_utils/text_utils.js';
|
6
|
-
import * as Common from '../common/common.js';
|
6
|
+
import type * as Common from '../common/common.js';
|
7
7
|
import * as HostModule from '../host/host.js';
|
8
|
-
import * as Platform from '../platform/platform.js';
|
9
|
-
import * as Root from '../root/root.js';
|
10
8
|
import type * as Protocol from '../../generated/protocol.js';
|
11
9
|
|
12
|
-
import {cssMetadata, GridAreaRowRegex} from './CSSMetadata.js';
|
13
10
|
import type {Edit} from './CSSModel.js';
|
14
11
|
import type {CSSStyleDeclaration} from './CSSStyleDeclaration.js';
|
15
12
|
|
@@ -163,113 +160,17 @@ export class CSSProperty {
|
|
163
160
|
}
|
164
161
|
|
165
162
|
const range = this.range.relativeTo(this.ownerStyle.range.startLine, this.ownerStyle.range.startColumn);
|
166
|
-
const indentation = this.ownerStyle.cssText ?
|
167
|
-
this.detectIndentation(this.ownerStyle.cssText) :
|
168
|
-
Common.Settings.Settings.instance().moduleSetting('textEditorIndent').get();
|
169
|
-
const endIndentation = this.ownerStyle.cssText ? indentation.substring(0, this.ownerStyle.range.endColumn) : '';
|
170
163
|
const text = new TextUtils.Text.Text(this.ownerStyle.cssText || '');
|
171
|
-
const
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
styleText: string, indentation: string, endIndentation: string,
|
179
|
-
tokenizerFactory: TextUtils.TextUtils.TokenizerFactory): string {
|
180
|
-
const doubleIndent = indentation.substring(endIndentation.length) + indentation;
|
181
|
-
if (indentation) {
|
182
|
-
indentation = '\n' + indentation;
|
183
|
-
}
|
184
|
-
let result = '';
|
185
|
-
let propertyName = '';
|
186
|
-
let propertyText = '';
|
187
|
-
let insideProperty = false;
|
188
|
-
let needsSemi = false;
|
189
|
-
const tokenize = tokenizerFactory.createTokenizer('text/css');
|
190
|
-
|
191
|
-
tokenize('*{' + styleText + '}', processToken);
|
192
|
-
if (insideProperty) {
|
193
|
-
result += propertyText;
|
194
|
-
}
|
195
|
-
result = result.substring(2, result.length - 1).trimRight();
|
196
|
-
return result + (indentation ? '\n' + endIndentation : '');
|
197
|
-
|
198
|
-
function processToken(token: string, tokenType: string|null, _column: number, _newColumn: number): void {
|
199
|
-
if (!insideProperty) {
|
200
|
-
const disabledProperty = tokenType && tokenType.includes('comment') && isDisabledProperty(token);
|
201
|
-
const isPropertyStart = tokenType &&
|
202
|
-
(tokenType.includes('string') || tokenType.includes('meta') || tokenType.includes('property') ||
|
203
|
-
tokenType.includes('variable-2'));
|
204
|
-
if (disabledProperty) {
|
205
|
-
result = result.trimRight() + indentation + token;
|
206
|
-
} else if (isPropertyStart) {
|
207
|
-
insideProperty = true;
|
208
|
-
propertyText = token;
|
209
|
-
} else if (token !== ';' || needsSemi) {
|
210
|
-
result += token;
|
211
|
-
if (token.trim() && !(tokenType && tokenType.includes('comment'))) {
|
212
|
-
needsSemi = token !== ';';
|
213
|
-
}
|
214
|
-
}
|
215
|
-
if (token === '{' && !tokenType) {
|
216
|
-
needsSemi = false;
|
217
|
-
}
|
218
|
-
return;
|
219
|
-
}
|
220
|
-
|
221
|
-
if (token === '}' || token === ';') {
|
222
|
-
// While `propertyText` can generally be trimmed, doing so
|
223
|
-
// breaks valid CSS declarations such as `--foo: ;` which would
|
224
|
-
// then produce invalid CSS of the form `--foo:;`. This
|
225
|
-
// implementation takes special care to restore a single
|
226
|
-
// whitespace token in this edge case. https://crbug.com/1071296
|
227
|
-
const trimmedPropertyText = propertyText.trim();
|
228
|
-
result =
|
229
|
-
result.trimRight() + indentation + trimmedPropertyText + (trimmedPropertyText.endsWith(':') ? ' ' : '');
|
230
|
-
needsSemi = false;
|
231
|
-
insideProperty = false;
|
232
|
-
propertyName = '';
|
233
|
-
if (Root.Runtime.experiments.isEnabled('preciseChanges')) {
|
234
|
-
result += token;
|
235
|
-
return;
|
236
|
-
}
|
237
|
-
// We preserve the legacy behavior to always add semicolon to
|
238
|
-
// declarations regardless of its original text.
|
239
|
-
result += ';';
|
240
|
-
if (token === '}') {
|
241
|
-
result += '}';
|
242
|
-
}
|
243
|
-
} else {
|
244
|
-
if (cssMetadata().isGridAreaDefiningProperty(propertyName)) {
|
245
|
-
const rowResult = GridAreaRowRegex.exec(token);
|
246
|
-
if (rowResult && rowResult.index === 0 && !propertyText.trimRight().endsWith(']')) {
|
247
|
-
propertyText = propertyText.trimRight() + '\n' + doubleIndent;
|
248
|
-
}
|
249
|
-
}
|
250
|
-
if (!propertyName && token === ':') {
|
251
|
-
propertyName = propertyText;
|
252
|
-
}
|
253
|
-
propertyText += token;
|
254
|
-
}
|
164
|
+
const textBeforeInsertion =
|
165
|
+
text.extract(new TextUtils.TextRange.TextRange(0, 0, range.startLine, range.startColumn));
|
166
|
+
// If we are appending after the last property and that property doesn't have a semicolon at the end
|
167
|
+
// (which is only legal in the last position), then add the semicolon in front of the new text to avoid
|
168
|
+
// CSS parsing errors. However, we shouldn't prepend semicolons on the first line or after a comment.
|
169
|
+
if (textBeforeInsertion.trim().length && !/[;{\/]\s*$/.test(textBeforeInsertion)) {
|
170
|
+
propertyText = ';' + propertyText;
|
255
171
|
}
|
256
|
-
|
257
|
-
|
258
|
-
const colon = text.indexOf(':');
|
259
|
-
if (colon === -1) {
|
260
|
-
return false;
|
261
|
-
}
|
262
|
-
const propertyName = text.substring(2, colon).trim();
|
263
|
-
return cssMetadata().isCSSPropertyName(propertyName);
|
264
|
-
}
|
265
|
-
}
|
266
|
-
|
267
|
-
private detectIndentation(text: string): string {
|
268
|
-
const lines = text.split('\n');
|
269
|
-
if (lines.length < 2) {
|
270
|
-
return '';
|
271
|
-
}
|
272
|
-
return TextUtils.TextUtils.Utils.lineIndent(lines[1]);
|
172
|
+
const newStyleText = text.replaceRange(range, propertyText);
|
173
|
+
return this.ownerStyle.setText(newStyleText, majorChange);
|
273
174
|
}
|
274
175
|
|
275
176
|
setValue(newValue: string, majorChange: boolean, overwrite: boolean, userCallback?: ((arg0: boolean) => void)): void {
|
@@ -288,7 +189,18 @@ export class CSSProperty {
|
|
288
189
|
return Promise.resolve(true);
|
289
190
|
}
|
290
191
|
const propertyText = this.text.trim();
|
291
|
-
|
192
|
+
// Ensure that if we try to enable/disable a property that has no semicolon (which is only legal
|
193
|
+
// in the last position of a css rule), we add it. This ensures that if we then later try
|
194
|
+
// to re-enable/-disable the rule, we end up with legal syntax (if the user adds more properties
|
195
|
+
// after the disabled rule).
|
196
|
+
const appendSemicolonIfMissing = (propertyText: string): string =>
|
197
|
+
propertyText + (propertyText.endsWith(';') ? '' : ';');
|
198
|
+
let text: string;
|
199
|
+
if (disabled) {
|
200
|
+
text = '/* ' + appendSemicolonIfMissing(propertyText) + ' */';
|
201
|
+
} else {
|
202
|
+
text = appendSemicolonIfMissing(this.text.substring(2, propertyText.length - 2).trim());
|
203
|
+
}
|
292
204
|
return this.setText(text, true, true);
|
293
205
|
}
|
294
206
|
|