chrome-devtools-frontend 1.0.1698733 → 1.0.1700561
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/.agents/skills/devtools-verification/SKILL.md +19 -0
- package/.agents/skills/{repro-flaky-tests → fix-tests}/SKILL.md +2 -2
- package/front_end/core/sdk/CSSPropertyParserMatchers.ts +2 -2
- package/front_end/core/sdk/DOMModel.ts +3 -5
- package/front_end/core/sdk/NetworkManager.ts +2 -2
- package/front_end/core/sdk/OverlayModel.ts +11 -12
- package/front_end/core/sdk/ServiceWorkerCacheModel.ts +3 -0
- package/front_end/core/sdk/SourceMapScopeChainEntry.ts +84 -32
- package/front_end/core/sdk/StorageBucketsModel.ts +2 -0
- package/front_end/entrypoints/main/GlobalAiButton.ts +2 -6
- package/front_end/entrypoints/main/MainImpl.ts +8 -1
- package/front_end/generated/InspectorBackendCommands.ts +12 -2
- package/front_end/generated/SupportedCSSProperties.ts +14 -0
- package/front_end/generated/protocol-mapping.d.ts +48 -1
- package/front_end/generated/protocol-proxy-api.d.ts +37 -1
- package/front_end/generated/protocol.ts +131 -0
- package/front_end/models/bindings/NetworkProject.ts +30 -0
- package/front_end/models/bindings/ResourceScriptMapping.ts +62 -0
- package/front_end/models/change_tracker/ChangeTracker.ts +1 -1
- package/front_end/models/comment_manager/CD4ABridge.ts +2 -2
- package/front_end/models/comment_manager/CommentManager.ts +18 -0
- package/front_end/models/emulation/DeviceModeModel.ts +1 -1
- package/front_end/models/extensions/ExtensionAPI.ts +4 -2
- package/front_end/models/issues_manager/CookieIssue.ts +0 -15
- package/front_end/models/persistence/NetworkPersistenceManager.ts +29 -4
- package/front_end/models/source_map_scopes/NamesResolver.ts +34 -4
- package/front_end/models/source_map_scopes/ScopeChainModel.ts +31 -7
- package/front_end/panels/accessibility/AccessibilityAnnouncementRecordingView.ts +281 -3
- package/front_end/panels/accessibility/accessibilityAnnouncementRecordingView.css +85 -0
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +1 -2
- package/front_end/panels/ai_assistance/ai_assistance-meta.ts +5 -8
- package/front_end/panels/animation/AnimationTimeline.ts +1 -1
- package/front_end/panels/application/AppManifestView.ts +128 -134
- package/front_end/panels/application/CrashReportContextView.ts +6 -6
- package/front_end/panels/application/DeviceBoundSessionsTreeElement.ts +17 -17
- package/front_end/panels/application/DeviceBoundSessionsView.ts +136 -137
- package/front_end/panels/application/IndexedDBModel.ts +3 -0
- package/front_end/panels/application/IndexedDBViews.ts +1 -1
- package/front_end/panels/application/KeyValueStorageItemsView.ts +1 -0
- package/front_end/panels/application/OriginTrialTreeView.ts +18 -23
- package/front_end/panels/application/ReportingApiTreeElement.ts +3 -3
- package/front_end/panels/application/ReportingApiView.ts +6 -14
- package/front_end/panels/application/application-meta.ts +7 -7
- package/front_end/panels/application/components/AdsView.ts +63 -1
- package/front_end/panels/application/components/adsView.css +11 -1
- package/front_end/panels/common/CommentThreadWidget.ts +20 -22
- package/front_end/panels/common/CommentsOverlayWidget.ts +115 -9
- package/front_end/panels/common/CommentsStatusBarPill.ts +13 -1
- package/front_end/panels/common/ExtensionServer.ts +43 -34
- package/front_end/panels/common/GeminiRebrandPromoDialog.ts +1 -1
- package/front_end/panels/common/commentThreadWidget.css +6 -0
- package/front_end/panels/common/common-meta.ts +4 -1
- package/front_end/panels/elements/CSSRuleValidator.ts +1 -1
- package/front_end/panels/elements/ElementsPanel.ts +4 -4
- package/front_end/panels/elements/ElementsTreeElement.ts +9 -2
- package/front_end/panels/elements/ElementsTreeOutline.ts +25 -33
- package/front_end/panels/elements/elementsTreeOutline.css +8 -4
- package/front_end/panels/event_listeners/EventListenersView.ts +9 -4
- package/front_end/panels/issues/IssuesPane.ts +34 -22
- package/front_end/panels/lighthouse/LighthouseController.ts +1 -1
- package/front_end/panels/mobile_throttling/NetworkPanelIndicator.ts +1 -1
- package/front_end/panels/mobile_throttling/ThrottlingManager.ts +1 -1
- package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +1 -1
- package/front_end/panels/network/RequestPayloadView.ts +17 -15
- package/front_end/panels/recorder/RecordingView.ts +32 -53
- package/front_end/panels/recorder/StepView.ts +19 -4
- package/front_end/panels/recorder/TimelineSection.ts +1 -1
- package/front_end/panels/recorder/controlButton.css +6 -0
- package/front_end/panels/recorder/recordingView.css +11 -2
- package/front_end/panels/settings/BackendLinkingSettingsTab.ts +2 -1
- package/front_end/panels/settings/EditFileSystemView.ts +1 -1
- package/front_end/panels/sources/CallStackSidebarPane.ts +1 -1
- package/front_end/panels/sources/DebuggerPlugin.ts +137 -56
- package/front_end/panels/sources/ScopeChainSidebarPane.ts +17 -15
- package/front_end/panels/timeline/components/DetailsView.ts +3 -3
- package/front_end/panels/timeline/components/IgnoreListSetting.ts +0 -2
- package/front_end/panels/timeline/components/LiveMetricsView.ts +59 -64
- package/front_end/panels/timeline/components/OriginMap.ts +1 -1
- package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +2 -3
- package/front_end/panels/timeline/components/liveMetricsView.css +1 -0
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/lighthouse/README.chromium +2 -2
- package/front_end/third_party/lighthouse/lighthouse-dt-bundle.js +1580 -1524
- package/front_end/third_party/lighthouse/locales/ar-XB.json +111 -72
- package/front_end/third_party/lighthouse/locales/ar.json +113 -74
- package/front_end/third_party/lighthouse/locales/bg.json +112 -73
- package/front_end/third_party/lighthouse/locales/ca.json +112 -73
- package/front_end/third_party/lighthouse/locales/cs.json +112 -73
- package/front_end/third_party/lighthouse/locales/da.json +112 -73
- package/front_end/third_party/lighthouse/locales/de.json +112 -73
- package/front_end/third_party/lighthouse/locales/el.json +112 -73
- package/front_end/third_party/lighthouse/locales/en-GB.json +111 -72
- package/front_end/third_party/lighthouse/locales/en-US.json +102 -66
- package/front_end/third_party/lighthouse/locales/en-XA.json +111 -72
- package/front_end/third_party/lighthouse/locales/en-XL.json +102 -66
- package/front_end/third_party/lighthouse/locales/es-419.json +112 -73
- package/front_end/third_party/lighthouse/locales/es.json +112 -73
- package/front_end/third_party/lighthouse/locales/fi.json +112 -73
- package/front_end/third_party/lighthouse/locales/fil.json +112 -73
- package/front_end/third_party/lighthouse/locales/fr.json +112 -73
- package/front_end/third_party/lighthouse/locales/he.json +112 -73
- package/front_end/third_party/lighthouse/locales/hi.json +112 -73
- package/front_end/third_party/lighthouse/locales/hr.json +112 -73
- package/front_end/third_party/lighthouse/locales/hu.json +112 -73
- package/front_end/third_party/lighthouse/locales/id.json +112 -73
- package/front_end/third_party/lighthouse/locales/it.json +113 -74
- package/front_end/third_party/lighthouse/locales/ja.json +112 -73
- package/front_end/third_party/lighthouse/locales/ko.json +112 -73
- package/front_end/third_party/lighthouse/locales/lt.json +112 -73
- package/front_end/third_party/lighthouse/locales/lv.json +112 -73
- package/front_end/third_party/lighthouse/locales/nl.json +112 -73
- package/front_end/third_party/lighthouse/locales/no.json +112 -73
- package/front_end/third_party/lighthouse/locales/pl.json +112 -73
- package/front_end/third_party/lighthouse/locales/pt-PT.json +112 -73
- package/front_end/third_party/lighthouse/locales/pt.json +112 -73
- package/front_end/third_party/lighthouse/locales/ro.json +112 -73
- package/front_end/third_party/lighthouse/locales/ru.json +112 -73
- package/front_end/third_party/lighthouse/locales/sk.json +112 -73
- package/front_end/third_party/lighthouse/locales/sl.json +112 -73
- package/front_end/third_party/lighthouse/locales/sr-Latn.json +112 -73
- package/front_end/third_party/lighthouse/locales/sr.json +112 -73
- package/front_end/third_party/lighthouse/locales/sv.json +124 -85
- package/front_end/third_party/lighthouse/locales/ta.json +112 -73
- package/front_end/third_party/lighthouse/locales/te.json +112 -73
- package/front_end/third_party/lighthouse/locales/th.json +112 -73
- package/front_end/third_party/lighthouse/locales/tr.json +113 -74
- package/front_end/third_party/lighthouse/locales/uk.json +112 -73
- package/front_end/third_party/lighthouse/locales/vi.json +112 -73
- package/front_end/third_party/lighthouse/locales/zh-HK.json +112 -73
- package/front_end/third_party/lighthouse/locales/zh-TW.json +113 -74
- package/front_end/third_party/lighthouse/locales/zh.json +113 -74
- package/front_end/third_party/lighthouse/report/bundle.d.ts +4 -4
- package/front_end/third_party/lighthouse/report/bundle.js +10 -3
- package/front_end/third_party/lighthouse/report-assets/report-generator.mjs +2 -2
- package/front_end/third_party/lit/lit.ts +3 -0
- package/front_end/third_party/lit/package.json +3 -0
- package/front_end/third_party/lit/rebuild.sh +3 -2
- package/front_end/ui/comments/CommentAnchorResolver.ts +8 -2
- package/front_end/ui/comments/CommentOverlayManager.ts +2 -1
- package/front_end/ui/components/buttons/Button.ts +19 -1
- package/front_end/ui/legacy/ContextMenu.ts +16 -1
- package/front_end/ui/legacy/InspectorView.ts +4 -3
- package/front_end/ui/legacy/PlusButton.ts +5 -6
- package/front_end/ui/legacy/TabbedPane.ts +121 -80
- package/front_end/ui/legacy/Treeoutline.ts +37 -6
- package/front_end/ui/legacy/UIUtils.ts +7 -0
- package/front_end/ui/legacy/Widget.ts +33 -0
- package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +3 -0
- package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +14 -4
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +157 -171
- package/front_end/ui/lit/lit.ts +1 -1
- package/front_end/ui/visual_logging/KnownContextValues.ts +7 -0
- package/inspector_overlay/highlight_anchor.ts +197 -0
- package/inspector_overlay/tool_highlight.ts +8 -0
- package/package.json +1 -1
- package/.agents/skills/devtools-ci/SKILL.md +0 -65
- package/.agents/skills/evaluate-ai-css-completion/SKILL.md +0 -143
- package/.agents/skills/evaluate-ai-css-completion/scripts/evaluate.js +0 -104
- package/.agents/skills/fixing-skipped-tests/SKILL.md +0 -32
- package/.agents/skills/gerrit-cli/SKILL.md +0 -74
- package/.agents/skills/gerrit-cli/references/commands.md +0 -169
- package/.agents/skills/gerrit-cli/references/workflows.md +0 -63
- package/.agents/skills/gerrit-cli/scripts/import_upstream.py +0 -85
- package/front_end/models/issues_manager/descriptions/cookieExcludeBlockedWithinRelatedWebsiteSet.md +0 -4
|
@@ -20,6 +20,25 @@ description: "MANDATORY: Activate this skill ANY TIME you need to build the proj
|
|
|
20
20
|
- `npm run lint` will execute ESLint and StyleLint. It will report any violations and automatically fix them where possible.
|
|
21
21
|
- To run the linter on a specific file or directory, you can run `npm run lint -- <PATH>` where `PATH` is a path to a file or directory. This will also automatically fix violations where possible.
|
|
22
22
|
|
|
23
|
+
## Fetching Tryjob Results, Failure Logs, & Screenshot Goldens
|
|
24
|
+
|
|
25
|
+
Use `scripts/tools/get_cl_test_results.py` to fetch all tryjob build statuses, per-test failure logs, Blink web test text diffs, and screenshot artifacts (`actual_image`, `expected_image`, `image_diff`) for a CL in one command:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Fetch all build statuses, failure logs, and artifacts for a CL into an output directory:
|
|
29
|
+
scripts/tools/get_cl_test_results.py --cl <CL_NUMBER> --output-dir <OUTPUT_DIR>
|
|
30
|
+
|
|
31
|
+
# Filter for specific failing tests (e.g. DOMTreeWidget) or specific builders:
|
|
32
|
+
scripts/tools/get_cl_test_results.py --cl <CL_NUMBER> --test-filter "DOMTreeWidget" --output-dir <OUTPUT_DIR>
|
|
33
|
+
|
|
34
|
+
# Also apply Linux actual_image screenshot artifacts directly to test/goldens/linux/...:
|
|
35
|
+
scripts/tools/get_cl_test_results.py --cl <CL_NUMBER> --output-dir <OUTPUT_DIR> --apply-goldens
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Screenshot Golden & Inspection Rules
|
|
39
|
+
- **Linux-only goldens**: Never generate, update, or commit golden PNGs from macOS. Screenshot tests in DevTools only use Linux goldens (`test/goldens/linux/...`) produced by Linux trybots (`dtf_linux_rel` / `dtf_linux_dbg`). Do not run screenshot tests locally on macOS to verify goldens.
|
|
40
|
+
- **Multimodal inspection only**: Always inspect `actual_image.png`, `expected_image.png`, and `image_diff.png` directly using your multimodal file viewer (`view_file`). Never write or run programmatic image comparison scripts.
|
|
41
|
+
|
|
23
42
|
## Best practices
|
|
24
43
|
|
|
25
44
|
- Run tests often to verify your changes.
|
|
@@ -83,12 +83,12 @@ export class BaseVariableMatcher extends BaseVariableMatcherBase {
|
|
|
83
83
|
const nameNode = args[0][0];
|
|
84
84
|
const fallback = args.length === 2 ? args[1] : undefined;
|
|
85
85
|
|
|
86
|
-
if (nameNode?.name !== 'VariableName') {
|
|
86
|
+
if (nameNode?.name !== 'VariableName' && nameNode?.name !== 'ValueName') {
|
|
87
87
|
return null;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
const varName = matching.ast.text(nameNode);
|
|
91
|
-
if (!varName.startsWith('--')) {
|
|
91
|
+
if (!varName.startsWith('--') || varName.length <= 2) {
|
|
92
92
|
return null;
|
|
93
93
|
}
|
|
94
94
|
|
|
@@ -1319,12 +1319,10 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
|
|
|
1319
1319
|
return;
|
|
1320
1320
|
}
|
|
1321
1321
|
|
|
1322
|
-
|
|
1323
|
-
if
|
|
1324
|
-
return;
|
|
1325
|
-
}
|
|
1326
|
-
|
|
1322
|
+
// Highlight synchronously before scrolling to avoid out-of-order highlights
|
|
1323
|
+
// if asynchronous scroll calls resolve late during rapid navigation.
|
|
1327
1324
|
node.highlightForTwoSeconds();
|
|
1325
|
+
await node.callFunction(scrollIntoViewInPage);
|
|
1328
1326
|
}
|
|
1329
1327
|
|
|
1330
1328
|
async focus(): Promise<void> {
|
|
@@ -93,14 +93,14 @@ const UIStrings = {
|
|
|
93
93
|
* @example {GET} PH2
|
|
94
94
|
* @example {https://example.com} PH3
|
|
95
95
|
*/
|
|
96
|
-
sFailedLoadingSS: '{PH1} failed loading: {PH2} "{PH3}"
|
|
96
|
+
sFailedLoadingSS: '{PH1} failed loading: {PH2} "{PH3}"',
|
|
97
97
|
/**
|
|
98
98
|
* @description Console message when a request finished loading.
|
|
99
99
|
* @example {XHR} PH1
|
|
100
100
|
* @example {GET} PH2
|
|
101
101
|
* @example {https://example.com} PH3
|
|
102
102
|
*/
|
|
103
|
-
sFinishedLoadingSS: '{PH1} finished loading: {PH2} "{PH3}"
|
|
103
|
+
sFinishedLoadingSS: '{PH1} finished loading: {PH2} "{PH3}"',
|
|
104
104
|
/**
|
|
105
105
|
* @description One of direct socket connection statuses.
|
|
106
106
|
*/
|
|
@@ -342,13 +342,13 @@ export class OverlayModel extends SDKModel<EventTypes> implements ProtocolProxyA
|
|
|
342
342
|
// overlay, so that it is not cleared by the highlight
|
|
343
343
|
return;
|
|
344
344
|
}
|
|
345
|
-
|
|
346
|
-
|
|
345
|
+
clearTimeout(this.#hideHighlightTimeout);
|
|
346
|
+
this.#hideHighlightTimeout = undefined;
|
|
347
347
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
348
|
+
const highlightConfig = this.buildHighlightConfig(mode);
|
|
349
|
+
if (typeof showInfo !== 'undefined') {
|
|
350
|
+
highlightConfig.showInfo = showInfo;
|
|
351
|
+
}
|
|
352
352
|
this.#highlighter.highlightInOverlay(data, highlightConfig);
|
|
353
353
|
}
|
|
354
354
|
|
|
@@ -496,12 +496,11 @@ export class OverlayModel extends SDKModel<EventTypes> implements ProtocolProxyA
|
|
|
496
496
|
}
|
|
497
497
|
|
|
498
498
|
private delayedHideHighlight(delay: number): void {
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
}
|
|
499
|
+
clearTimeout(this.#hideHighlightTimeout);
|
|
500
|
+
this.#hideHighlightTimeout = globalThis.setTimeout(
|
|
501
|
+
() => this.highlightInOverlay({clear: true}),
|
|
502
|
+
delay,
|
|
503
|
+
);
|
|
505
504
|
}
|
|
506
505
|
|
|
507
506
|
highlightFrame(frameId: Protocol.Page.FrameId): void {
|
|
@@ -279,6 +279,9 @@ export class ServiceWorkerCacheModel extends SDKModel<EventTypes> implements Pro
|
|
|
279
279
|
storageBucketDeleted(_event: Protocol.Storage.StorageBucketDeletedEvent): void {
|
|
280
280
|
}
|
|
281
281
|
|
|
282
|
+
privateVerificationTokensUpdated(): void {
|
|
283
|
+
}
|
|
284
|
+
|
|
282
285
|
setThrottlerSchedulesAsSoonAsPossibleForTest(): void {
|
|
283
286
|
this.#scheduleAsSoonAsPossible = true;
|
|
284
287
|
}
|
|
@@ -46,6 +46,7 @@ export class SourceMapScopeChainEntry implements ScopeChainEntry {
|
|
|
46
46
|
readonly #isInnerMostFunction: boolean;
|
|
47
47
|
readonly #returnValue?: RemoteObject;
|
|
48
48
|
readonly #scopeNumber?: number;
|
|
49
|
+
#object?: SourceMapScopeRemoteObject;
|
|
49
50
|
|
|
50
51
|
/**
|
|
51
52
|
* @param isInnerMostFunction If `scope` is the innermost 'function' scope. Only used for labeling as we name the
|
|
@@ -63,6 +64,10 @@ export class SourceMapScopeChainEntry implements ScopeChainEntry {
|
|
|
63
64
|
this.#scopeNumber = scopeNumber;
|
|
64
65
|
}
|
|
65
66
|
|
|
67
|
+
originalScope(): ScopesCodec.OriginalScope {
|
|
68
|
+
return this.#scope;
|
|
69
|
+
}
|
|
70
|
+
|
|
66
71
|
extraProperties(): RemoteObjectProperty[] {
|
|
67
72
|
const extraProperties = [];
|
|
68
73
|
if (this.#isInnerMostFunction && this.#callFrame.exception) {
|
|
@@ -118,7 +123,10 @@ export class SourceMapScopeChainEntry implements ScopeChainEntry {
|
|
|
118
123
|
}
|
|
119
124
|
|
|
120
125
|
object(): RemoteObject {
|
|
121
|
-
|
|
126
|
+
if (!this.#object) {
|
|
127
|
+
this.#object = new SourceMapScopeRemoteObject(this.#callFrame, this.#scope, this.#range, this.#scopeNumber);
|
|
128
|
+
}
|
|
129
|
+
return this.#object;
|
|
122
130
|
}
|
|
123
131
|
|
|
124
132
|
description(): string {
|
|
@@ -135,6 +143,8 @@ class SourceMapScopeRemoteObject extends RemoteObjectImpl {
|
|
|
135
143
|
readonly #scope: ScopesCodec.OriginalScope;
|
|
136
144
|
readonly #range?: ScopesCodec.GeneratedRange;
|
|
137
145
|
readonly #scopeNumber?: number;
|
|
146
|
+
#propertiesPromise?: Promise<GetPropertiesResult>;
|
|
147
|
+
#cachedWithPreview = false;
|
|
138
148
|
|
|
139
149
|
constructor(callFrame: CallFrame, scope: ScopesCodec.OriginalScope, range: ScopesCodec.GeneratedRange|undefined,
|
|
140
150
|
scopeNumber: number|undefined) {
|
|
@@ -153,60 +163,102 @@ class SourceMapScopeRemoteObject extends RemoteObjectImpl {
|
|
|
153
163
|
if (accessorPropertiesOnly) {
|
|
154
164
|
return {properties: [], internalProperties: []};
|
|
155
165
|
}
|
|
166
|
+
if (!this.#propertiesPromise || (generatePreview && !this.#cachedWithPreview)) {
|
|
167
|
+
this.#cachedWithPreview = generatePreview;
|
|
168
|
+
this.#propertiesPromise = this.#evaluateProperties(generatePreview);
|
|
169
|
+
}
|
|
170
|
+
return await this.#propertiesPromise;
|
|
171
|
+
}
|
|
156
172
|
|
|
173
|
+
async #evaluateProperties(generatePreview: boolean): Promise<GetPropertiesResult> {
|
|
157
174
|
if (this.#scope.variables.length === 0) {
|
|
158
175
|
return {properties: [], internalProperties: []};
|
|
159
176
|
}
|
|
160
|
-
|
|
161
177
|
const expressions = this.#scope.variables.map((_, index) => this.#findExpression(index));
|
|
178
|
+
const values = await this.#evaluateAsBatch(expressions, generatePreview) ??
|
|
179
|
+
await this.#evaluateSeparately(expressions, generatePreview);
|
|
162
180
|
|
|
163
|
-
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
181
|
+
const properties = this.#scope.variables.map((variable, index) => {
|
|
182
|
+
const value = values[index];
|
|
183
|
+
if (value === null) {
|
|
184
|
+
return SourceMapScopeRemoteObject.#unavailableProperty(variable);
|
|
185
|
+
}
|
|
186
|
+
return new RemoteObjectProperty(variable, value, /* enumerable */ false, /* writable */ false, /* isOwn */ true,
|
|
187
|
+
/* wasThrown */ false);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
return {properties, internalProperties: []};
|
|
191
|
+
}
|
|
167
192
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
193
|
+
/**
|
|
194
|
+
* Evaluates all binding expressions of this scope with a single `evaluateOnCallFrame` call.
|
|
195
|
+
*
|
|
196
|
+
* We build an object literal that spreads in one `{index: value}` object per binding, each produced by
|
|
197
|
+
* its own arrow function wrapped in `try`/`catch`. A binding that throws contributes nothing, which is
|
|
198
|
+
* how we tell it apart from one that legitimately evaluates to `undefined`, and it doesn't take the
|
|
199
|
+
* rest of the scope down with it.
|
|
200
|
+
*
|
|
201
|
+
* The expressions are inlined rather than passed to `eval`. `eval` in the evaluated code is the page's
|
|
202
|
+
* `eval`, which a `script-src` CSP without `'unsafe-eval'` blocks. `Runtime.evaluate` can opt out of
|
|
203
|
+
* that via `allowUnsafeEvalBlockedByCSP`, but `Debugger.evaluateOnCallFrame` has no such option.
|
|
204
|
+
* Inlining also means we don't introduce bindings of our own that could shadow the names a binding
|
|
205
|
+
* expression refers to, and arrow functions keep `this` pointing at the paused frame's receiver.
|
|
206
|
+
*
|
|
207
|
+
* @returns The value for each expression, or null if the batch failed as a whole. The latter happens
|
|
208
|
+
* when a binding expression doesn't parse, since that takes out the entire object literal.
|
|
209
|
+
*/
|
|
210
|
+
async #evaluateAsBatch(expressions: Array<string|null>,
|
|
211
|
+
generatePreview: boolean): Promise<Array<RemoteObject|null>|null> {
|
|
212
|
+
const spreads: string[] = [];
|
|
213
|
+
for (const [index, expression] of expressions.entries()) {
|
|
214
|
+
if (expression !== null) {
|
|
215
|
+
spreads.push(`...(() => { try { return {${index}: (${expression})}; } catch {} })()`);
|
|
172
216
|
}
|
|
173
217
|
}
|
|
218
|
+
if (spreads.length === 0) {
|
|
219
|
+
return expressions.map(() => null);
|
|
220
|
+
}
|
|
174
221
|
|
|
175
|
-
const batchExpression = `({ __proto__: null, ${spreadEntries.join(', ')} })`;
|
|
176
222
|
const result = await this.#callFrame.evaluate({
|
|
177
|
-
expression:
|
|
223
|
+
expression: `({__proto__: null, ${spreads.join(', ')}})`,
|
|
224
|
+
// The wrapper object is a throw-away. We only need previews for the values inside of it.
|
|
178
225
|
generatePreview: false,
|
|
179
226
|
scopeNumber: this.#scopeNumber,
|
|
180
227
|
});
|
|
181
|
-
|
|
182
228
|
if ('error' in result || result.exceptionDetails || !result.object) {
|
|
183
|
-
|
|
184
|
-
return {properties, internalProperties: []};
|
|
229
|
+
return null;
|
|
185
230
|
}
|
|
186
231
|
|
|
187
|
-
const {properties
|
|
232
|
+
const {properties} = await result.object.getOwnProperties(generatePreview);
|
|
188
233
|
result.object.release();
|
|
189
234
|
|
|
190
|
-
const
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
235
|
+
const valueByIndex = new Map(properties?.map(({name, value}) => [name, value] as const));
|
|
236
|
+
return expressions.map((_, index) => valueByIndex.get(String(index)) ?? null);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Fallback for when {@link #evaluateAsBatch} fails as a whole, so that a single binding expression
|
|
241
|
+
* that doesn't parse only costs us that one variable.
|
|
242
|
+
*/
|
|
243
|
+
async #evaluateSeparately(expressions: Array<string|null>,
|
|
244
|
+
generatePreview: boolean): Promise<Array<RemoteObject|null>> {
|
|
245
|
+
const values: Array<RemoteObject|null> = [];
|
|
246
|
+
for (const expression of expressions) {
|
|
247
|
+
if (expression === null) {
|
|
248
|
+
values.push(null);
|
|
249
|
+
continue;
|
|
194
250
|
}
|
|
195
|
-
}
|
|
196
251
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
252
|
+
const result = await this.#callFrame.evaluate({expression, generatePreview, scopeNumber: this.#scopeNumber});
|
|
253
|
+
if ('error' in result || result.exceptionDetails) {
|
|
254
|
+
// TODO(crbug.com/40277685): Make these errors user-visible to aid tooling developers.
|
|
255
|
+
// E.g. show the error on hover or expose it in the developer resources panel.
|
|
256
|
+
values.push(null);
|
|
202
257
|
} else {
|
|
203
|
-
|
|
204
|
-
/* isOwn */ true,
|
|
205
|
-
/* wasThrown */ false));
|
|
258
|
+
values.push(result.object);
|
|
206
259
|
}
|
|
207
260
|
}
|
|
208
|
-
|
|
209
|
-
return {properties, internalProperties: []};
|
|
261
|
+
return values;
|
|
210
262
|
}
|
|
211
263
|
|
|
212
264
|
/** @returns null if the variable is unavailable at the current paused location */
|
|
@@ -219,7 +271,7 @@ class SourceMapScopeRemoteObject extends RemoteObjectImpl {
|
|
|
219
271
|
if (typeof expressionOrSubRanges === 'string') {
|
|
220
272
|
return expressionOrSubRanges;
|
|
221
273
|
}
|
|
222
|
-
if (expressionOrSubRanges
|
|
274
|
+
if (!expressionOrSubRanges) {
|
|
223
275
|
return null;
|
|
224
276
|
}
|
|
225
277
|
|
|
@@ -154,6 +154,8 @@ export class StorageBucketsModel extends SDKModel<EventTypes> implements Protoco
|
|
|
154
154
|
cacheStorageContentUpdated(_event: Protocol.Storage.CacheStorageContentUpdatedEvent): void {
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
+
privateVerificationTokensUpdated(): void {
|
|
158
|
+
}
|
|
157
159
|
}
|
|
158
160
|
|
|
159
161
|
SDKModel.register(StorageBucketsModel, {capabilities: Capability.STORAGE, autostart: false});
|
|
@@ -23,14 +23,10 @@ const UIStrings = {
|
|
|
23
23
|
* @description Tooltip for the AI assistance button in the main DevTools toolbar.
|
|
24
24
|
*/
|
|
25
25
|
openAiAssistance: 'Open AI assistance panel',
|
|
26
|
-
/**
|
|
27
|
-
* @description Text label for the Gemini button in the main DevTools toolbar when expanded.
|
|
28
|
-
*/
|
|
29
|
-
gemini: 'Gemini',
|
|
30
26
|
/**
|
|
31
27
|
* @description Tooltip for the Gemini button in the main DevTools toolbar.
|
|
32
28
|
*/
|
|
33
|
-
openGemini: 'Open Gemini panel',
|
|
29
|
+
openGemini: 'Open `Gemini` panel',
|
|
34
30
|
} as const;
|
|
35
31
|
const str_ = i18n.i18n.registerUIStrings('entrypoints/main/GlobalAiButton.ts', UIStrings);
|
|
36
32
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
@@ -65,7 +61,7 @@ export const DEFAULT_VIEW = (input: ViewInput, output: undefined, target: HTMLEl
|
|
|
65
61
|
});
|
|
66
62
|
|
|
67
63
|
const strings = AIAssistance.AiUtils.isGeminiBranding() ?
|
|
68
|
-
{title: i18nString(UIStrings.openGemini), label:
|
|
64
|
+
{title: i18nString(UIStrings.openGemini), label: i18n.i18n.lockedString('Gemini')} :
|
|
69
65
|
{title: i18nString(UIStrings.openAiAssistance), label: i18nString(UIStrings.aiAssistance)};
|
|
70
66
|
const icon = AIAssistance.AiUtils.getIconName();
|
|
71
67
|
|
|
@@ -44,6 +44,7 @@ import * as SDK from '../../core/sdk/sdk.js';
|
|
|
44
44
|
import * as Foundation from '../../foundation/foundation.js';
|
|
45
45
|
import * as AiAssistanceModel from '../../models/ai_assistance/ai_assistance.js';
|
|
46
46
|
import * as Badges from '../../models/badges/badges.js';
|
|
47
|
+
import * as CommentManager from '../../models/comment_manager/comment_manager.js';
|
|
47
48
|
import * as CrUXManager from '../../models/crux-manager/crux-manager.js';
|
|
48
49
|
import * as Persistence from '../../models/persistence/persistence.js';
|
|
49
50
|
import * as Workspace from '../../models/workspace/workspace.js';
|
|
@@ -554,7 +555,13 @@ export class MainImpl {
|
|
|
554
555
|
inspectorView.displaySelectOverrideFolderInfobar(event.data);
|
|
555
556
|
});
|
|
556
557
|
await inspectorView.createToolbars();
|
|
557
|
-
inspectorView.renderStatusBar();
|
|
558
|
+
inspectorView.renderStatusBar(this.#universe.commentManager.isAgentAttached());
|
|
559
|
+
this.#universe.commentManager.addEventListener(
|
|
560
|
+
CommentManager.CommentManager.Events.AGENT_ATTACHED_CHANGED,
|
|
561
|
+
event => {
|
|
562
|
+
inspectorView.renderStatusBar(event.data);
|
|
563
|
+
},
|
|
564
|
+
);
|
|
558
565
|
Host.InspectorFrontendHost.InspectorFrontendHostInstance.loadCompleted();
|
|
559
566
|
|
|
560
567
|
// Initialize elements for the live announcer functionality for a11y.
|
|
@@ -1018,7 +1018,8 @@ inspectorBackend.registerType("Overlay.FlexContainerHighlightConfig", [{"name":
|
|
|
1018
1018
|
inspectorBackend.registerType("Overlay.FlexItemHighlightConfig", [{"name": "baseSizeBox", "type": "object", "optional": true, "description": "Style of the box representing the item's base size", "typeRef": "Overlay.BoxStyle"}, {"name": "baseSizeBorder", "type": "object", "optional": true, "description": "Style of the border around the box representing the item's base size", "typeRef": "Overlay.LineStyle"}, {"name": "flexibilityArrow", "type": "object", "optional": true, "description": "Style of the arrow representing if the item grew or shrank", "typeRef": "Overlay.LineStyle"}]);
|
|
1019
1019
|
inspectorBackend.registerType("Overlay.LineStyle", [{"name": "color", "type": "object", "optional": true, "description": "The color of the line (default: transparent)", "typeRef": "DOM.RGBA"}, {"name": "pattern", "type": "string", "optional": true, "description": "The line pattern (default: solid)", "typeRef": null}]);
|
|
1020
1020
|
inspectorBackend.registerType("Overlay.BoxStyle", [{"name": "fillColor", "type": "object", "optional": true, "description": "The background color for the box (default: transparent)", "typeRef": "DOM.RGBA"}, {"name": "hatchColor", "type": "object", "optional": true, "description": "The hatching color for the box (default: transparent)", "typeRef": "DOM.RGBA"}]);
|
|
1021
|
-
inspectorBackend.registerType("Overlay.
|
|
1021
|
+
inspectorBackend.registerType("Overlay.ImcbHighlightConfig", [{"name": "imcbBorderColor", "type": "object", "optional": true, "description": "Border color for the Inset-Modified Containing Block (default: transparent).", "typeRef": "DOM.RGBA"}, {"name": "imcbBackgroundColor", "type": "object", "optional": true, "description": "Background fill color for the Inset-Modified Containing Block (default: transparent).", "typeRef": "DOM.RGBA"}, {"name": "insetsBackgroundColor", "type": "object", "optional": true, "description": "Fill color for the inset modifiers area (difference between CB and IMCB).", "typeRef": "DOM.RGBA"}, {"name": "insetsHatchColor", "type": "object", "optional": true, "description": "Hatch color for the inset modifiers area.", "typeRef": "DOM.RGBA"}, {"name": "anchorBorderColor", "type": "object", "optional": true, "description": "Border color for the referenced target anchor element(s) (when element is anchor-positioned).", "typeRef": "DOM.RGBA"}, {"name": "anchorBackgroundColor", "type": "object", "optional": true, "description": "Background fill color for the referenced target anchor element(s) (when element is anchor-positioned).", "typeRef": "DOM.RGBA"}, {"name": "showPositionAreaGrid", "type": "boolean", "optional": true, "description": "Whether to render the 3x3 position-area grid lines when position-area is used.", "typeRef": null}, {"name": "positionAreaGridLineColor", "type": "object", "optional": true, "description": "Line color for the 3x3 position-area grid lines.", "typeRef": "DOM.RGBA"}, {"name": "positionAreaActiveRegionColor", "type": "object", "optional": true, "description": "Fill color for the active region within the position-area grid.", "typeRef": "DOM.RGBA"}]);
|
|
1022
|
+
inspectorBackend.registerType("Overlay.HighlightConfig", [{"name": "showInfo", "type": "boolean", "optional": true, "description": "Whether the node info tooltip should be shown (default: false).", "typeRef": null}, {"name": "showStyles", "type": "boolean", "optional": true, "description": "Whether the node styles in the tooltip (default: false).", "typeRef": null}, {"name": "showRulers", "type": "boolean", "optional": true, "description": "Whether the rulers should be shown (default: false).", "typeRef": null}, {"name": "showAccessibilityInfo", "type": "boolean", "optional": true, "description": "Whether the a11y info should be shown (default: true).", "typeRef": null}, {"name": "showExtensionLines", "type": "boolean", "optional": true, "description": "Whether the extension lines from node to the rulers should be shown (default: false).", "typeRef": null}, {"name": "contentColor", "type": "object", "optional": true, "description": "The content box highlight fill color (default: transparent).", "typeRef": "DOM.RGBA"}, {"name": "paddingColor", "type": "object", "optional": true, "description": "The padding highlight fill color (default: transparent).", "typeRef": "DOM.RGBA"}, {"name": "borderColor", "type": "object", "optional": true, "description": "The border highlight fill color (default: transparent).", "typeRef": "DOM.RGBA"}, {"name": "marginColor", "type": "object", "optional": true, "description": "The margin highlight fill color (default: transparent).", "typeRef": "DOM.RGBA"}, {"name": "eventTargetColor", "type": "object", "optional": true, "description": "The event target element highlight fill color (default: transparent).", "typeRef": "DOM.RGBA"}, {"name": "shapeColor", "type": "object", "optional": true, "description": "The shape outside fill color (default: transparent).", "typeRef": "DOM.RGBA"}, {"name": "shapeMarginColor", "type": "object", "optional": true, "description": "The shape margin fill color (default: transparent).", "typeRef": "DOM.RGBA"}, {"name": "cssGridColor", "type": "object", "optional": true, "description": "The grid layout color (default: transparent).", "typeRef": "DOM.RGBA"}, {"name": "colorFormat", "type": "string", "optional": true, "description": "The color format used to format color styles (default: hex).", "typeRef": "Overlay.ColorFormat"}, {"name": "gridHighlightConfig", "type": "object", "optional": true, "description": "The grid layout highlight configuration (default: all transparent).", "typeRef": "Overlay.GridHighlightConfig"}, {"name": "flexContainerHighlightConfig", "type": "object", "optional": true, "description": "The flex container highlight configuration (default: all transparent).", "typeRef": "Overlay.FlexContainerHighlightConfig"}, {"name": "flexItemHighlightConfig", "type": "object", "optional": true, "description": "The flex item highlight configuration (default: all transparent).", "typeRef": "Overlay.FlexItemHighlightConfig"}, {"name": "contrastAlgorithm", "type": "string", "optional": true, "description": "The contrast algorithm to use for the contrast ratio (default: aa).", "typeRef": "Overlay.ContrastAlgorithm"}, {"name": "containerQueryContainerHighlightConfig", "type": "object", "optional": true, "description": "The container query container highlight configuration (default: all transparent).", "typeRef": "Overlay.ContainerQueryContainerHighlightConfig"}, {"name": "imcbHighlightConfig", "type": "object", "optional": true, "description": "The IMCB highlight configuration (default: all transparent).", "typeRef": "Overlay.ImcbHighlightConfig"}]);
|
|
1022
1023
|
inspectorBackend.registerType("Overlay.GridNodeHighlightConfig", [{"name": "gridHighlightConfig", "type": "object", "optional": false, "description": "A descriptor for the highlight appearance.", "typeRef": "Overlay.GridHighlightConfig"}, {"name": "nodeId", "type": "number", "optional": false, "description": "Identifier of the node to highlight.", "typeRef": "DOM.NodeId"}]);
|
|
1023
1024
|
inspectorBackend.registerType("Overlay.FlexNodeHighlightConfig", [{"name": "flexContainerHighlightConfig", "type": "object", "optional": false, "description": "A descriptor for the highlight appearance of flex containers.", "typeRef": "Overlay.FlexContainerHighlightConfig"}, {"name": "nodeId", "type": "number", "optional": false, "description": "Identifier of the node to highlight.", "typeRef": "DOM.NodeId"}]);
|
|
1024
1025
|
inspectorBackend.registerType("Overlay.ScrollSnapContainerHighlightConfig", [{"name": "snapportBorder", "type": "object", "optional": true, "description": "The style of the snapport border (default: transparent)", "typeRef": "Overlay.LineStyle"}, {"name": "snapAreaBorder", "type": "object", "optional": true, "description": "The style of the snap area border (default: transparent)", "typeRef": "Overlay.LineStyle"}, {"name": "scrollMarginColor", "type": "object", "optional": true, "description": "The margin highlight fill color (default: transparent).", "typeRef": "DOM.RGBA"}, {"name": "scrollPaddingColor", "type": "object", "optional": true, "description": "The padding highlight fill color (default: transparent).", "typeRef": "DOM.RGBA"}]);
|
|
@@ -1113,7 +1114,9 @@ inspectorBackend.registerCommand("Page.enable", [{"name": "enableFileChooserOpen
|
|
|
1113
1114
|
inspectorBackend.registerCommand("Page.getAppManifest", [{"name": "manifestId", "type": "string", "optional": true, "description": "", "typeRef": null}], ["url", "errors", "data", "parsed", "manifest"], "Gets the processed manifest for this current document. This API always waits for the manifest to be loaded. If manifestId is provided, and it does not match the manifest of the current document, this API errors out. If there is not a loaded page, this API errors out immediately.");
|
|
1114
1115
|
inspectorBackend.registerCommand("Page.getInstallabilityErrors", [], ["installabilityErrors"], "");
|
|
1115
1116
|
inspectorBackend.registerCommand("Page.getManifestIcons", [], ["primaryIcon"], "Deprecated because it's not guaranteed that the returned icon is in fact the one used for PWA installation.");
|
|
1116
|
-
inspectorBackend.registerCommand("Page.getAppId", [], ["appId", "recommendedId"], "Returns the unique (PWA) app id. Only returns values if the feature flag 'WebAppEnableManifestId' is enabled");
|
|
1117
|
+
inspectorBackend.registerCommand("Page.getAppId", [], ["appId", "recommendedId", "bundleId", "parentAppName"], "Returns the unique (PWA) app id, along with IWA bundle ID and parent app info. Only returns values if the feature flag 'WebAppEnableManifestId' is enabled");
|
|
1118
|
+
inspectorBackend.registerCommand("Page.getSubApps", [], ["subApps"], "Returns the list of installed child Sub-Apps for the inspected parent app.");
|
|
1119
|
+
inspectorBackend.registerCommand("Page.getSiblingSubApps", [], ["subApps"], "Returns the list of sibling Sub-Apps sharing the same parent app if the inspected context is a Sub-App.");
|
|
1117
1120
|
inspectorBackend.registerCommand("Page.getAdScriptAncestry", [{"name": "frameId", "type": "string", "optional": false, "description": "", "typeRef": "Page.FrameId"}], ["adScriptAncestry"], "");
|
|
1118
1121
|
inspectorBackend.registerCommand("Page.getFrameTree", [], ["frameTree"], "Returns present frame tree structure.");
|
|
1119
1122
|
inspectorBackend.registerCommand("Page.getLayoutMetrics", [], ["layoutViewport", "visualViewport", "contentSize", "cssLayoutViewport", "cssVisualViewport", "cssContentSize"], "Returns metrics relating to the layouting of the page, such as viewport bounds/scale.");
|
|
@@ -1203,6 +1206,7 @@ inspectorBackend.registerType("Page.Screenshot", [{"name": "image", "type": "obj
|
|
|
1203
1206
|
inspectorBackend.registerType("Page.ShareTarget", [{"name": "action", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "method", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "enctype", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "title", "type": "string", "optional": true, "description": "Embed the ShareTargetParams", "typeRef": null}, {"name": "text", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "url", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "files", "type": "array", "optional": true, "description": "", "typeRef": "Page.FileFilter"}]);
|
|
1204
1207
|
inspectorBackend.registerType("Page.Shortcut", [{"name": "name", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "url", "type": "string", "optional": false, "description": "", "typeRef": null}]);
|
|
1205
1208
|
inspectorBackend.registerType("Page.WebAppManifest", [{"name": "backgroundColor", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "description", "type": "string", "optional": true, "description": "The extra description provided by the manifest.", "typeRef": null}, {"name": "dir", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "display", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "displayOverrides", "type": "array", "optional": true, "description": "The overrided display mode controlled by the user.", "typeRef": "string"}, {"name": "fileHandlers", "type": "array", "optional": true, "description": "The handlers to open files.", "typeRef": "Page.FileHandler"}, {"name": "icons", "type": "array", "optional": true, "description": "", "typeRef": "Page.ImageResource"}, {"name": "id", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "lang", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "launchHandler", "type": "object", "optional": true, "description": "TODO(crbug.com/1231886): This field is non-standard and part of a Chrome experiment. See: https://github.com/WICG/web-app-launch/blob/main/launch_handler.md", "typeRef": "Page.LaunchHandler"}, {"name": "name", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "orientation", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "preferRelatedApplications", "type": "boolean", "optional": true, "description": "", "typeRef": null}, {"name": "protocolHandlers", "type": "array", "optional": true, "description": "The handlers to open protocols.", "typeRef": "Page.ProtocolHandler"}, {"name": "relatedApplications", "type": "array", "optional": true, "description": "", "typeRef": "Page.RelatedApplication"}, {"name": "scope", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "scopeExtensions", "type": "array", "optional": true, "description": "Non-standard, see https://github.com/WICG/manifest-incubations/blob/gh-pages/scope_extensions-explainer.md", "typeRef": "Page.ScopeExtension"}, {"name": "screenshots", "type": "array", "optional": true, "description": "The screenshots used by chromium.", "typeRef": "Page.Screenshot"}, {"name": "shareTarget", "type": "object", "optional": true, "description": "", "typeRef": "Page.ShareTarget"}, {"name": "shortName", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "shortcuts", "type": "array", "optional": true, "description": "", "typeRef": "Page.Shortcut"}, {"name": "startUrl", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "themeColor", "type": "string", "optional": true, "description": "", "typeRef": null}]);
|
|
1209
|
+
inspectorBackend.registerType("Page.SubApp", [{"name": "name", "type": "string", "optional": false, "description": "Display name of the sub-app.", "typeRef": null}, {"name": "scope", "type": "string", "optional": false, "description": "Scope of the sub-app.", "typeRef": null}, {"name": "manifestId", "type": "string", "optional": false, "description": "Manifest id of the sub-app.", "typeRef": null}, {"name": "startUrl", "type": "string", "optional": false, "description": "Start URL of the sub-app.", "typeRef": null}]);
|
|
1206
1210
|
inspectorBackend.registerType("Page.BackForwardCacheBlockingDetails", [{"name": "url", "type": "string", "optional": true, "description": "Url of the file where blockage happened. Optional because of tests.", "typeRef": null}, {"name": "function", "type": "string", "optional": true, "description": "Function name where blockage happened. Optional because of anonymous functions and tests.", "typeRef": null}, {"name": "lineNumber", "type": "number", "optional": false, "description": "Line number in the script (0-based).", "typeRef": null}, {"name": "columnNumber", "type": "number", "optional": false, "description": "Column number in the script (0-based).", "typeRef": null}]);
|
|
1207
1211
|
inspectorBackend.registerType("Page.BackForwardCacheNotRestoredExplanation", [{"name": "type", "type": "string", "optional": false, "description": "Type of the reason", "typeRef": "Page.BackForwardCacheNotRestoredReasonType"}, {"name": "reason", "type": "string", "optional": false, "description": "Not restored reason", "typeRef": "Page.BackForwardCacheNotRestoredReason"}, {"name": "context", "type": "string", "optional": true, "description": "Context associated with the reason. The meaning of this context is dependent on the reason: - EmbedderExtensionSentMessageToCachedFrame: the extension ID.", "typeRef": null}, {"name": "details", "type": "array", "optional": true, "description": "", "typeRef": "Page.BackForwardCacheBlockingDetails"}]);
|
|
1208
1212
|
inspectorBackend.registerType("Page.BackForwardCacheNotRestoredExplanationTree", [{"name": "url", "type": "string", "optional": false, "description": "URL of each frame", "typeRef": null}, {"name": "explanations", "type": "array", "optional": false, "description": "Not restored reasons of each frame", "typeRef": "Page.BackForwardCacheNotRestoredExplanation"}, {"name": "children", "type": "array", "optional": false, "description": "Array of children frame", "typeRef": "Page.BackForwardCacheNotRestoredExplanationTree"}]);
|
|
@@ -1337,6 +1341,7 @@ inspectorBackend.registerEvent("Storage.indexedDBContentUpdated", ["origin", "st
|
|
|
1337
1341
|
inspectorBackend.registerEvent("Storage.indexedDBListUpdated", ["origin", "storageKey", "bucketId"]);
|
|
1338
1342
|
inspectorBackend.registerEvent("Storage.storageBucketCreatedOrUpdated", ["bucketInfo"]);
|
|
1339
1343
|
inspectorBackend.registerEvent("Storage.storageBucketDeleted", ["bucketId"]);
|
|
1344
|
+
inspectorBackend.registerEvent("Storage.privateVerificationTokensUpdated", []);
|
|
1340
1345
|
inspectorBackend.registerCommand("Storage.getStorageKeyForFrame", [{"name": "frameId", "type": "string", "optional": false, "description": "", "typeRef": "Page.FrameId"}], ["storageKey"], "Returns a storage key given a frame id. Deprecated. Please use Storage.getStorageKey instead.");
|
|
1341
1346
|
inspectorBackend.registerCommand("Storage.getStorageKey", [{"name": "frameId", "type": "string", "optional": true, "description": "", "typeRef": "Page.FrameId"}], ["storageKey"], "Returns storage key for the given frame. If no frame ID is provided, the storage key of the target executing this command is returned.");
|
|
1342
1347
|
inspectorBackend.registerCommand("Storage.clearDataForOrigin", [{"name": "origin", "type": "string", "optional": false, "description": "Security origin.", "typeRef": null}, {"name": "storageTypes", "type": "string", "optional": false, "description": "Comma separated list of StorageType to clear.", "typeRef": null}], [], "Clears storage for origin.");
|
|
@@ -1356,12 +1361,17 @@ inspectorBackend.registerCommand("Storage.untrackIndexedDBForOrigin", [{"name":
|
|
|
1356
1361
|
inspectorBackend.registerCommand("Storage.untrackIndexedDBForStorageKey", [{"name": "storageKey", "type": "string", "optional": false, "description": "Storage key.", "typeRef": null}], [], "Unregisters storage key from receiving notifications for IndexedDB.");
|
|
1357
1362
|
inspectorBackend.registerCommand("Storage.getTrustTokens", [], ["tokens"], "Returns the number of stored Trust Tokens per issuer for the current browsing context.");
|
|
1358
1363
|
inspectorBackend.registerCommand("Storage.clearTrustTokens", [{"name": "issuerOrigin", "type": "string", "optional": false, "description": "", "typeRef": null}], ["didDeleteTokens"], "Removes all Trust Tokens issued by the provided issuerOrigin. Leaves other stored data, including the issuer's Redemption Records, intact.");
|
|
1364
|
+
inspectorBackend.registerCommand("Storage.getPrivateVerificationTokens", [], ["tokens"], "Returns all stored Private Verification Tokens for the current browsing context.");
|
|
1365
|
+
inspectorBackend.registerCommand("Storage.clearPrivateVerificationTokens", [{"name": "issuerOrigin", "type": "string", "optional": false, "description": "", "typeRef": null}], [], "Removes all Private Verification Tokens issued by the provided issuerOrigin.");
|
|
1366
|
+
inspectorBackend.registerCommand("Storage.deletePrivateVerificationToken", [{"name": "tokenId", "type": "string", "optional": false, "description": "", "typeRef": null}], [], "Removes a specific Private Verification Token by its ID.");
|
|
1367
|
+
inspectorBackend.registerCommand("Storage.setPrivateVerificationTokensTracking", [{"name": "enable", "type": "boolean", "optional": false, "description": "", "typeRef": null}], [], "Set tracking for Private Verification Tokens.");
|
|
1359
1368
|
inspectorBackend.registerCommand("Storage.setStorageBucketTracking", [{"name": "storageKey", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "enable", "type": "boolean", "optional": false, "description": "", "typeRef": null}], [], "Set tracking for a storage key's buckets.");
|
|
1360
1369
|
inspectorBackend.registerCommand("Storage.deleteStorageBucket", [{"name": "bucket", "type": "object", "optional": false, "description": "", "typeRef": "Storage.StorageBucket"}], [], "Deletes the Storage Bucket with the given storage key and bucket name.");
|
|
1361
1370
|
inspectorBackend.registerCommand("Storage.runBounceTrackingMitigations", [], ["deletedSites"], "Deletes state for sites identified as potential bounce trackers, immediately.");
|
|
1362
1371
|
inspectorBackend.registerCommand("Storage.getRelatedWebsiteSets", [], ["sets"], "Returns the effective Related Website Sets in use by this profile for the browser session. The effective Related Website Sets will not change during a browser session.");
|
|
1363
1372
|
inspectorBackend.registerType("Storage.UsageForType", [{"name": "storageType", "type": "string", "optional": false, "description": "Name of storage type.", "typeRef": "Storage.StorageType"}, {"name": "usage", "type": "number", "optional": false, "description": "Storage usage (bytes).", "typeRef": null}]);
|
|
1364
1373
|
inspectorBackend.registerType("Storage.TrustTokens", [{"name": "issuerOrigin", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "count", "type": "number", "optional": false, "description": "", "typeRef": null}]);
|
|
1374
|
+
inspectorBackend.registerType("Storage.PrivateVerificationToken", [{"name": "id", "type": "string", "optional": false, "description": "Unique identifier of the token in the database.", "typeRef": null}, {"name": "issuerOrigin", "type": "string", "optional": false, "description": "Origin of the token issuer.", "typeRef": null}, {"name": "keyId", "type": "number", "optional": false, "description": "Public key ID used to issue the token.", "typeRef": null}, {"name": "expiration", "type": "number", "optional": false, "description": "Expiration timestamp in seconds since the epoch.", "typeRef": "Network.TimeSinceEpoch"}, {"name": "creationTime", "type": "number", "optional": false, "description": "Token creation timestamp in seconds since the epoch.", "typeRef": "Network.TimeSinceEpoch"}, {"name": "version", "type": "number", "optional": false, "description": "Token protocol version.", "typeRef": null}, {"name": "token", "type": "string", "optional": false, "description": "Base64-encoded serialized token.", "typeRef": null}]);
|
|
1365
1375
|
inspectorBackend.registerType("Storage.StorageBucket", [{"name": "storageKey", "type": "string", "optional": false, "description": "", "typeRef": "Storage.SerializedStorageKey"}, {"name": "name", "type": "string", "optional": true, "description": "If not specified, it is the default bucket of the storageKey.", "typeRef": null}]);
|
|
1366
1376
|
inspectorBackend.registerType("Storage.StorageBucketInfo", [{"name": "bucket", "type": "object", "optional": false, "description": "", "typeRef": "Storage.StorageBucket"}, {"name": "id", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "expiration", "type": "number", "optional": false, "description": "", "typeRef": "Network.TimeSinceEpoch"}, {"name": "quota", "type": "number", "optional": false, "description": "Storage quota (bytes).", "typeRef": null}, {"name": "persistent", "type": "boolean", "optional": false, "description": "", "typeRef": null}, {"name": "durability", "type": "string", "optional": false, "description": "", "typeRef": "Storage.StorageBucketsDurability"}]);
|
|
1367
1377
|
inspectorBackend.registerType("Storage.RelatedWebsiteSet", [{"name": "primarySites", "type": "array", "optional": false, "description": "The primary site of this set, along with the ccTLDs if there is any.", "typeRef": "string"}, {"name": "associatedSites", "type": "array", "optional": false, "description": "The associated sites of this set, along with the ccTLDs if there is any.", "typeRef": "string"}, {"name": "serviceSites", "type": "array", "optional": false, "description": "The service sites of this set, along with the ccTLDs if there is any.", "typeRef": "string"}]);
|
|
@@ -660,6 +660,7 @@ export const generatedProperties: CSSProperty[] = [
|
|
|
660
660
|
"line-clamp",
|
|
661
661
|
"line-gap-override",
|
|
662
662
|
"line-height",
|
|
663
|
+
"link-parameters",
|
|
663
664
|
"list-style-image",
|
|
664
665
|
"list-style-position",
|
|
665
666
|
"list-style-type",
|
|
@@ -3683,6 +3684,14 @@ export const generatedProperties: CSSProperty[] = [
|
|
|
3683
3684
|
],
|
|
3684
3685
|
"name": "line-height"
|
|
3685
3686
|
},
|
|
3687
|
+
{
|
|
3688
|
+
"keywords": [
|
|
3689
|
+
"none"
|
|
3690
|
+
],
|
|
3691
|
+
"name": "link-parameters",
|
|
3692
|
+
"runtime_flag": "CSSLinkParametersProperty",
|
|
3693
|
+
"runtime_flag_status": "experimental"
|
|
3694
|
+
},
|
|
3686
3695
|
{
|
|
3687
3696
|
"inherited": true,
|
|
3688
3697
|
"longhands": [
|
|
@@ -7934,6 +7943,11 @@ export const generatedPropertyValues: Record<string, CSSPropertyValue> = {
|
|
|
7934
7943
|
"normal"
|
|
7935
7944
|
]
|
|
7936
7945
|
},
|
|
7946
|
+
"link-parameters": {
|
|
7947
|
+
"values": [
|
|
7948
|
+
"none"
|
|
7949
|
+
]
|
|
7950
|
+
},
|
|
7937
7951
|
"list-style-image": {
|
|
7938
7952
|
"values": [
|
|
7939
7953
|
"none"
|
|
@@ -777,6 +777,10 @@ export namespace ProtocolMapping {
|
|
|
777
777
|
'Storage.indexedDBListUpdated': [Protocol.Storage.IndexedDBListUpdatedEvent];
|
|
778
778
|
'Storage.storageBucketCreatedOrUpdated': [Protocol.Storage.StorageBucketCreatedOrUpdatedEvent];
|
|
779
779
|
'Storage.storageBucketDeleted': [Protocol.Storage.StorageBucketDeletedEvent];
|
|
780
|
+
/**
|
|
781
|
+
* Private Verification Tokens have been stored or deleted.
|
|
782
|
+
*/
|
|
783
|
+
'Storage.privateVerificationTokensUpdated': [];
|
|
780
784
|
/**
|
|
781
785
|
* Issued when attached to target because of auto-attach or `attachToTarget` command.
|
|
782
786
|
*/
|
|
@@ -4161,13 +4165,27 @@ export namespace ProtocolMapping {
|
|
|
4161
4165
|
returnType: Protocol.Page.GetManifestIconsResponse;
|
|
4162
4166
|
};
|
|
4163
4167
|
/**
|
|
4164
|
-
* Returns the unique (PWA) app id.
|
|
4168
|
+
* Returns the unique (PWA) app id, along with IWA bundle ID and parent app info.
|
|
4165
4169
|
* Only returns values if the feature flag 'WebAppEnableManifestId' is enabled
|
|
4166
4170
|
*/
|
|
4167
4171
|
'Page.getAppId': {
|
|
4168
4172
|
paramsType: [];
|
|
4169
4173
|
returnType: Protocol.Page.GetAppIdResponse;
|
|
4170
4174
|
};
|
|
4175
|
+
/**
|
|
4176
|
+
* Returns the list of installed child Sub-Apps for the inspected parent app.
|
|
4177
|
+
*/
|
|
4178
|
+
'Page.getSubApps': {
|
|
4179
|
+
paramsType: [];
|
|
4180
|
+
returnType: Protocol.Page.GetSubAppsResponse;
|
|
4181
|
+
};
|
|
4182
|
+
/**
|
|
4183
|
+
* Returns the list of sibling Sub-Apps sharing the same parent app if the inspected context is a Sub-App.
|
|
4184
|
+
*/
|
|
4185
|
+
'Page.getSiblingSubApps': {
|
|
4186
|
+
paramsType: [];
|
|
4187
|
+
returnType: Protocol.Page.GetSiblingSubAppsResponse;
|
|
4188
|
+
};
|
|
4171
4189
|
'Page.getAdScriptAncestry': {
|
|
4172
4190
|
paramsType: [Protocol.Page.GetAdScriptAncestryRequest];
|
|
4173
4191
|
returnType: Protocol.Page.GetAdScriptAncestryResponse;
|
|
@@ -4928,6 +4946,35 @@ export namespace ProtocolMapping {
|
|
|
4928
4946
|
paramsType: [Protocol.Storage.ClearTrustTokensRequest];
|
|
4929
4947
|
returnType: Protocol.Storage.ClearTrustTokensResponse;
|
|
4930
4948
|
};
|
|
4949
|
+
/**
|
|
4950
|
+
* Returns all stored Private Verification Tokens for the current browsing
|
|
4951
|
+
* context.
|
|
4952
|
+
*/
|
|
4953
|
+
'Storage.getPrivateVerificationTokens': {
|
|
4954
|
+
paramsType: [];
|
|
4955
|
+
returnType: Protocol.Storage.GetPrivateVerificationTokensResponse;
|
|
4956
|
+
};
|
|
4957
|
+
/**
|
|
4958
|
+
* Removes all Private Verification Tokens issued by the provided issuerOrigin.
|
|
4959
|
+
*/
|
|
4960
|
+
'Storage.clearPrivateVerificationTokens': {
|
|
4961
|
+
paramsType: [Protocol.Storage.ClearPrivateVerificationTokensRequest];
|
|
4962
|
+
returnType: void;
|
|
4963
|
+
};
|
|
4964
|
+
/**
|
|
4965
|
+
* Removes a specific Private Verification Token by its ID.
|
|
4966
|
+
*/
|
|
4967
|
+
'Storage.deletePrivateVerificationToken': {
|
|
4968
|
+
paramsType: [Protocol.Storage.DeletePrivateVerificationTokenRequest];
|
|
4969
|
+
returnType: void;
|
|
4970
|
+
};
|
|
4971
|
+
/**
|
|
4972
|
+
* Set tracking for Private Verification Tokens.
|
|
4973
|
+
*/
|
|
4974
|
+
'Storage.setPrivateVerificationTokensTracking': {
|
|
4975
|
+
paramsType: [Protocol.Storage.SetPrivateVerificationTokensTrackingRequest];
|
|
4976
|
+
returnType: void;
|
|
4977
|
+
};
|
|
4931
4978
|
/**
|
|
4932
4979
|
* Set tracking for a storage key's buckets.
|
|
4933
4980
|
*/
|