chrome-devtools-mcp 0.2.6 → 0.3.0

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 (40) hide show
  1. package/README.md +11 -3
  2. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/GdpClient.js +18 -3
  3. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +3 -2
  4. package/build/node_modules/chrome-devtools-frontend/front_end/core/i18n/i18n.js +24 -0
  5. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +5 -1
  6. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EnhancedTracesParser.js +4 -5
  7. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +1 -0
  8. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +8 -0
  9. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TargetManager.js +4 -0
  10. package/build/node_modules/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +10 -7
  11. package/build/node_modules/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +40 -11
  12. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js +95 -283
  13. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js +256 -22
  14. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AICallTree.js +12 -6
  15. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AIContext.js +64 -7
  16. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/EventsSerializer.js +3 -3
  17. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserInteractionsHandler.js +91 -63
  18. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserTimingsHandler.js +1 -1
  19. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Timing.js +1 -1
  20. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Trace.js +98 -36
  21. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/TraceEvents.js +9 -0
  22. package/build/src/McpContext.js +8 -2
  23. package/build/src/McpResponse.js +30 -3
  24. package/build/src/browser.js +2 -2
  25. package/build/src/cli.js +82 -0
  26. package/build/src/formatters/consoleFormatter.js +3 -1
  27. package/build/src/index.js +6 -198
  28. package/build/src/main.js +131 -0
  29. package/build/src/tools/ToolDefinition.js +1 -0
  30. package/build/src/tools/emulation.js +2 -2
  31. package/build/src/tools/input.js +8 -8
  32. package/build/src/tools/network.js +20 -4
  33. package/build/src/tools/pages.js +12 -2
  34. package/build/src/tools/performance.js +2 -2
  35. package/build/src/tools/screenshot.js +1 -1
  36. package/build/src/tools/script.js +4 -7
  37. package/build/src/tools/snapshot.js +2 -2
  38. package/build/src/trace-processing/parse.js +5 -6
  39. package/build/src/utils/pagination.js +49 -0
  40. package/package.json +12 -6
package/README.md CHANGED
@@ -27,7 +27,7 @@ MCP clients.
27
27
 
28
28
  ## Requirements
29
29
 
30
- - [Node.js 22](https://nodejs.org/) or newer.
30
+ - [Node.js 22.12.0](https://nodejs.org/) or newer.
31
31
  - [Chrome](https://www.google.com/chrome/) current stable version or newer.
32
32
  - [npm](https://www.npmjs.com/).
33
33
 
@@ -112,6 +112,14 @@ Go to `Cursor Settings` -> `MCP` -> `New MCP Server`. Use the config provided ab
112
112
  using the standard config from above.
113
113
  </details>
114
114
 
115
+ <details>
116
+ <summary>JetBrains AI Assistant & Junie</summary>
117
+
118
+ Go to `Settings | Tools | AI Assistant | Model Context Protocol (MCP)` -> `Add`. Use the config provided above.
119
+ The same way chrome-devtools-mcp can be configured for JetBrains Junie in `Settings | Tools | Junie | MCP Settings` -> `Add`. Use the config provided above.
120
+
121
+ </details>
122
+
115
123
  ### Your first prompt
116
124
 
117
125
  Enter the following prompt in your MCP Client to check if everything is working:
@@ -203,10 +211,10 @@ Pass them via the `args` property in the JSON configuration. For example:
203
211
  "chrome-devtools": {
204
212
  "command": "npx",
205
213
  "args": [
206
- "chrome-devtools-mcp@latest"
214
+ "chrome-devtools-mcp@latest",
207
215
  "--channel=canary",
208
216
  "--headless=true",
209
- "--isolated=true",
217
+ "--isolated=true"
210
218
  ]
211
219
  }
212
220
  }
@@ -39,7 +39,7 @@ function normalizeBadgeName(name) {
39
39
  }
40
40
  export const GOOGLE_DEVELOPER_PROGRAM_PROFILE_LINK = 'https://developers.google.com/profile/u/me';
41
41
  async function makeHttpRequest(request) {
42
- if (!Root.Runtime.hostConfig.devToolsGdpProfiles?.enabled || Root.Runtime.hostConfig.isOffTheRecord) {
42
+ if (!isGdpProfilesAvailable()) {
43
43
  return null;
44
44
  }
45
45
  const response = await new Promise(resolve => {
@@ -65,8 +65,12 @@ export class GdpClient {
65
65
  return gdpClientInstance;
66
66
  }
67
67
  async initialize() {
68
- void this.getProfile();
69
- void this.checkEligibility();
68
+ return await Promise.all([this.getProfile(), this.checkEligibility()]).then(([profile, eligibilityResponse]) => {
69
+ return {
70
+ hasProfile: Boolean(profile),
71
+ isEligible: eligibilityResponse?.createProfile === EligibilityStatus.ELIGIBLE
72
+ };
73
+ });
70
74
  }
71
75
  async getProfile() {
72
76
  if (this.#cachedProfilePromise) {
@@ -157,5 +161,16 @@ function setDebugGdpIntegrationEnabled(enabled) {
157
161
  localStorage.removeItem('debugGdpIntegrationEnabled');
158
162
  }
159
163
  }
164
+ export function isGdpProfilesAvailable() {
165
+ const isBaseFeatureEnabled = Boolean(Root.Runtime.hostConfig.devToolsGdpProfiles?.enabled);
166
+ const isBrandedBuild = Boolean(Root.Runtime.hostConfig.devToolsGdpProfilesAvailability?.enabled);
167
+ const isOffTheRecordProfile = Root.Runtime.hostConfig.isOffTheRecord;
168
+ const isDisabledByEnterprisePolicy = getGdpProfilesEnterprisePolicy() === Root.Runtime.GdpProfilesEnterprisePolicyValue.DISABLED;
169
+ return isBaseFeatureEnabled && isBrandedBuild && !isOffTheRecordProfile && !isDisabledByEnterprisePolicy;
170
+ }
171
+ export function getGdpProfilesEnterprisePolicy() {
172
+ return (Root.Runtime.hostConfig.devToolsGdpProfilesAvailability?.enterprisePolicyValue ??
173
+ Root.Runtime.GdpProfilesEnterprisePolicyValue.DISABLED);
174
+ }
160
175
  // @ts-expect-error
161
176
  globalThis.setDebugGdpIntegrationEnabled = setDebugGdpIntegrationEnabled;
@@ -193,7 +193,7 @@ export class UserMetrics {
193
193
  InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.LighthouseCategoryUsed" /* EnumeratedHistogram.LighthouseCategoryUsed */, type, 6 /* LighthouseCategoryUsed.MAX_VALUE */);
194
194
  }
195
195
  swatchActivated(swatch) {
196
- InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.SwatchActivated" /* EnumeratedHistogram.SwatchActivated */, swatch, 11 /* SwatchType.MAX_VALUE */);
196
+ InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.SwatchActivated" /* EnumeratedHistogram.SwatchActivated */, swatch, 12 /* SwatchType.MAX_VALUE */);
197
197
  }
198
198
  animationPlaybackRateChanged(playbackRate) {
199
199
  InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.AnimationPlaybackRateChanged" /* EnumeratedHistogram.AnimationPlaybackRateChanged */, playbackRate, 4 /* AnimationsPlaybackRate.MAX_VALUE */);
@@ -422,7 +422,8 @@ export var Action;
422
422
  Action[Action["AiCodeCompletionSuggestionDisplayed"] = 186] = "AiCodeCompletionSuggestionDisplayed";
423
423
  Action[Action["AiCodeCompletionSuggestionAccepted"] = 187] = "AiCodeCompletionSuggestionAccepted";
424
424
  Action[Action["AiCodeCompletionError"] = 188] = "AiCodeCompletionError";
425
- Action[Action["MAX_VALUE"] = 189] = "MAX_VALUE";
425
+ Action[Action["AttributeLinkClicked"] = 189] = "AttributeLinkClicked";
426
+ Action[Action["MAX_VALUE"] = 190] = "MAX_VALUE";
426
427
  /* eslint-enable @typescript-eslint/naming-convention */
427
428
  })(Action || (Action = {}));
428
429
  export var PanelCodes;
@@ -31,6 +31,30 @@ export const TimeUtilities = {
31
31
  }
32
32
  }
33
33
 
34
+ return parts.map(part => part.value).join('');
35
+ }
36
+ };
37
+
38
+ // TODO(jacktfranklin): once the ImageDelivery insight does not depend on this method, we can remove this stub.
39
+ export const ByteUtilities = {
40
+ bytesToString(x) {
41
+ const separator = ' ';
42
+ const formatter = new Intl.NumberFormat('en-US', {
43
+ style: 'unit',
44
+ unit: 'kilobyte',
45
+ unitDisplay: 'narrow',
46
+ minimumFractionDigits: 1,
47
+ maximumFractionDigits: 1,
48
+ });
49
+ const parts = formatter.formatToParts(x / 1000);
50
+ for (const part of parts) {
51
+ if (part.type === 'literal') {
52
+ if (part.value === ' ') {
53
+ part.value = separator;
54
+ }
55
+ }
56
+ }
57
+
34
58
  return parts.map(part => part.value).join('');
35
59
  }
36
60
  };
@@ -656,12 +656,16 @@ export class CSSMatchedStyles {
656
656
  const domCascade = this.#styleToDOMCascade.get(style);
657
657
  return domCascade ? domCascade.computeAttribute(style, attributeName, type) : null;
658
658
  }
659
- rawAttributeValueFromStyle(style, attributeName) {
659
+ originatingNodeForStyle(style) {
660
660
  let node = this.nodeForStyle(style) ?? this.node();
661
661
  // If it's a pseudo-element, we need to find the originating element.
662
662
  while (node?.pseudoType()) {
663
663
  node = node.parentNode;
664
664
  }
665
+ return node;
666
+ }
667
+ rawAttributeValueFromStyle(style, attributeName) {
668
+ const node = this.originatingNodeForStyle(style);
665
669
  if (!node) {
666
670
  return null;
667
671
  }
@@ -303,11 +303,10 @@ export class EnhancedTracesParser {
303
303
  // Using PID is the last resort
304
304
  for (const orphanScript of orphanScripts) {
305
305
  const orphanScriptExecutionContextIsolateId = this.getExecutionContextIsolateId(orphanScript.isolate, orphanScript.executionContextId);
306
- if (orphanScriptExecutionContextIsolateId in executionContextIsolateToTarget) {
307
- const frameId = executionContextIsolateToTarget.get(orphanScriptExecutionContextIsolateId);
308
- if (frameId) {
309
- targetToScripts.get(frameId)?.push(orphanScript);
310
- }
306
+ const frameId = executionContextIsolateToTarget.get(orphanScriptExecutionContextIsolateId);
307
+ if (frameId) {
308
+ // Found a link via execution context, use it.
309
+ targetToScripts.get(frameId)?.push(orphanScript);
311
310
  }
312
311
  else if (orphanScript.pid) {
313
312
  const target = targets.find(target => target.pid === orphanScript.pid);
@@ -484,6 +484,7 @@ export class NetworkDispatcher {
484
484
  networkRequest.mixedContentType = request.mixedContentType || "none" /* Protocol.Security.MixedContentType.None */;
485
485
  networkRequest.setReferrerPolicy(request.referrerPolicy);
486
486
  networkRequest.setIsSameSite(request.isSameSite || false);
487
+ networkRequest.setIsAdRelated(request.isAdRelated || false);
487
488
  }
488
489
  updateNetworkRequestWithResponse(networkRequest, response) {
489
490
  if (response.url && networkRequest.url() !== response.url) {
@@ -307,6 +307,7 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
307
307
  directSocketInfo;
308
308
  #directSocketChunks = [];
309
309
  #isIpProtectionUsed;
310
+ #isAdRelated;
310
311
  constructor(requestId, backendRequestId, url, documentURL, frameId, loaderId, initiator, hasUserGesture) {
311
312
  super();
312
313
  this.#requestId = requestId;
@@ -318,6 +319,7 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
318
319
  this.#initiator = initiator;
319
320
  this.#hasUserGesture = hasUserGesture;
320
321
  this.#isIpProtectionUsed = false;
322
+ this.#isAdRelated = false;
321
323
  }
322
324
  static create(backendRequestId, url, documentURL, frameId, loaderId, initiator, hasUserGesture) {
323
325
  return new NetworkRequest(backendRequestId, backendRequestId, url, documentURL, frameId, loaderId, initiator, hasUserGesture);
@@ -1422,6 +1424,12 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
1422
1424
  isIpProtectionUsed() {
1423
1425
  return this.#isIpProtectionUsed;
1424
1426
  }
1427
+ setIsAdRelated(isAdRelated) {
1428
+ this.#isAdRelated = isAdRelated;
1429
+ }
1430
+ isAdRelated() {
1431
+ return this.#isAdRelated;
1432
+ }
1425
1433
  getAssociatedData(key) {
1426
1434
  return this.#associatedData.get(key) || null;
1427
1435
  }
@@ -258,6 +258,10 @@ export class TargetManager extends Common.ObjectWrapper.ObjectWrapper {
258
258
  * (eg., tab URL of `devtools://devtools/bundled/devtools_app.html` uses a MainConnection but has no CDP server behind it).
259
259
  */
260
260
  hasFakeConnection() {
261
+ // Rehydrated DevTools always has a fake connection, so we shortcut and avoid the race.
262
+ if (Root.Runtime.getPathName().includes('rehydrated_devtools_app')) {
263
+ return true;
264
+ }
261
265
  // There _may_ be a race condition hiding here on the router/connection creation.
262
266
  // So we play it safe and consider "no connection yet" as "not fake".
263
267
  const connection = this.primaryPageTarget()?.router()?.connection();
@@ -90,7 +90,7 @@ export function registerCommands(inspectorBackend) {
90
90
  inspectorBackend.registerEnum("Audits.ContentSecurityPolicyViolationType", { KInlineViolation: "kInlineViolation", KEvalViolation: "kEvalViolation", KURLViolation: "kURLViolation", KSRIViolation: "kSRIViolation", KTrustedTypesSinkViolation: "kTrustedTypesSinkViolation", KTrustedTypesPolicyViolation: "kTrustedTypesPolicyViolation", KWasmEvalViolation: "kWasmEvalViolation" });
91
91
  inspectorBackend.registerEnum("Audits.SharedArrayBufferIssueType", { TransferIssue: "TransferIssue", CreationIssue: "CreationIssue" });
92
92
  inspectorBackend.registerEnum("Audits.AttributionReportingIssueType", { PermissionPolicyDisabled: "PermissionPolicyDisabled", UntrustworthyReportingOrigin: "UntrustworthyReportingOrigin", InsecureContext: "InsecureContext", InvalidHeader: "InvalidHeader", InvalidRegisterTriggerHeader: "InvalidRegisterTriggerHeader", SourceAndTriggerHeaders: "SourceAndTriggerHeaders", SourceIgnored: "SourceIgnored", TriggerIgnored: "TriggerIgnored", OsSourceIgnored: "OsSourceIgnored", OsTriggerIgnored: "OsTriggerIgnored", InvalidRegisterOsSourceHeader: "InvalidRegisterOsSourceHeader", InvalidRegisterOsTriggerHeader: "InvalidRegisterOsTriggerHeader", WebAndOsHeaders: "WebAndOsHeaders", NoWebOrOsSupport: "NoWebOrOsSupport", NavigationRegistrationWithoutTransientUserActivation: "NavigationRegistrationWithoutTransientUserActivation", InvalidInfoHeader: "InvalidInfoHeader", NoRegisterSourceHeader: "NoRegisterSourceHeader", NoRegisterTriggerHeader: "NoRegisterTriggerHeader", NoRegisterOsSourceHeader: "NoRegisterOsSourceHeader", NoRegisterOsTriggerHeader: "NoRegisterOsTriggerHeader", NavigationRegistrationUniqueScopeAlreadySet: "NavigationRegistrationUniqueScopeAlreadySet" });
93
- inspectorBackend.registerEnum("Audits.SharedDictionaryError", { UseErrorCrossOriginNoCorsRequest: "UseErrorCrossOriginNoCorsRequest", UseErrorDictionaryLoadFailure: "UseErrorDictionaryLoadFailure", UseErrorMatchingDictionaryNotUsed: "UseErrorMatchingDictionaryNotUsed", UseErrorUnexpectedContentDictionaryHeader: "UseErrorUnexpectedContentDictionaryHeader", WriteErrorCossOriginNoCorsRequest: "WriteErrorCossOriginNoCorsRequest", WriteErrorDisallowedBySettings: "WriteErrorDisallowedBySettings", WriteErrorExpiredResponse: "WriteErrorExpiredResponse", WriteErrorFeatureDisabled: "WriteErrorFeatureDisabled", WriteErrorInsufficientResources: "WriteErrorInsufficientResources", WriteErrorInvalidMatchField: "WriteErrorInvalidMatchField", WriteErrorInvalidStructuredHeader: "WriteErrorInvalidStructuredHeader", WriteErrorNavigationRequest: "WriteErrorNavigationRequest", WriteErrorNoMatchField: "WriteErrorNoMatchField", WriteErrorNonListMatchDestField: "WriteErrorNonListMatchDestField", WriteErrorNonSecureContext: "WriteErrorNonSecureContext", WriteErrorNonStringIdField: "WriteErrorNonStringIdField", WriteErrorNonStringInMatchDestList: "WriteErrorNonStringInMatchDestList", WriteErrorNonStringMatchField: "WriteErrorNonStringMatchField", WriteErrorNonTokenTypeField: "WriteErrorNonTokenTypeField", WriteErrorRequestAborted: "WriteErrorRequestAborted", WriteErrorShuttingDown: "WriteErrorShuttingDown", WriteErrorTooLongIdField: "WriteErrorTooLongIdField", WriteErrorUnsupportedType: "WriteErrorUnsupportedType" });
93
+ inspectorBackend.registerEnum("Audits.SharedDictionaryError", { UseErrorCrossOriginNoCorsRequest: "UseErrorCrossOriginNoCorsRequest", UseErrorDictionaryLoadFailure: "UseErrorDictionaryLoadFailure", UseErrorMatchingDictionaryNotUsed: "UseErrorMatchingDictionaryNotUsed", UseErrorUnexpectedContentDictionaryHeader: "UseErrorUnexpectedContentDictionaryHeader", WriteErrorCossOriginNoCorsRequest: "WriteErrorCossOriginNoCorsRequest", WriteErrorDisallowedBySettings: "WriteErrorDisallowedBySettings", WriteErrorExpiredResponse: "WriteErrorExpiredResponse", WriteErrorFeatureDisabled: "WriteErrorFeatureDisabled", WriteErrorInsufficientResources: "WriteErrorInsufficientResources", WriteErrorInvalidMatchField: "WriteErrorInvalidMatchField", WriteErrorInvalidStructuredHeader: "WriteErrorInvalidStructuredHeader", WriteErrorInvalidTTLField: "WriteErrorInvalidTTLField", WriteErrorNavigationRequest: "WriteErrorNavigationRequest", WriteErrorNoMatchField: "WriteErrorNoMatchField", WriteErrorNonIntegerTTLField: "WriteErrorNonIntegerTTLField", WriteErrorNonListMatchDestField: "WriteErrorNonListMatchDestField", WriteErrorNonSecureContext: "WriteErrorNonSecureContext", WriteErrorNonStringIdField: "WriteErrorNonStringIdField", WriteErrorNonStringInMatchDestList: "WriteErrorNonStringInMatchDestList", WriteErrorNonStringMatchField: "WriteErrorNonStringMatchField", WriteErrorNonTokenTypeField: "WriteErrorNonTokenTypeField", WriteErrorRequestAborted: "WriteErrorRequestAborted", WriteErrorShuttingDown: "WriteErrorShuttingDown", WriteErrorTooLongIdField: "WriteErrorTooLongIdField", WriteErrorUnsupportedType: "WriteErrorUnsupportedType" });
94
94
  inspectorBackend.registerEnum("Audits.SRIMessageSignatureError", { MissingSignatureHeader: "MissingSignatureHeader", MissingSignatureInputHeader: "MissingSignatureInputHeader", InvalidSignatureHeader: "InvalidSignatureHeader", InvalidSignatureInputHeader: "InvalidSignatureInputHeader", SignatureHeaderValueIsNotByteSequence: "SignatureHeaderValueIsNotByteSequence", SignatureHeaderValueIsParameterized: "SignatureHeaderValueIsParameterized", SignatureHeaderValueIsIncorrectLength: "SignatureHeaderValueIsIncorrectLength", SignatureInputHeaderMissingLabel: "SignatureInputHeaderMissingLabel", SignatureInputHeaderValueNotInnerList: "SignatureInputHeaderValueNotInnerList", SignatureInputHeaderValueMissingComponents: "SignatureInputHeaderValueMissingComponents", SignatureInputHeaderInvalidComponentType: "SignatureInputHeaderInvalidComponentType", SignatureInputHeaderInvalidComponentName: "SignatureInputHeaderInvalidComponentName", SignatureInputHeaderInvalidHeaderComponentParameter: "SignatureInputHeaderInvalidHeaderComponentParameter", SignatureInputHeaderInvalidDerivedComponentParameter: "SignatureInputHeaderInvalidDerivedComponentParameter", SignatureInputHeaderKeyIdLength: "SignatureInputHeaderKeyIdLength", SignatureInputHeaderInvalidParameter: "SignatureInputHeaderInvalidParameter", SignatureInputHeaderMissingRequiredParameters: "SignatureInputHeaderMissingRequiredParameters", ValidationFailedSignatureExpired: "ValidationFailedSignatureExpired", ValidationFailedInvalidLength: "ValidationFailedInvalidLength", ValidationFailedSignatureMismatch: "ValidationFailedSignatureMismatch", ValidationFailedIntegrityMismatch: "ValidationFailedIntegrityMismatch" });
95
95
  inspectorBackend.registerEnum("Audits.UnencodedDigestError", { MalformedDictionary: "MalformedDictionary", UnknownAlgorithm: "UnknownAlgorithm", IncorrectDigestType: "IncorrectDigestType", IncorrectDigestLength: "IncorrectDigestLength" });
96
96
  inspectorBackend.registerEnum("Audits.GenericIssueErrorType", { FormLabelForNameError: "FormLabelForNameError", FormDuplicateIdForInputError: "FormDuplicateIdForInputError", FormInputWithNoLabelError: "FormInputWithNoLabelError", FormAutocompleteAttributeEmptyError: "FormAutocompleteAttributeEmptyError", FormEmptyIdAndNameAttributesForInputError: "FormEmptyIdAndNameAttributesForInputError", FormAriaLabelledByToNonExistingId: "FormAriaLabelledByToNonExistingId", FormInputAssignedAutocompleteValueToIdOrNameAttributeError: "FormInputAssignedAutocompleteValueToIdOrNameAttributeError", FormLabelHasNeitherForNorNestedInput: "FormLabelHasNeitherForNorNestedInput", FormLabelForMatchesNonExistingIdError: "FormLabelForMatchesNonExistingIdError", FormInputHasWrongButWellIntendedAutocompleteValueError: "FormInputHasWrongButWellIntendedAutocompleteValueError", ResponseWasBlockedByORB: "ResponseWasBlockedByORB" });
@@ -797,7 +797,7 @@ export function registerCommands(inspectorBackend) {
797
797
  inspectorBackend.registerEvent("Network.directUDPSocketClosed", ["identifier", "timestamp"]);
798
798
  inspectorBackend.registerEvent("Network.directUDPSocketChunkSent", ["identifier", "message", "timestamp"]);
799
799
  inspectorBackend.registerEvent("Network.directUDPSocketChunkReceived", ["identifier", "message", "timestamp"]);
800
- inspectorBackend.registerEvent("Network.requestWillBeSentExtraInfo", ["requestId", "associatedCookies", "headers", "connectTiming", "clientSecurityState", "siteHasCookieInOtherPartition"]);
800
+ inspectorBackend.registerEvent("Network.requestWillBeSentExtraInfo", ["requestId", "associatedCookies", "headers", "connectTiming", "clientSecurityState", "siteHasCookieInOtherPartition", "appliedNetworkConditionsId"]);
801
801
  inspectorBackend.registerEvent("Network.responseReceivedExtraInfo", ["requestId", "blockedCookies", "headers", "resourceIPAddressSpace", "statusCode", "headersText", "cookiePartitionKey", "cookiePartitionKeyOpaque", "exemptedCookies"]);
802
802
  inspectorBackend.registerEvent("Network.responseReceivedEarlyHints", ["requestId", "headers"]);
803
803
  inspectorBackend.registerEnum("Network.TrustTokenOperationDoneEventStatus", { Ok: "Ok", InvalidArgument: "InvalidArgument", MissingIssuerKeys: "MissingIssuerKeys", FailedPrecondition: "FailedPrecondition", ResourceExhausted: "ResourceExhausted", AlreadyExists: "AlreadyExists", ResourceLimited: "ResourceLimited", Unauthorized: "Unauthorized", BadResponse: "BadResponse", InternalError: "InternalError", UnknownError: "UnknownError", FulfilledLocally: "FulfilledLocally", SiteIssuerLimit: "SiteIssuerLimit" });
@@ -822,7 +822,9 @@ export function registerCommands(inspectorBackend) {
822
822
  inspectorBackend.registerCommand("Network.continueInterceptedRequest", [{ "name": "interceptionId", "type": "string", "optional": false, "description": "", "typeRef": "Network.InterceptionId" }, { "name": "errorReason", "type": "string", "optional": true, "description": "If set this causes the request to fail with the given reason. Passing `Aborted` for requests marked with `isNavigationRequest` also cancels the navigation. Must not be set in response to an authChallenge.", "typeRef": "Network.ErrorReason" }, { "name": "rawResponse", "type": "string", "optional": true, "description": "If set the requests completes using with the provided base64 encoded raw response, including HTTP status line and headers etc... Must not be set in response to an authChallenge.", "typeRef": null }, { "name": "url", "type": "string", "optional": true, "description": "If set the request url will be modified in a way that's not observable by page. Must not be set in response to an authChallenge.", "typeRef": null }, { "name": "method", "type": "string", "optional": true, "description": "If set this allows the request method to be overridden. Must not be set in response to an authChallenge.", "typeRef": null }, { "name": "postData", "type": "string", "optional": true, "description": "If set this allows postData to be set. Must not be set in response to an authChallenge.", "typeRef": null }, { "name": "headers", "type": "object", "optional": true, "description": "If set this allows the request headers to be changed. Must not be set in response to an authChallenge.", "typeRef": "Network.Headers" }, { "name": "authChallengeResponse", "type": "object", "optional": true, "description": "Response to a requestIntercepted with an authChallenge. Must not be set otherwise.", "typeRef": "Network.AuthChallengeResponse" }], [], "Response to Network.requestIntercepted which either modifies the request to continue with any modifications, or blocks it, or completes it with the provided response bytes. If a network fetch occurs as a result which encounters a redirect an additional Network.requestIntercepted event will be sent with the same InterceptionId. Deprecated, use Fetch.continueRequest, Fetch.fulfillRequest and Fetch.failRequest instead.");
823
823
  inspectorBackend.registerCommand("Network.deleteCookies", [{ "name": "name", "type": "string", "optional": false, "description": "Name of the cookies to remove.", "typeRef": null }, { "name": "url", "type": "string", "optional": true, "description": "If specified, deletes all the cookies with the given name where domain and path match provided URL.", "typeRef": null }, { "name": "domain", "type": "string", "optional": true, "description": "If specified, deletes only cookies with the exact domain.", "typeRef": null }, { "name": "path", "type": "string", "optional": true, "description": "If specified, deletes only cookies with the exact path.", "typeRef": null }, { "name": "partitionKey", "type": "object", "optional": true, "description": "If specified, deletes only cookies with the the given name and partitionKey where all partition key attributes match the cookie partition key attribute.", "typeRef": "Network.CookiePartitionKey" }], [], "Deletes browser cookies with matching name and url or domain/path/partitionKey pair.");
824
824
  inspectorBackend.registerCommand("Network.disable", [], [], "Disables network tracking, prevents network events from being sent to the client.");
825
- inspectorBackend.registerCommand("Network.emulateNetworkConditions", [{ "name": "offline", "type": "boolean", "optional": false, "description": "True to emulate internet disconnection.", "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 }], [], "Activates emulation of network conditions.");
825
+ inspectorBackend.registerCommand("Network.emulateNetworkConditions", [{ "name": "offline", "type": "boolean", "optional": false, "description": "True to emulate internet disconnection.", "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 }], [], "Activates emulation of network conditions. This command is deprecated in favor of the emulateNetworkConditionsByRule and overrideNetworkState commands, which can be used together to the same effect.");
826
+ inspectorBackend.registerCommand("Network.emulateNetworkConditionsByRule", [{ "name": "offline", "type": "boolean", "optional": false, "description": "True to emulate internet disconnection.", "typeRef": null }, { "name": "matchedNetworkConditions", "type": "array", "optional": false, "description": "Configure conditions for matching requests. If multiple entries match a request, the first entry wins. Global conditions can be configured by leaving the urlPattern for the conditions empty. These global conditions are also applied for throttling of p2p connections.", "typeRef": "Network.NetworkConditions" }], ["ruleIds"], "Activates emulation of network conditions for individual requests using URL match patterns.");
827
+ inspectorBackend.registerCommand("Network.overrideNetworkState", [{ "name": "offline", "type": "boolean", "optional": false, "description": "True to emulate internet disconnection.", "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" }], [], "Override the state of navigator.onLine and navigator.connection.");
826
828
  inspectorBackend.registerCommand("Network.enable", [{ "name": "maxTotalBufferSize", "type": "number", "optional": true, "description": "Buffer size in bytes to use when preserving network payloads (XHRs, etc).", "typeRef": null }, { "name": "maxResourceBufferSize", "type": "number", "optional": true, "description": "Per-resource buffer size in bytes to use when preserving network payloads (XHRs, etc).", "typeRef": null }, { "name": "maxPostDataSize", "type": "number", "optional": true, "description": "Longest post body size (in bytes) that would be included in requestWillBeSent notification", "typeRef": null }, { "name": "reportDirectSocketTraffic", "type": "boolean", "optional": true, "description": "Whether DirectSocket chunk send/receive events should be reported.", "typeRef": null }, { "name": "enableDurableMessages", "type": "boolean", "optional": true, "description": "Enable storing response bodies outside of renderer, so that these survive a cross-process navigation. Requires maxTotalBufferSize to be set. Currently defaults to false.", "typeRef": null }], [], "Enables network tracking, network events will now be delivered to the client.");
827
829
  inspectorBackend.registerCommand("Network.getAllCookies", [], ["cookies"], "Returns all browser cookies. Depending on the backend support, will return detailed cookie information in the `cookies` field. Deprecated. Use Storage.getCookies instead.");
828
830
  inspectorBackend.registerCommand("Network.getCertificate", [{ "name": "origin", "type": "string", "optional": false, "description": "Origin to get certificate for.", "typeRef": null }], ["tableNames"], "Returns the DER-encoded certificate.");
@@ -849,7 +851,7 @@ export function registerCommands(inspectorBackend) {
849
851
  inspectorBackend.registerCommand("Network.setCookieControls", [{ "name": "enableThirdPartyCookieRestriction", "type": "boolean", "optional": false, "description": "Whether 3pc restriction is enabled.", "typeRef": null }, { "name": "disableThirdPartyCookieMetadata", "type": "boolean", "optional": false, "description": "Whether 3pc grace period exception should be enabled; false by default.", "typeRef": null }, { "name": "disableThirdPartyCookieHeuristics", "type": "boolean", "optional": false, "description": "Whether 3pc heuristics exceptions should be enabled; false by default.", "typeRef": null }], [], "Sets Controls for third-party cookie access Page reload is required before the new cookie behavior will be observed");
850
852
  inspectorBackend.registerType("Network.ResourceTiming", [{ "name": "requestTime", "type": "number", "optional": false, "description": "Timing's requestTime is a baseline in seconds, while the other numbers are ticks in milliseconds relatively to this requestTime.", "typeRef": null }, { "name": "proxyStart", "type": "number", "optional": false, "description": "Started resolving proxy.", "typeRef": null }, { "name": "proxyEnd", "type": "number", "optional": false, "description": "Finished resolving proxy.", "typeRef": null }, { "name": "dnsStart", "type": "number", "optional": false, "description": "Started DNS address resolve.", "typeRef": null }, { "name": "dnsEnd", "type": "number", "optional": false, "description": "Finished DNS address resolve.", "typeRef": null }, { "name": "connectStart", "type": "number", "optional": false, "description": "Started connecting to the remote host.", "typeRef": null }, { "name": "connectEnd", "type": "number", "optional": false, "description": "Connected to the remote host.", "typeRef": null }, { "name": "sslStart", "type": "number", "optional": false, "description": "Started SSL handshake.", "typeRef": null }, { "name": "sslEnd", "type": "number", "optional": false, "description": "Finished SSL handshake.", "typeRef": null }, { "name": "workerStart", "type": "number", "optional": false, "description": "Started running ServiceWorker.", "typeRef": null }, { "name": "workerReady", "type": "number", "optional": false, "description": "Finished Starting ServiceWorker.", "typeRef": null }, { "name": "workerFetchStart", "type": "number", "optional": false, "description": "Started fetch event.", "typeRef": null }, { "name": "workerRespondWithSettled", "type": "number", "optional": false, "description": "Settled fetch event respondWith promise.", "typeRef": null }, { "name": "workerRouterEvaluationStart", "type": "number", "optional": true, "description": "Started ServiceWorker static routing source evaluation.", "typeRef": null }, { "name": "workerCacheLookupStart", "type": "number", "optional": true, "description": "Started cache lookup when the source was evaluated to `cache`.", "typeRef": null }, { "name": "sendStart", "type": "number", "optional": false, "description": "Started sending request.", "typeRef": null }, { "name": "sendEnd", "type": "number", "optional": false, "description": "Finished sending request.", "typeRef": null }, { "name": "pushStart", "type": "number", "optional": false, "description": "Time the server started pushing request.", "typeRef": null }, { "name": "pushEnd", "type": "number", "optional": false, "description": "Time the server finished pushing request.", "typeRef": null }, { "name": "receiveHeadersStart", "type": "number", "optional": false, "description": "Started receiving response headers.", "typeRef": null }, { "name": "receiveHeadersEnd", "type": "number", "optional": false, "description": "Finished receiving response headers.", "typeRef": null }]);
851
853
  inspectorBackend.registerType("Network.PostDataEntry", [{ "name": "bytes", "type": "string", "optional": true, "description": "", "typeRef": null }]);
852
- inspectorBackend.registerType("Network.Request", [{ "name": "url", "type": "string", "optional": false, "description": "Request URL (without fragment).", "typeRef": null }, { "name": "urlFragment", "type": "string", "optional": true, "description": "Fragment of the requested URL starting with hash, if present.", "typeRef": null }, { "name": "method", "type": "string", "optional": false, "description": "HTTP request method.", "typeRef": null }, { "name": "headers", "type": "object", "optional": false, "description": "HTTP request headers.", "typeRef": "Network.Headers" }, { "name": "postData", "type": "string", "optional": true, "description": "HTTP POST request data. Use postDataEntries instead.", "typeRef": null }, { "name": "hasPostData", "type": "boolean", "optional": true, "description": "True when the request has POST data. Note that postData might still be omitted when this flag is true when the data is too long.", "typeRef": null }, { "name": "postDataEntries", "type": "array", "optional": true, "description": "Request body elements (post data broken into individual entries).", "typeRef": "Network.PostDataEntry" }, { "name": "mixedContentType", "type": "string", "optional": true, "description": "The mixed content type of the request.", "typeRef": "Security.MixedContentType" }, { "name": "initialPriority", "type": "string", "optional": false, "description": "Priority of the resource request at the time request is sent.", "typeRef": "Network.ResourcePriority" }, { "name": "referrerPolicy", "type": "string", "optional": false, "description": "The referrer policy of the request, as defined in https://www.w3.org/TR/referrer-policy/", "typeRef": null }, { "name": "isLinkPreload", "type": "boolean", "optional": true, "description": "Whether is loaded via link preload.", "typeRef": null }, { "name": "trustTokenParams", "type": "object", "optional": true, "description": "Set for requests when the TrustToken API is used. Contains the parameters passed by the developer (e.g. via \\\"fetch\\\") as understood by the backend.", "typeRef": "Network.TrustTokenParams" }, { "name": "isSameSite", "type": "boolean", "optional": true, "description": "True if this resource request is considered to be the 'same site' as the request corresponding to the main frame.", "typeRef": null }]);
854
+ inspectorBackend.registerType("Network.Request", [{ "name": "url", "type": "string", "optional": false, "description": "Request URL (without fragment).", "typeRef": null }, { "name": "urlFragment", "type": "string", "optional": true, "description": "Fragment of the requested URL starting with hash, if present.", "typeRef": null }, { "name": "method", "type": "string", "optional": false, "description": "HTTP request method.", "typeRef": null }, { "name": "headers", "type": "object", "optional": false, "description": "HTTP request headers.", "typeRef": "Network.Headers" }, { "name": "postData", "type": "string", "optional": true, "description": "HTTP POST request data. Use postDataEntries instead.", "typeRef": null }, { "name": "hasPostData", "type": "boolean", "optional": true, "description": "True when the request has POST data. Note that postData might still be omitted when this flag is true when the data is too long.", "typeRef": null }, { "name": "postDataEntries", "type": "array", "optional": true, "description": "Request body elements (post data broken into individual entries).", "typeRef": "Network.PostDataEntry" }, { "name": "mixedContentType", "type": "string", "optional": true, "description": "The mixed content type of the request.", "typeRef": "Security.MixedContentType" }, { "name": "initialPriority", "type": "string", "optional": false, "description": "Priority of the resource request at the time request is sent.", "typeRef": "Network.ResourcePriority" }, { "name": "referrerPolicy", "type": "string", "optional": false, "description": "The referrer policy of the request, as defined in https://www.w3.org/TR/referrer-policy/", "typeRef": null }, { "name": "isLinkPreload", "type": "boolean", "optional": true, "description": "Whether is loaded via link preload.", "typeRef": null }, { "name": "trustTokenParams", "type": "object", "optional": true, "description": "Set for requests when the TrustToken API is used. Contains the parameters passed by the developer (e.g. via \\\"fetch\\\") as understood by the backend.", "typeRef": "Network.TrustTokenParams" }, { "name": "isSameSite", "type": "boolean", "optional": true, "description": "True if this resource request is considered to be the 'same site' as the request corresponding to the main frame.", "typeRef": null }, { "name": "isAdRelated", "type": "boolean", "optional": true, "description": "True when the resource request is ad-related.", "typeRef": null }]);
853
855
  inspectorBackend.registerType("Network.SignedCertificateTimestamp", [{ "name": "status", "type": "string", "optional": false, "description": "Validation status.", "typeRef": null }, { "name": "origin", "type": "string", "optional": false, "description": "Origin.", "typeRef": null }, { "name": "logDescription", "type": "string", "optional": false, "description": "Log name / description.", "typeRef": null }, { "name": "logId", "type": "string", "optional": false, "description": "Log ID.", "typeRef": null }, { "name": "timestamp", "type": "number", "optional": false, "description": "Issuance date. Unlike TimeSinceEpoch, this contains the number of milliseconds since January 1, 1970, UTC, not the number of seconds.", "typeRef": null }, { "name": "hashAlgorithm", "type": "string", "optional": false, "description": "Hash algorithm.", "typeRef": null }, { "name": "signatureAlgorithm", "type": "string", "optional": false, "description": "Signature algorithm.", "typeRef": null }, { "name": "signatureData", "type": "string", "optional": false, "description": "Signature data.", "typeRef": null }]);
854
856
  inspectorBackend.registerType("Network.SecurityDetails", [{ "name": "protocol", "type": "string", "optional": false, "description": "Protocol name (e.g. \\\"TLS 1.2\\\" or \\\"QUIC\\\").", "typeRef": null }, { "name": "keyExchange", "type": "string", "optional": false, "description": "Key Exchange used by the connection, or the empty string if not applicable.", "typeRef": null }, { "name": "keyExchangeGroup", "type": "string", "optional": true, "description": "(EC)DH group used by the connection, if applicable.", "typeRef": null }, { "name": "cipher", "type": "string", "optional": false, "description": "Cipher name.", "typeRef": null }, { "name": "mac", "type": "string", "optional": true, "description": "TLS MAC. Note that AEAD ciphers do not have separate MACs.", "typeRef": null }, { "name": "certificateId", "type": "number", "optional": false, "description": "Certificate ID value.", "typeRef": "Security.CertificateId" }, { "name": "subjectName", "type": "string", "optional": false, "description": "Certificate subject name.", "typeRef": null }, { "name": "sanList", "type": "array", "optional": false, "description": "Subject Alternative Name (SAN) DNS names and IP addresses.", "typeRef": "string" }, { "name": "issuer", "type": "string", "optional": false, "description": "Name of the issuing CA.", "typeRef": null }, { "name": "validFrom", "type": "number", "optional": false, "description": "Certificate valid from date.", "typeRef": "Network.TimeSinceEpoch" }, { "name": "validTo", "type": "number", "optional": false, "description": "Certificate valid to (expiration) date", "typeRef": "Network.TimeSinceEpoch" }, { "name": "signedCertificateTimestampList", "type": "array", "optional": false, "description": "List of signed certificate timestamps (SCTs).", "typeRef": "Network.SignedCertificateTimestamp" }, { "name": "certificateTransparencyCompliance", "type": "string", "optional": false, "description": "Whether the request complied with Certificate Transparency policy", "typeRef": "Network.CertificateTransparencyCompliance" }, { "name": "serverSignatureAlgorithm", "type": "number", "optional": true, "description": "The signature algorithm used by the server in the TLS server signature, represented as a TLS SignatureScheme code point. Omitted if not applicable or not known.", "typeRef": null }, { "name": "encryptedClientHello", "type": "boolean", "optional": false, "description": "Whether the connection used Encrypted ClientHello", "typeRef": null }]);
855
857
  inspectorBackend.registerType("Network.CorsErrorStatus", [{ "name": "corsError", "type": "string", "optional": false, "description": "", "typeRef": "Network.CorsError" }, { "name": "failedParameter", "type": "string", "optional": false, "description": "", "typeRef": null }]);
@@ -874,6 +876,7 @@ export function registerCommands(inspectorBackend) {
874
876
  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 }]);
875
877
  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" }]);
876
878
  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" }]);
879
+ 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 }]);
877
880
  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" }]);
878
881
  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 }]);
879
882
  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 }]);
@@ -1499,11 +1502,11 @@ export function registerCommands(inspectorBackend) {
1499
1502
  inspectorBackend.registerEnum("Runtime.SerializationOptionsSerialization", { Deep: "deep", Json: "json", IdOnly: "idOnly" });
1500
1503
  inspectorBackend.registerEnum("Runtime.DeepSerializedValueType", { Undefined: "undefined", Null: "null", String: "string", Number: "number", Boolean: "boolean", Bigint: "bigint", Regexp: "regexp", Date: "date", Symbol: "symbol", Array: "array", Object: "object", Function: "function", Map: "map", Set: "set", Weakmap: "weakmap", Weakset: "weakset", Error: "error", Proxy: "proxy", Promise: "promise", Typedarray: "typedarray", Arraybuffer: "arraybuffer", Node: "node", Window: "window", Generator: "generator" });
1501
1504
  inspectorBackend.registerEnum("Runtime.RemoteObjectType", { Object: "object", Function: "function", Undefined: "undefined", String: "string", Number: "number", Boolean: "boolean", Symbol: "symbol", Bigint: "bigint" });
1502
- inspectorBackend.registerEnum("Runtime.RemoteObjectSubtype", { Array: "array", Null: "null", Node: "node", Regexp: "regexp", Date: "date", Map: "map", Set: "set", Weakmap: "weakmap", Weakset: "weakset", Iterator: "iterator", Generator: "generator", Error: "error", Proxy: "proxy", Promise: "promise", Typedarray: "typedarray", Arraybuffer: "arraybuffer", Dataview: "dataview", Webassemblymemory: "webassemblymemory", Wasmvalue: "wasmvalue" });
1505
+ inspectorBackend.registerEnum("Runtime.RemoteObjectSubtype", { Array: "array", Null: "null", Node: "node", Regexp: "regexp", Date: "date", Map: "map", Set: "set", Weakmap: "weakmap", Weakset: "weakset", Iterator: "iterator", Generator: "generator", Error: "error", Proxy: "proxy", Promise: "promise", Typedarray: "typedarray", Arraybuffer: "arraybuffer", Dataview: "dataview", Webassemblymemory: "webassemblymemory", Wasmvalue: "wasmvalue", Trustedtype: "trustedtype" });
1503
1506
  inspectorBackend.registerEnum("Runtime.ObjectPreviewType", { Object: "object", Function: "function", Undefined: "undefined", String: "string", Number: "number", Boolean: "boolean", Symbol: "symbol", Bigint: "bigint" });
1504
- inspectorBackend.registerEnum("Runtime.ObjectPreviewSubtype", { Array: "array", Null: "null", Node: "node", Regexp: "regexp", Date: "date", Map: "map", Set: "set", Weakmap: "weakmap", Weakset: "weakset", Iterator: "iterator", Generator: "generator", Error: "error", Proxy: "proxy", Promise: "promise", Typedarray: "typedarray", Arraybuffer: "arraybuffer", Dataview: "dataview", Webassemblymemory: "webassemblymemory", Wasmvalue: "wasmvalue" });
1507
+ inspectorBackend.registerEnum("Runtime.ObjectPreviewSubtype", { Array: "array", Null: "null", Node: "node", Regexp: "regexp", Date: "date", Map: "map", Set: "set", Weakmap: "weakmap", Weakset: "weakset", Iterator: "iterator", Generator: "generator", Error: "error", Proxy: "proxy", Promise: "promise", Typedarray: "typedarray", Arraybuffer: "arraybuffer", Dataview: "dataview", Webassemblymemory: "webassemblymemory", Wasmvalue: "wasmvalue", Trustedtype: "trustedtype" });
1505
1508
  inspectorBackend.registerEnum("Runtime.PropertyPreviewType", { Object: "object", Function: "function", Undefined: "undefined", String: "string", Number: "number", Boolean: "boolean", Symbol: "symbol", Accessor: "accessor", Bigint: "bigint" });
1506
- inspectorBackend.registerEnum("Runtime.PropertyPreviewSubtype", { Array: "array", Null: "null", Node: "node", Regexp: "regexp", Date: "date", Map: "map", Set: "set", Weakmap: "weakmap", Weakset: "weakset", Iterator: "iterator", Generator: "generator", Error: "error", Proxy: "proxy", Promise: "promise", Typedarray: "typedarray", Arraybuffer: "arraybuffer", Dataview: "dataview", Webassemblymemory: "webassemblymemory", Wasmvalue: "wasmvalue" });
1509
+ inspectorBackend.registerEnum("Runtime.PropertyPreviewSubtype", { Array: "array", Null: "null", Node: "node", Regexp: "regexp", Date: "date", Map: "map", Set: "set", Weakmap: "weakmap", Weakset: "weakset", Iterator: "iterator", Generator: "generator", Error: "error", Proxy: "proxy", Promise: "promise", Typedarray: "typedarray", Arraybuffer: "arraybuffer", Dataview: "dataview", Webassemblymemory: "webassemblymemory", Wasmvalue: "wasmvalue", Trustedtype: "trustedtype" });
1507
1510
  inspectorBackend.registerEvent("Runtime.bindingCalled", ["name", "payload", "executionContextId"]);
1508
1511
  inspectorBackend.registerEnum("Runtime.ConsoleAPICalledEventType", { Log: "log", Debug: "debug", Info: "info", Error: "error", Warning: "warning", Dir: "dir", DirXML: "dirxml", Table: "table", Trace: "trace", Clear: "clear", StartGroup: "startGroup", StartGroupCollapsed: "startGroupCollapsed", EndGroup: "endGroup", Assert: "assert", Profile: "profile", ProfileEnd: "profileEnd", Count: "count", TimeEnd: "timeEnd" });
1509
1512
  inspectorBackend.registerEvent("Runtime.consoleAPICalled", ["type", "args", "executionContextId", "timestamp", "stackTrace", "context"]);
@@ -472,6 +472,7 @@ export const generatedProperties = [
472
472
  "font-family",
473
473
  "font-feature-settings",
474
474
  "font-kerning",
475
+ "font-language-override",
475
476
  "font-optical-sizing",
476
477
  "font-palette",
477
478
  "font-size",
@@ -516,8 +517,8 @@ export const generatedProperties = [
516
517
  "inset-block-start",
517
518
  "inset-inline-end",
518
519
  "inset-inline-start",
519
- "interest-hide-delay",
520
- "interest-show-delay",
520
+ "interest-delay-end",
521
+ "interest-delay-start",
521
522
  "interpolate-size",
522
523
  "isolation",
523
524
  "item-tolerance",
@@ -639,6 +640,7 @@ export const generatedProperties = [
639
640
  "row-rule-style",
640
641
  "row-rule-width",
641
642
  "ruby-align",
643
+ "ruby-overhang",
642
644
  "ruby-position",
643
645
  "rx",
644
646
  "ry",
@@ -736,7 +738,7 @@ export const generatedProperties = [
736
738
  "timeline-trigger-name",
737
739
  "timeline-trigger-range-end",
738
740
  "timeline-trigger-range-start",
739
- "timeline-trigger-timeline",
741
+ "timeline-trigger-source",
740
742
  "top",
741
743
  "touch-action",
742
744
  "transform",
@@ -2263,7 +2265,8 @@ export const generatedProperties = [
2263
2265
  "font-size-adjust",
2264
2266
  "font-kerning",
2265
2267
  "font-feature-settings",
2266
- "font-variation-settings"
2268
+ "font-variation-settings",
2269
+ "font-language-override"
2267
2270
  ],
2268
2271
  "name": "font"
2269
2272
  },
@@ -2290,6 +2293,13 @@ export const generatedProperties = [
2290
2293
  ],
2291
2294
  "name": "font-kerning"
2292
2295
  },
2296
+ {
2297
+ "inherited": true,
2298
+ "keywords": [
2299
+ "normal"
2300
+ ],
2301
+ "name": "font-language-override"
2302
+ },
2293
2303
  {
2294
2304
  "inherited": true,
2295
2305
  "keywords": [
@@ -2751,16 +2761,16 @@ export const generatedProperties = [
2751
2761
  },
2752
2762
  {
2753
2763
  "longhands": [
2754
- "interest-show-delay",
2755
- "interest-hide-delay"
2764
+ "interest-delay-start",
2765
+ "interest-delay-end"
2756
2766
  ],
2757
2767
  "name": "interest-delay"
2758
2768
  },
2759
2769
  {
2760
- "name": "interest-hide-delay"
2770
+ "name": "interest-delay-end"
2761
2771
  },
2762
2772
  {
2763
- "name": "interest-show-delay"
2773
+ "name": "interest-delay-start"
2764
2774
  },
2765
2775
  {
2766
2776
  "inherited": true,
@@ -3722,6 +3732,14 @@ export const generatedProperties = [
3722
3732
  ],
3723
3733
  "name": "ruby-align"
3724
3734
  },
3735
+ {
3736
+ "inherited": true,
3737
+ "keywords": [
3738
+ "auto",
3739
+ "none"
3740
+ ],
3741
+ "name": "ruby-overhang"
3742
+ },
3725
3743
  {
3726
3744
  "inherited": true,
3727
3745
  "keywords": [
@@ -4412,7 +4430,7 @@ export const generatedProperties = [
4412
4430
  {
4413
4431
  "longhands": [
4414
4432
  "timeline-trigger-name",
4415
- "timeline-trigger-timeline",
4433
+ "timeline-trigger-source",
4416
4434
  "timeline-trigger-behavior",
4417
4435
  "timeline-trigger-range-start",
4418
4436
  "timeline-trigger-range-end",
@@ -4450,7 +4468,7 @@ export const generatedProperties = [
4450
4468
  "none",
4451
4469
  "auto"
4452
4470
  ],
4453
- "name": "timeline-trigger-timeline"
4471
+ "name": "timeline-trigger-source"
4454
4472
  },
4455
4473
  {
4456
4474
  "keywords": [
@@ -5659,6 +5677,11 @@ export const generatedPropertyValues = {
5659
5677
  "none"
5660
5678
  ]
5661
5679
  },
5680
+ "font-language-override": {
5681
+ "values": [
5682
+ "normal"
5683
+ ]
5684
+ },
5662
5685
  "font-optical-sizing": {
5663
5686
  "values": [
5664
5687
  "auto",
@@ -6467,6 +6490,12 @@ export const generatedPropertyValues = {
6467
6490
  "space-between"
6468
6491
  ]
6469
6492
  },
6493
+ "ruby-overhang": {
6494
+ "values": [
6495
+ "auto",
6496
+ "none"
6497
+ ]
6498
+ },
6470
6499
  "ruby-position": {
6471
6500
  "values": [
6472
6501
  "over",
@@ -6824,7 +6853,7 @@ export const generatedPropertyValues = {
6824
6853
  "state"
6825
6854
  ]
6826
6855
  },
6827
- "timeline-trigger-timeline": {
6856
+ "timeline-trigger-source": {
6828
6857
  "values": [
6829
6858
  "none",
6830
6859
  "auto"