Skip to content

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

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

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

Conversation

@comfy-pr-bot

Copy link
Copy Markdown
Member

Backport of #15066 to cloud/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

🎭 Playwright: ✅ 1824 passed, 0 failed · 2 flaky

📊 Browser Reports
  • chromium: View Report (✅ 1803 / ❌ 0 / ⚠️ 2 / ⏭️ 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)

🎨 Storybook: ✅ Built — View Storybook

Details

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

Links

📦 Bundle Size

⏳ Size data collection in progress…

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.1 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.6 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 70.0 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 · 69.7 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 65.5 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 55.9 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.1 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 51.6 MB heap
subgraph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.5 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 59.0 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 143ms TBT · 76.2 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.1 MB heap
vue-large-graph-idle: · 57.1 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 160.5 MB heap
vue-large-graph-pan: · 56.3 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 40ms TBT · 165.3 MB heap
workflow-execution: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 66.3 MB heap

ℹ️ No baseline found — significance unavailable.

Absolute values
Metric Value
canvas-idle: avg frame time 17ms
canvas-idle: p95 frame time 17ms
canvas-idle: layout duration 0ms
canvas-idle: style recalc duration 9ms
canvas-idle: layout count 0
canvas-idle: style recalc count 9
canvas-idle: task duration 482ms
canvas-idle: script duration 7ms
canvas-idle: TBT 0ms
canvas-idle: heap used 67.1 MB
canvas-idle: DOM nodes 18
canvas-idle: event listeners 5
canvas-mouse-sweep: avg frame time 17ms
canvas-mouse-sweep: p95 frame time 17ms
canvas-mouse-sweep: layout duration 4ms
canvas-mouse-sweep: style recalc duration 37ms
canvas-mouse-sweep: layout count 12
canvas-mouse-sweep: style recalc count 77
canvas-mouse-sweep: task duration 838ms
canvas-mouse-sweep: script duration 113ms
canvas-mouse-sweep: TBT 0ms
canvas-mouse-sweep: heap used 53.6 MB
canvas-mouse-sweep: DOM nodes -112
canvas-mouse-sweep: event listeners -75
canvas-zoom-sweep: avg frame time 17ms
canvas-zoom-sweep: p95 frame time 17ms
canvas-zoom-sweep: layout duration 1ms
canvas-zoom-sweep: style recalc duration 16ms
canvas-zoom-sweep: layout count 6
canvas-zoom-sweep: style recalc count 31
canvas-zoom-sweep: task duration 353ms
canvas-zoom-sweep: script duration 9ms
canvas-zoom-sweep: TBT 0ms
canvas-zoom-sweep: heap used 70.0 MB
canvas-zoom-sweep: DOM nodes 77
canvas-zoom-sweep: event listeners 19
dom-widget-clipping: avg frame time 17ms
dom-widget-clipping: p95 frame time 17ms
dom-widget-clipping: layout duration 0ms
dom-widget-clipping: style recalc duration 9ms
dom-widget-clipping: layout count 0
dom-widget-clipping: style recalc count 11
dom-widget-clipping: task duration 377ms
dom-widget-clipping: script duration 57ms
dom-widget-clipping: TBT 0ms
dom-widget-clipping: heap used 51.8 MB
dom-widget-clipping: DOM nodes 18
dom-widget-clipping: event listeners 1
large-graph-idle: avg frame time 17ms
large-graph-idle: p95 frame time 17ms
large-graph-idle: layout duration 0ms
large-graph-idle: style recalc duration 8ms
large-graph-idle: layout count 0
large-graph-idle: style recalc count 8
large-graph-idle: task duration 608ms
large-graph-idle: script duration 15ms
large-graph-idle: TBT 0ms
large-graph-idle: heap used 69.7 MB
large-graph-idle: DOM nodes -281
large-graph-idle: event listeners -149
large-graph-pan: avg frame time 17ms
large-graph-pan: p95 frame time 17ms
large-graph-pan: layout duration 0ms
large-graph-pan: style recalc duration 15ms
large-graph-pan: layout count 0
large-graph-pan: style recalc count 69
large-graph-pan: task duration 1206ms
large-graph-pan: script duration 333ms
large-graph-pan: TBT 0ms
large-graph-pan: heap used 65.5 MB
large-graph-pan: DOM nodes -285
large-graph-pan: event listeners -148
large-graph-zoom: avg frame time 17ms
large-graph-zoom: p95 frame time 17ms
large-graph-zoom: layout duration 7ms
large-graph-zoom: style recalc duration 15ms
large-graph-zoom: layout count 60
large-graph-zoom: style recalc count 65
large-graph-zoom: task duration 1410ms
large-graph-zoom: script duration 387ms
large-graph-zoom: TBT 0ms
large-graph-zoom: heap used 55.9 MB
large-graph-zoom: DOM nodes -287
large-graph-zoom: event listeners -168
minimap-idle: avg frame time 17ms
minimap-idle: p95 frame time 17ms
minimap-idle: layout duration 0ms
minimap-idle: style recalc duration 7ms
minimap-idle: layout count 0
minimap-idle: style recalc count 8
minimap-idle: task duration 589ms
minimap-idle: script duration 14ms
minimap-idle: TBT 0ms
minimap-idle: heap used 71.1 MB
minimap-idle: DOM nodes -283
minimap-idle: event listeners -149
subgraph-dom-widget-clipping: avg frame time 17ms
subgraph-dom-widget-clipping: p95 frame time 17ms
subgraph-dom-widget-clipping: layout duration 0ms
subgraph-dom-widget-clipping: style recalc duration 10ms
subgraph-dom-widget-clipping: layout count 0
subgraph-dom-widget-clipping: style recalc count 47
subgraph-dom-widget-clipping: task duration 396ms
subgraph-dom-widget-clipping: script duration 117ms
subgraph-dom-widget-clipping: TBT 0ms
subgraph-dom-widget-clipping: heap used 51.6 MB
subgraph-dom-widget-clipping: DOM nodes 19
subgraph-dom-widget-clipping: event listeners 7
subgraph-idle: avg frame time 17ms
subgraph-idle: p95 frame time 17ms
subgraph-idle: layout duration 0ms
subgraph-idle: style recalc duration 9ms
subgraph-idle: layout count 0
subgraph-idle: style recalc count 10
subgraph-idle: task duration 442ms
subgraph-idle: script duration 6ms
subgraph-idle: TBT 0ms
subgraph-idle: heap used 67.5 MB
subgraph-idle: DOM nodes 20
subgraph-idle: event listeners 4
subgraph-mouse-sweep: avg frame time 17ms
subgraph-mouse-sweep: p95 frame time 17ms
subgraph-mouse-sweep: layout duration 5ms
subgraph-mouse-sweep: style recalc duration 37ms
subgraph-mouse-sweep: layout count 16
subgraph-mouse-sweep: style recalc count 76
subgraph-mouse-sweep: task duration 780ms
subgraph-mouse-sweep: script duration 88ms
subgraph-mouse-sweep: TBT 0ms
subgraph-mouse-sweep: heap used 59.0 MB
subgraph-mouse-sweep: DOM nodes 61
subgraph-mouse-sweep: event listeners 4
subgraph-transition-enter: avg frame time 17ms
subgraph-transition-enter: p95 frame time 17ms
subgraph-transition-enter: layout duration 13ms
subgraph-transition-enter: style recalc duration 31ms
subgraph-transition-enter: layout count 14
subgraph-transition-enter: style recalc count 19
subgraph-transition-enter: task duration 990ms
subgraph-transition-enter: script duration 20ms
subgraph-transition-enter: TBT 143ms
subgraph-transition-enter: heap used 76.2 MB
subgraph-transition-enter: DOM nodes 13673
subgraph-transition-enter: event listeners 2375
viewport-pan-sweep: avg frame time 17ms
viewport-pan-sweep: p95 frame time 17ms
viewport-pan-sweep: layout duration 0ms
viewport-pan-sweep: style recalc duration 38ms
viewport-pan-sweep: layout count 0
viewport-pan-sweep: style recalc count 250
viewport-pan-sweep: task duration 4188ms
viewport-pan-sweep: script duration 1026ms
viewport-pan-sweep: TBT 0ms
viewport-pan-sweep: heap used 69.1 MB
viewport-pan-sweep: DOM nodes -282
viewport-pan-sweep: event listeners -133
vue-large-graph-idle: avg frame time 17ms
vue-large-graph-idle: p95 frame time 17ms
vue-large-graph-idle: layout duration 0ms
vue-large-graph-idle: style recalc duration 0ms
vue-large-graph-idle: layout count 0
vue-large-graph-idle: style recalc count 0
vue-large-graph-idle: task duration 16206ms
vue-large-graph-idle: script duration 111ms
vue-large-graph-idle: TBT 0ms
vue-large-graph-idle: heap used 160.5 MB
vue-large-graph-idle: DOM nodes -8312
vue-large-graph-idle: event listeners -16388
vue-large-graph-pan: avg frame time 18ms
vue-large-graph-pan: p95 frame time 17ms
vue-large-graph-pan: layout duration 0ms
vue-large-graph-pan: style recalc duration 17ms
vue-large-graph-pan: layout count 0
vue-large-graph-pan: style recalc count 169
vue-large-graph-pan: task duration 20045ms
vue-large-graph-pan: script duration 418ms
vue-large-graph-pan: TBT 40ms
vue-large-graph-pan: heap used 165.3 MB
vue-large-graph-pan: DOM nodes -8312
vue-large-graph-pan: event listeners -16383
workflow-execution: avg frame time 17ms
workflow-execution: p95 frame time 17ms
workflow-execution: layout duration 1ms
workflow-execution: style recalc duration 20ms
workflow-execution: layout count 4
workflow-execution: style recalc count 14
workflow-execution: task duration 123ms
workflow-execution: script duration 7ms
workflow-execution: TBT 0ms
workflow-execution: heap used 66.3 MB
workflow-execution: DOM nodes 135
workflow-execution: event listeners 98
Raw data
{
  "timestamp": "2026-08-20T06:32:17.600Z",
  "gitSha": "01f7ab3cc5c2b6c6d992a2684acdc5b6ba2e9e6e",
  "branch": "backport-15066-to-cloud-1.51",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2046.3349999999991,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 6.638999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 490.329,
      "heapDeltaBytes": 4980856,
      "heapUsedBytes": 70278168,
      "domNodes": 14,
      "jsHeapTotalBytes": 24117248,
      "scriptDurationMs": 6.763999999999999,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-idle",
      "durationMs": 2021.4859999999817,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 11.139999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 473.799,
      "heapDeltaBytes": 5066232,
      "heapUsedBytes": 70438772,
      "domNodes": 22,
      "jsHeapTotalBytes": 24641536,
      "scriptDurationMs": 7.213000000000001,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1841.7720000000202,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 38.613,
      "layouts": 12,
      "layoutDurationMs": 3.575999999999999,
      "taskDurationMs": 884.0400000000001,
      "heapDeltaBytes": -18085692,
      "heapUsedBytes": 47233192,
      "domNodes": -281,
      "jsHeapTotalBytes": 23171072,
      "scriptDurationMs": 116.998,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1790.106000000037,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 36.163000000000004,
      "layouts": 12,
      "layoutDurationMs": 3.507,
      "taskDurationMs": 792.2099999999999,
      "heapDeltaBytes": -92752,
      "heapUsedBytes": 65229872,
      "domNodes": 58,
      "jsHeapTotalBytes": 24907776,
      "scriptDurationMs": 108.641,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1735.9519999999975,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 17.227,
      "layouts": 6,
      "layoutDurationMs": 0.7040000000000002,
      "taskDurationMs": 361.44300000000004,
      "heapDeltaBytes": 8357180,
      "heapUsedBytes": 73552196,
      "domNodes": 78,
      "jsHeapTotalBytes": 23855104,
      "scriptDurationMs": 9.283999999999999,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1734.5390000000407,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 15.722,
      "layouts": 6,
      "layoutDurationMs": 0.629,
      "taskDurationMs": 343.974,
      "heapDeltaBytes": 7888204,
      "heapUsedBytes": 73223348,
      "domNodes": 76,
      "jsHeapTotalBytes": 24117248,
      "scriptDurationMs": 8.550999999999998,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 605.5200000000127,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 7.822000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 395.678,
      "heapDeltaBytes": -11789956,
      "heapUsedBytes": 53614540,
      "domNodes": 18,
      "jsHeapTotalBytes": 25165824,
      "scriptDurationMs": 57.221,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 575.1589999999851,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.518,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 358.615,
      "heapDeltaBytes": -10795348,
      "heapUsedBytes": 54991840,
      "domNodes": 18,
      "jsHeapTotalBytes": 24117248,
      "scriptDurationMs": 56.128,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2039.9580000000128,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.308999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 613.671,
      "heapDeltaBytes": 12904936,
      "heapUsedBytes": 73194732,
      "domNodes": -281,
      "jsHeapTotalBytes": 3506176,
      "scriptDurationMs": 16.141999999999996,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2009.0710000000627,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 8.345000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 601.602,
      "heapDeltaBytes": 12600760,
      "heapUsedBytes": 72872096,
      "domNodes": -281,
      "jsHeapTotalBytes": 3506176,
      "scriptDurationMs": 14.181999999999997,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2222.623999999996,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 13.989999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1233.835,
      "heapDeltaBytes": 4915172,
      "heapUsedBytes": 66287032,
      "domNodes": -285,
      "jsHeapTotalBytes": 4222976,
      "scriptDurationMs": 333.631,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2161.8330000000014,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 15.757,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1178.626,
      "heapDeltaBytes": 10569544,
      "heapUsedBytes": 71154572,
      "domNodes": -284,
      "jsHeapTotalBytes": 3698688,
      "scriptDurationMs": 333.185,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3265.0150000000053,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 15.363000000000001,
      "layouts": 60,
      "layoutDurationMs": 7.528,
      "taskDurationMs": 1437.842,
      "heapDeltaBytes": -764904,
      "heapUsedBytes": 61559052,
      "domNodes": -287,
      "jsHeapTotalBytes": 3506176,
      "scriptDurationMs": 391.843,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3146.6669999999795,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 14.582999999999995,
      "layouts": 60,
      "layoutDurationMs": 7.383000000000001,
      "taskDurationMs": 1382.587,
      "heapDeltaBytes": -6232396,
      "heapUsedBytes": 55759828,
      "domNodes": -287,
      "jsHeapTotalBytes": 4030464,
      "scriptDurationMs": 383.15,
      "eventListeners": -183,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2046.0009999999897,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 6.015,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 594.133,
      "heapDeltaBytes": 13196384,
      "heapUsedBytes": 74135500,
      "domNodes": -282,
      "jsHeapTotalBytes": 2719744,
      "scriptDurationMs": 14.282000000000004,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 2046.7630000000554,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.564000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 582.899,
      "heapDeltaBytes": 13573640,
      "heapUsedBytes": 74922832,
      "domNodes": -284,
      "jsHeapTotalBytes": 4030464,
      "scriptDurationMs": 12.951000000000004,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 592.7369999999996,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 9.998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 400.926,
      "heapDeltaBytes": -11416364,
      "heapUsedBytes": 54134148,
      "domNodes": 18,
      "jsHeapTotalBytes": 26214400,
      "scriptDurationMs": 118.037,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 589.7219999999379,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 10.475999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 390.35400000000004,
      "heapDeltaBytes": -11397024,
      "heapUsedBytes": 53995288,
      "domNodes": 20,
      "jsHeapTotalBytes": 27000832,
      "scriptDurationMs": 116.13399999999999,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1993.6830000000327,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.666000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 453.487,
      "heapDeltaBytes": 5066248,
      "heapUsedBytes": 70581716,
      "domNodes": 20,
      "jsHeapTotalBytes": 24641536,
      "scriptDurationMs": 6.747000000000002,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1995.600999999965,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.669,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 430.93800000000005,
      "heapDeltaBytes": 5478188,
      "heapUsedBytes": 70928780,
      "domNodes": 20,
      "jsHeapTotalBytes": 24117248,
      "scriptDurationMs": 5.582999999999999,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1717.4630000000093,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 36.953,
      "layouts": 16,
      "layoutDurationMs": 4.8999999999999995,
      "taskDurationMs": 793.674,
      "heapDeltaBytes": -3632332,
      "heapUsedBytes": 61840712,
      "domNodes": 60,
      "jsHeapTotalBytes": 24641536,
      "scriptDurationMs": 87.986,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1689.883000000009,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 36.222,
      "layouts": 16,
      "layoutDurationMs": 4.52,
      "taskDurationMs": 766.147,
      "heapDeltaBytes": -3788052,
      "heapUsedBytes": 61907356,
      "domNodes": 61,
      "jsHeapTotalBytes": 23855104,
      "scriptDurationMs": 88.791,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1418.86199999999,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 31.240000000000006,
      "layouts": 14,
      "layoutDurationMs": 12.584000000000001,
      "taskDurationMs": 989.8969999999998,
      "heapDeltaBytes": -5973644,
      "heapUsedBytes": 79929400,
      "domNodes": 13673,
      "jsHeapTotalBytes": 10223616,
      "scriptDurationMs": 19.523999999999994,
      "eventListeners": 2375,
      "totalBlockingTimeMs": 143,
      "frameDurationMs": 16.666666666666696,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8426.918000000001,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 38.426,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4381.505,
      "heapDeltaBytes": 11263992,
      "heapUsedBytes": 71528464,
      "domNodes": -283,
      "jsHeapTotalBytes": 3960832,
      "scriptDurationMs": 1047.565,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333338,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8215.417000000001,
      "styleRecalcs": 251,
      "styleRecalcDurationMs": 37.427,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3995.3070000000002,
      "heapDeltaBytes": 12765636,
      "heapUsedBytes": 73287504,
      "domNodes": -280,
      "jsHeapTotalBytes": 3960832,
      "scriptDurationMs": 1005.007,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 17328.79299999996,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16650.833,
      "heapDeltaBytes": -26891952,
      "heapUsedBytes": 170688844,
      "domNodes": -8312,
      "jsHeapTotalBytes": -13045760,
      "scriptDurationMs": 119.63400000000001,
      "eventListeners": -16389,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.219999999999953,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 16686.480000000076,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 15761.307999999999,
      "heapDeltaBytes": -44473116,
      "heapUsedBytes": 165959288,
      "domNodes": -8312,
      "jsHeapTotalBytes": -15405056,
      "scriptDurationMs": 102.36799999999998,
      "eventListeners": -16387,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 20409.958000000017,
      "styleRecalcs": 159,
      "styleRecalcDurationMs": 15.654999999999974,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 19804.041999999998,
      "heapDeltaBytes": -40424164,
      "heapUsedBytes": 170433884,
      "domNodes": -8312,
      "jsHeapTotalBytes": -13082624,
      "scriptDurationMs": 411.048,
      "eventListeners": -16381,
      "totalBlockingTimeMs": 28,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 20860.184000000005,
      "styleRecalcs": 178,
      "styleRecalcDurationMs": 17.72299999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 20285.723,
      "heapDeltaBytes": -20973468,
      "heapUsedBytes": 176264248,
      "domNodes": -8312,
      "jsHeapTotalBytes": -14426112,
      "scriptDurationMs": 424.27700000000004,
      "eventListeners": -16385,
      "totalBlockingTimeMs": 52,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 476.7940000000408,
      "styleRecalcs": 17,
      "styleRecalcDurationMs": 23.28,
      "layouts": 4,
      "layoutDurationMs": 1.639,
      "taskDurationMs": 120.512,
      "heapDeltaBytes": 5068632,
      "heapUsedBytes": 69645912,
      "domNodes": 150,
      "jsHeapTotalBytes": 5242880,
      "scriptDurationMs": 7.355,
      "eventListeners": 99,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 494.4830000000593,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 17.447,
      "layouts": 3,
      "layoutDurationMs": 0.6119999999999999,
      "taskDurationMs": 126.16,
      "heapDeltaBytes": 4925088,
      "heapUsedBytes": 69324480,
      "domNodes": 119,
      "jsHeapTotalBytes": 4718592,
      "scriptDurationMs": 6.696000000000001,
      "eventListeners": 97,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    }
  ]
}

@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
@datadog-official

datadog-official Bot commented Aug 20, 2026

Copy link
Copy Markdown

Pipelines

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: 92aaa2c | Docs | View more details | Give us feedback!

@codecov

codecov Bot commented Aug 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@              Coverage Diff              @@
##             cloud/1.51   #15479   +/-   ##
=============================================
  Coverage              ?   81.48%           
=============================================
  Files                 ?     1883           
  Lines                 ?   117536           
  Branches              ?    37189           
=============================================
  Hits                  ?    95771           
  Misses                ?    21289           
  Partials              ?      476           
Flag Coverage Δ
unit 72.91% <100.00%> (?)

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%> (ø)
🚀 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 8599217 into cloud/1.51 Aug 20, 2026
87 of 90 checks passed
@comfy-pr-bot
comfy-pr-bot deleted the backport-15066-to-cloud-1.51 branch August 20, 2026 07:22
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