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.
- package/front_end/core/common/Settings.ts +1 -1
- package/front_end/core/sdk/PreloadingModel.ts +3 -0
- package/front_end/core/sdk/ResourceTreeModel.ts +1 -1
- package/front_end/core/sdk/SourceMapScopesInfo.ts +57 -0
- package/front_end/generated/InspectorBackendCommands.js +4 -4
- package/front_end/generated/SupportedCSSProperties.js +0 -19
- package/front_end/generated/protocol-mapping.d.ts +1 -1
- package/front_end/generated/protocol-proxy-api.d.ts +1 -1
- package/front_end/generated/protocol.ts +9 -8
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +43 -8
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +50 -32
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +29 -29
- package/front_end/models/javascript_metadata/NativeFunctions.js +3 -8
- package/front_end/models/trace/handlers/UserTimingsHandler.ts +1 -1
- package/front_end/models/trace/insights/CLSCulprits.ts +2 -1
- package/front_end/models/trace/insights/Cache.ts +2 -1
- package/front_end/models/trace/insights/DOMSize.ts +2 -1
- package/front_end/models/trace/insights/DocumentLatency.ts +2 -1
- package/front_end/models/trace/insights/DuplicatedJavaScript.ts +2 -1
- package/front_end/models/trace/insights/FontDisplay.ts +2 -1
- package/front_end/models/trace/insights/ForcedReflow.ts +2 -1
- package/front_end/models/trace/insights/INPBreakdown.ts +2 -1
- package/front_end/models/trace/insights/ImageDelivery.ts +2 -1
- package/front_end/models/trace/insights/LCPBreakdown.ts +2 -1
- package/front_end/models/trace/insights/LCPDiscovery.ts +2 -1
- package/front_end/models/trace/insights/LegacyJavaScript.ts +2 -1
- package/front_end/models/trace/insights/ModernHTTP.ts +2 -1
- package/front_end/models/trace/insights/NetworkDependencyTree.ts +2 -1
- package/front_end/models/trace/insights/RenderBlocking.ts +2 -1
- package/front_end/models/trace/insights/SlowCSSSelector.ts +2 -1
- package/front_end/models/trace/insights/ThirdParties.ts +2 -1
- package/front_end/models/trace/insights/Viewport.ts +2 -1
- package/front_end/models/trace/insights/types.ts +2 -1
- package/front_end/panels/application/ReportingApiView.ts +8 -7
- package/front_end/panels/application/StorageView.ts +2 -1
- package/front_end/panels/application/preloading/components/PreloadingString.ts +2 -0
- package/front_end/panels/console/ConsolePrompt.ts +24 -4
- package/front_end/panels/timeline/TimelinePanel.ts +10 -8
- package/front_end/panels/timeline/components/ExportTraceOptions.ts +1 -1
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/ui/components/buttons/Button.ts +17 -0
- package/front_end/ui/legacy/SearchableView.ts +1 -1
- package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +48 -5
- package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +2 -2
- package/front_end/ui/legacy/components/source_frame/JSONView.ts +28 -0
- 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 {@
|
|
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.
|
|
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": "
|
|
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
|
|
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
|
|
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
|
-
*
|
|
2292
|
+
* Embedding origin the permission applies to, all origins if not specified.
|
|
2293
2293
|
*/
|
|
2294
2294
|
origin?: string;
|
|
2295
2295
|
/**
|
|
2296
|
-
*
|
|
2297
|
-
* present and valid. If the
|
|
2298
|
-
*
|
|
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
|
-
|
|
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
|
|
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
|
/**
|
package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt
CHANGED
|
@@ -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/
|
|
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/
|
|
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://
|
|
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://
|
|
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/
|
|
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://
|
|
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://
|
|
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/
|
|
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
|