chrome-devtools-frontend 1.0.938150 → 1.0.939277
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/.stylelintrc.json +15 -11
- package/config/gni/all_devtools_files.gni +0 -1
- package/config/gni/devtools_grd_files.gni +0 -1
- package/front_end/Images/whatsnew.avif +0 -0
- package/front_end/Tests.js +30 -29
- package/front_end/core/host/InspectorFrontendHost.ts +16 -30
- package/front_end/core/host/InspectorFrontendHostAPI.ts +1 -0
- package/front_end/core/host/UserMetrics.ts +25 -0
- package/front_end/core/i18n/locales/en-US.json +4 -1
- package/front_end/core/i18n/locales/en-XL.json +4 -1
- package/front_end/core/sdk/CSSModel.ts +64 -50
- package/front_end/core/sdk/EmulationModel.ts +11 -0
- package/front_end/core/sdk/sdk-meta.ts +30 -1
- package/front_end/entrypoints/devtools_app/devtools_app.json +0 -1
- package/front_end/entrypoints/inspector_main/RenderingOptions.ts +9 -2
- package/front_end/entrypoints/inspector_main/renderingOptions.css +2 -2
- package/front_end/entrypoints/main/MainImpl.ts +14 -0
- package/front_end/entrypoints/main/main-meta.ts +0 -2
- package/front_end/entrypoints/node_main/nodeConnectionsPanel.css +2 -2
- package/front_end/entrypoints/worker_app/worker_app.json +0 -1
- package/front_end/legacy_test_runner/test_runner/test_runner.js +2 -4
- package/front_end/models/persistence/editFileSystemView.css +1 -1
- package/front_end/models/persistence/workspaceSettingsTab.css +1 -1
- package/front_end/panels/accessibility/accessibilityNode.css +2 -2
- package/front_end/panels/accessibility/axBreadcrumbs.css +1 -1
- package/front_end/panels/animation/animationTimeline.css +5 -5
- package/front_end/panels/application/components/frameDetailsReportView.css +1 -1
- package/front_end/panels/application/resourcesPanel.css +1 -1
- package/front_end/panels/application/resourcesSidebar.css +1 -1
- package/front_end/panels/browser_debugger/browser_debugger-meta.ts +0 -3
- package/front_end/panels/browser_debugger/xhrBreakpointsSidebarPane.css +2 -5
- package/front_end/panels/changes/changesSidebar.css +1 -1
- package/front_end/panels/changes/changesView.css +2 -2
- package/front_end/panels/console/consolePrompt.css +1 -1
- package/front_end/panels/console/consoleSidebar.css +4 -4
- package/front_end/panels/console/consoleView.css +2 -2
- package/front_end/panels/css_overview/components/cssOverviewStartView.css +1 -1
- package/front_end/panels/css_overview/cssOverviewCompletedView.css +8 -8
- package/front_end/panels/elements/classesPaneWidget.css +1 -1
- package/front_end/panels/elements/components/adornerSettingsPane.css +1 -1
- package/front_end/panels/elements/computedStyleWidgetTree.css +1 -1
- package/front_end/panels/elements/elementsPanel.css +1 -1
- package/front_end/panels/elements/elementsTreeOutline.css +1 -1
- package/front_end/panels/elements/layoutPane.css +1 -1
- package/front_end/panels/elements/platformFontsWidget.css +1 -1
- package/front_end/panels/elements/stylesSectionTree.css +1 -1
- package/front_end/panels/event_listeners/EventListenersView.ts +5 -4
- package/front_end/panels/event_listeners/eventListenersView.css +3 -2
- package/front_end/panels/help/ReleaseNoteText.ts +28 -0
- package/front_end/panels/issues/IssueKindView.ts +0 -6
- package/front_end/panels/issues/IssueView.ts +19 -27
- package/front_end/panels/issues/components/HideIssuesMenu.ts +7 -11
- package/front_end/panels/issues/components/hideIssuesMenu.css +8 -0
- package/front_end/panels/issues/issuesTree.css +17 -5
- package/front_end/panels/lighthouse/lighthouseStartView.css +2 -2
- package/front_end/panels/media/playerListView.css +1 -1
- package/front_end/panels/mobile_throttling/throttlingSettingsTab.css +1 -1
- package/front_end/panels/network/NetworkLogView.ts +13 -0
- package/front_end/panels/network/NetworkSearchScope.ts +3 -1
- package/front_end/panels/network/blockedURLsPane.css +1 -1
- package/front_end/panels/network/networkConfigView.css +1 -1
- package/front_end/panels/network/networkLogView.css +3 -3
- package/front_end/panels/profiler/profileLauncherView.css +3 -3
- package/front_end/panels/security/mainView.css +2 -2
- package/front_end/panels/security/originView.css +1 -1
- package/front_end/panels/sensors/sensors.css +2 -2
- package/front_end/panels/settings/emulation/components/userAgentClientHintsForm.css +1 -1
- package/front_end/panels/settings/emulation/devicesSettingsTab.css +4 -4
- package/front_end/panels/settings/frameworkIgnoreListSettingsTab.css +1 -1
- package/front_end/panels/settings/settingsScreen.css +2 -2
- package/front_end/panels/sources/CoveragePlugin.ts +7 -2
- package/front_end/panels/sources/JavaScriptBreakpointsSidebarPane.ts +14 -17
- package/front_end/panels/sources/callStackSidebarPane.css +1 -1
- package/front_end/panels/sources/dialog.css +1 -1
- package/front_end/panels/sources/javaScriptBreakpointsSidebarPane.css +19 -45
- package/front_end/panels/sources/navigatorTree.css +4 -4
- package/front_end/panels/sources/sourcesPanel.css +2 -2
- package/front_end/panels/sources/threadsSidebarPane.css +1 -1
- package/front_end/panels/timeline/components/WebVitalsTooltip.css +1 -1
- package/front_end/panels/timeline/historyToolbarButton.css +1 -1
- package/front_end/panels/timeline/timelineStatusDialog.css +1 -1
- package/front_end/panels/webauthn/webauthnPane.css +2 -2
- package/front_end/ui/components/adorners/adorner.css +1 -1
- package/front_end/ui/components/expandable_list/expandableList.css +1 -1
- package/front_end/ui/components/linear_memory_inspector/valueInterpreterDisplay.css +1 -2
- package/front_end/ui/components/linear_memory_inspector/valueInterpreterSettings.css +1 -1
- package/front_end/ui/components/report_view/reportKey.css +1 -1
- package/front_end/ui/components/report_view/reportValue.css +1 -1
- package/front_end/ui/components/settings/settingCheckbox.css +5 -0
- package/front_end/ui/legacy/ContextMenu.ts +10 -3
- package/front_end/ui/legacy/SoftContextMenu.ts +9 -2
- package/front_end/ui/legacy/checkboxTextLabel.css +5 -1
- package/front_end/ui/legacy/components/color_picker/spectrum.css +9 -9
- package/front_end/ui/legacy/components/data_grid/dataGrid.css +2 -2
- package/front_end/ui/legacy/components/inline_editor/cssAngleEditor.css +3 -3
- package/front_end/ui/legacy/components/inline_editor/cssLength.css +1 -1
- package/front_end/ui/legacy/components/inline_editor/cssShadowEditor.css +1 -1
- package/front_end/ui/legacy/components/inline_editor/fontEditor.css +1 -1
- package/front_end/ui/legacy/components/object_ui/objectPropertiesSection.css +2 -2
- package/front_end/ui/legacy/components/quick_open/FilteredListWidget.ts +13 -7
- package/front_end/ui/legacy/components/quick_open/filteredListWidget.css +2 -2
- package/front_end/ui/legacy/components/source_frame/imageView.css +1 -1
- package/front_end/ui/legacy/components/text_editor/cmdevtools.css +6 -14
- package/front_end/ui/legacy/emptyWidget.css +1 -1
- package/front_end/ui/legacy/filter.css +1 -1
- package/front_end/ui/legacy/infobar.css +2 -2
- package/front_end/ui/legacy/inspectorCommon.css +49 -45
- package/front_end/ui/legacy/inspectorSyntaxHighlight.css +3 -3
- package/front_end/ui/legacy/inspectorViewTabbedPane.css +1 -1
- package/front_end/ui/legacy/searchableView.css +1 -1
- package/front_end/ui/legacy/softContextMenu.css +11 -1
- package/front_end/ui/legacy/textPrompt.css +1 -1
- package/front_end/ui/legacy/themeColors.css +1 -0
- package/front_end/ui/legacy/toolbar.css +8 -8
- package/front_end/ui/legacy/treeoutline.css +4 -4
- package/inspector_overlay/common.css +2 -2
- package/inspector_overlay/tool_highlight.css +1 -1
- package/inspector_overlay/tool_paused.css +2 -2
- package/package.json +1 -1
- package/scripts/eslint_rules/lib/es_modules_import.js +21 -20
- package/scripts/eslint_rules/lib/l10n_filename_matches.js +4 -3
- package/scripts/eslint_rules/lib/migrate_create_shadow_root_with_styles.js +2 -2
- package/scripts/eslint_rules/lib/migrate_register_required_css.js +1 -1
- package/scripts/eslint_rules/tests/es_modules_import_test.js +3 -2
- package/front_end/panels/browser_debugger/module.json +0 -3
package/.stylelintrc.json
CHANGED
|
@@ -12,15 +12,6 @@
|
|
|
12
12
|
"declaration-no-important": true,
|
|
13
13
|
"color-named": "never",
|
|
14
14
|
"max-empty-lines": 1,
|
|
15
|
-
"property-no-vendor-prefix": [
|
|
16
|
-
true,
|
|
17
|
-
{
|
|
18
|
-
"ignoreProperties": [
|
|
19
|
-
"border-image",
|
|
20
|
-
"/^mask-/"
|
|
21
|
-
]
|
|
22
|
-
}
|
|
23
|
-
],
|
|
24
15
|
"selector-type-no-unknown": [
|
|
25
16
|
true,
|
|
26
17
|
{
|
|
@@ -28,6 +19,19 @@
|
|
|
28
19
|
"/^devtools-/"
|
|
29
20
|
]
|
|
30
21
|
}
|
|
31
|
-
]
|
|
32
|
-
|
|
22
|
+
],
|
|
23
|
+
"max-line-length": null,
|
|
24
|
+
"selector-class-pattern": null,
|
|
25
|
+
"keyframes-name-pattern": null,
|
|
26
|
+
"selector-no-vendor-prefix": null,
|
|
27
|
+
"property-no-vendor-prefix": null,
|
|
28
|
+
"value-no-vendor-prefix": null,
|
|
29
|
+
"media-feature-name-no-vendor-prefix": null
|
|
30
|
+
},
|
|
31
|
+
"overrides": [
|
|
32
|
+
{
|
|
33
|
+
"files": ["**/*.ts"],
|
|
34
|
+
"customSyntax": "html"
|
|
35
|
+
}
|
|
36
|
+
]
|
|
33
37
|
}
|
|
@@ -30,7 +30,6 @@ all_devtools_files = [
|
|
|
30
30
|
"front_end/legacy_test_runner/bindings_test_runner/IsolatedFilesystemTestRunner.js",
|
|
31
31
|
"front_end/legacy_test_runner/bindings_test_runner/OverridesTestRunner.js",
|
|
32
32
|
"front_end/legacy_test_runner/bindings_test_runner/PersistenceTestRunner.js",
|
|
33
|
-
"front_end/panels/browser_debugger/module.json",
|
|
34
33
|
"front_end/third_party/codemirror/codemirror.css",
|
|
35
34
|
"front_end/legacy_test_runner/console_test_runner/console_test_runner.js",
|
|
36
35
|
"front_end/legacy_test_runner/coverage_test_runner/coverage_test_runner.js",
|
|
@@ -340,7 +340,6 @@ grd_files_release_sources = [
|
|
|
340
340
|
"front_end/panels/browser_debugger/browser_debugger-legacy.js",
|
|
341
341
|
"front_end/panels/browser_debugger/browser_debugger-meta.js",
|
|
342
342
|
"front_end/panels/browser_debugger/browser_debugger.js",
|
|
343
|
-
"front_end/panels/browser_debugger/browser_debugger_module.js",
|
|
344
343
|
"front_end/panels/changes/changes-legacy.js",
|
|
345
344
|
"front_end/panels/changes/changes-meta.js",
|
|
346
345
|
"front_end/panels/changes/changes.js",
|
|
Binary file
|
package/front_end/Tests.js
CHANGED
|
@@ -1331,8 +1331,8 @@
|
|
|
1331
1331
|
const browserContextIds = [];
|
|
1332
1332
|
const targetAgent = self.SDK.targetManager.mainTarget().targetAgent();
|
|
1333
1333
|
|
|
1334
|
-
const target1 = await createIsolatedTarget(url);
|
|
1335
|
-
const target2 = await createIsolatedTarget(url);
|
|
1334
|
+
const target1 = await createIsolatedTarget(url, browserContextIds);
|
|
1335
|
+
const target2 = await createIsolatedTarget(url, browserContextIds);
|
|
1336
1336
|
|
|
1337
1337
|
const response = await targetAgent.invoke_getBrowserContexts();
|
|
1338
1338
|
this.assertEquals(response.browserContextIds.length, 2);
|
|
@@ -1356,34 +1356,37 @@
|
|
|
1356
1356
|
this.assertEquals(removedTargets.indexOf(target2) !== -1, true);
|
|
1357
1357
|
|
|
1358
1358
|
this.releaseControl();
|
|
1359
|
+
};
|
|
1359
1360
|
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1361
|
+
/**
|
|
1362
|
+
* @param {string} url
|
|
1363
|
+
* @return {!Promise<!SDK.Target>}
|
|
1364
|
+
*/
|
|
1365
|
+
async function createIsolatedTarget(url, opt_browserContextIds) {
|
|
1366
|
+
const targetAgent = self.SDK.targetManager.mainTarget().targetAgent();
|
|
1367
|
+
const {browserContextId} = await targetAgent.invoke_createBrowserContext();
|
|
1368
|
+
if (opt_browserContextIds) {
|
|
1369
|
+
opt_browserContextIds.push(browserContextId);
|
|
1370
|
+
}
|
|
1367
1371
|
|
|
1368
|
-
|
|
1369
|
-
|
|
1372
|
+
const {targetId} = await targetAgent.invoke_createTarget({url: 'about:blank', browserContextId});
|
|
1373
|
+
await targetAgent.invoke_attachToTarget({targetId, flatten: true});
|
|
1370
1374
|
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1375
|
+
const target = self.SDK.targetManager.targets().find(target => target.id() === targetId);
|
|
1376
|
+
const pageAgent = target.pageAgent();
|
|
1377
|
+
await pageAgent.invoke_enable();
|
|
1378
|
+
await pageAgent.invoke_navigate({url});
|
|
1379
|
+
return target;
|
|
1380
|
+
}
|
|
1377
1381
|
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
+
async function disposeBrowserContext(browserContextId) {
|
|
1383
|
+
const targetAgent = self.SDK.targetManager.mainTarget().targetAgent();
|
|
1384
|
+
await targetAgent.invoke_disposeBrowserContext({browserContextId});
|
|
1385
|
+
}
|
|
1382
1386
|
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
};
|
|
1387
|
+
async function evalCode(target, code) {
|
|
1388
|
+
return (await target.runtimeAgent().invoke_evaluate({expression: code})).result.value;
|
|
1389
|
+
}
|
|
1387
1390
|
|
|
1388
1391
|
TestSuite.prototype.testInputDispatchEventsToOOPIF = async function() {
|
|
1389
1392
|
this.takeControl();
|
|
@@ -1391,14 +1394,12 @@
|
|
|
1391
1394
|
await new Promise(callback => this._waitForTargets(2, callback));
|
|
1392
1395
|
|
|
1393
1396
|
async function takeLogs(target) {
|
|
1394
|
-
|
|
1397
|
+
return await evalCode(target, `
|
|
1395
1398
|
(function() {
|
|
1396
1399
|
var result = window.logs.join(' ');
|
|
1397
1400
|
window.logs = [];
|
|
1398
1401
|
return result;
|
|
1399
|
-
})()
|
|
1400
|
-
`;
|
|
1401
|
-
return (await target.runtimeAgent().invoke_evaluate({expression: code})).result.value;
|
|
1402
|
+
})()`);
|
|
1402
1403
|
}
|
|
1403
1404
|
|
|
1404
1405
|
let parentFrameOutput;
|
|
@@ -364,13 +364,7 @@ export class InspectorFrontendHostStub implements InspectorFrontendHostAPI {
|
|
|
364
364
|
export let InspectorFrontendHostInstance: InspectorFrontendHostStub = window.InspectorFrontendHost;
|
|
365
365
|
|
|
366
366
|
class InspectorFrontendAPIImpl {
|
|
367
|
-
readonly #debugFrontend: boolean;
|
|
368
|
-
|
|
369
367
|
constructor() {
|
|
370
|
-
this.#debugFrontend = (Boolean(Root.Runtime.Runtime.queryParam('debugFrontend'))) ||
|
|
371
|
-
// @ts-ignore Compatibility hacks
|
|
372
|
-
(window['InspectorTest'] && window['InspectorTest']['debugTest']);
|
|
373
|
-
|
|
374
368
|
for (const descriptor of EventDescriptors) {
|
|
375
369
|
// @ts-ignore Dispatcher magic
|
|
376
370
|
this[descriptor[1]] = this.dispatch.bind(this, descriptor[0], descriptor[2], descriptor[3]);
|
|
@@ -378,35 +372,27 @@ class InspectorFrontendAPIImpl {
|
|
|
378
372
|
}
|
|
379
373
|
|
|
380
374
|
private dispatch(name: symbol, signature: string[], runOnceLoaded: boolean, ...params: string[]): void {
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
} else {
|
|
384
|
-
innerDispatch();
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
function innerDispatch(): void {
|
|
388
|
-
// Single argument methods get dispatched with the param.
|
|
389
|
-
if (signature.length < 2) {
|
|
390
|
-
try {
|
|
391
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
392
|
-
InspectorFrontendHostInstance.events.dispatchEventToListeners<any>(name, params[0]);
|
|
393
|
-
} catch (error) {
|
|
394
|
-
console.error(error + ' ' + error.stack);
|
|
395
|
-
}
|
|
396
|
-
return;
|
|
397
|
-
}
|
|
398
|
-
const data: {
|
|
399
|
-
[x: string]: string,
|
|
400
|
-
} = {};
|
|
401
|
-
for (let i = 0; i < signature.length; ++i) {
|
|
402
|
-
data[signature[i]] = params[i];
|
|
403
|
-
}
|
|
375
|
+
// Single argument methods get dispatched with the param.
|
|
376
|
+
if (signature.length < 2) {
|
|
404
377
|
try {
|
|
405
378
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
406
|
-
InspectorFrontendHostInstance.events.dispatchEventToListeners<any>(name,
|
|
379
|
+
InspectorFrontendHostInstance.events.dispatchEventToListeners<any>(name, params[0]);
|
|
407
380
|
} catch (error) {
|
|
408
381
|
console.error(error + ' ' + error.stack);
|
|
409
382
|
}
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
const data: {
|
|
386
|
+
[x: string]: string,
|
|
387
|
+
} = {};
|
|
388
|
+
for (let i = 0; i < signature.length; ++i) {
|
|
389
|
+
data[signature[i]] = params[i];
|
|
390
|
+
}
|
|
391
|
+
try {
|
|
392
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
393
|
+
InspectorFrontendHostInstance.events.dispatchEventToListeners<any>(name, data);
|
|
394
|
+
} catch (error) {
|
|
395
|
+
console.error(error + ' ' + error.stack);
|
|
410
396
|
}
|
|
411
397
|
}
|
|
412
398
|
|
|
@@ -245,6 +245,22 @@ export class UserMetrics {
|
|
|
245
245
|
InspectorFrontendHostInstance.recordEnumeratedHistogram(
|
|
246
246
|
EnumeratedHistogram.ConsoleShowsCorsErrors, Number(show), 2);
|
|
247
247
|
}
|
|
248
|
+
|
|
249
|
+
syncSetting(devtoolsSyncSettingEnabled: boolean): void {
|
|
250
|
+
const size = Object.keys(SyncSetting).length + 1;
|
|
251
|
+
|
|
252
|
+
InspectorFrontendHostInstance.getSyncInformation(syncInfo => {
|
|
253
|
+
let settingValue = SyncSetting.ChromeSyncDisabled;
|
|
254
|
+
if (syncInfo.isSyncActive && !syncInfo.arePreferencesSynced) {
|
|
255
|
+
settingValue = SyncSetting.ChromeSyncSettingsDisabled;
|
|
256
|
+
} else if (syncInfo.isSyncActive && syncInfo.arePreferencesSynced) {
|
|
257
|
+
settingValue = devtoolsSyncSettingEnabled ? SyncSetting.DevToolsSyncSettingEnabled :
|
|
258
|
+
SyncSetting.DevToolsSyncSettingDisabled;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
InspectorFrontendHostInstance.recordEnumeratedHistogram(EnumeratedHistogram.SyncSetting, settingValue, size);
|
|
262
|
+
});
|
|
263
|
+
}
|
|
248
264
|
}
|
|
249
265
|
|
|
250
266
|
// Codes below are used to collect UMA histograms in the Chromium port.
|
|
@@ -800,3 +816,12 @@ export const Language: Record<string, number> = {
|
|
|
800
816
|
'zh-TW': 81,
|
|
801
817
|
'zu': 82,
|
|
802
818
|
};
|
|
819
|
+
|
|
820
|
+
// TODO(crbug.com/1167717): Make this a const enum again
|
|
821
|
+
// eslint-disable-next-line rulesdir/const_enum
|
|
822
|
+
export enum SyncSetting {
|
|
823
|
+
ChromeSyncDisabled = 1,
|
|
824
|
+
ChromeSyncSettingsDisabled = 2,
|
|
825
|
+
DevToolsSyncSettingDisabled = 3,
|
|
826
|
+
DevToolsSyncSettingEnabled = 4,
|
|
827
|
+
}
|
|
@@ -935,6 +935,9 @@
|
|
|
935
935
|
"entrypoints/inspector_main/RenderingOptions.ts | forcesCssColorgamutMediaFeature": {
|
|
936
936
|
"message": "Forces CSS color-gamut media feature"
|
|
937
937
|
},
|
|
938
|
+
"entrypoints/inspector_main/RenderingOptions.ts | forcesCssForcedColors": {
|
|
939
|
+
"message": "Forces CSS forced-colors media feature"
|
|
940
|
+
},
|
|
938
941
|
"entrypoints/inspector_main/RenderingOptions.ts | forcesCssPreferscolorschemeMedia": {
|
|
939
942
|
"message": "Forces CSS prefers-color-scheme media feature"
|
|
940
943
|
},
|
|
@@ -9147,7 +9150,7 @@
|
|
|
9147
9150
|
"message": "Coverage: n/a"
|
|
9148
9151
|
},
|
|
9149
9152
|
"panels/sources/CoveragePlugin.ts | coverageS": {
|
|
9150
|
-
"message": "Coverage: {PH1}
|
|
9153
|
+
"message": "Coverage: {PH1}"
|
|
9151
9154
|
},
|
|
9152
9155
|
"panels/sources/CoveragePlugin.ts | showDetails": {
|
|
9153
9156
|
"message": "Show Details"
|
|
@@ -935,6 +935,9 @@
|
|
|
935
935
|
"entrypoints/inspector_main/RenderingOptions.ts | forcesCssColorgamutMediaFeature": {
|
|
936
936
|
"message": "F̂ór̂ćêś ĈŚŜ color-gamut ḿêd́îá f̂éât́ûŕê"
|
|
937
937
|
},
|
|
938
|
+
"entrypoints/inspector_main/RenderingOptions.ts | forcesCssForcedColors": {
|
|
939
|
+
"message": "F̂ór̂ćêś ĈŚŜ f́ôŕĉéd̂-ćôĺôŕŝ ḿêd́îá f̂éât́ûŕê"
|
|
940
|
+
},
|
|
938
941
|
"entrypoints/inspector_main/RenderingOptions.ts | forcesCssPreferscolorschemeMedia": {
|
|
939
942
|
"message": "F̂ór̂ćêś ĈŚŜ prefers-color-scheme ḿêd́îá f̂éât́ûŕê"
|
|
940
943
|
},
|
|
@@ -9147,7 +9150,7 @@
|
|
|
9147
9150
|
"message": "Ĉóv̂ér̂áĝé: n̂/á"
|
|
9148
9151
|
},
|
|
9149
9152
|
"panels/sources/CoveragePlugin.ts | coverageS": {
|
|
9150
|
-
"message": "Ĉóv̂ér̂áĝé: {PH1}
|
|
9153
|
+
"message": "Ĉóv̂ér̂áĝé: {PH1}"
|
|
9151
9154
|
},
|
|
9152
9155
|
"panels/sources/CoveragePlugin.ts | showDetails": {
|
|
9153
9156
|
"message": "Ŝh́ôẃ D̂ét̂áîĺŝ"
|
|
@@ -47,6 +47,7 @@ import {CSSStyleDeclaration, Type} from './CSSStyleDeclaration.js';
|
|
|
47
47
|
import {CSSStyleSheetHeader} from './CSSStyleSheetHeader.js';
|
|
48
48
|
import type {DOMNode} from './DOMModel.js';
|
|
49
49
|
import {DOMModel} from './DOMModel.js';
|
|
50
|
+
import type {ResourceTreeFrame} from './ResourceTreeModel.js';
|
|
50
51
|
import {Events as ResourceTreeModelEvents, ResourceTreeModel} from './ResourceTreeModel.js';
|
|
51
52
|
import type {Target} from './Target.js';
|
|
52
53
|
import {Capability} from './Target.js';
|
|
@@ -54,37 +55,37 @@ import {SDKModel} from './SDKModel.js';
|
|
|
54
55
|
import {SourceMapManager} from './SourceMapManager.js';
|
|
55
56
|
|
|
56
57
|
export class CSSModel extends SDKModel<EventTypes> {
|
|
57
|
-
|
|
58
|
-
#
|
|
59
|
-
#
|
|
60
|
-
readonly #
|
|
61
|
-
readonly #sourceMapManagerInternal: SourceMapManager<CSSStyleSheetHeader>;
|
|
62
|
-
agent: ProtocolProxyApi.CSSApi;
|
|
63
|
-
readonly #styleLoader: ComputedStyleLoader;
|
|
58
|
+
readonly agent: ProtocolProxyApi.CSSApi;
|
|
59
|
+
readonly #domModel: DOMModel;
|
|
60
|
+
readonly #fontFaces: Map<string, CSSFontFace>;
|
|
61
|
+
readonly #originalStyleSheetText: Map<CSSStyleSheetHeader, Promise<string|null>>;
|
|
64
62
|
readonly #resourceTreeModel: ResourceTreeModel|null;
|
|
65
|
-
#
|
|
63
|
+
readonly #sourceMapManager: SourceMapManager<CSSStyleSheetHeader>;
|
|
64
|
+
readonly #styleLoader: ComputedStyleLoader;
|
|
65
|
+
readonly #stylePollingThrottler: Common.Throttler.Throttler;
|
|
66
66
|
readonly #styleSheetIdsForURL: Map<string, Map<string, Set<Protocol.CSS.StyleSheetId>>>;
|
|
67
|
-
readonly #
|
|
68
|
-
#
|
|
69
|
-
|
|
67
|
+
readonly #styleSheetIdToHeader: Map<Protocol.CSS.StyleSheetId, CSSStyleSheetHeader>;
|
|
68
|
+
#cachedMatchedCascadeNode: DOMNode|null;
|
|
69
|
+
#cachedMatchedCascadePromise: Promise<CSSMatchedStyles|null>|null;
|
|
70
70
|
#cssPropertyTracker: CSSPropertyTracker|null;
|
|
71
71
|
#isCSSPropertyTrackingEnabled: boolean;
|
|
72
|
+
#isEnabled: boolean;
|
|
73
|
+
#isRuleUsageTrackingEnabled: boolean;
|
|
72
74
|
#isTrackingRequestPending: boolean;
|
|
73
|
-
readonly #trackedCSSProperties: Map<number, Protocol.CSS.CSSComputedStyleProperty[]>;
|
|
74
|
-
readonly #stylePollingThrottler: Common.Throttler.Throttler;
|
|
75
75
|
|
|
76
76
|
constructor(target: Target) {
|
|
77
77
|
super(target);
|
|
78
|
-
this.#
|
|
78
|
+
this.#isEnabled = false;
|
|
79
79
|
this.#cachedMatchedCascadeNode = null;
|
|
80
80
|
this.#cachedMatchedCascadePromise = null;
|
|
81
|
-
this.#
|
|
82
|
-
this.#
|
|
81
|
+
this.#domModel = (target.model(DOMModel) as DOMModel);
|
|
82
|
+
this.#sourceMapManager = new SourceMapManager(target);
|
|
83
83
|
this.agent = target.cssAgent();
|
|
84
84
|
this.#styleLoader = new ComputedStyleLoader(this);
|
|
85
85
|
this.#resourceTreeModel = target.model(ResourceTreeModel);
|
|
86
86
|
if (this.#resourceTreeModel) {
|
|
87
|
-
this.#resourceTreeModel.addEventListener(
|
|
87
|
+
this.#resourceTreeModel.addEventListener(
|
|
88
|
+
ResourceTreeModelEvents.MainFrameNavigated, this.onMainFrameNavigated, this);
|
|
88
89
|
}
|
|
89
90
|
target.registerCSSDispatcher(new CSSDispatcher(this));
|
|
90
91
|
if (!target.suspended()) {
|
|
@@ -93,23 +94,21 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
93
94
|
this.#styleSheetIdToHeader = new Map();
|
|
94
95
|
this.#styleSheetIdsForURL = new Map();
|
|
95
96
|
|
|
96
|
-
this.#
|
|
97
|
+
this.#originalStyleSheetText = new Map();
|
|
97
98
|
|
|
98
99
|
this.#isRuleUsageTrackingEnabled = false;
|
|
99
100
|
|
|
100
|
-
this.#
|
|
101
|
+
this.#fontFaces = new Map();
|
|
101
102
|
|
|
102
103
|
this.#cssPropertyTracker = null; // TODO: support multiple trackers when we refactor the backend
|
|
103
104
|
this.#isCSSPropertyTrackingEnabled = false;
|
|
104
105
|
this.#isTrackingRequestPending = false;
|
|
105
|
-
this.#trackedCSSProperties = new Map();
|
|
106
106
|
this.#stylePollingThrottler = new Common.Throttler.Throttler(StylePollingInterval);
|
|
107
107
|
|
|
108
|
-
this.#
|
|
109
|
-
Common.Settings.Settings.instance().moduleSetting('cssSourceMapsEnabled').get());
|
|
108
|
+
this.#sourceMapManager.setEnabled(Common.Settings.Settings.instance().moduleSetting('cssSourceMapsEnabled').get());
|
|
110
109
|
Common.Settings.Settings.instance()
|
|
111
110
|
.moduleSetting('cssSourceMapsEnabled')
|
|
112
|
-
.addChangeListener(event => this.#
|
|
111
|
+
.addChangeListener(event => this.#sourceMapManager.setEnabled((event.data as boolean)));
|
|
113
112
|
}
|
|
114
113
|
|
|
115
114
|
headersForSourceURL(sourceURL: string): CSSStyleSheetHeader[] {
|
|
@@ -148,7 +147,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
148
147
|
}
|
|
149
148
|
|
|
150
149
|
sourceMapManager(): SourceMapManager<CSSStyleSheetHeader> {
|
|
151
|
-
return this.#
|
|
150
|
+
return this.#sourceMapManager;
|
|
152
151
|
}
|
|
153
152
|
|
|
154
153
|
static trimSourceURL(text: string): string {
|
|
@@ -172,7 +171,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
172
171
|
}
|
|
173
172
|
|
|
174
173
|
domModel(): DOMModel {
|
|
175
|
-
return this.#
|
|
174
|
+
return this.#domModel;
|
|
176
175
|
}
|
|
177
176
|
|
|
178
177
|
async setStyleText(
|
|
@@ -187,7 +186,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
187
186
|
return false;
|
|
188
187
|
}
|
|
189
188
|
|
|
190
|
-
this.#
|
|
189
|
+
this.#domModel.markUndoableState(!majorChange);
|
|
191
190
|
const edit = new Edit(styleSheetId, range, text, styles[0]);
|
|
192
191
|
this.fireStyleSheetChanged(styleSheetId, edit);
|
|
193
192
|
return true;
|
|
@@ -207,7 +206,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
207
206
|
if (!selectorList) {
|
|
208
207
|
return false;
|
|
209
208
|
}
|
|
210
|
-
this.#
|
|
209
|
+
this.#domModel.markUndoableState();
|
|
211
210
|
const edit = new Edit(styleSheetId, range, text, selectorList);
|
|
212
211
|
this.fireStyleSheetChanged(styleSheetId, edit);
|
|
213
212
|
return true;
|
|
@@ -227,7 +226,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
227
226
|
if (!keyText) {
|
|
228
227
|
return false;
|
|
229
228
|
}
|
|
230
|
-
this.#
|
|
229
|
+
this.#domModel.markUndoableState();
|
|
231
230
|
const edit = new Edit(styleSheetId, range, text, keyText);
|
|
232
231
|
this.fireStyleSheetChanged(styleSheetId, edit);
|
|
233
232
|
return true;
|
|
@@ -268,12 +267,12 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
268
267
|
}
|
|
269
268
|
|
|
270
269
|
isEnabled(): boolean {
|
|
271
|
-
return this.#
|
|
270
|
+
return this.#isEnabled;
|
|
272
271
|
}
|
|
273
272
|
|
|
274
273
|
private async enable(): Promise<void> {
|
|
275
274
|
await this.agent.invoke_enable();
|
|
276
|
-
this.#
|
|
275
|
+
this.#isEnabled = true;
|
|
277
276
|
if (this.#isRuleUsageTrackingEnabled) {
|
|
278
277
|
await this.startCoverage();
|
|
279
278
|
}
|
|
@@ -287,7 +286,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
287
286
|
return null;
|
|
288
287
|
}
|
|
289
288
|
|
|
290
|
-
const node = this.#
|
|
289
|
+
const node = this.#domModel.nodeForId(nodeId);
|
|
291
290
|
if (!node) {
|
|
292
291
|
return null;
|
|
293
292
|
}
|
|
@@ -399,7 +398,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
399
398
|
if (!media) {
|
|
400
399
|
return false;
|
|
401
400
|
}
|
|
402
|
-
this.#
|
|
401
|
+
this.#domModel.markUndoableState();
|
|
403
402
|
const edit = new Edit(styleSheetId, range, newMediaText, media);
|
|
404
403
|
this.fireStyleSheetChanged(styleSheetId, edit);
|
|
405
404
|
return true;
|
|
@@ -421,7 +420,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
421
420
|
if (!containerQuery) {
|
|
422
421
|
return false;
|
|
423
422
|
}
|
|
424
|
-
this.#
|
|
423
|
+
this.#domModel.markUndoableState();
|
|
425
424
|
const edit = new Edit(styleSheetId, range, newContainerQueryText, containerQuery);
|
|
426
425
|
this.fireStyleSheetChanged(styleSheetId, edit);
|
|
427
426
|
return true;
|
|
@@ -439,7 +438,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
439
438
|
if (!rule) {
|
|
440
439
|
return null;
|
|
441
440
|
}
|
|
442
|
-
this.#
|
|
441
|
+
this.#domModel.markUndoableState();
|
|
443
442
|
const edit = new Edit(styleSheetId, ruleLocation, ruleText, rule);
|
|
444
443
|
this.fireStyleSheetChanged(styleSheetId, edit);
|
|
445
444
|
return new CSSStyleRule(this, rule);
|
|
@@ -477,13 +476,13 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
477
476
|
|
|
478
477
|
fontsUpdated(fontFace?: Protocol.CSS.FontFace|null): void {
|
|
479
478
|
if (fontFace) {
|
|
480
|
-
this.#
|
|
479
|
+
this.#fontFaces.set(fontFace.src, new CSSFontFace(fontFace));
|
|
481
480
|
}
|
|
482
481
|
this.dispatchEventToListeners(Events.FontsUpdated);
|
|
483
482
|
}
|
|
484
483
|
|
|
485
484
|
fontFaces(): CSSFontFace[] {
|
|
486
|
-
return [...this.#
|
|
485
|
+
return [...this.#fontFaces.values()];
|
|
487
486
|
}
|
|
488
487
|
|
|
489
488
|
styleSheetHeaderForId(id: Protocol.CSS.StyleSheetId): CSSStyleSheetHeader|null {
|
|
@@ -503,10 +502,10 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
503
502
|
if (!header) {
|
|
504
503
|
return Promise.resolve(null);
|
|
505
504
|
}
|
|
506
|
-
let promise = this.#
|
|
505
|
+
let promise = this.#originalStyleSheetText.get(header);
|
|
507
506
|
if (!promise) {
|
|
508
507
|
promise = this.getStyleSheetText(header.id);
|
|
509
|
-
this.#
|
|
508
|
+
this.#originalStyleSheetText.set(header, promise);
|
|
510
509
|
this.originalContentRequestedForTest(header);
|
|
511
510
|
}
|
|
512
511
|
return promise;
|
|
@@ -541,8 +540,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
541
540
|
}
|
|
542
541
|
styleSheetIds.add(styleSheetHeader.id);
|
|
543
542
|
}
|
|
544
|
-
this.#
|
|
545
|
-
styleSheetHeader, styleSheetHeader.sourceURL, styleSheetHeader.sourceMapURL);
|
|
543
|
+
this.#sourceMapManager.attachSourceMap(styleSheetHeader, styleSheetHeader.sourceURL, styleSheetHeader.sourceMapURL);
|
|
546
544
|
this.dispatchEventToListeners(Events.StyleSheetAdded, styleSheetHeader);
|
|
547
545
|
}
|
|
548
546
|
|
|
@@ -569,8 +567,8 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
569
567
|
}
|
|
570
568
|
}
|
|
571
569
|
}
|
|
572
|
-
this.#
|
|
573
|
-
this.#
|
|
570
|
+
this.#originalStyleSheetText.delete(header);
|
|
571
|
+
this.#sourceMapManager.detachSourceMap(header);
|
|
574
572
|
this.dispatchEventToListeners(Events.StyleSheetRemoved, header);
|
|
575
573
|
}
|
|
576
574
|
|
|
@@ -602,13 +600,13 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
602
600
|
const response = await this.agent.invoke_setStyleSheetText({styleSheetId: header.id, text: newText});
|
|
603
601
|
const sourceMapURL = response.sourceMapURL;
|
|
604
602
|
|
|
605
|
-
this.#
|
|
603
|
+
this.#sourceMapManager.detachSourceMap(header);
|
|
606
604
|
header.setSourceMapURL(sourceMapURL);
|
|
607
|
-
this.#
|
|
605
|
+
this.#sourceMapManager.attachSourceMap(header, header.sourceURL, header.sourceMapURL);
|
|
608
606
|
if (sourceMapURL === null) {
|
|
609
607
|
return 'Error in CSS.setStyleSheetText';
|
|
610
608
|
}
|
|
611
|
-
this.#
|
|
609
|
+
this.#domModel.markUndoableState(!majorChange);
|
|
612
610
|
this.fireStyleSheetChanged(styleSheetId);
|
|
613
611
|
return null;
|
|
614
612
|
}
|
|
@@ -622,22 +620,38 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
622
620
|
}
|
|
623
621
|
}
|
|
624
622
|
|
|
623
|
+
private async onMainFrameNavigated(event: Common.EventTarget.EventTargetEvent<ResourceTreeFrame>): Promise<void> {
|
|
624
|
+
// If the main frame was restored from the back-forward cache, the order of CDP
|
|
625
|
+
// is different from the regular navigations. In this case, events about CSS
|
|
626
|
+
// stylesheet has already been received and they are mixed with the previous page
|
|
627
|
+
// stylesheets. Therefore, we re-enable the CSS agent to get fresh events.
|
|
628
|
+
// For the regular navigatons, we can just clear the local data because events about
|
|
629
|
+
// stylesheets will arrive later.
|
|
630
|
+
if (event.data.backForwardCacheDetails.restoredFromCache) {
|
|
631
|
+
await this.suspendModel();
|
|
632
|
+
await this.resumeModel();
|
|
633
|
+
} else {
|
|
634
|
+
this.resetStyleSheets();
|
|
635
|
+
this.resetFontFaces();
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
|
|
625
639
|
private resetStyleSheets(): void {
|
|
626
640
|
const headers = [...this.#styleSheetIdToHeader.values()];
|
|
627
641
|
this.#styleSheetIdsForURL.clear();
|
|
628
642
|
this.#styleSheetIdToHeader.clear();
|
|
629
643
|
for (const header of headers) {
|
|
630
|
-
this.#
|
|
644
|
+
this.#sourceMapManager.detachSourceMap(header);
|
|
631
645
|
this.dispatchEventToListeners(Events.StyleSheetRemoved, header);
|
|
632
646
|
}
|
|
633
647
|
}
|
|
634
648
|
|
|
635
649
|
private resetFontFaces(): void {
|
|
636
|
-
this.#
|
|
650
|
+
this.#fontFaces.clear();
|
|
637
651
|
}
|
|
638
652
|
|
|
639
653
|
async suspendModel(): Promise<void> {
|
|
640
|
-
this.#
|
|
654
|
+
this.#isEnabled = false;
|
|
641
655
|
await this.agent.invoke_disable();
|
|
642
656
|
this.resetStyleSheets();
|
|
643
657
|
this.resetFontFaces();
|
|
@@ -713,7 +727,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
713
727
|
if (this.#cssPropertyTracker) {
|
|
714
728
|
this.#cssPropertyTracker.dispatchEventToListeners(
|
|
715
729
|
CSSPropertyTrackerEvents.TrackedCSSPropertiesUpdated,
|
|
716
|
-
result.nodeIds.map(nodeId => this.#
|
|
730
|
+
result.nodeIds.map(nodeId => this.#domModel.nodeForId(nodeId)));
|
|
717
731
|
}
|
|
718
732
|
}
|
|
719
733
|
|
|
@@ -725,7 +739,7 @@ export class CSSModel extends SDKModel<EventTypes> {
|
|
|
725
739
|
dispose(): void {
|
|
726
740
|
this.disableCSSPropertyTracker();
|
|
727
741
|
super.dispose();
|
|
728
|
-
this.#
|
|
742
|
+
this.#sourceMapManager.dispose();
|
|
729
743
|
}
|
|
730
744
|
|
|
731
745
|
getAgent(): ProtocolProxyApi.CSSApi {
|
|
@@ -76,6 +76,8 @@ export class EmulationModel extends SDKModel<void> {
|
|
|
76
76
|
Common.Settings.Settings.instance().moduleSetting<string>('emulatedCSSMediaFeatureColorGamut');
|
|
77
77
|
const mediaFeaturePrefersColorSchemeSetting =
|
|
78
78
|
Common.Settings.Settings.instance().moduleSetting<string>('emulatedCSSMediaFeaturePrefersColorScheme');
|
|
79
|
+
const mediaFeatureForcedColorsSetting =
|
|
80
|
+
Common.Settings.Settings.instance().moduleSetting('emulatedCSSMediaFeatureForcedColors');
|
|
79
81
|
const mediaFeaturePrefersContrastSetting =
|
|
80
82
|
Common.Settings.Settings.instance().moduleSetting<string>('emulatedCSSMediaFeaturePrefersContrast');
|
|
81
83
|
const mediaFeaturePrefersReducedDataSetting =
|
|
@@ -90,6 +92,7 @@ export class EmulationModel extends SDKModel<void> {
|
|
|
90
92
|
['type', mediaTypeSetting.get()],
|
|
91
93
|
['color-gamut', mediaFeatureColorGamutSetting.get()],
|
|
92
94
|
['prefers-color-scheme', mediaFeaturePrefersColorSchemeSetting.get()],
|
|
95
|
+
['forced-colors', mediaFeatureForcedColorsSetting.get()],
|
|
93
96
|
['prefers-contrast', mediaFeaturePrefersContrastSetting.get()],
|
|
94
97
|
['prefers-reduced-data', mediaFeaturePrefersReducedDataSetting.get()],
|
|
95
98
|
['prefers-reduced-motion', mediaFeaturePrefersReducedMotionSetting.get()],
|
|
@@ -106,6 +109,10 @@ export class EmulationModel extends SDKModel<void> {
|
|
|
106
109
|
this.#mediaConfiguration.set('prefers-color-scheme', mediaFeaturePrefersColorSchemeSetting.get());
|
|
107
110
|
this.updateCssMedia();
|
|
108
111
|
});
|
|
112
|
+
mediaFeatureForcedColorsSetting.addChangeListener(() => {
|
|
113
|
+
this.#mediaConfiguration.set('forced-colors', mediaFeatureForcedColorsSetting.get());
|
|
114
|
+
this.updateCssMedia();
|
|
115
|
+
});
|
|
109
116
|
mediaFeaturePrefersContrastSetting.addChangeListener(() => {
|
|
110
117
|
this.#mediaConfiguration.set('prefers-contrast', mediaFeaturePrefersContrastSetting.get());
|
|
111
118
|
this.updateCssMedia();
|
|
@@ -367,6 +374,10 @@ export class EmulationModel extends SDKModel<void> {
|
|
|
367
374
|
name: 'prefers-color-scheme',
|
|
368
375
|
value: this.#mediaConfiguration.get('prefers-color-scheme') ?? '',
|
|
369
376
|
},
|
|
377
|
+
{
|
|
378
|
+
name: 'forced-colors',
|
|
379
|
+
value: this.#mediaConfiguration.get('forced-colors') ?? '',
|
|
380
|
+
},
|
|
370
381
|
{
|
|
371
382
|
name: 'prefers-contrast',
|
|
372
383
|
value: this.#mediaConfiguration.get('prefers-contrast') ?? '',
|