chrome-devtools-frontend 1.0.1525561 → 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 (46) hide show
  1. package/front_end/core/common/Settings.ts +1 -1
  2. package/front_end/core/sdk/PreloadingModel.ts +3 -0
  3. package/front_end/core/sdk/ResourceTreeModel.ts +1 -1
  4. package/front_end/core/sdk/SourceMapScopesInfo.ts +57 -0
  5. package/front_end/generated/InspectorBackendCommands.js +4 -4
  6. package/front_end/generated/SupportedCSSProperties.js +0 -19
  7. package/front_end/generated/protocol-mapping.d.ts +1 -1
  8. package/front_end/generated/protocol-proxy-api.d.ts +1 -1
  9. package/front_end/generated/protocol.ts +9 -8
  10. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +43 -8
  11. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +50 -32
  12. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +29 -29
  13. package/front_end/models/javascript_metadata/NativeFunctions.js +3 -8
  14. package/front_end/models/trace/handlers/UserTimingsHandler.ts +1 -1
  15. package/front_end/models/trace/insights/CLSCulprits.ts +2 -1
  16. package/front_end/models/trace/insights/Cache.ts +2 -1
  17. package/front_end/models/trace/insights/DOMSize.ts +2 -1
  18. package/front_end/models/trace/insights/DocumentLatency.ts +2 -1
  19. package/front_end/models/trace/insights/DuplicatedJavaScript.ts +2 -1
  20. package/front_end/models/trace/insights/FontDisplay.ts +2 -1
  21. package/front_end/models/trace/insights/ForcedReflow.ts +2 -1
  22. package/front_end/models/trace/insights/INPBreakdown.ts +2 -1
  23. package/front_end/models/trace/insights/ImageDelivery.ts +2 -1
  24. package/front_end/models/trace/insights/LCPBreakdown.ts +2 -1
  25. package/front_end/models/trace/insights/LCPDiscovery.ts +2 -1
  26. package/front_end/models/trace/insights/LegacyJavaScript.ts +2 -1
  27. package/front_end/models/trace/insights/ModernHTTP.ts +2 -1
  28. package/front_end/models/trace/insights/NetworkDependencyTree.ts +2 -1
  29. package/front_end/models/trace/insights/RenderBlocking.ts +2 -1
  30. package/front_end/models/trace/insights/SlowCSSSelector.ts +2 -1
  31. package/front_end/models/trace/insights/ThirdParties.ts +2 -1
  32. package/front_end/models/trace/insights/Viewport.ts +2 -1
  33. package/front_end/models/trace/insights/types.ts +2 -1
  34. package/front_end/panels/application/ReportingApiView.ts +8 -7
  35. package/front_end/panels/application/StorageView.ts +2 -1
  36. package/front_end/panels/application/preloading/components/PreloadingString.ts +2 -0
  37. package/front_end/panels/console/ConsolePrompt.ts +24 -4
  38. package/front_end/panels/timeline/TimelinePanel.ts +10 -8
  39. package/front_end/panels/timeline/components/ExportTraceOptions.ts +1 -1
  40. package/front_end/third_party/chromium/README.chromium +1 -1
  41. package/front_end/ui/components/buttons/Button.ts +17 -0
  42. package/front_end/ui/legacy/SearchableView.ts +1 -1
  43. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +48 -5
  44. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +2 -2
  45. package/front_end/ui/legacy/components/source_frame/JSONView.ts +28 -0
  46. package/package.json +22 -22
@@ -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
  }
@@ -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);
@@ -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
  /**
@@ -55,6 +55,7 @@ We can break this time down into the 4 phases that combine to make the LCP time:
55
55
  ## Estimated savings: none
56
56
 
57
57
  ## External resources:
58
+ - https://developer.chrome.com/docs/performance/insights/lcp-breakdown
58
59
  - https://web.dev/articles/lcp
59
60
  - https://web.dev/articles/optimize-lcp
60
61
  === end content
@@ -100,6 +101,7 @@ We can break this time down into the 4 phases that combine to make the LCP time:
100
101
  ## Estimated savings: none
101
102
 
102
103
  ## External resources:
104
+ - https://developer.chrome.com/docs/performance/insights/lcp-breakdown
103
105
  - https://web.dev/articles/lcp
104
106
  - https://web.dev/articles/optimize-lcp
105
107
  === end content
@@ -123,6 +125,7 @@ We can break this time down into the 2 phases that combine to make the LCP time:
123
125
  ## Estimated savings: none
124
126
 
125
127
  ## External resources:
128
+ - https://developer.chrome.com/docs/performance/insights/lcp-breakdown
126
129
  - https://web.dev/articles/lcp
127
130
  - https://web.dev/articles/optimize-lcp
128
131
  === end content
@@ -140,6 +143,7 @@ There are no network requests that are render blocking.
140
143
  ## Estimated savings: FCP 0 ms, LCP 0 ms
141
144
 
142
145
  ## External resources:
146
+ - https://developer.chrome.com/docs/performance/insights/render-blocking
143
147
  - https://web.dev/articles/lcp
144
148
  - https://web.dev/articles/optimize-lcp
145
149
  === end content
@@ -168,6 +172,7 @@ allUrls = [0: https://code.jquery.com/jquery-3.7.1.js, 1: http://localhost:8000/
168
172
  ## Estimated savings: FCP 2015 ms, LCP 0 ms
169
173
 
170
174
  ## External resources:
175
+ - https://developer.chrome.com/docs/performance/insights/render-blocking
171
176
  - https://web.dev/articles/lcp
172
177
  - https://web.dev/articles/optimize-lcp
173
178
  === end content
@@ -227,6 +232,7 @@ The result of the checks for this insight are:
227
232
  ## Estimated savings: none
228
233
 
229
234
  ## External resources:
235
+ - https://developer.chrome.com/docs/performance/insights/lcp-discovery
230
236
  - https://web.dev/articles/lcp
231
237
  - https://web.dev/articles/optimize-lcp
232
238
  === end content
@@ -288,6 +294,7 @@ The result of the checks for this insight are:
288
294
  ## Estimated savings: FCP 3428 ms, LCP 3428 ms
289
295
 
290
296
  ## External resources:
297
+ - https://developer.chrome.com/docs/performance/insights/document-latency
291
298
  - https://web.dev/articles/optimize-ttfb
292
299
  === end content
293
300
 
@@ -334,6 +341,7 @@ Layout shifts in this cluster:
334
341
  ## Estimated savings: none
335
342
 
336
343
  ## External resources:
344
+ - https://developer.chrome.com/docs/performance/insights/cls-culprit
337
345
  - https://web.dev/articles/cls
338
346
  - https://web.dev/articles/optimize-cls
339
347
  === end content
@@ -354,6 +362,7 @@ No layout shifts were found.
354
362
  ## Estimated savings: none
355
363
 
356
364
  ## External resources:
365
+ - https://developer.chrome.com/docs/performance/insights/cls-culprit
357
366
  - https://web.dev/articles/cls
358
367
  - https://web.dev/articles/optimize-cls
359
368
  === end content
@@ -432,6 +441,7 @@ Layout shifts in this cluster:
432
441
  ## Estimated savings: none
433
442
 
434
443
  ## External resources:
444
+ - https://developer.chrome.com/docs/performance/insights/cls-culprit
435
445
  - https://web.dev/articles/cls
436
446
  - https://web.dev/articles/optimize-cls
437
447
  === end content
@@ -463,6 +473,7 @@ The longest interaction on the page was a `click` which had a total duration of
463
473
  ## Estimated savings: none
464
474
 
465
475
  ## External resources:
476
+ - https://developer.chrome.com/docs/performance/insights/inp-breakdown
466
477
  - https://web.dev/articles/inp
467
478
  - https://web.dev/explore/how-to-optimize-inp
468
479
  - https://web.dev/articles/optimize-long-tasks
@@ -489,6 +500,7 @@ There are no requests that were served over a legacy HTTP protocol.
489
500
  ## Estimated savings: none
490
501
 
491
502
  ## External resources:
503
+ - https://developer.chrome.com/docs/performance/insights/modern-http
492
504
  - https://developer.chrome.com/docs/lighthouse/best-practices/uses-http2
493
505
  === end content
494
506
 
@@ -526,6 +538,7 @@ allUrls = [0: https://ads.jetpackdigital.com/sites/_uploads/1742278386bg_opt_640
526
538
  ## Estimated savings: FCP 0 ms, LCP 0 ms
527
539
 
528
540
  ## External resources:
541
+ - https://developer.chrome.com/docs/performance/insights/modern-http
529
542
  - https://developer.chrome.com/docs/lighthouse/best-practices/uses-http2
530
543
  === end content
531
544
 
@@ -546,6 +559,7 @@ No DOM size issues were detected.
546
559
  ## Estimated savings: none
547
560
 
548
561
  ## External resources:
562
+ - https://developer.chrome.com/docs/performance/insights/dom-size
549
563
  - https://developer.chrome.com/docs/lighthouse/performance/dom-size/
550
564
  === end content
551
565
 
@@ -561,7 +575,7 @@ This insight evaluates some key metrics about the Document Object Model (DOM) an
561
575
  - The largest layout and style recalculation events.
562
576
 
563
577
  ## Detailed analysis:
564
- A large DOM can increase the duration of style calculations and layout reflows, impacting page responsiveness. A large DOM will also increase memory usage. [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).
578
+ A large DOM can increase the duration of style calculations and layout reflows, impacting page responsiveness. A large DOM will also increase memory usage. [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/performance/insights/dom-size).
565
579
 
566
580
  Statistic:
567
581
 
@@ -577,6 +591,7 @@ Large layout updates/style calculations:
577
591
  ## Estimated savings: none
578
592
 
579
593
  ## External resources:
594
+ - https://developer.chrome.com/docs/performance/insights/dom-size
580
595
  - https://developer.chrome.com/docs/lighthouse/performance/dom-size/
581
596
  === end content
582
597
 
@@ -636,6 +651,7 @@ Duplication grouped by Node modules: - Source: node_modules/filestack-js - Dupli
636
651
  ## Estimated savings: FCP 100 ms, LCP 100 ms
637
652
 
638
653
  ## External resources:
654
+ - https://developer.chrome.com/docs/performance/insights/duplicated-javascript
639
655
  === end content
640
656
 
641
657
  Title: PerformanceInsightFormatter Duplicated javascript serializes no details if there is no duplicate javascript
@@ -652,6 +668,7 @@ There is no duplicated JavaScript in the page modules
652
668
  ## Estimated savings: none
653
669
 
654
670
  ## External resources:
671
+ - https://developer.chrome.com/docs/performance/insights/duplicated-javascript
655
672
  === end content
656
673
 
657
674
  Title: PerformanceInsightFormatter Legacy JavaScript serializes the correct details when there is no legacy javascript in modules
@@ -669,6 +686,7 @@ There is no significant amount of legacy JavaScript on the page.
669
686
  ## Estimated savings: none
670
687
 
671
688
  ## External resources:
689
+ - https://developer.chrome.com/docs/performance/insights/legacy-javascript
672
690
  - https://web.dev/articles/baseline-and-polyfills
673
691
  - https://philipwalton.com/articles/the-state-of-es5-on-the-web/
674
692
  === end content
@@ -735,6 +753,7 @@ Line: 0, Column: 390688, Name: Object.values
735
753
  ## Estimated savings: FCP 0 ms, LCP 0 ms
736
754
 
737
755
  ## External resources:
756
+ - https://developer.chrome.com/docs/performance/insights/legacy-javascript
738
757
  - https://web.dev/articles/baseline-and-polyfills
739
758
  - https://philipwalton.com/articles/the-state-of-es5-on-the-web/
740
759
  === end content
@@ -752,6 +771,7 @@ No font display issues were detected.
752
771
  ## Estimated savings: FCP -Infinity ms
753
772
 
754
773
  ## External resources:
774
+ - https://developer.chrome.com/docs/performance/insights/font-display
755
775
  - https://web.dev/articles/preload-optional-fonts
756
776
  - https://fonts.google.com/knowledge/glossary/foit
757
777
  - https://developer.chrome.com/blog/font-fallbacks
@@ -774,11 +794,12 @@ The following font display issues were found:
774
794
  - Font name: EJRVQgYoZZY2vCFuvAFWzr-_dSb_.woff2, URL: https://fonts.gstatic.com/s/ptserif/v18/EJRVQgYoZZY2vCFuvAFWzr-_dSb_.woff2 (eventKey: s-5325, ts: 409057959655), Property 'font-display' set to: 'auto', Wasted time: 15 ms.
775
795
  - Font name: S6u9w4BMUTPHh6UVSwiPGQ3q5d0.woff2, URL: https://fonts.gstatic.com/s/lato/v24/S6u9w4BMUTPHh6UVSwiPGQ3q5d0.woff2 (eventKey: s-5238, ts: 409057956530), Property 'font-display' set to: 'auto', Wasted time: 10 ms.
776
796
 
777
- Consider setting [`font-display`](https://developer.chrome.com/blog/font-display) to `swap` or `optional` to ensure text is consistently visible. `swap` can be further optimized to mitigate layout shifts with [font metric overrides](https://developer.chrome.com/blog/font-fallbacks).
797
+ Consider setting [`font-display`](https://developer.chrome.com/docs/performance/insights/font-display) to `swap` or `optional` to ensure text is consistently visible. `swap` can be further optimized to mitigate layout shifts with [font metric overrides](https://developer.chrome.com/blog/font-fallbacks).
778
798
 
779
799
  ## Estimated savings: FCP 20 ms
780
800
 
781
801
  ## External resources:
802
+ - https://developer.chrome.com/docs/performance/insights/font-display
782
803
  - https://web.dev/articles/preload-optional-fonts
783
804
  - https://fonts.google.com/knowledge/glossary/foit
784
805
  - https://developer.chrome.com/blog/font-fallbacks
@@ -797,6 +818,7 @@ There are no unoptimized images on this page.
797
818
  ## Estimated savings: none
798
819
 
799
820
  ## External resources:
821
+ - https://developer.chrome.com/docs/performance/insights/image-delivery
800
822
  - https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/
801
823
  === end content
802
824
 
@@ -841,6 +863,7 @@ This image file is larger than it needs to be (2048x1356) for its displayed dime
841
863
  ## Estimated savings: FCP 0 ms, LCP 100 ms
842
864
 
843
865
  ## External resources:
866
+ - https://developer.chrome.com/docs/performance/insights/image-delivery
844
867
  - https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/
845
868
  === end content
846
869
 
@@ -852,13 +875,14 @@ Content:
852
875
  This insight identifies forced synchronous layouts (also known as forced reflows) and layout thrashing caused by JavaScript accessing layout properties at suboptimal points in time.
853
876
 
854
877
  ## Detailed analysis:
855
- A forced reflow occurs when JavaScript queries geometric properties (such as `offsetWidth`) after styles have been invalidated by a change to the DOM state. This can result in poor performance. Learn more about [forced reflows](https://developers.google.com/web/fundamentals/performance/rendering/avoid-large-complex-layouts-and-layout-thrashing#avoid-forced-synchronous-layouts) and possible mitigations.
878
+ A forced reflow occurs when JavaScript queries geometric properties (such as `offsetWidth`) after styles have been invalidated by a change to the DOM state. This can result in poor performance. Learn more about [forced reflows](https://developer.chrome.com/docs/performance/insights/forced-reflow) and possible mitigations.
856
879
 
857
880
  The forced reflow checks revealed no problems.
858
881
 
859
882
  ## Estimated savings: none
860
883
 
861
884
  ## External resources:
885
+ - https://developer.chrome.com/docs/performance/insights/forced-reflow
862
886
  - https://developers.google.com/web/fundamentals/performance/rendering/avoid-large-complex-layouts-and-layout-thrashing#avoid-forced-synchronous-layouts
863
887
  === end content
864
888
 
@@ -870,7 +894,7 @@ Content:
870
894
  This insight identifies forced synchronous layouts (also known as forced reflows) and layout thrashing caused by JavaScript accessing layout properties at suboptimal points in time.
871
895
 
872
896
  ## Detailed analysis:
873
- A forced reflow occurs when JavaScript queries geometric properties (such as `offsetWidth`) after styles have been invalidated by a change to the DOM state. This can result in poor performance. Learn more about [forced reflows](https://developers.google.com/web/fundamentals/performance/rendering/avoid-large-complex-layouts-and-layout-thrashing#avoid-forced-synchronous-layouts) and possible mitigations.
897
+ A forced reflow occurs when JavaScript queries geometric properties (such as `offsetWidth`) after styles have been invalidated by a change to the DOM state. This can result in poor performance. Learn more about [forced reflows](https://developer.chrome.com/docs/performance/insights/forced-reflow) and possible mitigations.
874
898
 
875
899
  The forced reflow checks revealed one or more problems.
876
900
 
@@ -901,6 +925,7 @@ Stack trace (including total time):
901
925
  ## Estimated savings: none
902
926
 
903
927
  ## External resources:
928
+ - https://developer.chrome.com/docs/performance/insights/forced-reflow
904
929
  - https://developers.google.com/web/fundamentals/performance/rendering/avoid-large-complex-layouts-and-layout-thrashing#avoid-forced-synchronous-layouts
905
930
  === end content
906
931
 
@@ -927,6 +952,7 @@ no origins were preconnected.
927
952
  ## Estimated savings: none
928
953
 
929
954
  ## External resources:
955
+ - https://developer.chrome.com/docs/performance/insights/network-dependency-tree
930
956
  - https://web.dev/learn/performance/understanding-the-critical-path
931
957
  - https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/
932
958
  === end content
@@ -959,6 +985,7 @@ no origins were preconnected.
959
985
  ## Estimated savings: none
960
986
 
961
987
  ## External resources:
988
+ - https://developer.chrome.com/docs/performance/insights/network-dependency-tree
962
989
  - https://web.dev/learn/performance/understanding-the-critical-path
963
990
  - https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/
964
991
  === end content
@@ -976,6 +1003,7 @@ No CSS selector data was found. CSS selector stats need to be enabled in the per
976
1003
  ## Estimated savings: none
977
1004
 
978
1005
  ## External resources:
1006
+ - https://developer.chrome.com/docs/performance/insights/slow-css-selector
979
1007
  - https://developer.chrome.com/docs/devtools/performance/selector-stats
980
1008
  === end content
981
1009
 
@@ -997,11 +1025,12 @@ Elapsed time: 0 ms
997
1025
  Match attempts: 2444
998
1026
  Match count: 465
999
1027
 
1000
- If Recalculate Style costs remain high, selector optimization can reduce them. [Optimize the selectors](https://developer.chrome.com/docs/devtools/performance/selector-stats) with both high elapsed time and high slow-path %. Simpler selectors, fewer selectors, a smaller DOM, and a shallower DOM will all reduce matching costs.
1028
+ If Recalculate Style costs remain high, selector optimization can reduce them. [Optimize the selectors](https://developer.chrome.com/docs/performance/insights/slow-css-selector) with both high elapsed time and high slow-path %. Simpler selectors, fewer selectors, a smaller DOM, and a shallower DOM will all reduce matching costs.
1001
1029
 
1002
1030
  ## Estimated savings: none
1003
1031
 
1004
1032
  ## External resources:
1033
+ - https://developer.chrome.com/docs/performance/insights/slow-css-selector
1005
1034
  - https://developer.chrome.com/docs/devtools/performance/selector-stats
1006
1035
  === end content
1007
1036
 
@@ -1018,6 +1047,7 @@ No 3rd party scripts were found on this page.
1018
1047
  ## Estimated savings: none
1019
1048
 
1020
1049
  ## External resources:
1050
+ - https://developer.chrome.com/docs/performance/insights/third-parties
1021
1051
  - https://web.dev/articles/optimizing-content-efficiency-loading-third-party-javascript/
1022
1052
  === end content
1023
1053
 
@@ -1043,11 +1073,12 @@ The following list contains the largest amount spent by a 3rd party script on th
1043
1073
  - noondiphcddnnabmjcihcjfbhfklnnep: 2 ms
1044
1074
  - web.app: 0.2 ms
1045
1075
 
1046
- 3rd party code can significantly impact load performance. [Reduce and defer loading of 3rd party code](https://web.dev/articles/optimizing-content-efficiency-loading-third-party-javascript/) to prioritize your page's content.
1076
+ 3rd party code can significantly impact load performance. [Reduce and defer loading of 3rd party code](https://developer.chrome.com/docs/performance/insights/third-parties) to prioritize your page's content.
1047
1077
 
1048
1078
  ## Estimated savings: none
1049
1079
 
1050
1080
  ## External resources:
1081
+ - https://developer.chrome.com/docs/performance/insights/third-parties
1051
1082
  - https://web.dev/articles/optimizing-content-efficiency-loading-third-party-javascript/
1052
1083
  === end content
1053
1084
 
@@ -1064,6 +1095,7 @@ No requests with inefficient cache policies.
1064
1095
  ## Estimated savings: none
1065
1096
 
1066
1097
  ## External resources:
1098
+ - https://developer.chrome.com/docs/performance/insights/cache
1067
1099
  - https://web.dev/uses-long-cache-ttl/
1068
1100
  === end content
1069
1101
 
@@ -1081,11 +1113,12 @@ The following resources were associated with ineffficient cache policies:
1081
1113
  - Cache Time to Live (TTL): 600 seconds
1082
1114
  - Wasted bytes: 0 B
1083
1115
 
1084
- A long cache lifetime can speed up repeat visits to your page. [Learn more](https://web.dev/uses-long-cache-ttl/).
1116
+ A long cache lifetime can speed up repeat visits to your page. [Learn more about caching](https://developer.chrome.com/docs/performance/insights/cache).
1085
1117
 
1086
1118
  ## Estimated savings: none
1087
1119
 
1088
1120
  ## External resources:
1121
+ - https://developer.chrome.com/docs/performance/insights/cache
1089
1122
  - https://web.dev/uses-long-cache-ttl/
1090
1123
  === end content
1091
1124
 
@@ -1104,6 +1137,7 @@ The viewport meta tag was found: `width=device-width, initial-scale=0.25`.
1104
1137
  ## Estimated savings: INP 0 ms
1105
1138
 
1106
1139
  ## External resources:
1140
+ - https://developer.chrome.com/docs/performance/insights/viewport
1107
1141
  - https://developer.chrome.com/blog/300ms-tap-delay-gone-away/
1108
1142
  === end content
1109
1143
 
@@ -1119,10 +1153,11 @@ The webpage is not optimized for mobile viewing.
1119
1153
 
1120
1154
  The viewport meta tag is missing.
1121
1155
 
1122
- Tap interactions may be [delayed by up to 300 ms](https://developer.chrome.com/blog/300ms-tap-delay-gone-away/) if the viewport is not optimized for mobile.
1156
+ Tap interactions may be [delayed by up to 300 ms](https://developer.chrome.com/docs/performance/insights/viewport) if the viewport is not optimized for mobile.
1123
1157
 
1124
1158
  ## Estimated savings: none
1125
1159
 
1126
1160
  ## External resources:
1161
+ - https://developer.chrome.com/docs/performance/insights/viewport
1127
1162
  - https://developer.chrome.com/blog/300ms-tap-delay-gone-away/
1128
1163
  === end content