chrome-devtools-frontend 1.0.1558690 → 1.0.1559913

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 (51) hide show
  1. package/front_end/Images/src/container.svg +4 -0
  2. package/front_end/core/common/Gzip.ts +15 -0
  3. package/front_end/core/sdk/CSSMetadata.ts +6 -6
  4. package/front_end/core/sdk/CSSModel.ts +2 -2
  5. package/front_end/core/sdk/DOMModel.ts +7 -3
  6. package/front_end/generated/InspectorBackendCommands.ts +2 -1
  7. package/front_end/generated/SupportedCSSProperties.js +64 -32
  8. package/front_end/generated/protocol-mapping.d.ts +9 -0
  9. package/front_end/generated/protocol-proxy-api.d.ts +7 -0
  10. package/front_end/generated/protocol.ts +14 -1
  11. package/front_end/models/ai_assistance/agents/StylingAgent.ts +1 -1
  12. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +11 -7
  13. package/front_end/models/trace/LanternComputationData.ts +4 -3
  14. package/front_end/models/trace/Processor.ts +6 -5
  15. package/front_end/models/trace/Styles.ts +10 -1
  16. package/front_end/models/trace/handlers/LargestImagePaintHandler.ts +2 -2
  17. package/front_end/models/trace/handlers/MetaHandler.ts +14 -0
  18. package/front_end/models/trace/handlers/PageLoadMetricsHandler.ts +54 -34
  19. package/front_end/models/trace/helpers/Timing.ts +8 -1
  20. package/front_end/models/trace/insights/Common.ts +1 -1
  21. package/front_end/models/trace/insights/LCPBreakdown.ts +4 -4
  22. package/front_end/models/trace/insights/LCPDiscovery.ts +3 -3
  23. package/front_end/models/trace/insights/RenderBlocking.ts +1 -1
  24. package/front_end/models/trace/insights/types.ts +1 -1
  25. package/front_end/models/trace/types/TraceEvents.ts +62 -10
  26. package/front_end/panels/common/AiCodeGenerationTeaser.ts +48 -12
  27. package/front_end/panels/common/aiCodeGenerationTeaser.css +14 -0
  28. package/front_end/panels/common/common.ts +1 -1
  29. package/front_end/panels/console/consoleView.css +1 -1
  30. package/front_end/panels/elements/CSSRuleValidator.ts +38 -0
  31. package/front_end/panels/elements/ElementsTreeElement.ts +79 -58
  32. package/front_end/panels/elements/ElementsTreeOutline.ts +0 -17
  33. package/front_end/panels/elements/StylesSidebarPane.ts +15 -4
  34. package/front_end/panels/timeline/StatusDialog.ts +4 -3
  35. package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +3 -16
  36. package/front_end/panels/timeline/TimelineFlameChartView.ts +64 -21
  37. package/front_end/panels/timeline/TimelinePanel.ts +71 -24
  38. package/front_end/panels/timeline/TimelineUIUtils.ts +28 -2
  39. package/front_end/panels/timeline/TimingsTrackAppender.ts +3 -1
  40. package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +1 -1
  41. package/front_end/panels/timeline/components/insights/RenderBlocking.ts +6 -4
  42. package/front_end/panels/timeline/overlays/OverlaysImpl.ts +4 -0
  43. package/front_end/panels/timeline/timelinePanel.css +8 -1
  44. package/front_end/panels/timeline/utils/EntryNodes.ts +2 -1
  45. package/front_end/third_party/chromium/README.chromium +1 -1
  46. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +70 -28
  47. package/front_end/ui/legacy/SearchableView.ts +11 -5
  48. package/front_end/ui/legacy/SplitWidget.ts +1 -1
  49. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +43 -9
  50. package/front_end/ui/visual_logging/KnownContextValues.ts +13 -0
  51. package/package.json +1 -1
@@ -0,0 +1,4 @@
1
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M4.5 17C4.08333 17 3.72933 16.854 3.438 16.562C3.146 16.2707 3 15.9167 3 15.5V4.5C3 4.08333 3.146 3.72933 3.438 3.438C3.72933 3.146 4.08333 3 4.5 3H15.5C15.9167 3 16.2707 3.146 16.562 3.438C16.854 3.72933 17 4.08333 17 4.5V15.5C17 15.9167 16.854 16.2707 16.562 16.562C16.2707 16.854 15.9167 17 15.5 17H4.5ZM4.5 15.5H15.5V4.5H4.5V15.5Z" fill="black"/>
3
+ <path d="M6.85714 14C6.61905 14 6.41676 13.9166 6.25029 13.7497C6.08343 13.5833 6 13.381 6 13.1429V6.85714C6 6.61905 6.08343 6.41676 6.25029 6.25029C6.41676 6.08343 6.61905 6 6.85714 6H13.1429C13.381 6 13.5833 6.08343 13.7497 6.25029C13.9166 6.41676 14 6.61905 14 6.85714V13.1429C14 13.381 13.9166 13.5833 13.7497 13.7497C13.5833 13.9166 13.381 14 13.1429 14H6.85714ZM7.5 12.5H12.5V7.5H7.5V12.5Z" fill="black"/>
4
+ </svg>
@@ -68,7 +68,22 @@ export function decompressStream(stream: ReadableStream): ReadableStream {
68
68
  const ds = new DecompressionStream('gzip');
69
69
  return stream.pipeThrough(ds);
70
70
  }
71
+
71
72
  export function compressStream(stream: ReadableStream): ReadableStream {
72
73
  const cs = new CompressionStream('gzip');
73
74
  return stream.pipeThrough(cs);
74
75
  }
76
+
77
+ export function createMonitoredStream(stream: ReadableStream, onProgress: (bytesRead: number) => void): ReadableStream {
78
+ let bytesRead = 0;
79
+
80
+ const progressTransformer = new TransformStream({
81
+ transform(chunk, controller) {
82
+ bytesRead += chunk.byteLength;
83
+ onProgress(bytesRead);
84
+ controller.enqueue(chunk);
85
+ }
86
+ });
87
+
88
+ return stream.pipeThrough(progressTransformer);
89
+ }
@@ -644,7 +644,7 @@ const extraPropertyValues = new Map<string, Set<string>>([
644
644
  ['background-repeat', new Set(['repeat', 'repeat-x', 'repeat-y', 'no-repeat', 'space', 'round'])],
645
645
  ['content', new Set(['normal', 'close-quote', 'no-close-quote', 'no-open-quote', 'open-quote'])],
646
646
  ['baseline-shift', new Set(['baseline'])],
647
- ['max-height', new Set(['min-content', 'max-content', '-webkit-fill-available', 'fit-content'])],
647
+ ['max-height', new Set(['min-content', 'max-content', '-webkit-fill-available', 'fit-content', 'stretch'])],
648
648
  ['color', new Set(['black'])],
649
649
  ['background-color', new Set(['white'])],
650
650
  ['box-shadow', new Set(['inset'])],
@@ -718,7 +718,7 @@ const extraPropertyValues = new Map<string, Set<string>>([
718
718
  ]),
719
719
  ],
720
720
  ['zoom', new Set(['normal'])],
721
- ['max-width', new Set(['min-content', 'max-content', '-webkit-fill-available', 'fit-content'])],
721
+ ['max-width', new Set(['min-content', 'max-content', '-webkit-fill-available', 'fit-content', 'stretch'])],
722
722
  ['-webkit-font-smoothing', new Set(['antialiased', 'subpixel-antialiased'])],
723
723
  [
724
724
  'border',
@@ -1109,7 +1109,7 @@ const extraPropertyValues = new Map<string, Set<string>>([
1109
1109
  ]),
1110
1110
  ],
1111
1111
  ['flex-flow', new Set(['nowrap', 'row', 'row-reverse', 'column', 'column-reverse', 'wrap', 'wrap-reverse'])],
1112
- ['height', new Set(['-webkit-fill-available'])],
1112
+ ['height', new Set(['-webkit-fill-available', 'stretch'])],
1113
1113
  ['inline-size', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content'])],
1114
1114
  [
1115
1115
  'list-style',
@@ -1176,9 +1176,9 @@ const extraPropertyValues = new Map<string, Set<string>>([
1176
1176
  ['max-block-size', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content'])],
1177
1177
  ['max-inline-size', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content'])],
1178
1178
  ['min-block-size', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content'])],
1179
- ['min-height', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content'])],
1179
+ ['min-height', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content', 'stretch'])],
1180
1180
  ['min-inline-size', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content'])],
1181
- ['min-width', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content'])],
1181
+ ['min-width', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content', 'stretch'])],
1182
1182
  ['object-position', new Set(['top', 'bottom', 'left', 'right', 'center'])],
1183
1183
  ['shape-outside', new Set(['border-box', 'content-box', 'padding-box', 'margin-box'])],
1184
1184
  [
@@ -1340,7 +1340,7 @@ const extraPropertyValues = new Map<string, Set<string>>([
1340
1340
  ['-webkit-text-stroke-width', new Set(['medium', 'thick', 'thin'])],
1341
1341
  ['-webkit-transform-origin-x', new Set(['left', 'right', 'center'])],
1342
1342
  ['-webkit-transform-origin-y', new Set(['top', 'bottom', 'center'])],
1343
- ['width', new Set(['-webkit-fill-available'])],
1343
+ ['width', new Set(['-webkit-fill-available', 'stretch'])],
1344
1344
  ['contain-intrinsic-width', new Set(['auto none', 'auto 100px'])],
1345
1345
  ['contain-intrinsic-height', new Set(['auto none', 'auto 100px'])],
1346
1346
  ['contain-intrinsic-size', new Set(['auto none', 'auto 100px'])],
@@ -38,7 +38,7 @@ export interface LayoutProperties {
38
38
  isGrid: boolean;
39
39
  isSubgrid: boolean;
40
40
  isGridLanes: boolean;
41
- isContainer: boolean;
41
+ containerType?: string;
42
42
  hasScroll: boolean;
43
43
  }
44
44
 
@@ -402,7 +402,7 @@ export class CSSModel extends SDKModel<EventTypes> {
402
402
  isGrid,
403
403
  isSubgrid,
404
404
  isGridLanes,
405
- isContainer,
405
+ containerType: isContainer ? containerType : undefined,
406
406
  hasScroll,
407
407
  };
408
408
  }
@@ -110,10 +110,12 @@ export const ARIA_ATTRIBUTES = new Set<string>([
110
110
 
111
111
  export enum DOMNodeEvents {
112
112
  TOP_LAYER_INDEX_CHANGED = 'TopLayerIndexChanged',
113
+ SCROLLABLE_FLAG_UPDATED = 'ScrollableFlagUpdated',
113
114
  }
114
115
 
115
116
  export interface DOMNodeEventTypes {
116
117
  [DOMNodeEvents.TOP_LAYER_INDEX_CHANGED]: void;
118
+ [DOMNodeEvents.SCROLLABLE_FLAG_UPDATED]: void;
117
119
  }
118
120
 
119
121
  export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventTypes> {
@@ -392,6 +394,11 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
392
394
 
393
395
  setIsScrollable(isScrollable: boolean): void {
394
396
  this.#isScrollable = isScrollable;
397
+ this.dispatchEventToListeners(DOMNodeEvents.SCROLLABLE_FLAG_UPDATED);
398
+ if (this.nodeName() === '#document') {
399
+ // We show the scroll badge of the document on the <html> element.
400
+ this.ownerDocument?.documentElement?.setIsScrollable(isScrollable);
401
+ }
395
402
  }
396
403
 
397
404
  setAffectedByStartingStyles(affectedByStartingStyles: boolean): void {
@@ -1651,7 +1658,6 @@ export class DOMModel extends SDKModel<EventTypes> {
1651
1658
  return;
1652
1659
  }
1653
1660
  node.setIsScrollable(isScrollable);
1654
- this.dispatchEventToListeners(Events.ScrollableFlagUpdated, {node});
1655
1661
  }
1656
1662
 
1657
1663
  affectedByStartingStylesFlagUpdated(nodeId: Protocol.DOM.NodeId, affectedByStartingStyles: boolean): void {
@@ -1907,7 +1913,6 @@ export enum Events {
1907
1913
  DistributedNodesChanged = 'DistributedNodesChanged',
1908
1914
  MarkersChanged = 'MarkersChanged',
1909
1915
  TopLayerElementsChanged = 'TopLayerElementsChanged',
1910
- ScrollableFlagUpdated = 'ScrollableFlagUpdated',
1911
1916
  AffectedByStartingStylesFlagUpdated = 'AffectedByStartingStylesFlagUpdated',
1912
1917
  AdoptedStyleSheetsModified = 'AdoptedStyleSheetsModified',
1913
1918
  /* eslint-enable @typescript-eslint/naming-convention */
@@ -1925,7 +1930,6 @@ export interface EventTypes {
1925
1930
  [Events.DistributedNodesChanged]: DOMNode;
1926
1931
  [Events.MarkersChanged]: DOMNode;
1927
1932
  [Events.TopLayerElementsChanged]: {document: DOMDocument, documentShortcuts: DOMNodeShortcut[]};
1928
- [Events.ScrollableFlagUpdated]: {node: DOMNode};
1929
1933
  [Events.AffectedByStartingStylesFlagUpdated]: {node: DOMNode};
1930
1934
  [Events.AdoptedStyleSheetsModified]: DOMNode;
1931
1935
  }
@@ -843,7 +843,8 @@ inspectorBackend.registerCommand("Network.disable", [], [], "Disables network tr
843
843
  inspectorBackend.registerCommand("Network.emulateNetworkConditions", [{"name": "offline", "type": "boolean", "optional": false, "description": "True to emulate internet disconnection.", "typeRef": null}, {"name": "latency", "type": "number", "optional": false, "description": "Minimum latency from request sent to response headers received (ms).", "typeRef": null}, {"name": "downloadThroughput", "type": "number", "optional": false, "description": "Maximal aggregated download throughput (bytes/sec). -1 disables download throttling.", "typeRef": null}, {"name": "uploadThroughput", "type": "number", "optional": false, "description": "Maximal aggregated upload throughput (bytes/sec). -1 disables upload throttling.", "typeRef": null}, {"name": "connectionType", "type": "string", "optional": true, "description": "Connection type if known.", "typeRef": "Network.ConnectionType"}, {"name": "packetLoss", "type": "number", "optional": true, "description": "WebRTC packet loss (percent, 0-100). 0 disables packet loss emulation, 100 drops all the packets.", "typeRef": null}, {"name": "packetQueueLength", "type": "number", "optional": true, "description": "WebRTC packet queue length (packet). 0 removes any queue length limitations.", "typeRef": null}, {"name": "packetReordering", "type": "boolean", "optional": true, "description": "WebRTC packetReordering feature.", "typeRef": null}], [], "Activates emulation of network conditions. This command is deprecated in favor of the emulateNetworkConditionsByRule and overrideNetworkState commands, which can be used together to the same effect.");
844
844
  inspectorBackend.registerCommand("Network.emulateNetworkConditionsByRule", [{"name": "offline", "type": "boolean", "optional": false, "description": "True to emulate internet disconnection.", "typeRef": null}, {"name": "matchedNetworkConditions", "type": "array", "optional": false, "description": "Configure conditions for matching requests. If multiple entries match a request, the first entry wins. Global conditions can be configured by leaving the urlPattern for the conditions empty. These global conditions are also applied for throttling of p2p connections.", "typeRef": "Network.NetworkConditions"}], ["ruleIds"], "Activates emulation of network conditions for individual requests using URL match patterns. Unlike the deprecated Network.emulateNetworkConditions this method does not affect `navigator` state. Use Network.overrideNetworkState to explicitly modify `navigator` behavior.");
845
845
  inspectorBackend.registerCommand("Network.overrideNetworkState", [{"name": "offline", "type": "boolean", "optional": false, "description": "True to emulate internet disconnection.", "typeRef": null}, {"name": "latency", "type": "number", "optional": false, "description": "Minimum latency from request sent to response headers received (ms).", "typeRef": null}, {"name": "downloadThroughput", "type": "number", "optional": false, "description": "Maximal aggregated download throughput (bytes/sec). -1 disables download throttling.", "typeRef": null}, {"name": "uploadThroughput", "type": "number", "optional": false, "description": "Maximal aggregated upload throughput (bytes/sec). -1 disables upload throttling.", "typeRef": null}, {"name": "connectionType", "type": "string", "optional": true, "description": "Connection type if known.", "typeRef": "Network.ConnectionType"}], [], "Override the state of navigator.onLine and navigator.connection.");
846
- inspectorBackend.registerCommand("Network.enable", [{"name": "maxTotalBufferSize", "type": "number", "optional": true, "description": "Buffer size in bytes to use when preserving network payloads (XHRs, etc).", "typeRef": null}, {"name": "maxResourceBufferSize", "type": "number", "optional": true, "description": "Per-resource buffer size in bytes to use when preserving network payloads (XHRs, etc).", "typeRef": null}, {"name": "maxPostDataSize", "type": "number", "optional": true, "description": "Longest post body size (in bytes) that would be included in requestWillBeSent notification", "typeRef": null}, {"name": "reportDirectSocketTraffic", "type": "boolean", "optional": true, "description": "Whether DirectSocket chunk send/receive events should be reported.", "typeRef": null}, {"name": "enableDurableMessages", "type": "boolean", "optional": true, "description": "Enable storing response bodies outside of renderer, so that these survive a cross-process navigation. Requires maxTotalBufferSize to be set. Currently defaults to false.", "typeRef": null}], [], "Enables network tracking, network events will now be delivered to the client.");
846
+ inspectorBackend.registerCommand("Network.enable", [{"name": "maxTotalBufferSize", "type": "number", "optional": true, "description": "Buffer size in bytes to use when preserving network payloads (XHRs, etc).", "typeRef": null}, {"name": "maxResourceBufferSize", "type": "number", "optional": true, "description": "Per-resource buffer size in bytes to use when preserving network payloads (XHRs, etc).", "typeRef": null}, {"name": "maxPostDataSize", "type": "number", "optional": true, "description": "Longest post body size (in bytes) that would be included in requestWillBeSent notification", "typeRef": null}, {"name": "reportDirectSocketTraffic", "type": "boolean", "optional": true, "description": "Whether DirectSocket chunk send/receive events should be reported.", "typeRef": null}, {"name": "enableDurableMessages", "type": "boolean", "optional": true, "description": "Enable storing response bodies outside of renderer, so that these survive a cross-process navigation. Requires maxTotalBufferSize to be set. Currently defaults to false. This field is being deprecated in favor of the dedicated configureDurableMessages command, due to the possibility of deadlocks when awaiting Network.enable before issuing Runtime.runIfWaitingForDebugger.", "typeRef": null}], [], "Enables network tracking, network events will now be delivered to the client.");
847
+ inspectorBackend.registerCommand("Network.configureDurableMessages", [{"name": "maxTotalBufferSize", "type": "number", "optional": true, "description": "Buffer size in bytes to use when preserving network payloads (XHRs, etc).", "typeRef": null}, {"name": "maxResourceBufferSize", "type": "number", "optional": true, "description": "Per-resource buffer size in bytes to use when preserving network payloads (XHRs, etc).", "typeRef": null}], [], "Configures storing response bodies outside of renderer, so that these survive a cross-process navigation. If maxTotalBufferSize is not set, durable messages are disabled.");
847
848
  inspectorBackend.registerCommand("Network.getAllCookies", [], ["cookies"], "Returns all browser cookies. Depending on the backend support, will return detailed cookie information in the `cookies` field. Deprecated. Use Storage.getCookies instead.");
848
849
  inspectorBackend.registerCommand("Network.getCertificate", [{"name": "origin", "type": "string", "optional": false, "description": "Origin to get certificate for.", "typeRef": null}], ["tableNames"], "Returns the DER-encoded certificate.");
849
850
  inspectorBackend.registerCommand("Network.getCookies", [{"name": "urls", "type": "array", "optional": true, "description": "The list of URLs for which applicable cookies will be fetched. If not specified, it's assumed to be set to the list containing the URLs of the page and all of its subframes.", "typeRef": "string"}], ["cookies"], "Returns all browser cookies for the current URL. Depending on the backend support, will return detailed cookie information in the `cookies` field.");
@@ -349,6 +349,7 @@ export const generatedProperties = [
349
349
  "background-repeat",
350
350
  "background-size",
351
351
  "base-palette",
352
+ "base-url",
352
353
  "baseline-shift",
353
354
  "baseline-source",
354
355
  "block-ellipsis",
@@ -419,10 +420,10 @@ export const generatedProperties = [
419
420
  "column-height",
420
421
  "column-rule-break",
421
422
  "column-rule-color",
422
- "column-rule-edge-end-inset",
423
- "column-rule-edge-start-inset",
424
- "column-rule-interior-end-inset",
425
- "column-rule-interior-start-inset",
423
+ "column-rule-edge-inset-end",
424
+ "column-rule-edge-inset-start",
425
+ "column-rule-interior-inset-end",
426
+ "column-rule-interior-inset-start",
426
427
  "column-rule-style",
427
428
  "column-rule-visibility-items",
428
429
  "column-rule-width",
@@ -510,7 +511,9 @@ export const generatedProperties = [
510
511
  "grid-template-areas",
511
512
  "grid-template-columns",
512
513
  "grid-template-rows",
514
+ "hash",
513
515
  "height",
516
+ "hostname",
514
517
  "hyphenate-character",
515
518
  "hyphenate-limit-chars",
516
519
  "hyphens",
@@ -619,9 +622,12 @@ export const generatedProperties = [
619
622
  "page",
620
623
  "page-orientation",
621
624
  "paint-order",
625
+ "pathname",
626
+ "pattern",
622
627
  "perspective",
623
628
  "perspective-origin",
624
629
  "pointer-events",
630
+ "port",
625
631
  "position",
626
632
  "position-anchor",
627
633
  "position-area",
@@ -630,6 +636,7 @@ export const generatedProperties = [
630
636
  "position-visibility",
631
637
  "prefix",
632
638
  "print-color-adjust",
639
+ "protocol",
633
640
  "quotes",
634
641
  "r",
635
642
  "range",
@@ -642,10 +649,10 @@ export const generatedProperties = [
642
649
  "row-gap",
643
650
  "row-rule-break",
644
651
  "row-rule-color",
645
- "row-rule-edge-end-inset",
646
- "row-rule-edge-start-inset",
647
- "row-rule-interior-end-inset",
648
- "row-rule-interior-start-inset",
652
+ "row-rule-edge-inset-end",
653
+ "row-rule-edge-inset-start",
654
+ "row-rule-interior-inset-end",
655
+ "row-rule-interior-inset-start",
649
656
  "row-rule-style",
650
657
  "row-rule-visibility-items",
651
658
  "row-rule-width",
@@ -683,6 +690,7 @@ export const generatedProperties = [
683
690
  "scrollbar-color",
684
691
  "scrollbar-gutter",
685
692
  "scrollbar-width",
693
+ "search",
686
694
  "shape-image-threshold",
687
695
  "shape-margin",
688
696
  "shape-outside",
@@ -1039,6 +1047,9 @@ export const generatedProperties = [
1039
1047
  {
1040
1048
  "name": "base-palette"
1041
1049
  },
1050
+ {
1051
+ "name": "base-url"
1052
+ },
1042
1053
  {
1043
1054
  "keywords": [
1044
1055
  "baseline",
@@ -1727,28 +1738,28 @@ export const generatedProperties = [
1727
1738
  },
1728
1739
  {
1729
1740
  "inherited": false,
1730
- "name": "column-rule-edge-end-inset"
1741
+ "name": "column-rule-edge-inset-end"
1731
1742
  },
1732
1743
  {
1733
1744
  "inherited": false,
1734
- "name": "column-rule-edge-start-inset"
1745
+ "name": "column-rule-edge-inset-start"
1735
1746
  },
1736
1747
  {
1737
1748
  "longhands": [
1738
- "column-rule-edge-start-inset",
1739
- "column-rule-edge-end-inset",
1740
- "column-rule-interior-start-inset",
1741
- "column-rule-interior-end-inset"
1749
+ "column-rule-edge-inset-start",
1750
+ "column-rule-edge-inset-end",
1751
+ "column-rule-interior-inset-start",
1752
+ "column-rule-interior-inset-end"
1742
1753
  ],
1743
1754
  "name": "column-rule-inset"
1744
1755
  },
1745
1756
  {
1746
1757
  "inherited": false,
1747
- "name": "column-rule-interior-end-inset"
1758
+ "name": "column-rule-interior-inset-end"
1748
1759
  },
1749
1760
  {
1750
1761
  "inherited": false,
1751
- "name": "column-rule-interior-start-inset"
1762
+ "name": "column-rule-interior-inset-start"
1752
1763
  },
1753
1764
  {
1754
1765
  "keywords": [
@@ -2722,6 +2733,9 @@ export const generatedProperties = [
2722
2733
  ],
2723
2734
  "name": "grid-template-rows"
2724
2735
  },
2736
+ {
2737
+ "name": "hash"
2738
+ },
2725
2739
  {
2726
2740
  "keywords": [
2727
2741
  "auto",
@@ -2731,6 +2745,9 @@ export const generatedProperties = [
2731
2745
  ],
2732
2746
  "name": "height"
2733
2747
  },
2748
+ {
2749
+ "name": "hostname"
2750
+ },
2734
2751
  {
2735
2752
  "inherited": true,
2736
2753
  "name": "hyphenate-character"
@@ -3525,6 +3542,12 @@ export const generatedProperties = [
3525
3542
  ],
3526
3543
  "name": "paint-order"
3527
3544
  },
3545
+ {
3546
+ "name": "pathname"
3547
+ },
3548
+ {
3549
+ "name": "pattern"
3550
+ },
3528
3551
  {
3529
3552
  "keywords": [
3530
3553
  "none"
@@ -3572,6 +3595,9 @@ export const generatedProperties = [
3572
3595
  ],
3573
3596
  "name": "pointer-events"
3574
3597
  },
3598
+ {
3599
+ "name": "port"
3600
+ },
3575
3601
  {
3576
3602
  "keywords": [
3577
3603
  "static",
@@ -3654,6 +3680,9 @@ export const generatedProperties = [
3654
3680
  ],
3655
3681
  "name": "print-color-adjust"
3656
3682
  },
3683
+ {
3684
+ "name": "protocol"
3685
+ },
3657
3686
  {
3658
3687
  "inherited": true,
3659
3688
  "keywords": [
@@ -3738,28 +3767,28 @@ export const generatedProperties = [
3738
3767
  },
3739
3768
  {
3740
3769
  "inherited": false,
3741
- "name": "row-rule-edge-end-inset"
3770
+ "name": "row-rule-edge-inset-end"
3742
3771
  },
3743
3772
  {
3744
3773
  "inherited": false,
3745
- "name": "row-rule-edge-start-inset"
3774
+ "name": "row-rule-edge-inset-start"
3746
3775
  },
3747
3776
  {
3748
3777
  "longhands": [
3749
- "row-rule-edge-start-inset",
3750
- "row-rule-edge-end-inset",
3751
- "row-rule-interior-start-inset",
3752
- "row-rule-interior-end-inset"
3778
+ "row-rule-edge-inset-start",
3779
+ "row-rule-edge-inset-end",
3780
+ "row-rule-interior-inset-start",
3781
+ "row-rule-interior-inset-end"
3753
3782
  ],
3754
3783
  "name": "row-rule-inset"
3755
3784
  },
3756
3785
  {
3757
3786
  "inherited": false,
3758
- "name": "row-rule-interior-end-inset"
3787
+ "name": "row-rule-interior-inset-end"
3759
3788
  },
3760
3789
  {
3761
3790
  "inherited": false,
3762
- "name": "row-rule-interior-start-inset"
3791
+ "name": "row-rule-interior-inset-start"
3763
3792
  },
3764
3793
  {
3765
3794
  "keywords": [
@@ -3847,14 +3876,14 @@ export const generatedProperties = [
3847
3876
  },
3848
3877
  {
3849
3878
  "longhands": [
3850
- "row-rule-edge-start-inset",
3851
- "row-rule-edge-end-inset",
3852
- "row-rule-interior-start-inset",
3853
- "row-rule-interior-end-inset",
3854
- "column-rule-edge-start-inset",
3855
- "column-rule-edge-end-inset",
3856
- "column-rule-interior-start-inset",
3857
- "column-rule-interior-end-inset"
3879
+ "row-rule-edge-inset-start",
3880
+ "row-rule-edge-inset-end",
3881
+ "row-rule-interior-inset-start",
3882
+ "row-rule-interior-inset-end",
3883
+ "column-rule-edge-inset-start",
3884
+ "column-rule-edge-inset-end",
3885
+ "column-rule-interior-inset-start",
3886
+ "column-rule-interior-inset-end"
3858
3887
  ],
3859
3888
  "name": "rule-inset"
3860
3889
  },
@@ -4096,6 +4125,9 @@ export const generatedProperties = [
4096
4125
  ],
4097
4126
  "name": "scrollbar-width"
4098
4127
  },
4128
+ {
4129
+ "name": "search"
4130
+ },
4099
4131
  {
4100
4132
  "name": "shape-image-threshold"
4101
4133
  },
@@ -3351,6 +3351,15 @@ export namespace ProtocolMapping {
3351
3351
  paramsType: [Protocol.Network.EnableRequest?];
3352
3352
  returnType: void;
3353
3353
  };
3354
+ /**
3355
+ * Configures storing response bodies outside of renderer, so that these survive
3356
+ * a cross-process navigation.
3357
+ * If maxTotalBufferSize is not set, durable messages are disabled.
3358
+ */
3359
+ 'Network.configureDurableMessages': {
3360
+ paramsType: [Protocol.Network.ConfigureDurableMessagesRequest?];
3361
+ returnType: void;
3362
+ };
3354
3363
  /**
3355
3364
  * Returns all browser cookies. Depending on the backend support, will return detailed cookie
3356
3365
  * information in the `cookies` field.
@@ -2538,6 +2538,13 @@ declare namespace ProtocolProxyApi {
2538
2538
  */
2539
2539
  invoke_enable(params: Protocol.Network.EnableRequest): Promise<Protocol.ProtocolResponseWithError>;
2540
2540
 
2541
+ /**
2542
+ * Configures storing response bodies outside of renderer, so that these survive
2543
+ * a cross-process navigation.
2544
+ * If maxTotalBufferSize is not set, durable messages are disabled.
2545
+ */
2546
+ invoke_configureDurableMessages(params: Protocol.Network.ConfigureDurableMessagesRequest): Promise<Protocol.ProtocolResponseWithError>;
2547
+
2541
2548
  /**
2542
2549
  * Returns all browser cookies. Depending on the backend support, will return detailed cookie
2543
2550
  * information in the `cookies` field.
@@ -11571,11 +11571,24 @@ export namespace Network {
11571
11571
  /**
11572
11572
  * Enable storing response bodies outside of renderer, so that these survive
11573
11573
  * a cross-process navigation. Requires maxTotalBufferSize to be set.
11574
- * Currently defaults to false.
11574
+ * Currently defaults to false. This field is being deprecated in favor of the dedicated
11575
+ * configureDurableMessages command, due to the possibility of deadlocks when awaiting
11576
+ * Network.enable before issuing Runtime.runIfWaitingForDebugger.
11575
11577
  */
11576
11578
  enableDurableMessages?: boolean;
11577
11579
  }
11578
11580
 
11581
+ export interface ConfigureDurableMessagesRequest {
11582
+ /**
11583
+ * Buffer size in bytes to use when preserving network payloads (XHRs, etc).
11584
+ */
11585
+ maxTotalBufferSize?: integer;
11586
+ /**
11587
+ * Per-resource buffer size in bytes to use when preserving network payloads (XHRs, etc).
11588
+ */
11589
+ maxResourceBufferSize?: integer;
11590
+ }
11591
+
11579
11592
  export interface GetAllCookiesResponse extends ProtocolResponseWithError {
11580
11593
  /**
11581
11594
  * Array of cookie objects.
@@ -219,7 +219,7 @@ export class NodeContext extends ConversationContext<SDK.DOMModel.DOMNode> {
219
219
  {title: 'Why does this element scroll?', jslogContext: 'scroll-why'},
220
220
  ];
221
221
  }
222
- if (layoutProps.isContainer) {
222
+ if (layoutProps.containerType) {
223
223
  return [
224
224
  {title: 'What are container queries?', jslogContext: 'container-what'},
225
225
  {title: 'How do I use container-type?', jslogContext: 'container-how'},
@@ -13,12 +13,13 @@ import {bytes, millis} from './UnitFormatters.js';
13
13
  /**
14
14
  * For a given frame ID and navigation ID, returns the LCP Event and the LCP Request, if the resource was an image.
15
15
  */
16
- function getLCPData(parsedTrace: Trace.TraceModel.ParsedTrace, frameId: string, navigationId: string): {
16
+ function getLCPData(
17
+ parsedTrace: Trace.TraceModel.ParsedTrace, frameId: string, navigation: Trace.Types.Events.NavigationStart): {
17
18
  lcpEvent: Trace.Types.Events.LargestContentfulPaintCandidate,
18
19
  metricScore: Trace.Handlers.ModelHandlers.PageLoadMetrics.LCPMetricScore,
19
20
  lcpRequest?: Trace.Types.Events.SyntheticNetworkRequest,
20
21
  }|null {
21
- const navMetrics = parsedTrace.data.PageLoadMetrics.metricScoresByFrameId.get(frameId)?.get(navigationId);
22
+ const navMetrics = parsedTrace.data.PageLoadMetrics.metricScoresByFrameId.get(frameId)?.get(navigation);
22
23
  if (!navMetrics) {
23
24
  return null;
24
25
  }
@@ -28,13 +29,16 @@ function getLCPData(parsedTrace: Trace.TraceModel.ParsedTrace, frameId: string,
28
29
  return null;
29
30
  }
30
31
  const lcpEvent = metric?.event;
31
- if (!lcpEvent || !Trace.Types.Events.isLargestContentfulPaintCandidate(lcpEvent)) {
32
+ if (!lcpEvent || !Trace.Types.Events.isAnyLargestContentfulPaintCandidate(lcpEvent)) {
32
33
  return null;
33
34
  }
34
35
 
36
+ const navigationId = navigation.args.data?.navigationId;
37
+
35
38
  return {
36
39
  lcpEvent,
37
- lcpRequest: parsedTrace.data.LargestImagePaint.lcpRequestByNavigationId.get(navigationId),
40
+ lcpRequest: navigationId ? parsedTrace.data.LargestImagePaint.lcpRequestByNavigationId.get(navigationId) :
41
+ undefined,
38
42
  metricScore: metric,
39
43
  };
40
44
  }
@@ -89,15 +93,15 @@ export class PerformanceInsightFormatter {
89
93
  * Information about LCP which we pass to the LLM for all insights that relate to LCP.
90
94
  */
91
95
  #lcpMetricSharedContext(): string {
92
- if (!this.#insight.navigationId) {
96
+ if (!this.#insight.navigation) {
93
97
  // No navigation ID = no LCP.
94
98
  return '';
95
99
  }
96
- if (!this.#insight.frameId || !this.#insight.navigationId) {
100
+ if (!this.#insight.frameId || !this.#insight.navigation) {
97
101
  return '';
98
102
  }
99
103
 
100
- const data = getLCPData(this.#parsedTrace, this.#insight.frameId, this.#insight.navigationId);
104
+ const data = getLCPData(this.#parsedTrace, this.#insight.frameId, this.#insight.navigation);
101
105
  if (!data) {
102
106
  return '';
103
107
  }
@@ -10,14 +10,15 @@ import type * as Types from './types/types.js';
10
10
 
11
11
  type NetworkRequest = Lantern.Types.NetworkRequest<Types.Events.SyntheticNetworkRequest>;
12
12
 
13
- function createProcessedNavigation(data: Handlers.Types.HandlerData, frameId: string, navigationId: string):
14
- Lantern.Types.Simulation.ProcessedNavigation {
13
+ function createProcessedNavigation(
14
+ data: Handlers.Types.HandlerData, frameId: string,
15
+ navigation: Types.Events.NavigationStart): Lantern.Types.Simulation.ProcessedNavigation {
15
16
  const scoresByNav = data.PageLoadMetrics.metricScoresByFrameId.get(frameId);
16
17
  if (!scoresByNav) {
17
18
  throw new Lantern.Core.LanternError('missing metric scores for frame');
18
19
  }
19
20
 
20
- const scores = scoresByNav.get(navigationId);
21
+ const scores = scoresByNav.get(navigation);
21
22
  if (!scores) {
22
23
  throw new Lantern.Core.LanternError('missing metric scores for specified navigation');
23
24
  }
@@ -268,7 +268,8 @@ export class TraceProcessor extends EventTarget {
268
268
 
269
269
  #createLanternContext(
270
270
  data: Handlers.Types.HandlerData, traceEvents: readonly Types.Events.Event[], frameId: string,
271
- navigationId: string, options: Types.Configuration.ParseOptions): Insights.Types.LanternContext|undefined {
271
+ navigation: Types.Events.NavigationStart,
272
+ options: Types.Configuration.ParseOptions): Insights.Types.LanternContext|undefined {
272
273
  // Check for required handlers.
273
274
  if (!data.NetworkRequests || !data.Workers || !data.PageLoadMetrics) {
274
275
  return;
@@ -278,7 +279,7 @@ export class TraceProcessor extends EventTarget {
278
279
  }
279
280
 
280
281
  const navStarts = data.Meta.navigationsByFrameId.get(frameId);
281
- const navStartIndex = navStarts?.findIndex(n => n.args.data?.navigationId === navigationId);
282
+ const navStartIndex = navStarts?.findIndex(n => n === navigation);
282
283
  if (!navStarts || navStartIndex === undefined || navStartIndex === -1) {
283
284
  throw new Lantern.Core.LanternError('Could not find navigation start');
284
285
  }
@@ -295,7 +296,7 @@ export class TraceProcessor extends EventTarget {
295
296
 
296
297
  const requests = LanternComputationData.createNetworkRequests(trace, data, startTime, endTime);
297
298
  const graph = LanternComputationData.createGraph(requests, trace, data);
298
- const processedNavigation = LanternComputationData.createProcessedNavigation(data, frameId, navigationId);
299
+ const processedNavigation = LanternComputationData.createProcessedNavigation(data, frameId, navigation);
299
300
 
300
301
  const networkAnalysis = Lantern.Core.NetworkAnalyzer.analyze(requests);
301
302
  if (!networkAnalysis) {
@@ -455,7 +456,7 @@ export class TraceProcessor extends EventTarget {
455
456
  model.frameId = context.frameId;
456
457
  const navId = context.navigation?.args.data?.navigationId;
457
458
  if (navId) {
458
- model.navigationId = navId;
459
+ model.navigation = context.navigation;
459
460
  }
460
461
  model.createOverlays = () => {
461
462
  // @ts-expect-error: model is a union of all possible insight model types.
@@ -571,7 +572,7 @@ export class TraceProcessor extends EventTarget {
571
572
  let lantern: Insights.Types.LanternContext|undefined;
572
573
  try {
573
574
  options.logger?.start('insights:createLanternContext');
574
- lantern = this.#createLanternContext(data, traceEvents, frameId, navigationId, options);
575
+ lantern = this.#createLanternContext(data, traceEvents, frameId, navigation, options);
575
576
  } catch (e) {
576
577
  // Handle Lantern errors gracefully
577
578
  // Don't allow an error in constructing the Lantern graphs to break the rest of the trace processor.
@@ -879,6 +879,11 @@ export function maybeInitSylesMap(): EventStylesMap {
879
879
  defaultCategoryStyles.rendering,
880
880
  true,
881
881
  ),
882
+ [Types.Events.Name.MARK_LCP_CANDIDATE_FOR_SOFT_NAVIGATION]: new TimelineRecordStyle(
883
+ i18nString(UIStrings.largestContentfulPaint),
884
+ defaultCategoryStyles.rendering,
885
+ true,
886
+ ),
882
887
 
883
888
  [Types.Events.Name.TIME_STAMP]:
884
889
  new TimelineRecordStyle(i18nString(UIStrings.timestamp), defaultCategoryStyles.scripting),
@@ -1118,7 +1123,7 @@ export function markerDetailsForEvent(event: Types.Events.Event): {
1118
1123
  color = 'var(--sys-color-green-bright)';
1119
1124
  title = Handlers.ModelHandlers.PageLoadMetrics.MetricName.FCP;
1120
1125
  }
1121
- if (Types.Events.isLargestContentfulPaintCandidate(event)) {
1126
+ if (Types.Events.isAnyLargestContentfulPaintCandidate(event)) {
1122
1127
  color = 'var(--sys-color-green)';
1123
1128
  title = Handlers.ModelHandlers.PageLoadMetrics.MetricName.LCP;
1124
1129
  }
@@ -1126,6 +1131,10 @@ export function markerDetailsForEvent(event: Types.Events.Event): {
1126
1131
  color = 'var(--color-text-primary)';
1127
1132
  title = Handlers.ModelHandlers.PageLoadMetrics.MetricName.NAV;
1128
1133
  }
1134
+ if (Types.Events.isSoftNavigationStart(event)) {
1135
+ color = 'var(--sys-color-blue)';
1136
+ title = Handlers.ModelHandlers.PageLoadMetrics.MetricName.SOFT_NAV;
1137
+ }
1129
1138
  if (Types.Events.isMarkDOMContent(event)) {
1130
1139
  color = 'var(--color-text-disabled)';
1131
1140
  title = Handlers.ModelHandlers.PageLoadMetrics.MetricName.DCL;
@@ -55,9 +55,9 @@ export async function finalize(): Promise<void> {
55
55
  const metricScoresByFrameId = pageLoadMetricsData().metricScoresByFrameId;
56
56
 
57
57
  for (const [navigationId, navigation] of navigationsByNavigationId) {
58
- const lcpMetric = metricScoresByFrameId.get(navigation.args.frame)?.get(navigationId)?.get(MetricName.LCP);
58
+ const lcpMetric = metricScoresByFrameId.get(navigation.args.frame)?.get(navigation)?.get(MetricName.LCP);
59
59
  const lcpEvent = lcpMetric?.event;
60
- if (!lcpEvent || !Types.Events.isLargestContentfulPaintCandidate(lcpEvent)) {
60
+ if (!lcpEvent || !Types.Events.isAnyLargestContentfulPaintCandidate(lcpEvent)) {
61
61
  continue;
62
62
  }
63
63