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.
Files changed (164) hide show
  1. package/.agents/skills/devtools-verification/SKILL.md +19 -0
  2. package/.agents/skills/{repro-flaky-tests → fix-tests}/SKILL.md +2 -2
  3. package/front_end/core/sdk/CSSPropertyParserMatchers.ts +2 -2
  4. package/front_end/core/sdk/DOMModel.ts +3 -5
  5. package/front_end/core/sdk/NetworkManager.ts +2 -2
  6. package/front_end/core/sdk/OverlayModel.ts +11 -12
  7. package/front_end/core/sdk/ServiceWorkerCacheModel.ts +3 -0
  8. package/front_end/core/sdk/SourceMapScopeChainEntry.ts +84 -32
  9. package/front_end/core/sdk/StorageBucketsModel.ts +2 -0
  10. package/front_end/entrypoints/main/GlobalAiButton.ts +2 -6
  11. package/front_end/entrypoints/main/MainImpl.ts +8 -1
  12. package/front_end/generated/InspectorBackendCommands.ts +12 -2
  13. package/front_end/generated/SupportedCSSProperties.ts +14 -0
  14. package/front_end/generated/protocol-mapping.d.ts +48 -1
  15. package/front_end/generated/protocol-proxy-api.d.ts +37 -1
  16. package/front_end/generated/protocol.ts +131 -0
  17. package/front_end/models/bindings/NetworkProject.ts +30 -0
  18. package/front_end/models/bindings/ResourceScriptMapping.ts +62 -0
  19. package/front_end/models/change_tracker/ChangeTracker.ts +1 -1
  20. package/front_end/models/comment_manager/CD4ABridge.ts +2 -2
  21. package/front_end/models/comment_manager/CommentManager.ts +18 -0
  22. package/front_end/models/emulation/DeviceModeModel.ts +1 -1
  23. package/front_end/models/extensions/ExtensionAPI.ts +4 -2
  24. package/front_end/models/issues_manager/CookieIssue.ts +0 -15
  25. package/front_end/models/persistence/NetworkPersistenceManager.ts +29 -4
  26. package/front_end/models/source_map_scopes/NamesResolver.ts +34 -4
  27. package/front_end/models/source_map_scopes/ScopeChainModel.ts +31 -7
  28. package/front_end/panels/accessibility/AccessibilityAnnouncementRecordingView.ts +281 -3
  29. package/front_end/panels/accessibility/accessibilityAnnouncementRecordingView.css +85 -0
  30. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +1 -2
  31. package/front_end/panels/ai_assistance/ai_assistance-meta.ts +5 -8
  32. package/front_end/panels/animation/AnimationTimeline.ts +1 -1
  33. package/front_end/panels/application/AppManifestView.ts +128 -134
  34. package/front_end/panels/application/CrashReportContextView.ts +6 -6
  35. package/front_end/panels/application/DeviceBoundSessionsTreeElement.ts +17 -17
  36. package/front_end/panels/application/DeviceBoundSessionsView.ts +136 -137
  37. package/front_end/panels/application/IndexedDBModel.ts +3 -0
  38. package/front_end/panels/application/IndexedDBViews.ts +1 -1
  39. package/front_end/panels/application/KeyValueStorageItemsView.ts +1 -0
  40. package/front_end/panels/application/OriginTrialTreeView.ts +18 -23
  41. package/front_end/panels/application/ReportingApiTreeElement.ts +3 -3
  42. package/front_end/panels/application/ReportingApiView.ts +6 -14
  43. package/front_end/panels/application/application-meta.ts +7 -7
  44. package/front_end/panels/application/components/AdsView.ts +63 -1
  45. package/front_end/panels/application/components/adsView.css +11 -1
  46. package/front_end/panels/common/CommentThreadWidget.ts +20 -22
  47. package/front_end/panels/common/CommentsOverlayWidget.ts +115 -9
  48. package/front_end/panels/common/CommentsStatusBarPill.ts +13 -1
  49. package/front_end/panels/common/ExtensionServer.ts +43 -34
  50. package/front_end/panels/common/GeminiRebrandPromoDialog.ts +1 -1
  51. package/front_end/panels/common/commentThreadWidget.css +6 -0
  52. package/front_end/panels/common/common-meta.ts +4 -1
  53. package/front_end/panels/elements/CSSRuleValidator.ts +1 -1
  54. package/front_end/panels/elements/ElementsPanel.ts +4 -4
  55. package/front_end/panels/elements/ElementsTreeElement.ts +9 -2
  56. package/front_end/panels/elements/ElementsTreeOutline.ts +25 -33
  57. package/front_end/panels/elements/elementsTreeOutline.css +8 -4
  58. package/front_end/panels/event_listeners/EventListenersView.ts +9 -4
  59. package/front_end/panels/issues/IssuesPane.ts +34 -22
  60. package/front_end/panels/lighthouse/LighthouseController.ts +1 -1
  61. package/front_end/panels/mobile_throttling/NetworkPanelIndicator.ts +1 -1
  62. package/front_end/panels/mobile_throttling/ThrottlingManager.ts +1 -1
  63. package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +1 -1
  64. package/front_end/panels/network/RequestPayloadView.ts +17 -15
  65. package/front_end/panels/recorder/RecordingView.ts +32 -53
  66. package/front_end/panels/recorder/StepView.ts +19 -4
  67. package/front_end/panels/recorder/TimelineSection.ts +1 -1
  68. package/front_end/panels/recorder/controlButton.css +6 -0
  69. package/front_end/panels/recorder/recordingView.css +11 -2
  70. package/front_end/panels/settings/BackendLinkingSettingsTab.ts +2 -1
  71. package/front_end/panels/settings/EditFileSystemView.ts +1 -1
  72. package/front_end/panels/sources/CallStackSidebarPane.ts +1 -1
  73. package/front_end/panels/sources/DebuggerPlugin.ts +137 -56
  74. package/front_end/panels/sources/ScopeChainSidebarPane.ts +17 -15
  75. package/front_end/panels/timeline/components/DetailsView.ts +3 -3
  76. package/front_end/panels/timeline/components/IgnoreListSetting.ts +0 -2
  77. package/front_end/panels/timeline/components/LiveMetricsView.ts +59 -64
  78. package/front_end/panels/timeline/components/OriginMap.ts +1 -1
  79. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +2 -3
  80. package/front_end/panels/timeline/components/liveMetricsView.css +1 -0
  81. package/front_end/third_party/chromium/README.chromium +1 -1
  82. package/front_end/third_party/lighthouse/README.chromium +2 -2
  83. package/front_end/third_party/lighthouse/lighthouse-dt-bundle.js +1580 -1524
  84. package/front_end/third_party/lighthouse/locales/ar-XB.json +111 -72
  85. package/front_end/third_party/lighthouse/locales/ar.json +113 -74
  86. package/front_end/third_party/lighthouse/locales/bg.json +112 -73
  87. package/front_end/third_party/lighthouse/locales/ca.json +112 -73
  88. package/front_end/third_party/lighthouse/locales/cs.json +112 -73
  89. package/front_end/third_party/lighthouse/locales/da.json +112 -73
  90. package/front_end/third_party/lighthouse/locales/de.json +112 -73
  91. package/front_end/third_party/lighthouse/locales/el.json +112 -73
  92. package/front_end/third_party/lighthouse/locales/en-GB.json +111 -72
  93. package/front_end/third_party/lighthouse/locales/en-US.json +102 -66
  94. package/front_end/third_party/lighthouse/locales/en-XA.json +111 -72
  95. package/front_end/third_party/lighthouse/locales/en-XL.json +102 -66
  96. package/front_end/third_party/lighthouse/locales/es-419.json +112 -73
  97. package/front_end/third_party/lighthouse/locales/es.json +112 -73
  98. package/front_end/third_party/lighthouse/locales/fi.json +112 -73
  99. package/front_end/third_party/lighthouse/locales/fil.json +112 -73
  100. package/front_end/third_party/lighthouse/locales/fr.json +112 -73
  101. package/front_end/third_party/lighthouse/locales/he.json +112 -73
  102. package/front_end/third_party/lighthouse/locales/hi.json +112 -73
  103. package/front_end/third_party/lighthouse/locales/hr.json +112 -73
  104. package/front_end/third_party/lighthouse/locales/hu.json +112 -73
  105. package/front_end/third_party/lighthouse/locales/id.json +112 -73
  106. package/front_end/third_party/lighthouse/locales/it.json +113 -74
  107. package/front_end/third_party/lighthouse/locales/ja.json +112 -73
  108. package/front_end/third_party/lighthouse/locales/ko.json +112 -73
  109. package/front_end/third_party/lighthouse/locales/lt.json +112 -73
  110. package/front_end/third_party/lighthouse/locales/lv.json +112 -73
  111. package/front_end/third_party/lighthouse/locales/nl.json +112 -73
  112. package/front_end/third_party/lighthouse/locales/no.json +112 -73
  113. package/front_end/third_party/lighthouse/locales/pl.json +112 -73
  114. package/front_end/third_party/lighthouse/locales/pt-PT.json +112 -73
  115. package/front_end/third_party/lighthouse/locales/pt.json +112 -73
  116. package/front_end/third_party/lighthouse/locales/ro.json +112 -73
  117. package/front_end/third_party/lighthouse/locales/ru.json +112 -73
  118. package/front_end/third_party/lighthouse/locales/sk.json +112 -73
  119. package/front_end/third_party/lighthouse/locales/sl.json +112 -73
  120. package/front_end/third_party/lighthouse/locales/sr-Latn.json +112 -73
  121. package/front_end/third_party/lighthouse/locales/sr.json +112 -73
  122. package/front_end/third_party/lighthouse/locales/sv.json +124 -85
  123. package/front_end/third_party/lighthouse/locales/ta.json +112 -73
  124. package/front_end/third_party/lighthouse/locales/te.json +112 -73
  125. package/front_end/third_party/lighthouse/locales/th.json +112 -73
  126. package/front_end/third_party/lighthouse/locales/tr.json +113 -74
  127. package/front_end/third_party/lighthouse/locales/uk.json +112 -73
  128. package/front_end/third_party/lighthouse/locales/vi.json +112 -73
  129. package/front_end/third_party/lighthouse/locales/zh-HK.json +112 -73
  130. package/front_end/third_party/lighthouse/locales/zh-TW.json +113 -74
  131. package/front_end/third_party/lighthouse/locales/zh.json +113 -74
  132. package/front_end/third_party/lighthouse/report/bundle.d.ts +4 -4
  133. package/front_end/third_party/lighthouse/report/bundle.js +10 -3
  134. package/front_end/third_party/lighthouse/report-assets/report-generator.mjs +2 -2
  135. package/front_end/third_party/lit/lit.ts +3 -0
  136. package/front_end/third_party/lit/package.json +3 -0
  137. package/front_end/third_party/lit/rebuild.sh +3 -2
  138. package/front_end/ui/comments/CommentAnchorResolver.ts +8 -2
  139. package/front_end/ui/comments/CommentOverlayManager.ts +2 -1
  140. package/front_end/ui/components/buttons/Button.ts +19 -1
  141. package/front_end/ui/legacy/ContextMenu.ts +16 -1
  142. package/front_end/ui/legacy/InspectorView.ts +4 -3
  143. package/front_end/ui/legacy/PlusButton.ts +5 -6
  144. package/front_end/ui/legacy/TabbedPane.ts +121 -80
  145. package/front_end/ui/legacy/Treeoutline.ts +37 -6
  146. package/front_end/ui/legacy/UIUtils.ts +7 -0
  147. package/front_end/ui/legacy/Widget.ts +33 -0
  148. package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +3 -0
  149. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +14 -4
  150. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +157 -171
  151. package/front_end/ui/lit/lit.ts +1 -1
  152. package/front_end/ui/visual_logging/KnownContextValues.ts +7 -0
  153. package/inspector_overlay/highlight_anchor.ts +197 -0
  154. package/inspector_overlay/tool_highlight.ts +8 -0
  155. package/package.json +1 -1
  156. package/.agents/skills/devtools-ci/SKILL.md +0 -65
  157. package/.agents/skills/evaluate-ai-css-completion/SKILL.md +0 -143
  158. package/.agents/skills/evaluate-ai-css-completion/scripts/evaluate.js +0 -104
  159. package/.agents/skills/fixing-skipped-tests/SKILL.md +0 -32
  160. package/.agents/skills/gerrit-cli/SKILL.md +0 -74
  161. package/.agents/skills/gerrit-cli/references/commands.md +0 -169
  162. package/.agents/skills/gerrit-cli/references/workflows.md +0 -63
  163. package/.agents/skills/gerrit-cli/scripts/import_upstream.py +0 -85
  164. 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.
@@ -1,6 +1,6 @@
1
1
  ---
2
- name: repro-flaky-tests
3
- description: Reproduce and investigate flakiness in a test.
2
+ name: fix-tests
3
+ description: Use this skill to reproduce and fix flaky and disabled tests.
4
4
  ---
5
5
 
6
6
  # Workflow
@@ -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
- const result = await node.callFunction(scrollIntoViewInPage);
1323
- if (!result) {
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
- clearTimeout(this.#hideHighlightTimeout);
346
- this.#hideHighlightTimeout = undefined;
345
+ clearTimeout(this.#hideHighlightTimeout);
346
+ this.#hideHighlightTimeout = undefined;
347
347
 
348
- const highlightConfig = this.buildHighlightConfig(mode);
349
- if (typeof showInfo !== 'undefined') {
350
- highlightConfig.showInfo = showInfo;
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
- if (this.#hideHighlightTimeout === undefined) {
500
- this.#hideHighlightTimeout = globalThis.setTimeout(
501
- () => this.highlightInOverlay({clear: true}),
502
- delay,
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
- return new SourceMapScopeRemoteObject(this.#callFrame, this.#scope, this.#range, this.#scopeNumber);
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
- if (expressions.every(expr => expr === null)) {
164
- const properties = this.#scope.variables.map(v => SourceMapScopeRemoteObject.#unavailableProperty(v));
165
- return {properties, internalProperties: []};
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
- const spreadEntries: string[] = [];
169
- for (const [index, expr] of expressions.entries()) {
170
- if (expr !== null) {
171
- spreadEntries.push(`...(() => { try { return {${index}: eval(${JSON.stringify(expr)})}; } catch {} })()`);
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: batchExpression,
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
- const properties = this.#scope.variables.map(v => SourceMapScopeRemoteObject.#unavailableProperty(v));
184
- return {properties, internalProperties: []};
229
+ return null;
185
230
  }
186
231
 
187
- const {properties: objectProperties} = await result.object.getOwnProperties(generatePreview);
232
+ const {properties} = await result.object.getOwnProperties(generatePreview);
188
233
  result.object.release();
189
234
 
190
- const propertyMap = new Map<string, RemoteObjectProperty>();
191
- if (objectProperties) {
192
- for (const prop of objectProperties) {
193
- propertyMap.set(prop.name, prop);
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
- const properties: RemoteObjectProperty[] = [];
198
- for (const [index, variable] of this.#scope.variables.entries()) {
199
- const prop = propertyMap.get(String(index));
200
- if (!prop || !prop.value) {
201
- properties.push(SourceMapScopeRemoteObject.#unavailableProperty(variable));
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
- properties.push(new RemoteObjectProperty(variable, prop.value, /* enumerable */ false, /* writable */ false,
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 === null || expressionOrSubRanges === undefined) {
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: i18nString(UIStrings.gemini)} :
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.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"}]);
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
  */