chrome-devtools-frontend 1.0.1524741 → 1.0.1526203

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 (66) hide show
  1. package/docs/policy/slow-close.md +22 -19
  2. package/front_end/core/common/Settings.ts +1 -1
  3. package/front_end/core/sdk/PreloadingModel.ts +3 -0
  4. package/front_end/core/sdk/ResourceTreeModel.ts +1 -1
  5. package/front_end/{models/source_map_scopes → core/sdk}/ScopeTreeCache.ts +8 -7
  6. package/front_end/core/sdk/SourceMapScopesInfo.ts +57 -0
  7. package/front_end/core/sdk/sdk.ts +2 -0
  8. package/front_end/entrypoints/formatter_worker/FormatterActions.ts +7 -0
  9. package/front_end/entrypoints/formatter_worker/ScopeParser.ts +15 -12
  10. package/front_end/generated/InspectorBackendCommands.js +4 -4
  11. package/front_end/generated/SupportedCSSProperties.js +0 -19
  12. package/front_end/generated/protocol-mapping.d.ts +1 -1
  13. package/front_end/generated/protocol-proxy-api.d.ts +1 -1
  14. package/front_end/generated/protocol.ts +9 -8
  15. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +43 -8
  16. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +50 -32
  17. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +29 -29
  18. package/front_end/models/formatter/FormatterWorkerPool.ts +1 -1
  19. package/front_end/models/javascript_metadata/NativeFunctions.js +3 -8
  20. package/front_end/models/source_map_scopes/NamesResolver.ts +1 -3
  21. package/front_end/models/source_map_scopes/source_map_scopes.ts +0 -2
  22. package/front_end/models/trace/handlers/UserTimingsHandler.ts +1 -1
  23. package/front_end/models/trace/insights/CLSCulprits.ts +2 -1
  24. package/front_end/models/trace/insights/Cache.ts +2 -1
  25. package/front_end/models/trace/insights/DOMSize.ts +2 -1
  26. package/front_end/models/trace/insights/DocumentLatency.ts +2 -1
  27. package/front_end/models/trace/insights/DuplicatedJavaScript.ts +2 -1
  28. package/front_end/models/trace/insights/FontDisplay.ts +2 -1
  29. package/front_end/models/trace/insights/ForcedReflow.ts +2 -1
  30. package/front_end/models/trace/insights/INPBreakdown.ts +2 -1
  31. package/front_end/models/trace/insights/ImageDelivery.ts +2 -1
  32. package/front_end/models/trace/insights/LCPBreakdown.ts +2 -1
  33. package/front_end/models/trace/insights/LCPDiscovery.ts +2 -1
  34. package/front_end/models/trace/insights/LegacyJavaScript.ts +2 -1
  35. package/front_end/models/trace/insights/ModernHTTP.ts +2 -1
  36. package/front_end/models/trace/insights/NetworkDependencyTree.ts +2 -1
  37. package/front_end/models/trace/insights/RenderBlocking.ts +2 -1
  38. package/front_end/models/trace/insights/SlowCSSSelector.ts +2 -1
  39. package/front_end/models/trace/insights/ThirdParties.ts +2 -1
  40. package/front_end/models/trace/insights/Viewport.ts +2 -1
  41. package/front_end/models/trace/insights/types.ts +2 -1
  42. package/front_end/panels/application/ReportingApiView.ts +8 -7
  43. package/front_end/panels/application/StorageView.ts +2 -1
  44. package/front_end/panels/application/preloading/components/PreloadingString.ts +2 -0
  45. package/front_end/panels/changes/ChangesSidebar.ts +10 -3
  46. package/front_end/panels/changes/ChangesView.ts +69 -69
  47. package/front_end/panels/changes/CombinedDiffView.ts +1 -1
  48. package/front_end/panels/changes/changesView.css +4 -0
  49. package/front_end/panels/console/ConsolePrompt.ts +24 -4
  50. package/front_end/panels/lighthouse/LighthouseController.ts +5 -0
  51. package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorPane.ts +43 -46
  52. package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +254 -153
  53. package/front_end/panels/linear_memory_inspector/components/linearMemoryInspector.css +28 -21
  54. package/front_end/panels/timeline/TimelinePanel.ts +10 -8
  55. package/front_end/panels/timeline/components/ExportTraceOptions.ts +1 -1
  56. package/front_end/third_party/chromium/README.chromium +1 -1
  57. package/front_end/ui/components/buttons/Button.ts +17 -0
  58. package/front_end/ui/components/docs/linear_memory_inspector/basic.ts +21 -9
  59. package/front_end/ui/components/highlighting/HighlightManager.ts +21 -1
  60. package/front_end/ui/components/tooltips/Tooltip.ts +22 -5
  61. package/front_end/ui/legacy/SearchableView.ts +1 -1
  62. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +48 -5
  63. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +2 -2
  64. package/front_end/ui/legacy/components/source_frame/JSONView.ts +28 -0
  65. package/front_end/ui/legacy/components/source_frame/StreamingContentHexView.ts +18 -20
  66. package/package.json +22 -22
@@ -4,11 +4,11 @@
4
4
  <small>([go/chrome-devtools:slow-close-policy])</small>
5
5
 
6
6
  In November 2024, we instituted a slow close policy for Chrome DevTools to
7
- automatically maintain hygiene of our bug database. We ended up with a list
8
- of over 1650 open bugs and over 750 open feature requests, some of them going
9
- back over 10 years, which was not only challenging to maintain, but also made
10
- it difficult to determine what's relevant and where we should invest our
11
- resources best.
7
+ automatically maintain hygiene of our bug database. We ended up with a list of
8
+ over 1650 open bugs and over 750 open feature requests, some of them going back
9
+ over 10 years, which was not only challenging to maintain, but also made it
10
+ difficult to determine what's relevant and where we should invest our resources
11
+ best.
12
12
 
13
13
  By automatically nudging and closing stale bugs and feature requests, we can
14
14
  reduce this burden, and better communicate to our users what will actually be
@@ -20,28 +20,31 @@ actioned, and hear from them what remains relevant.
20
20
 
21
21
  The criteria for slow close:
22
22
 
23
- - Status: unassigned
24
- - Type: Bug or Feature Request
25
- - Created: over 3 years ago
26
- - Last updated: over 90 days ago
27
- - Popularity: (cc count + vote count) < 10
28
- - No open descendants
23
+ - Status: unassigned
24
+ - Type: Bug or Feature Request
25
+ - Created: over 3 years ago
26
+ - Last updated: over 90 days ago
27
+ - Popularity: (cc count + vote count) < 10
28
+ - No open descendants
29
29
 
30
30
  Googlers can mark issues as exempt from slow close by adding them to the
31
31
  [`DevTools-Blintz-Close-Exempt` hotlist](https://issues.chromium.org/hotlists/6459983).
32
+ All issues on the
33
+ [`ChromeTooling-Icebox`](https://issues.chromium.org/hotlists/7363836) are also
34
+ automatically exempt from slow close.
32
35
 
33
36
  ## Process
34
37
 
35
38
  The automation runs on a daily basis, and performs the following steps:
36
39
 
37
- - Issues that meet the criteria outlined above are added to the
38
- [`DevTools-Blintz-Close-Candidate` hotlist](https://issues.chromium.org/hotlists/6459982)
39
- for closure.
40
- - If 14 days have passed and no updates have occurred, the issue will be closed
41
- and moved to the
42
- [`DevTools-Blintz-Close` hotlist](https://issues.chromium.org/hotlists/6460812)
43
- for recording purposes.
44
- - No more than 25 issues will be updated in a single run.
40
+ - Issues that meet the criteria outlined above are added to the
41
+ [`DevTools-Blintz-Close-Candidate` hotlist](https://issues.chromium.org/hotlists/6459982)
42
+ for closure.
43
+ - If 14 days have passed and no updates have occurred, the issue will be
44
+ closed and moved to the
45
+ [`DevTools-Blintz-Close` hotlist](https://issues.chromium.org/hotlists/6460812)
46
+ for recording purposes.
47
+ - No more than 25 issues will be updated in a single run.
45
48
 
46
49
  ## Implementation
47
50
 
@@ -131,7 +131,7 @@ export class Settings {
131
131
  * to store UI state such as how a user choses to position a split widget or
132
132
  * which panel they last opened.
133
133
  * If you are creating a setting that you expect the user to control, and
134
- * sync, prefer {@see createSetting}
134
+ * sync, prefer {@link Settings.createSetting}
135
135
  */
136
136
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
137
137
  moduleSetting<T = any>(settingName: string): Setting<T> {
@@ -626,6 +626,8 @@ class PreloadingAttemptRegistry {
626
626
  return 0;
627
627
  case Protocol.Preload.SpeculationAction.Prerender:
628
628
  return 1;
629
+ case Protocol.Preload.SpeculationAction.PrerenderUntilScript:
630
+ return 2;
629
631
  }
630
632
  }
631
633
 
@@ -736,6 +738,7 @@ class PreloadingAttemptRegistry {
736
738
  };
737
739
  break;
738
740
  case Protocol.Preload.SpeculationAction.Prerender:
741
+ case Protocol.Preload.SpeculationAction.PrerenderUntilScript:
739
742
  attempt = {
740
743
  action: Protocol.Preload.SpeculationAction.Prerender,
741
744
  key,
@@ -106,7 +106,7 @@ export class ResourceTreeModel extends SDKModel<EventTypes> {
106
106
  }
107
107
 
108
108
  // TODO(crbug.com/445966299): Refactor to use `storageAgent().invoke_getStorageKey()` instead.
109
- const response = await this.storageAgent.invoke_getStorageKeyForFrame({frameId});
109
+ const response = await this.storageAgent.invoke_getStorageKey({frameId});
110
110
  if (response.getError() === 'Frame tree node for given frame not found') {
111
111
  return null;
112
112
  }
@@ -2,24 +2,25 @@
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
4
 
5
- import type * as SDK from '../../core/sdk/sdk.js';
6
- import * as Formatter from '../formatter/formatter.js';
7
- import * as TextUtils from '../text_utils/text_utils.js';
5
+ import * as Formatter from '../../models/formatter/formatter.js';
6
+ import * as TextUtils from '../../models/text_utils/text_utils.js';
7
+
8
+ import type {Script} from './Script.js';
8
9
 
9
10
  type ScopeTreeNode = Formatter.FormatterWorkerPool.ScopeTreeNode;
10
11
 
11
12
  /** If a script failed to parse, we stash null in order to prevent unnecessary re-parsing */
12
- const scopeTrees = new WeakMap<SDK.Script.Script, Promise<ScopeTreeNode|null>>();
13
+ const scopeTrees = new WeakMap<Script, Promise<ScopeTreeNode|null>>();
13
14
 
14
15
  /**
15
16
  * Computes and caches the scope tree for `script`.
16
17
  *
17
- * We use {@link SDK.Script.Script} as a key to uniquely identify scripts.
18
- * {@link SDK.Script.Script} boils down to "target" + "script ID". This
18
+ * We use {@link Script} as a key to uniquely identify scripts.
19
+ * {@link Script} boils down to "target" + "script ID". This
19
20
  * duplicates work in case of identitical script running on multiple targets
20
21
  * (e.g. workers).
21
22
  */
22
- export function scopeTreeForScript(script: SDK.Script.Script): Promise<ScopeTreeNode|null> {
23
+ export function scopeTreeForScript(script: Script): Promise<ScopeTreeNode|null> {
23
24
  let promise = scopeTrees.get(script);
24
25
  if (promise === undefined) {
25
26
  promise = script.requestContentData().then(content => {
@@ -3,6 +3,8 @@
3
3
  // found in the LICENSE file.
4
4
 
5
5
  import * as Protocol from '../../generated/protocol.js';
6
+ import * as Formatter from '../../models/formatter/formatter.js';
7
+ import type * as TextUtils from '../../models/text_utils/text_utils.js';
6
8
  import type * as ScopesCodec from '../../third_party/source-map-scopes-codec/source-map-scopes-codec.js';
7
9
 
8
10
  import type {CallFrame, ScopeChainEntry} from './DebuggerModel.js';
@@ -22,6 +24,61 @@ export class SourceMapScopesInfo {
22
24
  this.#generatedRanges = scopeInfo.ranges;
23
25
  }
24
26
 
27
+ /**
28
+ * If the source map does not contain any scopes information, this factory function attempts to create bare bones scope information
29
+ * via the script's AST combined with the mappings.
30
+ *
31
+ * We create the generated ranges from the scope tree and for each range we create an original scope that matches the bounds 1:1.
32
+ * We don't map the bounds via mappings as mappings are often iffy and it's not strictly required to translate stack traces where we
33
+ * map call-sites separately.
34
+ */
35
+ static createFromAst(
36
+ sourceMap: SourceMap, scopeTree: Formatter.FormatterWorkerPool.ScopeTreeNode,
37
+ text: TextUtils.Text.Text): SourceMapScopesInfo {
38
+ const {scope, range} = convertScope(scopeTree, undefined, undefined);
39
+ return new SourceMapScopesInfo(sourceMap, {scopes: [scope], ranges: [range]});
40
+
41
+ function convertScope(
42
+ node: Formatter.FormatterWorkerPool.ScopeTreeNode, parentScope: ScopesCodec.OriginalScope|undefined,
43
+ parentRange: ScopesCodec.GeneratedRange|
44
+ undefined): {scope: ScopesCodec.OriginalScope, range: ScopesCodec.GeneratedRange} {
45
+ const start = positionFromOffset(node.start);
46
+ const end = positionFromOffset(node.end);
47
+ const isStackFrame = node.kind === Formatter.FormatterWorkerPool.ScopeKind.FUNCTION;
48
+
49
+ const scope: ScopesCodec.OriginalScope = {
50
+ start,
51
+ end,
52
+ name: sourceMap.findEntry(start.line, start.column, 0)?.name,
53
+ isStackFrame,
54
+ variables: [],
55
+ children: [],
56
+ };
57
+
58
+ const range: ScopesCodec.GeneratedRange = {
59
+ start,
60
+ end,
61
+ originalScope: scope,
62
+ isStackFrame,
63
+ isHidden: false,
64
+ values: [],
65
+ children: [],
66
+ };
67
+
68
+ parentRange?.children.push(range);
69
+ parentScope?.children.push(scope);
70
+
71
+ node.children.forEach(child => convertScope(child, scope, range));
72
+
73
+ return {scope, range};
74
+ }
75
+
76
+ function positionFromOffset(offset: number): ScopesCodec.Position {
77
+ const location = text.positionFromOffset(offset);
78
+ return {line: location.lineNumber, column: location.columnNumber};
79
+ }
80
+ }
81
+
25
82
  addOriginalScopes(scopes: Array<ScopesCodec.OriginalScope|null>): void {
26
83
  for (const scope of scopes) {
27
84
  this.#originalScopes.push(scope);
@@ -68,6 +68,7 @@ import * as RemoteObject from './RemoteObject.js';
68
68
  import * as Resource from './Resource.js';
69
69
  import * as ResourceTreeModel from './ResourceTreeModel.js';
70
70
  import * as RuntimeModel from './RuntimeModel.js';
71
+ import * as ScopeTreeCache from './ScopeTreeCache.js';
71
72
  import * as ScreenCaptureModel from './ScreenCaptureModel.js';
72
73
  import * as Script from './Script.js';
73
74
  import * as SDKModel from './SDKModel.js';
@@ -149,6 +150,7 @@ export {
149
150
  Resource,
150
151
  ResourceTreeModel,
151
152
  RuntimeModel,
153
+ ScopeTreeCache,
152
154
  ScreenCaptureModel,
153
155
  Script,
154
156
  SDKModel,
@@ -44,9 +44,16 @@ export const enum DefinitionKind {
44
44
  FIXED = 3,
45
45
  }
46
46
 
47
+ export const enum ScopeKind {
48
+ BLOCK = 1,
49
+ FUNCTION = 2,
50
+ GLOBAL = 3,
51
+ }
52
+
47
53
  export interface ScopeTreeNode {
48
54
  variables: Array<{name: string, kind: DefinitionKind, offsets: number[]}>;
49
55
  start: number;
50
56
  end: number;
57
+ kind: ScopeKind;
51
58
  children: ScopeTreeNode[];
52
59
  }
@@ -5,7 +5,7 @@
5
5
  import * as Acorn from '../../third_party/acorn/acorn.js';
6
6
 
7
7
  import {ECMA_VERSION} from './AcornTokenizer.js';
8
- import {DefinitionKind, type ScopeTreeNode} from './FormatterActions.js';
8
+ import {DefinitionKind, ScopeKind, type ScopeTreeNode} from './FormatterActions.js';
9
9
 
10
10
  export function parseScopes(expression: string, sourceType: 'module'|'script' = 'script'): Scope|null {
11
11
  // Parse the expression and find variables and scopes.
@@ -36,12 +36,14 @@ export class Scope {
36
36
  readonly parent: Scope|null;
37
37
  readonly start: number;
38
38
  readonly end: number;
39
+ readonly kind: ScopeKind;
39
40
  readonly children: Scope[] = [];
40
41
 
41
- constructor(start: number, end: number, parent: Scope|null) {
42
+ constructor(start: number, end: number, parent: Scope|null, kind: ScopeKind) {
42
43
  this.start = start;
43
44
  this.end = end;
44
45
  this.parent = parent;
46
+ this.kind = kind;
45
47
  if (parent) {
46
48
  parent.children.push(this);
47
49
  }
@@ -61,6 +63,7 @@ export class Scope {
61
63
  start: this.start,
62
64
  end: this.end,
63
65
  variables,
66
+ kind: this.kind,
64
67
  children,
65
68
  };
66
69
  }
@@ -137,7 +140,7 @@ export class ScopeVariableAnalysis {
137
140
 
138
141
  constructor(node: Acorn.ESTree.Node) {
139
142
  this.#rootNode = node;
140
- this.#rootScope = new Scope(node.start, node.end, null);
143
+ this.#rootScope = new Scope(node.start, node.end, null, ScopeKind.GLOBAL);
141
144
  this.#currentScope = this.#rootScope;
142
145
  }
143
146
 
@@ -169,7 +172,7 @@ export class ScopeVariableAnalysis {
169
172
  node.elements.forEach(item => this.#processNode(item));
170
173
  break;
171
174
  case 'ArrowFunctionExpression': {
172
- this.#pushScope(node.start, node.end);
175
+ this.#pushScope(node.start, node.end, ScopeKind.FUNCTION);
173
176
  node.params.forEach(this.#processNodeAsDefinition.bind(this, DefinitionKind.VAR, false));
174
177
  if (node.body.type === 'BlockStatement') {
175
178
  // Include the body of the arrow function in the same scope as the arguments.
@@ -188,7 +191,7 @@ export class ScopeVariableAnalysis {
188
191
  this.#processNode(node.right);
189
192
  break;
190
193
  case 'BlockStatement':
191
- this.#pushScope(node.start, node.end);
194
+ this.#pushScope(node.start, node.end, ScopeKind.BLOCK);
192
195
  node.body.forEach(this.#processNode.bind(this));
193
196
  this.#popScope(false);
194
197
  break;
@@ -202,7 +205,7 @@ export class ScopeVariableAnalysis {
202
205
  break;
203
206
  }
204
207
  case 'CatchClause':
205
- this.#pushScope(node.start, node.end);
208
+ this.#pushScope(node.start, node.end, ScopeKind.BLOCK);
206
209
  this.#processNodeAsDefinition(DefinitionKind.LET, false, node.param);
207
210
  this.#processNode(node.body);
208
211
  this.#popScope(false);
@@ -234,14 +237,14 @@ export class ScopeVariableAnalysis {
234
237
  break;
235
238
  case 'ForInStatement':
236
239
  case 'ForOfStatement':
237
- this.#pushScope(node.start, node.end);
240
+ this.#pushScope(node.start, node.end, ScopeKind.BLOCK);
238
241
  this.#processNode(node.left);
239
242
  this.#processNode(node.right);
240
243
  this.#processNode(node.body);
241
244
  this.#popScope(false);
242
245
  break;
243
246
  case 'ForStatement':
244
- this.#pushScope(node.start, node.end);
247
+ this.#pushScope(node.start, node.end, ScopeKind.BLOCK);
245
248
  this.#processNode(node.init ?? null);
246
249
  this.#processNode(node.test ?? null);
247
250
  this.#processNode(node.update ?? null);
@@ -250,7 +253,7 @@ export class ScopeVariableAnalysis {
250
253
  break;
251
254
  case 'FunctionDeclaration':
252
255
  this.#processNodeAsDefinition(DefinitionKind.VAR, false, node.id);
253
- this.#pushScope(node.id?.end ?? node.start, node.end);
256
+ this.#pushScope(node.id?.end ?? node.start, node.end, ScopeKind.FUNCTION);
254
257
  this.#addVariable('this', node.start, DefinitionKind.FIXED);
255
258
  this.#addVariable('arguments', node.start, DefinitionKind.FIXED);
256
259
  node.params.forEach(this.#processNodeAsDefinition.bind(this, DefinitionKind.LET, false));
@@ -259,7 +262,7 @@ export class ScopeVariableAnalysis {
259
262
  this.#popScope(true);
260
263
  break;
261
264
  case 'FunctionExpression':
262
- this.#pushScope(node.id?.end ?? node.start, node.end);
265
+ this.#pushScope(node.id?.end ?? node.start, node.end, ScopeKind.FUNCTION);
263
266
  this.#addVariable('this', node.start, DefinitionKind.FIXED);
264
267
  this.#addVariable('arguments', node.start, DefinitionKind.FIXED);
265
268
  node.params.forEach(this.#processNodeAsDefinition.bind(this, DefinitionKind.LET, false));
@@ -421,8 +424,8 @@ export class ScopeVariableAnalysis {
421
424
  return this.#allNames;
422
425
  }
423
426
 
424
- #pushScope(start: number, end: number): void {
425
- this.#currentScope = new Scope(start, end, this.#currentScope);
427
+ #pushScope(start: number, end: number, kind: ScopeKind): void {
428
+ this.#currentScope = new Scope(start, end, this.#currentScope, kind);
426
429
  }
427
430
 
428
431
  #popScope(isFunctionContext: boolean): void {
@@ -214,7 +214,7 @@ inspectorBackend.registerEnum("Browser.PrivacySandboxAPI", {BiddingAndAuctionSer
214
214
  inspectorBackend.registerEvent("Browser.downloadWillBegin", ["frameId", "guid", "url", "suggestedFilename"]);
215
215
  inspectorBackend.registerEnum("Browser.DownloadProgressEventState", {InProgress: "inProgress", Completed: "completed", Canceled: "canceled"});
216
216
  inspectorBackend.registerEvent("Browser.downloadProgress", ["guid", "totalBytes", "receivedBytes", "state", "filePath"]);
217
- inspectorBackend.registerCommand("Browser.setPermission", [{"name": "permission", "type": "object", "optional": false, "description": "Descriptor of permission to override.", "typeRef": "Browser.PermissionDescriptor"}, {"name": "setting", "type": "string", "optional": false, "description": "Setting of the permission.", "typeRef": "Browser.PermissionSetting"}, {"name": "origin", "type": "string", "optional": true, "description": "Requesting origin the permission applies to, all origins if not specified.", "typeRef": null}, {"name": "embeddingOrigin", "type": "string", "optional": true, "description": "Embedding origin the permission applies to. It is ignored unless the requesting origin is present and valid. If the requesting origin is provided but the embedding origin isn't, the requesting origin is used as the embedding origin.", "typeRef": null}, {"name": "browserContextId", "type": "string", "optional": true, "description": "Context to override. When omitted, default browser context is used.", "typeRef": "Browser.BrowserContextID"}], [], "Set permission settings for given requesting and embedding origins.");
217
+ inspectorBackend.registerCommand("Browser.setPermission", [{"name": "permission", "type": "object", "optional": false, "description": "Descriptor of permission to override.", "typeRef": "Browser.PermissionDescriptor"}, {"name": "setting", "type": "string", "optional": false, "description": "Setting of the permission.", "typeRef": "Browser.PermissionSetting"}, {"name": "origin", "type": "string", "optional": true, "description": "Embedding origin the permission applies to, all origins if not specified.", "typeRef": null}, {"name": "embeddedOrigin", "type": "string", "optional": true, "description": "Embedded origin the permission applies to. It is ignored unless the embedding origin is present and valid. If the embedding origin is provided but the embedded origin isn't, the embedding origin is used as the embedded origin.", "typeRef": null}, {"name": "browserContextId", "type": "string", "optional": true, "description": "Context to override. When omitted, default browser context is used.", "typeRef": "Browser.BrowserContextID"}], [], "Set permission settings for given embedding and embedded origins.");
218
218
  inspectorBackend.registerCommand("Browser.grantPermissions", [{"name": "permissions", "type": "array", "optional": false, "description": "", "typeRef": "Browser.PermissionType"}, {"name": "origin", "type": "string", "optional": true, "description": "Origin the permission applies to, all origins if not specified.", "typeRef": null}, {"name": "browserContextId", "type": "string", "optional": true, "description": "BrowserContext to override permissions. When omitted, default browser context is used.", "typeRef": "Browser.BrowserContextID"}], [], "Grant specific permissions to the given origin and reject all others. Deprecated. Use setPermission instead.");
219
219
  inspectorBackend.registerCommand("Browser.resetPermissions", [{"name": "browserContextId", "type": "string", "optional": true, "description": "BrowserContext to reset permissions. When omitted, default browser context is used.", "typeRef": "Browser.BrowserContextID"}], [], "Reset all permission management for all origins.");
220
220
  inspectorBackend.registerEnum("Browser.SetDownloadBehaviorRequestBehavior", {Deny: "deny", Allow: "allow", AllowAndName: "allowAndName", Default: "default"});
@@ -870,7 +870,7 @@ inspectorBackend.registerCommand("Network.getResponseBodyForInterception", [{"na
870
870
  inspectorBackend.registerCommand("Network.takeResponseBodyForInterceptionAsStream", [{"name": "interceptionId", "type": "string", "optional": false, "description": "", "typeRef": "Network.InterceptionId"}], ["stream"], "Returns a handle to the stream representing the response body. Note that after this command, the intercepted request can't be continued as is -- you either need to cancel it or to provide the response body. The stream only supports sequential read, IO.read will fail if the position is specified.");
871
871
  inspectorBackend.registerCommand("Network.replayXHR", [{"name": "requestId", "type": "string", "optional": false, "description": "Identifier of XHR to replay.", "typeRef": "Network.RequestId"}], [], "This method sends a new XMLHttpRequest which is identical to the original one. The following parameters should be identical: method, url, async, request body, extra headers, withCredentials attribute, user, password.");
872
872
  inspectorBackend.registerCommand("Network.searchInResponseBody", [{"name": "requestId", "type": "string", "optional": false, "description": "Identifier of the network response to search.", "typeRef": "Network.RequestId"}, {"name": "query", "type": "string", "optional": false, "description": "String to search for.", "typeRef": null}, {"name": "caseSensitive", "type": "boolean", "optional": true, "description": "If true, search is case sensitive.", "typeRef": null}, {"name": "isRegex", "type": "boolean", "optional": true, "description": "If true, treats string parameter as regex.", "typeRef": null}], ["result"], "Searches for given string in response content.");
873
- inspectorBackend.registerCommand("Network.setBlockedURLs", [{"name": "urlPatterns", "type": "array", "optional": true, "description": "URL patterns to block. Patterns use the URLPattern constructor string syntax (https://urlpattern.spec.whatwg.org/). Example: `*://*:*/*.css`.", "typeRef": "string"}, {"name": "urls", "type": "array", "optional": true, "description": "URL patterns to block. Wildcards ('*') are allowed.", "typeRef": "string"}], [], "Blocks URLs from loading.");
873
+ inspectorBackend.registerCommand("Network.setBlockedURLs", [{"name": "urlPatterns", "type": "array", "optional": true, "description": "URL patterns to block. Patterns use the URLPattern constructor string syntax (https://urlpattern.spec.whatwg.org/) and must be absolute. Example: `*://*:*/*.css`.", "typeRef": "string"}, {"name": "urls", "type": "array", "optional": true, "description": "URL patterns to block. Wildcards ('*') are allowed.", "typeRef": "string"}], [], "Blocks URLs from loading.");
874
874
  inspectorBackend.registerCommand("Network.setBypassServiceWorker", [{"name": "bypass", "type": "boolean", "optional": false, "description": "Bypass service worker and load from network.", "typeRef": null}], [], "Toggles ignoring of service worker for each request.");
875
875
  inspectorBackend.registerCommand("Network.setCacheDisabled", [{"name": "cacheDisabled", "type": "boolean", "optional": false, "description": "Cache disabled state.", "typeRef": null}], [], "Toggles ignoring cache for each request. If `true`, cache will not be used.");
876
876
  inspectorBackend.registerCommand("Network.setCookie", [{"name": "name", "type": "string", "optional": false, "description": "Cookie name.", "typeRef": null}, {"name": "value", "type": "string", "optional": false, "description": "Cookie value.", "typeRef": null}, {"name": "url", "type": "string", "optional": true, "description": "The request-URI to associate with the setting of the cookie. This value can affect the default domain, path, source port, and source scheme values of the created cookie.", "typeRef": null}, {"name": "domain", "type": "string", "optional": true, "description": "Cookie domain.", "typeRef": null}, {"name": "path", "type": "string", "optional": true, "description": "Cookie path.", "typeRef": null}, {"name": "secure", "type": "boolean", "optional": true, "description": "True if cookie is secure.", "typeRef": null}, {"name": "httpOnly", "type": "boolean", "optional": true, "description": "True if cookie is http-only.", "typeRef": null}, {"name": "sameSite", "type": "string", "optional": true, "description": "Cookie SameSite type.", "typeRef": "Network.CookieSameSite"}, {"name": "expires", "type": "number", "optional": true, "description": "Cookie expiration date, session cookie if not set", "typeRef": "Network.TimeSinceEpoch"}, {"name": "priority", "type": "string", "optional": true, "description": "Cookie Priority type.", "typeRef": "Network.CookiePriority"}, {"name": "sameParty", "type": "boolean", "optional": true, "description": "True if cookie is SameParty.", "typeRef": null}, {"name": "sourceScheme", "type": "string", "optional": true, "description": "Cookie source scheme type.", "typeRef": "Network.CookieSourceScheme"}, {"name": "sourcePort", "type": "number", "optional": true, "description": "Cookie source port. Valid values are {-1, [1, 65535]}, -1 indicates an unspecified port. An unspecified port value allows protocol clients to emulate legacy cookie scope for the port. This is a temporary ability and it will be removed in the future.", "typeRef": null}, {"name": "partitionKey", "type": "object", "optional": true, "description": "Cookie partition key. If not set, the cookie will be set as not partitioned.", "typeRef": "Network.CookiePartitionKey"}], ["success"], "Sets a cookie with the given cookie data; may overwrite equivalent cookies if they exist.");
@@ -911,7 +911,7 @@ inspectorBackend.registerType("Network.SignedExchangeSignature", [{"name": "labe
911
911
  inspectorBackend.registerType("Network.SignedExchangeHeader", [{"name": "requestUrl", "type": "string", "optional": false, "description": "Signed exchange request URL.", "typeRef": null}, {"name": "responseCode", "type": "number", "optional": false, "description": "Signed exchange response code.", "typeRef": null}, {"name": "responseHeaders", "type": "object", "optional": false, "description": "Signed exchange response headers.", "typeRef": "Network.Headers"}, {"name": "signatures", "type": "array", "optional": false, "description": "Signed exchange response signature.", "typeRef": "Network.SignedExchangeSignature"}, {"name": "headerIntegrity", "type": "string", "optional": false, "description": "Signed exchange header integrity hash in the form of `sha256-<base64-hash-value>`.", "typeRef": null}]);
912
912
  inspectorBackend.registerType("Network.SignedExchangeError", [{"name": "message", "type": "string", "optional": false, "description": "Error message.", "typeRef": null}, {"name": "signatureIndex", "type": "number", "optional": true, "description": "The index of the signature which caused the error.", "typeRef": null}, {"name": "errorField", "type": "string", "optional": true, "description": "The field which caused the error.", "typeRef": "Network.SignedExchangeErrorField"}]);
913
913
  inspectorBackend.registerType("Network.SignedExchangeInfo", [{"name": "outerResponse", "type": "object", "optional": false, "description": "The outer response of signed HTTP exchange which was received from network.", "typeRef": "Network.Response"}, {"name": "hasExtraInfo", "type": "boolean", "optional": false, "description": "Whether network response for the signed exchange was accompanied by extra headers.", "typeRef": null}, {"name": "header", "type": "object", "optional": true, "description": "Information about the signed exchange header.", "typeRef": "Network.SignedExchangeHeader"}, {"name": "securityDetails", "type": "object", "optional": true, "description": "Security details for the signed exchange header.", "typeRef": "Network.SecurityDetails"}, {"name": "errors", "type": "array", "optional": true, "description": "Errors occurred while handling the signed exchange.", "typeRef": "Network.SignedExchangeError"}]);
914
- inspectorBackend.registerType("Network.NetworkConditions", [{"name": "urlPattern", "type": "string", "optional": false, "description": "Only matching requests will be affected by these conditions. Patterns use the URLPattern constructor string syntax (https://urlpattern.spec.whatwg.org/). If the pattern is empty, all requests are matched (including p2p connections).", "typeRef": null}, {"name": "latency", "type": "number", "optional": false, "description": "Minimum latency from request sent to response headers received (ms).", "typeRef": null}, {"name": "downloadThroughput", "type": "number", "optional": false, "description": "Maximal aggregated download throughput (bytes/sec). -1 disables download throttling.", "typeRef": null}, {"name": "uploadThroughput", "type": "number", "optional": false, "description": "Maximal aggregated upload throughput (bytes/sec). -1 disables upload throttling.", "typeRef": null}, {"name": "connectionType", "type": "string", "optional": true, "description": "Connection type if known.", "typeRef": "Network.ConnectionType"}, {"name": "packetLoss", "type": "number", "optional": true, "description": "WebRTC packet loss (percent, 0-100). 0 disables packet loss emulation, 100 drops all the packets.", "typeRef": null}, {"name": "packetQueueLength", "type": "number", "optional": true, "description": "WebRTC packet queue length (packet). 0 removes any queue length limitations.", "typeRef": null}, {"name": "packetReordering", "type": "boolean", "optional": true, "description": "WebRTC packetReordering feature.", "typeRef": null}]);
914
+ inspectorBackend.registerType("Network.NetworkConditions", [{"name": "urlPattern", "type": "string", "optional": false, "description": "Only matching requests will be affected by these conditions. Patterns use the URLPattern constructor string syntax (https://urlpattern.spec.whatwg.org/) and must be absolute. If the pattern is empty, all requests are matched (including p2p connections).", "typeRef": null}, {"name": "latency", "type": "number", "optional": false, "description": "Minimum latency from request sent to response headers received (ms).", "typeRef": null}, {"name": "downloadThroughput", "type": "number", "optional": false, "description": "Maximal aggregated download throughput (bytes/sec). -1 disables download throttling.", "typeRef": null}, {"name": "uploadThroughput", "type": "number", "optional": false, "description": "Maximal aggregated upload throughput (bytes/sec). -1 disables upload throttling.", "typeRef": null}, {"name": "connectionType", "type": "string", "optional": true, "description": "Connection type if known.", "typeRef": "Network.ConnectionType"}, {"name": "packetLoss", "type": "number", "optional": true, "description": "WebRTC packet loss (percent, 0-100). 0 disables packet loss emulation, 100 drops all the packets.", "typeRef": null}, {"name": "packetQueueLength", "type": "number", "optional": true, "description": "WebRTC packet queue length (packet). 0 removes any queue length limitations.", "typeRef": null}, {"name": "packetReordering", "type": "boolean", "optional": true, "description": "WebRTC packetReordering feature.", "typeRef": null}]);
915
915
  inspectorBackend.registerType("Network.DirectTCPSocketOptions", [{"name": "noDelay", "type": "boolean", "optional": false, "description": "TCP_NODELAY option", "typeRef": null}, {"name": "keepAliveDelay", "type": "number", "optional": true, "description": "Expected to be unsigned integer.", "typeRef": null}, {"name": "sendBufferSize", "type": "number", "optional": true, "description": "Expected to be unsigned integer.", "typeRef": null}, {"name": "receiveBufferSize", "type": "number", "optional": true, "description": "Expected to be unsigned integer.", "typeRef": null}, {"name": "dnsQueryType", "type": "string", "optional": true, "description": "", "typeRef": "Network.DirectSocketDnsQueryType"}]);
916
916
  inspectorBackend.registerType("Network.DirectUDPSocketOptions", [{"name": "remoteAddr", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "remotePort", "type": "number", "optional": true, "description": "Unsigned int 16.", "typeRef": null}, {"name": "localAddr", "type": "string", "optional": true, "description": "", "typeRef": null}, {"name": "localPort", "type": "number", "optional": true, "description": "Unsigned int 16.", "typeRef": null}, {"name": "dnsQueryType", "type": "string", "optional": true, "description": "", "typeRef": "Network.DirectSocketDnsQueryType"}, {"name": "sendBufferSize", "type": "number", "optional": true, "description": "Expected to be unsigned integer.", "typeRef": null}, {"name": "receiveBufferSize", "type": "number", "optional": true, "description": "Expected to be unsigned integer.", "typeRef": null}]);
917
917
  inspectorBackend.registerType("Network.DirectUDPMessage", [{"name": "data", "type": "string", "optional": false, "description": "", "typeRef": null}, {"name": "remoteAddr", "type": "string", "optional": true, "description": "Null for connected mode.", "typeRef": null}, {"name": "remotePort", "type": "number", "optional": true, "description": "Null for connected mode. Expected to be unsigned integer.", "typeRef": null}]);
@@ -1176,7 +1176,7 @@ inspectorBackend.registerType("PerformanceTimeline.TimelineEvent", [{"name": "fr
1176
1176
 
1177
1177
  // Preload.
1178
1178
  inspectorBackend.registerEnum("Preload.RuleSetErrorType", {SourceIsNotJsonObject: "SourceIsNotJsonObject", InvalidRulesSkipped: "InvalidRulesSkipped", InvalidRulesetLevelTag: "InvalidRulesetLevelTag"});
1179
- inspectorBackend.registerEnum("Preload.SpeculationAction", {Prefetch: "Prefetch", Prerender: "Prerender"});
1179
+ inspectorBackend.registerEnum("Preload.SpeculationAction", {Prefetch: "Prefetch", Prerender: "Prerender", PrerenderUntilScript: "PrerenderUntilScript"});
1180
1180
  inspectorBackend.registerEnum("Preload.SpeculationTargetHint", {Blank: "Blank", Self: "Self"});
1181
1181
  inspectorBackend.registerEnum("Preload.PrerenderFinalStatus", {Activated: "Activated", Destroyed: "Destroyed", LowEndDevice: "LowEndDevice", InvalidSchemeRedirect: "InvalidSchemeRedirect", InvalidSchemeNavigation: "InvalidSchemeNavigation", NavigationRequestBlockedByCsp: "NavigationRequestBlockedByCsp", MojoBinderPolicy: "MojoBinderPolicy", RendererProcessCrashed: "RendererProcessCrashed", RendererProcessKilled: "RendererProcessKilled", Download: "Download", TriggerDestroyed: "TriggerDestroyed", NavigationNotCommitted: "NavigationNotCommitted", NavigationBadHttpStatus: "NavigationBadHttpStatus", ClientCertRequested: "ClientCertRequested", NavigationRequestNetworkError: "NavigationRequestNetworkError", CancelAllHostsForTesting: "CancelAllHostsForTesting", DidFailLoad: "DidFailLoad", Stop: "Stop", SslCertificateError: "SslCertificateError", LoginAuthRequested: "LoginAuthRequested", UaChangeRequiresReload: "UaChangeRequiresReload", BlockedByClient: "BlockedByClient", AudioOutputDeviceRequested: "AudioOutputDeviceRequested", MixedContent: "MixedContent", TriggerBackgrounded: "TriggerBackgrounded", MemoryLimitExceeded: "MemoryLimitExceeded", DataSaverEnabled: "DataSaverEnabled", TriggerUrlHasEffectiveUrl: "TriggerUrlHasEffectiveUrl", ActivatedBeforeStarted: "ActivatedBeforeStarted", InactivePageRestriction: "InactivePageRestriction", StartFailed: "StartFailed", TimeoutBackgrounded: "TimeoutBackgrounded", CrossSiteRedirectInInitialNavigation: "CrossSiteRedirectInInitialNavigation", CrossSiteNavigationInInitialNavigation: "CrossSiteNavigationInInitialNavigation", SameSiteCrossOriginRedirectNotOptInInInitialNavigation: "SameSiteCrossOriginRedirectNotOptInInInitialNavigation", SameSiteCrossOriginNavigationNotOptInInInitialNavigation: "SameSiteCrossOriginNavigationNotOptInInInitialNavigation", ActivationNavigationParameterMismatch: "ActivationNavigationParameterMismatch", ActivatedInBackground: "ActivatedInBackground", EmbedderHostDisallowed: "EmbedderHostDisallowed", ActivationNavigationDestroyedBeforeSuccess: "ActivationNavigationDestroyedBeforeSuccess", TabClosedByUserGesture: "TabClosedByUserGesture", TabClosedWithoutUserGesture: "TabClosedWithoutUserGesture", PrimaryMainFrameRendererProcessCrashed: "PrimaryMainFrameRendererProcessCrashed", PrimaryMainFrameRendererProcessKilled: "PrimaryMainFrameRendererProcessKilled", ActivationFramePolicyNotCompatible: "ActivationFramePolicyNotCompatible", PreloadingDisabled: "PreloadingDisabled", BatterySaverEnabled: "BatterySaverEnabled", ActivatedDuringMainFrameNavigation: "ActivatedDuringMainFrameNavigation", PreloadingUnsupportedByWebContents: "PreloadingUnsupportedByWebContents", CrossSiteRedirectInMainFrameNavigation: "CrossSiteRedirectInMainFrameNavigation", CrossSiteNavigationInMainFrameNavigation: "CrossSiteNavigationInMainFrameNavigation", SameSiteCrossOriginRedirectNotOptInInMainFrameNavigation: "SameSiteCrossOriginRedirectNotOptInInMainFrameNavigation", SameSiteCrossOriginNavigationNotOptInInMainFrameNavigation: "SameSiteCrossOriginNavigationNotOptInInMainFrameNavigation", MemoryPressureOnTrigger: "MemoryPressureOnTrigger", MemoryPressureAfterTriggered: "MemoryPressureAfterTriggered", PrerenderingDisabledByDevTools: "PrerenderingDisabledByDevTools", SpeculationRuleRemoved: "SpeculationRuleRemoved", ActivatedWithAuxiliaryBrowsingContexts: "ActivatedWithAuxiliaryBrowsingContexts", MaxNumOfRunningEagerPrerendersExceeded: "MaxNumOfRunningEagerPrerendersExceeded", MaxNumOfRunningNonEagerPrerendersExceeded: "MaxNumOfRunningNonEagerPrerendersExceeded", MaxNumOfRunningEmbedderPrerendersExceeded: "MaxNumOfRunningEmbedderPrerendersExceeded", PrerenderingUrlHasEffectiveUrl: "PrerenderingUrlHasEffectiveUrl", RedirectedPrerenderingUrlHasEffectiveUrl: "RedirectedPrerenderingUrlHasEffectiveUrl", ActivationUrlHasEffectiveUrl: "ActivationUrlHasEffectiveUrl", JavaScriptInterfaceAdded: "JavaScriptInterfaceAdded", JavaScriptInterfaceRemoved: "JavaScriptInterfaceRemoved", AllPrerenderingCanceled: "AllPrerenderingCanceled", WindowClosed: "WindowClosed", SlowNetwork: "SlowNetwork", OtherPrerenderedPageActivated: "OtherPrerenderedPageActivated", V8OptimizerDisabled: "V8OptimizerDisabled", PrerenderFailedDuringPrefetch: "PrerenderFailedDuringPrefetch", BrowsingDataRemoved: "BrowsingDataRemoved", PrerenderHostReused: "PrerenderHostReused"});
1182
1182
  inspectorBackend.registerEnum("Preload.PreloadingStatus", {Pending: "Pending", Running: "Running", Ready: "Ready", Success: "Success", Failure: "Failure", NotSupported: "NotSupported"});
@@ -733,7 +733,6 @@ export const generatedProperties = [
733
733
  "text-wrap-mode",
734
734
  "text-wrap-style",
735
735
  "timeline-scope",
736
- "timeline-trigger-behavior",
737
736
  "timeline-trigger-exit-range-end",
738
737
  "timeline-trigger-exit-range-start",
739
738
  "timeline-trigger-name",
@@ -4432,7 +4431,6 @@ export const generatedProperties = [
4432
4431
  "longhands": [
4433
4432
  "timeline-trigger-name",
4434
4433
  "timeline-trigger-source",
4435
- "timeline-trigger-behavior",
4436
4434
  "timeline-trigger-range-start",
4437
4435
  "timeline-trigger-range-end",
4438
4436
  "timeline-trigger-exit-range-start",
@@ -4440,15 +4438,6 @@ export const generatedProperties = [
4440
4438
  ],
4441
4439
  "name": "timeline-trigger"
4442
4440
  },
4443
- {
4444
- "keywords": [
4445
- "once",
4446
- "repeat",
4447
- "alternate",
4448
- "state"
4449
- ],
4450
- "name": "timeline-trigger-behavior"
4451
- },
4452
4441
  {
4453
4442
  "name": "timeline-trigger-exit-range-end"
4454
4443
  },
@@ -6846,14 +6835,6 @@ export const generatedPropertyValues = {
6846
6835
  "stable"
6847
6836
  ]
6848
6837
  },
6849
- "timeline-trigger-behavior": {
6850
- "values": [
6851
- "once",
6852
- "repeat",
6853
- "alternate",
6854
- "state"
6855
- ]
6856
- },
6857
6838
  "timeline-trigger-source": {
6858
6839
  "values": [
6859
6840
  "none",
@@ -1231,7 +1231,7 @@ export namespace ProtocolMapping {
1231
1231
  returnType: void;
1232
1232
  };
1233
1233
  /**
1234
- * Set permission settings for given requesting and embedding origins.
1234
+ * Set permission settings for given embedding and embedded origins.
1235
1235
  */
1236
1236
  'Browser.setPermission': {
1237
1237
  paramsType: [Protocol.Browser.SetPermissionRequest];
@@ -591,7 +591,7 @@ declare namespace ProtocolProxyApi {
591
591
 
592
592
  export interface BrowserApi {
593
593
  /**
594
- * Set permission settings for given requesting and embedding origins.
594
+ * Set permission settings for given embedding and embedded origins.
595
595
  */
596
596
  invoke_setPermission(params: Protocol.Browser.SetPermissionRequest): Promise<Protocol.ProtocolResponseWithError>;
597
597
 
@@ -2289,15 +2289,15 @@ export namespace Browser {
2289
2289
  */
2290
2290
  setting: PermissionSetting;
2291
2291
  /**
2292
- * Requesting origin the permission applies to, all origins if not specified.
2292
+ * Embedding origin the permission applies to, all origins if not specified.
2293
2293
  */
2294
2294
  origin?: string;
2295
2295
  /**
2296
- * Embedding origin the permission applies to. It is ignored unless the requesting origin is
2297
- * present and valid. If the requesting origin is provided but the embedding origin isn't, the
2298
- * requesting origin is used as the embedding origin.
2296
+ * Embedded origin the permission applies to. It is ignored unless the embedding origin is
2297
+ * present and valid. If the embedding origin is provided but the embedded origin isn't, the
2298
+ * embedding origin is used as the embedded origin.
2299
2299
  */
2300
- embeddingOrigin?: string;
2300
+ embeddedOrigin?: string;
2301
2301
  /**
2302
2302
  * Context to override. When omitted, default browser context is used.
2303
2303
  */
@@ -11012,8 +11012,8 @@ export namespace Network {
11012
11012
  export interface NetworkConditions {
11013
11013
  /**
11014
11014
  * Only matching requests will be affected by these conditions. Patterns use the URLPattern constructor string
11015
- * syntax (https://urlpattern.spec.whatwg.org/). If the pattern is empty, all requests are matched (including p2p
11016
- * connections).
11015
+ * syntax (https://urlpattern.spec.whatwg.org/) and must be absolute. If the pattern is empty, all requests are
11016
+ * matched (including p2p connections).
11017
11017
  */
11018
11018
  urlPattern: string;
11019
11019
  /**
@@ -11608,7 +11608,7 @@ export namespace Network {
11608
11608
  export interface SetBlockedURLsRequest {
11609
11609
  /**
11610
11610
  * URL patterns to block. Patterns use the URLPattern constructor string syntax
11611
- * (https://urlpattern.spec.whatwg.org/). Example: `*://*:*\/*.css`.
11611
+ * (https://urlpattern.spec.whatwg.org/) and must be absolute. Example: `*://*:*\/*.css`.
11612
11612
  */
11613
11613
  urlPatterns?: string[];
11614
11614
  /**
@@ -16126,6 +16126,7 @@ export namespace Preload {
16126
16126
  export const enum SpeculationAction {
16127
16127
  Prefetch = 'Prefetch',
16128
16128
  Prerender = 'Prerender',
16129
+ PrerenderUntilScript = 'PrerenderUntilScript',
16129
16130
  }
16130
16131
 
16131
16132
  /**