Skip to content

[backport core/1.51] fix: keep Ctrl/Cmd shortcuts from falling through to the browser - #15478

Merged
comfy-pr-bot merged 1 commit into
core/1.51from
backport-15066-to-core-1.51
Aug 20, 2026
Merged

[backport core/1.51] fix: keep Ctrl/Cmd shortcuts from falling through to the browser#15478
comfy-pr-bot merged 1 commit into
core/1.51from
backport-15066-to-core-1.51

Conversation

@comfy-pr-bot

Copy link
Copy Markdown
Member

Backport of #15066 to core/1.51

Automatically created by backport workflow.

)

## Summary

Ctrl+S sometimes opened the browser's own "save page" dialog instead of
saving the workflow. Root cause: the global keybinding handler's modal
gate returns before `event.preventDefault()`, so any combo the app owns
is handed back to the browser whenever a dialog is open.

`src/platform/keybindings/keybindingService.ts:53-57`

```ts
if (isModalOpen(dialogStore.dialogStack.length)) {
  return          // <-- before event.preventDefault() on line 57
}
event.preventDefault()
```

`isModalOpen` is true for any managed dialog, any
`[role="dialog"][aria-modal="true"]`, any open Reka dialog, any `<dialog
open>`, and any visible `.comfy-modal` — so this fires often, and
intermittently, which is why the report is "Ctrl+S doesn't *always*
save".

## Changes

- **What (Before/After)**: when the modal gate declines to run a
keybinding, the browser default is now suppressed for Ctrl/Cmd combos.
Before: browser save-page dialog. After: no-op. Bare keys are untouched,
so typing inside a dialog still works — that is what the gate was added
to protect (#12184), and the existing tests asserting `preventDefault`
is *not* called for bare-key bindings still pass unchanged.
- **Breaking**: none.
- **Dependencies**: none.

## Review Focus

- Scope of the guard is `keyCombo.ctrl`, which `KeyComboImpl.fromEvent`
sets from `ctrlKey || metaKey`, so Cmd on macOS is covered.
- Combos in `RESERVED_BY_TEXT_INPUT` (Ctrl+A/C/V/X/Z/…) already return
earlier when focus is in an input, so this does not intercept text
editing.
- **Deliberately out of scope**: whether Ctrl+S should *save* while a
dialog is open. That is a product decision (re-entrancy against the
Save-As prompt is real), and this PR only stops the browser from
hijacking the combo. Tracked separately.

## How

- `keybindingService.ts`: suppress the default for Ctrl/Cmd combos
inside the modal-gate early return.
- `keybindingService.dialog.test.ts`: failing repro committed first
(`test:` commit), then the fix — the diff proves the bug existed.
- `browser_tests/tests/defaultKeybindings.spec.ts`: e2e opens the
Save-As dialog with Ctrl+S, then asserts a second Ctrl+S is
`defaultPrevented`.

- Fixes FE-1188
(https://linear.app/comfyorg/issue/FE-1188/bug-ctrls-triggers-browser-save-as-html-instead-of-comfyui-native-save)
- Part of FE-1586 (reported by Pablo in #comfy-creatives, 2026-08-11:
"When I hit ctrl+S it doesnt always save")

---------

Co-authored-by: Connor Byrne <c.byrne@comfy.org>
Co-authored-by: Alexander Brown <drjkl@comfy.org>
@comfy-pr-bot comfy-pr-bot added the backport Backporting a PR onto a release candidate label Aug 20, 2026
@comfy-pr-bot
comfy-pr-bot enabled auto-merge (squash) August 20, 2026 06:20
@dosubot dosubot Bot added the size:XS This PR changes 0-9 lines, ignoring generated files. label Aug 20, 2026
@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 08/20/2026, 06:21:53 AM UTC

Links

🎭 Playwright: ✅ 1820 passed, 0 failed · 4 flaky

📊 Browser Reports
  • chromium: View Report (✅ 1799 / ❌ 0 / ⚠️ 4 / ⏭️ 5)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 18 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

📦 Bundle Size

⏳ Size data collection in progress…

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.3 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 44.3 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.7 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 51.8 MB heap
large-graph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.8 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 58.9 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 58.7 MB heap
minimap-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 70.0 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 52.3 MB heap
subgraph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.7 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 58.9 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 143ms TBT · 75.7 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 61.4 MB heap
vue-large-graph-idle: · 56.3 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 162.9 MB heap
vue-large-graph-pan: · 56.2 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 99ms TBT · 162.4 MB heap
workflow-execution: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 66.3 MB heap

⚠️ 5 regressions detected

Show regressions
Metric Baseline PR (median) Δ Sig
canvas-zoom-sweep: layout duration 1ms 1ms +11% ⚠️ z=2.3
canvas-zoom-sweep: task duration 451ms 388ms -14% ⚠️ z=2.6
large-graph-pan: task duration 1293ms 1203ms -7% ⚠️ z=2.8
subgraph-dom-widget-clipping: task duration 429ms 416ms -3% ⚠️ z=2.1
subgraph-idle: task duration 544ms 453ms -17% ⚠️ z=2.7
All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: avg frame time 17ms 17ms -0% z=-0.9
canvas-idle: p95 frame time 17ms 17ms +0%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 9ms 8ms -10% z=-3.5
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 9 9 +0% z=-3.8
canvas-idle: task duration 555ms 451ms -19% z=1.8
canvas-idle: script duration 10ms 7ms -33% z=-8.3
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 67.3 MB 67.3 MB -0%
canvas-idle: DOM nodes 18 18 +0% z=-3.6
canvas-idle: event listeners 4 4 +0% z=-1.6
canvas-mouse-sweep: avg frame time 17ms 17ms -0% z=-0.9
canvas-mouse-sweep: p95 frame time 17ms 17ms -0%
canvas-mouse-sweep: layout duration 8ms 3ms -54% z=-0.6
canvas-mouse-sweep: style recalc duration 60ms 44ms -26% z=0.6
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 86 78 -9% z=-0.3
canvas-mouse-sweep: task duration 1250ms 968ms -23% z=1.8
canvas-mouse-sweep: script duration 141ms 120ms -15% z=-2.4
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 45.8 MB 44.3 MB -3%
canvas-mouse-sweep: DOM nodes -137 34 -125% z=-10.9
canvas-mouse-sweep: event listeners -153 5 -103% z=-0.8
canvas-zoom-sweep: avg frame time 17ms 17ms -0% z=0.5
canvas-zoom-sweep: p95 frame time 17ms 17ms -0%
canvas-zoom-sweep: layout duration 1ms 1ms +11% ⚠️ z=2.3
canvas-zoom-sweep: style recalc duration 19ms 19ms -1% z=-0.4
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 32 31 -3% z=-1.7
canvas-zoom-sweep: task duration 451ms 388ms -14% ⚠️ z=2.6
canvas-zoom-sweep: script duration 13ms 11ms -16% z=-5.4
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 69.9 MB 69.7 MB -0%
canvas-zoom-sweep: DOM nodes 77 76 -1% z=-4.1
canvas-zoom-sweep: event listeners 19 19 +0% z=-0.9
dom-widget-clipping: avg frame time 17ms 17ms -0% z=-0.2
dom-widget-clipping: p95 frame time 17ms 17ms +0%
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 8ms 8ms -2% z=-2.3
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 11 11 +0% z=-4.2
dom-widget-clipping: task duration 423ms 383ms -9% z=1.1
dom-widget-clipping: script duration 60ms 57ms -4% z=-3.2
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 51.9 MB 51.8 MB -0%
dom-widget-clipping: DOM nodes 18 18 +0% z=-2.9
dom-widget-clipping: event listeners 1 1 +0% variance too high
large-graph-idle: avg frame time 17ms 17ms +0% z=-0.2
large-graph-idle: p95 frame time 17ms 17ms +0%
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 7ms 7ms +4% z=-4.5
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 8 8 +7% z=-11.5
large-graph-idle: task duration 697ms 608ms -13% z=1.2
large-graph-idle: script duration 20ms 15ms -23% z=-8.3
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 67.2 MB 67.8 MB +1%
large-graph-idle: DOM nodes -282 -283 +1% z=-340.4
large-graph-idle: event listeners -165 -164 -1% z=-31.2
large-graph-pan: avg frame time 17ms 17ms +0% z=0.8
large-graph-pan: p95 frame time 17ms 17ms -0%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 16ms 14ms -11% z=-4.3
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 68 68 +0% z=-2.4
large-graph-pan: task duration 1293ms 1203ms -7% ⚠️ z=2.8
large-graph-pan: script duration 320ms 334ms +4% z=-3.8
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 65.3 MB 58.9 MB -10%
large-graph-pan: DOM nodes -285 -284 -1% z=-183.3
large-graph-pan: event listeners -149 -163 +9% z=-202.8
large-graph-zoom: avg frame time 17ms 17ms -0%
large-graph-zoom: p95 frame time 17ms 17ms +1%
large-graph-zoom: layout duration 9ms 7ms -21%
large-graph-zoom: style recalc duration 17ms 14ms -15%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 65 64 -1%
large-graph-zoom: task duration 1464ms 1416ms -3%
large-graph-zoom: script duration 411ms 389ms -5%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 75.8 MB 58.7 MB -23%
large-graph-zoom: DOM nodes 11 -287 -2705%
large-graph-zoom: event listeners 8 -153 -2013%
minimap-idle: avg frame time 17ms 17ms +0% z=0.1
minimap-idle: p95 frame time 17ms 17ms +0%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 7ms 7ms -5% z=-3.3
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 8 8 +0% z=-3.0
minimap-idle: task duration 717ms 600ms -16% z=1.5
minimap-idle: script duration 19ms 15ms -24% z=-8.4
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 70.9 MB 70.0 MB -1%
minimap-idle: DOM nodes -284 -285 +0% z=-222.0
minimap-idle: event listeners -149 -164 +10% z=-255.3
subgraph-dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
subgraph-dom-widget-clipping: p95 frame time 17ms 17ms -0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms +0%
subgraph-dom-widget-clipping: style recalc duration 11ms 12ms +7% z=-1.0
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 46 47 +2% z=-1.6
subgraph-dom-widget-clipping: task duration 429ms 416ms -3% ⚠️ z=2.1
subgraph-dom-widget-clipping: script duration 127ms 125ms -1% z=-0.5
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 53.1 MB 52.3 MB -2%
subgraph-dom-widget-clipping: DOM nodes 18 20 +11% z=-1.9
subgraph-dom-widget-clipping: event listeners 8 7 -13% z=-1.6
subgraph-idle: avg frame time 17ms 17ms -0% z=-0.7
subgraph-idle: p95 frame time 17ms 17ms -0%
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 9ms 9ms +0% z=-1.5
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 10 10 +5% z=-1.4
subgraph-idle: task duration 544ms 453ms -17% ⚠️ z=2.7
subgraph-idle: script duration 9ms 6ms -29% z=-5.2
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 67.8 MB 67.7 MB -0%
subgraph-idle: DOM nodes 19 20 +5% z=-1.2
subgraph-idle: event listeners 4 4 +0% variance too high
subgraph-mouse-sweep: avg frame time 17ms 17ms -0% z=-0.1
subgraph-mouse-sweep: p95 frame time 17ms 17ms +0%
subgraph-mouse-sweep: layout duration 5ms 4ms -17% z=-1.3
subgraph-mouse-sweep: style recalc duration 43ms 39ms -11% z=-1.2
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 77 78 +2% z=-1.1
subgraph-mouse-sweep: task duration 853ms 778ms -9% z=0.2
subgraph-mouse-sweep: script duration 95ms 86ms -9% z=-2.3
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 58.9 MB 58.9 MB +0%
subgraph-mouse-sweep: DOM nodes 64 67 +6% z=0.0
subgraph-mouse-sweep: event listeners 4 4 +0% variance too high
subgraph-transition-enter: avg frame time 17ms 17ms +0%
subgraph-transition-enter: p95 frame time 17ms 17ms +0%
subgraph-transition-enter: layout duration 11ms 13ms +14%
subgraph-transition-enter: style recalc duration 30ms 31ms +2%
subgraph-transition-enter: layout count 14 14 +0%
subgraph-transition-enter: style recalc count 19 19 +0%
subgraph-transition-enter: task duration 1018ms 946ms -7%
subgraph-transition-enter: script duration 19ms 17ms -11%
subgraph-transition-enter: TBT 125ms 143ms +14%
subgraph-transition-enter: heap used 74.7 MB 75.7 MB +1%
subgraph-transition-enter: DOM nodes 13673 13673 +0%
subgraph-transition-enter: event listeners 2375 2375 +0%
viewport-pan-sweep: avg frame time 17ms 17ms -0%
viewport-pan-sweep: p95 frame time 17ms 17ms +0%
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 45ms 37ms -17%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 249 249 -0%
viewport-pan-sweep: task duration 4523ms 4211ms -7%
viewport-pan-sweep: script duration 1010ms 1025ms +2%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 53.2 MB 61.4 MB +15%
viewport-pan-sweep: DOM nodes -282 -282 +0%
viewport-pan-sweep: event listeners -164 -148 -10%
vue-large-graph-idle: avg frame time 18ms 18ms -0%
vue-large-graph-idle: p95 frame time 17ms 17ms -0%
vue-large-graph-idle: layout duration 0ms 0ms +0%
vue-large-graph-idle: style recalc duration 0ms 0ms +0%
vue-large-graph-idle: layout count 0 0 +0%
vue-large-graph-idle: style recalc count 0 0 +0%
vue-large-graph-idle: task duration 18427ms 16649ms -10%
vue-large-graph-idle: script duration 148ms 114ms -23%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 148.6 MB 162.9 MB +10%
vue-large-graph-idle: DOM nodes -8314 -8314 +0%
vue-large-graph-idle: event listeners -16387 -16388 +0%
vue-large-graph-pan: avg frame time 18ms 18ms -2%
vue-large-graph-pan: p95 frame time 17ms 17ms +0%
vue-large-graph-pan: layout duration 0ms 0ms +0%
vue-large-graph-pan: style recalc duration 24ms 19ms -23%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 182 175 -4%
vue-large-graph-pan: task duration 23155ms 20282ms -12%
vue-large-graph-pan: script duration 431ms 424ms -2%
vue-large-graph-pan: TBT 189ms 99ms -47%
vue-large-graph-pan: heap used 164.7 MB 162.4 MB -1%
vue-large-graph-pan: DOM nodes -8314 -8312 -0%
vue-large-graph-pan: event listeners -16381 -16384 +0%
workflow-execution: avg frame time 17ms 17ms -0% z=0.1
workflow-execution: p95 frame time 17ms 17ms +0%
workflow-execution: layout duration 1ms 1ms +119% z=-2.7
workflow-execution: style recalc duration 20ms 26ms +32% z=0.7
workflow-execution: layout count 3 4 +40% z=-2.7
workflow-execution: style recalc count 12 14 +17% z=-1.9
workflow-execution: task duration 112ms 126ms +12% z=0.3
workflow-execution: script duration 8ms 8ms +6% z=-7.1
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 66.2 MB 66.3 MB +0%
workflow-execution: DOM nodes 124 134 +8% z=-3.8
workflow-execution: event listeners 98 98 +0% z=10.6
Historical variance (last 15 runs)
Metric μ σ CV
canvas-idle: avg frame time 17ms 0ms 0.0%
canvas-idle: layout duration 0ms 0ms 0.0%
canvas-idle: style recalc duration 11ms 1ms 8.2%
canvas-idle: layout count 0 0 0.0%
canvas-idle: style recalc count 11 1 5.0%
canvas-idle: task duration 395ms 31ms 7.9%
canvas-idle: script duration 25ms 2ms 8.8%
canvas-idle: TBT 0ms 0ms 0.0%
canvas-idle: DOM nodes 23 1 5.6%
canvas-idle: event listeners 12 5 40.9%
canvas-mouse-sweep: avg frame time 17ms 0ms 0.0%
canvas-mouse-sweep: layout duration 4ms 0ms 5.4%
canvas-mouse-sweep: style recalc duration 43ms 3ms 7.4%
canvas-mouse-sweep: layout count 12 0 0.0%
canvas-mouse-sweep: style recalc count 79 2 3.0%
canvas-mouse-sweep: task duration 865ms 58ms 6.7%
canvas-mouse-sweep: script duration 136ms 6ms 4.8%
canvas-mouse-sweep: TBT 0ms 0ms 0.0%
canvas-mouse-sweep: DOM nodes 62 3 4.2%
canvas-mouse-sweep: event listeners 8 4 49.4%
canvas-zoom-sweep: avg frame time 17ms 0ms 0.0%
canvas-zoom-sweep: layout duration 1ms 0ms 7.0%
canvas-zoom-sweep: style recalc duration 19ms 2ms 8.0%
canvas-zoom-sweep: layout count 6 0 0.0%
canvas-zoom-sweep: style recalc count 31 0 1.5%
canvas-zoom-sweep: task duration 327ms 23ms 7.1%
canvas-zoom-sweep: script duration 27ms 3ms 11.1%
canvas-zoom-sweep: TBT 0ms 0ms 0.0%
canvas-zoom-sweep: DOM nodes 79 1 1.0%
canvas-zoom-sweep: event listeners 24 5 21.8%
dom-widget-clipping: avg frame time 17ms 0ms 0.0%
dom-widget-clipping: layout duration 0ms 0ms 0.0%
dom-widget-clipping: style recalc duration 10ms 1ms 8.0%
dom-widget-clipping: layout count 0 0 0.0%
dom-widget-clipping: style recalc count 13 0 3.8%
dom-widget-clipping: task duration 365ms 16ms 4.5%
dom-widget-clipping: script duration 68ms 3ms 4.8%
dom-widget-clipping: TBT 0ms 0ms 0.0%
dom-widget-clipping: DOM nodes 22 1 6.4%
dom-widget-clipping: event listeners 8 6 81.2%
large-graph-idle: avg frame time 17ms 0ms 0.0%
large-graph-idle: layout duration 0ms 0ms 0.0%
large-graph-idle: style recalc duration 12ms 1ms 8.6%
large-graph-idle: layout count 0 0 0.0%
large-graph-idle: style recalc count 12 0 2.7%
large-graph-idle: task duration 542ms 54ms 10.0%
large-graph-idle: script duration 102ms 11ms 10.3%
large-graph-idle: TBT 0ms 0ms 0.0%
large-graph-idle: DOM nodes 25 1 3.7%
large-graph-idle: event listeners 26 6 23.2%
large-graph-pan: avg frame time 17ms 0ms 0.0%
large-graph-pan: layout duration 0ms 0ms 0.0%
large-graph-pan: style recalc duration 17ms 1ms 4.6%
large-graph-pan: layout count 0 0 0.0%
large-graph-pan: style recalc count 70 1 0.9%
large-graph-pan: task duration 1082ms 43ms 4.0%
large-graph-pan: script duration 408ms 20ms 4.8%
large-graph-pan: TBT 0ms 0ms 0.0%
large-graph-pan: DOM nodes 19 2 8.7%
large-graph-pan: event listeners 5 1 16.8%
minimap-idle: avg frame time 17ms 0ms 0.0%
minimap-idle: layout duration 0ms 0ms 0.0%
minimap-idle: style recalc duration 10ms 1ms 8.6%
minimap-idle: layout count 0 0 0.0%
minimap-idle: style recalc count 10 1 7.1%
minimap-idle: task duration 527ms 47ms 9.0%
minimap-idle: script duration 98ms 10ms 10.1%
minimap-idle: TBT 0ms 0ms 0.0%
minimap-idle: DOM nodes 19 1 7.1%
minimap-idle: event listeners 5 1 14.4%
subgraph-dom-widget-clipping: avg frame time 17ms 0ms 0.0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms 0.0%
subgraph-dom-widget-clipping: style recalc duration 13ms 1ms 7.4%
subgraph-dom-widget-clipping: layout count 0 0 0.0%
subgraph-dom-widget-clipping: style recalc count 48 1 1.2%
subgraph-dom-widget-clipping: task duration 378ms 18ms 4.9%
subgraph-dom-widget-clipping: script duration 128ms 6ms 4.9%
subgraph-dom-widget-clipping: TBT 0ms 0ms 0.0%
subgraph-dom-widget-clipping: DOM nodes 22 1 5.0%
subgraph-dom-widget-clipping: event listeners 16 6 36.0%
subgraph-idle: avg frame time 17ms 0ms 0.0%
subgraph-idle: layout duration 0ms 0ms 0.0%
subgraph-idle: style recalc duration 10ms 1ms 7.5%
subgraph-idle: layout count 0 0 0.0%
subgraph-idle: style recalc count 11 1 6.0%
subgraph-idle: task duration 370ms 31ms 8.5%
subgraph-idle: script duration 20ms 3ms 13.2%
subgraph-idle: TBT 0ms 0ms 0.0%
subgraph-idle: DOM nodes 22 1 6.9%
subgraph-idle: event listeners 10 7 64.5%
subgraph-mouse-sweep: avg frame time 17ms 0ms 0.0%
subgraph-mouse-sweep: layout duration 5ms 0ms 6.8%
subgraph-mouse-sweep: style recalc duration 42ms 3ms 7.8%
subgraph-mouse-sweep: layout count 16 0 0.0%
subgraph-mouse-sweep: style recalc count 80 2 2.4%
subgraph-mouse-sweep: task duration 766ms 69ms 9.0%
subgraph-mouse-sweep: script duration 101ms 7ms 6.5%
subgraph-mouse-sweep: TBT 0ms 0ms 0.0%
subgraph-mouse-sweep: DOM nodes 67 2 3.3%
subgraph-mouse-sweep: event listeners 8 4 52.6%
workflow-execution: avg frame time 17ms 0ms 0.0%
workflow-execution: layout duration 2ms 0ms 9.4%
workflow-execution: style recalc duration 24ms 2ms 9.1%
workflow-execution: layout count 5 1 11.0%
workflow-execution: style recalc count 18 2 11.5%
workflow-execution: task duration 123ms 11ms 8.8%
workflow-execution: script duration 29ms 3ms 10.2%
workflow-execution: TBT 0ms 0ms 0.0%
workflow-execution: DOM nodes 161 7 4.4%
workflow-execution: event listeners 52 4 8.4%
Trend (last 15 commits on main)
Metric Trend Dir Latest
canvas-idle: avg frame time ▆▃▆▁▆▃▆█▆▆▄▃▃▄▃ ➡️ 17ms
canvas-idle: p95 frame time ➡️ NaNms
canvas-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: style recalc duration ▇▇▆▆▃█▄▃▄▃▇▄▁▆▇ ➡️ 11ms
canvas-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
canvas-idle: style recalc count █▃▅▂▅▆▃▁▂▁▂▅▆▅▆ ➡️ 12
canvas-idle: task duration ▃▃▃▆▂▃▃▅▆▂█▃▁▃▃ ➡️ 391ms
canvas-idle: script duration ▄▃▅▇▂▅▃▆▇▅█▄▁▅▆ ➡️ 27ms
canvas-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: heap used ➡️ NaN MB
canvas-idle: DOM nodes █▇▆▅▃▇▃▁▂▂▅▆▆▆▇ ➡️ 24
canvas-idle: event listeners ▅█▅▄▁▅▁▁▁▄▅▅▁▅▄ 📉 11
canvas-mouse-sweep: avg frame time ▆█▆▃▁▃▁▆▆▁▃▆▆▃▃ ➡️ 17ms
canvas-mouse-sweep: p95 frame time ➡️ NaNms
canvas-mouse-sweep: layout duration ▁▃▂▄▁▂▁▃▆▂█▇▆▄▃ ➡️ 4ms
canvas-mouse-sweep: style recalc duration ▄▄▂▄▁▂▃▃▅▄█▆▂▄▄ ➡️ 43ms
canvas-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 12
canvas-mouse-sweep: style recalc count █▅▄▃▂▂▁▄▄▅▆▅▂▇▄ ➡️ 79
canvas-mouse-sweep: task duration █▆▄▂▂▃▂▄▄▅█▆▁▆▄ ➡️ 868ms
canvas-mouse-sweep: script duration ▄▅▄▆▄▆▆▆▅▅█▆▁▅▆ ➡️ 139ms
canvas-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-mouse-sweep: heap used ➡️ NaN MB
canvas-mouse-sweep: DOM nodes █▅▃▃▁▂▂▃▂▄▆▅▃▅▅ ➡️ 64
canvas-mouse-sweep: event listeners █▁▁▁▁▁▇▁▁▁██▇▁█ 📈 13
canvas-zoom-sweep: avg frame time ▅▅█▄▅▁▁▁▅▁▁▅▄▅▁ ➡️ 17ms
canvas-zoom-sweep: p95 frame time ➡️ NaNms
canvas-zoom-sweep: layout duration ▆▅▅▄▁▁█▅▃▅▇▆▁▂▆ ➡️ 1ms
canvas-zoom-sweep: style recalc duration ▆▅▄▆▅▃█▆▇▅▇▄▁▃▅ ➡️ 20ms
canvas-zoom-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 6
canvas-zoom-sweep: style recalc count ▁▁▃▄▆▃▆█▄▄▆▁▆▁▆ ➡️ 32
canvas-zoom-sweep: task duration ▄▂▁▇▂▂▄▅▆▃█▄▁▁▅ ➡️ 338ms
canvas-zoom-sweep: script duration ▃▃▂▇▂▂▅▇▆▅█▄▁▂▆ ➡️ 30ms
canvas-zoom-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-zoom-sweep: heap used ➡️ NaN MB
canvas-zoom-sweep: DOM nodes ▄▃▁▅█▁▃▆▄▅▅▃▃▄▃ ➡️ 79
canvas-zoom-sweep: event listeners ▁▁▂▅█▂▁▅▁▅▅▄▁▅▁ ➡️ 19
dom-widget-clipping: avg frame time ▂▄▅▅▂▄█▇▅▇▇▅▅▁▇ ➡️ 17ms
dom-widget-clipping: p95 frame time ➡️ NaNms
dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: style recalc duration ▆▆▂▆▄▃██▄▁▆▇▆▃▅ ➡️ 10ms
dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
dom-widget-clipping: style recalc count ▇█▅█▅▄█▇▇▁▇▄▇▂▅ ➡️ 13
dom-widget-clipping: task duration ▃▃▁▅▄▃▅▆▅▂▇█▁▅▅ ➡️ 371ms
dom-widget-clipping: script duration ▅▄▄▆▆▅▇▇▆▃█▇▁▇▇ ➡️ 71ms
dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: heap used ➡️ NaN MB
dom-widget-clipping: DOM nodes ▇▇▄▇▅▄█▇▅▁▅▄▇▃▄ ➡️ 21
dom-widget-clipping: event listeners ▅▅▅▅▁▅██▁▁▁▁█▁▁ 📉 2
large-graph-idle: avg frame time ▅▅▅▅▅▂▁▂▄▅▄▂▂▅█ ➡️ 17ms
large-graph-idle: p95 frame time ➡️ NaNms
large-graph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: style recalc duration ▅▅▅▆▄▅▃▄▅▅▆█▁▄▆ ➡️ 13ms
large-graph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-idle: style recalc count █▆█▃▃▁▃▆▃▆▆▃▆██ ➡️ 12
large-graph-idle: task duration ▂▃▂▆▂▃▃▇▅▃██▁▂▅ ➡️ 569ms
large-graph-idle: script duration ▄▅▄▆▄▅▅▇▆▅█▆▁▃▆ ➡️ 110ms
large-graph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: heap used ➡️ NaN MB
large-graph-idle: DOM nodes ▆█▅▂▅▃▁▂▃▅▅▆▂▆▅ ➡️ 25
large-graph-idle: event listeners ███▇██▄▁▄▇▇█▂█▇ ➡️ 29
large-graph-pan: avg frame time ▆▃▃▆█▃▁█▆▆▆▆█▁▆ ➡️ 17ms
large-graph-pan: p95 frame time ➡️ NaNms
large-graph-pan: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: style recalc duration ▃▂▄▄▁▅▂▂▁▄▄█▃▁▂ ➡️ 17ms
large-graph-pan: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-pan: style recalc count ▆▃█▂▃▂▂▂▁▇▅▃█▆▃ ➡️ 69
large-graph-pan: task duration ▄▃▄▆▄▄▄▆▄▄█▆▁▂▅ ➡️ 1100ms
large-graph-pan: script duration ▅▄▅▆▆▅▄▆▄▅█▄▁▄▅ ➡️ 413ms
large-graph-pan: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: heap used ➡️ NaN MB
large-graph-pan: DOM nodes ▅▃▆▂▄▁▃▁▁▅▁▂█▅▂ ➡️ 18
large-graph-pan: event listeners █▆█▁▁▆▁▁▃▆▁▃██▃ ➡️ 5
minimap-idle: avg frame time ▃▆▆▃█▁█▆▆▃▃▆█▆█ ➡️ 17ms
minimap-idle: p95 frame time ➡️ NaNms
minimap-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: style recalc duration ▄█▁█▅▅█▅▅▃▅▁▁▄▆ ➡️ 10ms
minimap-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
minimap-idle: style recalc count ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 9
minimap-idle: task duration ▃▄▁▅▁▃▄▅▇▃█▅▁▁▅ ➡️ 547ms
minimap-idle: script duration ▄▆▃▇▃▅▆▆▇▅█▅▁▃▆ ➡️ 106ms
minimap-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: heap used ➡️ NaN MB
minimap-idle: DOM nodes ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 19
minimap-idle: event listeners ▃▃▆▁▁▁▃▁▁▆▁▃█▆▁ ➡️ 4
subgraph-dom-widget-clipping: avg frame time ▅▄▄▄▄▄█▄▄▄▃▁▆▃▃ ➡️ 17ms
subgraph-dom-widget-clipping: p95 frame time ➡️ NaNms
subgraph-dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: style recalc duration ▂▄▃▅▅▃▂▅▇▃▄█▁▄▆ ➡️ 14ms
subgraph-dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-dom-widget-clipping: style recalc count ▇█▆▃▆▃▁▆█▇▃▆▇█▅ ➡️ 48
subgraph-dom-widget-clipping: task duration ▂▃▃▆▅▅▂▅█▂▆█▁▂▇ ➡️ 398ms
subgraph-dom-widget-clipping: script duration ▃▃▃▄▅▅▂▄█▂▅▇▁▂▅ ➡️ 131ms
subgraph-dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: heap used ➡️ NaN MB
subgraph-dom-widget-clipping: DOM nodes ▅▇▅▂▅▂▁▅▅▅▁▇▅█▄ ➡️ 22
subgraph-dom-widget-clipping: event listeners ▅▅▅▂▅▁▅██▁▁█▅█▅ 📈 16
subgraph-idle: avg frame time ▆▆█▁▆▃▆▆▆▃▆▁▃▆█ ➡️ 17ms
subgraph-idle: p95 frame time ➡️ NaNms
subgraph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: style recalc duration ▁▇▃▆▂▄▂▃▃▆▆▄▃▇█ ➡️ 12ms
subgraph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-idle: style recalc count ▃▆▃▃▂▅▁▂▁▆▃▃██▇ ➡️ 12
subgraph-idle: task duration ▁▃▁▇▁▁▃▆▅▂█▅▁▁▄ ➡️ 378ms
subgraph-idle: script duration ▁▃▂▇▁▂▃▇▆▂█▅▂▁▅ ➡️ 22ms
subgraph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: heap used ➡️ NaN MB
subgraph-idle: DOM nodes ▃▅▃▂▁▄▁▂▁▅▃▂▇█▇ ➡️ 24
subgraph-idle: event listeners ▁▅▁▁▁▁▁▁▁▅▄▁███ 📈 21
subgraph-mouse-sweep: avg frame time ▅▄▁▃▃▄▆▄▆▃▃█▁▃▃ ➡️ 17ms
subgraph-mouse-sweep: p95 frame time ➡️ NaNms
subgraph-mouse-sweep: layout duration ▁▄▄▄▃▃▅▅▅▂█▇▂▃▆ ➡️ 5ms
subgraph-mouse-sweep: style recalc duration ▃▂▄▅▂▃▄▅█▃█▆▁▂▅ ➡️ 43ms
subgraph-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 16
subgraph-mouse-sweep: style recalc count ▅▂▅▅▁▄▃▅█▅▆▄▂▄▅ ➡️ 81
subgraph-mouse-sweep: task duration ▃▂▄▅▂▄▄▅▇▄█▆▁▃▅ ➡️ 785ms
subgraph-mouse-sweep: script duration ▄▅▄▇▅▅▆▇▆▅██▁▄▆ ➡️ 105ms
subgraph-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-mouse-sweep: heap used ➡️ NaN MB
subgraph-mouse-sweep: DOM nodes ▅▁▄▅▁▄▃▃█▅▅▄▂▅▃ ➡️ 66
subgraph-mouse-sweep: event listeners ▇▁▂▇▁▂▂▂█▇▂▂▇▇▂ 📈 5
workflow-execution: avg frame time ▆▆▆▄▆▆▃▄▁▄█▆▅▄▆ ➡️ 17ms
workflow-execution: p95 frame time ➡️ NaNms
workflow-execution: layout duration ▁▆▁▃▂▄▃▂▃▃▅█▄▂▅ ➡️ 2ms
workflow-execution: style recalc duration ▃▇▅▇▁▅▆▇█▁██▂▄▆ ➡️ 25ms
workflow-execution: layout count ▁█▂▃▂▃▃▁▃▃▄▃▂▃▂ ➡️ 5
workflow-execution: style recalc count ▃█▅▇▁▄▅▆▅▅▅▅▄▄▂ ➡️ 15
workflow-execution: task duration ▂▅▄▅▁▄▆▆▆▁▇█▁▃▃ ➡️ 120ms
workflow-execution: script duration ▄▃▄▄▃▅▄▅▆▂▇█▁▃▄ ➡️ 29ms
workflow-execution: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
workflow-execution: heap used ➡️ NaN MB
workflow-execution: DOM nodes ▂█▃▆▁▄▃▅▃█▃▃▄▃▁ ➡️ 152
workflow-execution: event listeners ▅███▁▅███▁██▅█▅ ➡️ 49
Raw data
{
  "timestamp": "2026-08-20T06:32:40.380Z",
  "gitSha": "e6684dd7e196eb79fa2d9e090a21c1849749504f",
  "branch": "backport-15066-to-core-1.51",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2031.9700000000012,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.640000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 453.931,
      "heapDeltaBytes": 5177200,
      "heapUsedBytes": 70599264,
      "domNodes": 18,
      "jsHeapTotalBytes": 24379392,
      "scriptDurationMs": 6.711000000000002,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-idle",
      "durationMs": 2046.779000000015,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.812000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 448.62,
      "heapDeltaBytes": 5085828,
      "heapUsedBytes": 70497396,
      "domNodes": 18,
      "jsHeapTotalBytes": 24903680,
      "scriptDurationMs": 6.796,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2080.155999999988,
      "styleRecalcs": 80,
      "styleRecalcDurationMs": 53.019999999999996,
      "layouts": 12,
      "layoutDurationMs": 3.766,
      "taskDurationMs": 1068.293,
      "heapDeltaBytes": -18626364,
      "heapUsedBytes": 46700316,
      "domNodes": 63,
      "jsHeapTotalBytes": 23957504,
      "scriptDurationMs": 127.09199999999998,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1809.1759999999795,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 35.829,
      "layouts": 12,
      "layoutDurationMs": 3.202,
      "taskDurationMs": 867.5310000000001,
      "heapDeltaBytes": -19300612,
      "heapUsedBytes": 46232104,
      "domNodes": 5,
      "jsHeapTotalBytes": 22908928,
      "scriptDurationMs": 112.371,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1727.3050000000012,
      "styleRecalcs": 30,
      "styleRecalcDurationMs": 18.328000000000003,
      "layouts": 6,
      "layoutDurationMs": 0.7679999999999998,
      "taskDurationMs": 389.334,
      "heapDeltaBytes": 7691160,
      "heapUsedBytes": 73079736,
      "domNodes": 75,
      "jsHeapTotalBytes": 24641536,
      "scriptDurationMs": 11.345,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1737.594999999942,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 18.820999999999998,
      "layouts": 6,
      "layoutDurationMs": 0.7260000000000001,
      "taskDurationMs": 386.235,
      "heapDeltaBytes": 7811752,
      "heapUsedBytes": 73086308,
      "domNodes": 77,
      "jsHeapTotalBytes": 24379392,
      "scriptDurationMs": 10.618999999999998,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 563.2339999999658,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.235000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 374.39199999999994,
      "heapDeltaBytes": -10815500,
      "heapUsedBytes": 55067616,
      "domNodes": 18,
      "jsHeapTotalBytes": 24117248,
      "scriptDurationMs": 56.079,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 588.9400000000933,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 7.856,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 391.752,
      "heapDeltaBytes": -11850708,
      "heapUsedBytes": 53579392,
      "domNodes": 18,
      "jsHeapTotalBytes": 24903680,
      "scriptDurationMs": 58.616,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2008.8230000000067,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.294000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 597.389,
      "heapDeltaBytes": 9420000,
      "heapUsedBytes": 69787064,
      "domNodes": -283,
      "jsHeapTotalBytes": 2981888,
      "scriptDurationMs": 15.719999999999997,
      "eventListeners": -179,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2051.7489999999725,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.668999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 618.2940000000001,
      "heapDeltaBytes": 12684688,
      "heapUsedBytes": 72453396,
      "domNodes": -283,
      "jsHeapTotalBytes": 3506176,
      "scriptDurationMs": 14.936000000000005,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2143.9260000000218,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 13.561,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1200.244,
      "heapDeltaBytes": 7927208,
      "heapUsedBytes": 68703764,
      "domNodes": -284,
      "jsHeapTotalBytes": 3698688,
      "scriptDurationMs": 336.80100000000004,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2140.6880000000683,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 14.234,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1206.329,
      "heapDeltaBytes": -6724344,
      "heapUsedBytes": 54818336,
      "domNodes": -283,
      "jsHeapTotalBytes": 4292608,
      "scriptDurationMs": 330.23199999999997,
      "eventListeners": -179,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3281.8829999999934,
      "styleRecalcs": 64,
      "styleRecalcDurationMs": 14.672,
      "layouts": 60,
      "layoutDurationMs": 7.362,
      "taskDurationMs": 1432.824,
      "heapDeltaBytes": -1243572,
      "heapUsedBytes": 61565140,
      "domNodes": -286,
      "jsHeapTotalBytes": 3506176,
      "scriptDurationMs": 399.026,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3232.2849999999335,
      "styleRecalcs": 64,
      "styleRecalcDurationMs": 14.161,
      "layouts": 60,
      "layoutDurationMs": 7.142999999999999,
      "taskDurationMs": 1399.752,
      "heapDeltaBytes": -1256024,
      "heapUsedBytes": 61488952,
      "domNodes": -287,
      "jsHeapTotalBytes": 2981888,
      "scriptDurationMs": 379.28999999999996,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 2013.7420000000361,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.317999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 588.707,
      "heapDeltaBytes": 12378860,
      "heapUsedBytes": 72952632,
      "domNodes": -283,
      "jsHeapTotalBytes": 3506176,
      "scriptDurationMs": 13.415999999999997,
      "eventListeners": -179,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2006.4760000000206,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 6.454999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 611.642,
      "heapDeltaBytes": 12298408,
      "heapUsedBytes": 73800964,
      "domNodes": -286,
      "jsHeapTotalBytes": 3244032,
      "scriptDurationMs": 15.869999999999996,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 608.2770000000437,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 11.78,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 407.59499999999997,
      "heapDeltaBytes": -11333420,
      "heapUsedBytes": 54052656,
      "domNodes": 20,
      "jsHeapTotalBytes": 26214400,
      "scriptDurationMs": 121.74499999999999,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 622.1590000000106,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 11.76,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 424.59000000000003,
      "heapDeltaBytes": -10184140,
      "heapUsedBytes": 55582800,
      "domNodes": 20,
      "jsHeapTotalBytes": 24117248,
      "scriptDurationMs": 128.737,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1996.5700000000197,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.57,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 433.77199999999993,
      "heapDeltaBytes": 5389648,
      "heapUsedBytes": 70727536,
      "domNodes": 18,
      "jsHeapTotalBytes": 24117248,
      "scriptDurationMs": 6.303,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2020.9220000000414,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 10.854,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 473.084,
      "heapDeltaBytes": 5370948,
      "heapUsedBytes": 71229280,
      "domNodes": 22,
      "jsHeapTotalBytes": 23592960,
      "scriptDurationMs": 6.694999999999999,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1698.0649999999855,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 35.439,
      "layouts": 16,
      "layoutDurationMs": 3.9960000000000004,
      "taskDurationMs": 743.7479999999999,
      "heapDeltaBytes": -3617876,
      "heapUsedBytes": 61833804,
      "domNodes": 66,
      "jsHeapTotalBytes": 24117248,
      "scriptDurationMs": 83.01400000000001,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1722.5650000000314,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 41.769,
      "layouts": 16,
      "layoutDurationMs": 4.592,
      "taskDurationMs": 812.366,
      "heapDeltaBytes": -3612568,
      "heapUsedBytes": 61776768,
      "domNodes": 68,
      "jsHeapTotalBytes": 24379392,
      "scriptDurationMs": 89.152,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1400.1430000000141,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 30.942999999999998,
      "layouts": 14,
      "layoutDurationMs": 12.803000000000003,
      "taskDurationMs": 945.8629999999999,
      "heapDeltaBytes": -5976808,
      "heapUsedBytes": 79361504,
      "domNodes": 13673,
      "jsHeapTotalBytes": 10223616,
      "scriptDurationMs": 16.725999999999992,
      "eventListeners": 2375,
      "totalBlockingTimeMs": 143,
      "frameDurationMs": 16.666666666666696,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8355.33399999997,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 38.462,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4239.506,
      "heapDeltaBytes": 13230684,
      "heapUsedBytes": 73282876,
      "domNodes": -282,
      "jsHeapTotalBytes": 3960832,
      "scriptDurationMs": 1034.2420000000002,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8318.143000000076,
      "styleRecalcs": 248,
      "styleRecalcDurationMs": 35.416000000000004,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4182.726,
      "heapDeltaBytes": -4664100,
      "heapUsedBytes": 55575980,
      "domNodes": -282,
      "jsHeapTotalBytes": 4292608,
      "scriptDurationMs": 1016.1520000000002,
      "eventListeners": -163,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.80000000000109
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 17274.103000000025,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16629.340999999997,
      "heapDeltaBytes": -39823132,
      "heapUsedBytes": 171059376,
      "domNodes": -8316,
      "jsHeapTotalBytes": -13012992,
      "scriptDurationMs": 119.687,
      "eventListeners": -16389,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 17468.75,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16668.99,
      "heapDeltaBytes": -39775964,
      "heapUsedBytes": 170611356,
      "domNodes": -8312,
      "jsHeapTotalBytes": -11997184,
      "scriptDurationMs": 109.24,
      "eventListeners": -16387,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 20421.45499999998,
      "styleRecalcs": 172,
      "styleRecalcDurationMs": 17.52300000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 19954.943999999996,
      "heapDeltaBytes": -32775332,
      "heapUsedBytes": 164432284,
      "domNodes": -8312,
      "jsHeapTotalBytes": -13570048,
      "scriptDurationMs": 422.285,
      "eventListeners": -16383,
      "totalBlockingTimeMs": 51,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 21133.445999999934,
      "styleRecalcs": 177,
      "styleRecalcDurationMs": 20.136000000000042,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 20608.474,
      "heapDeltaBytes": -19927456,
      "heapUsedBytes": 176205144,
      "domNodes": -8312,
      "jsHeapTotalBytes": -13639680,
      "scriptDurationMs": 425.68800000000005,
      "eventListeners": -16385,
      "totalBlockingTimeMs": 147,
      "frameDurationMs": 17.779999999999927,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 475.47000000008666,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 25.68,
      "layouts": 4,
      "layoutDurationMs": 1.605,
      "taskDurationMs": 123.70700000000001,
      "heapDeltaBytes": 5133084,
      "heapUsedBytes": 69617336,
      "domNodes": 148,
      "jsHeapTotalBytes": 5505024,
      "scriptDurationMs": 8.841,
      "eventListeners": 99,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 482.4019999999791,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 26.008000000000003,
      "layouts": 3,
      "layoutDurationMs": 0.7010000000000001,
      "taskDurationMs": 127.91199999999999,
      "heapDeltaBytes": 4926468,
      "heapUsedBytes": 69460064,
      "domNodes": 119,
      "jsHeapTotalBytes": 4718592,
      "scriptDurationMs": 7.276,
      "eventListeners": 97,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    }
  ]
}

@github-actions github-actions Bot added the risk:R2 PR risk grade (advisory shadow check; grader-owned) label Aug 20, 2026
@github-actions
github-actions Bot requested a review from AustinMroz August 20, 2026 06:21
@codecov

codecov Bot commented Aug 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@            Coverage Diff             @@
##           core/1.51   #15478   +/-   ##
==========================================
  Coverage      81.48%   81.48%           
==========================================
  Files           1883     1883           
  Lines         117534   117536    +2     
  Branches       36717    36718    +1     
==========================================
+ Hits           95769    95771    +2     
  Misses         21289    21289           
  Partials         476      476           
Flag Coverage Δ
unit 72.91% <100.00%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/platform/keybindings/keybindingService.ts 90.54% <100.00%> (+0.26%) ⬆️
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@comfy-pr-bot
comfy-pr-bot merged commit 4e19471 into core/1.51 Aug 20, 2026
87 of 89 checks passed
@comfy-pr-bot
comfy-pr-bot deleted the backport-15066-to-core-1.51 branch August 20, 2026 06:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport Backporting a PR onto a release candidate risk:R2 PR risk grade (advisory shadow check; grader-owned) size:XS This PR changes 0-9 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants