Skip to content

[backport cloud/1.48] fix: preserve subgraph node size when editing or promoting widgets (FE-853) - #14492

Merged
comfy-pr-bot merged 1 commit into
cloud/1.48from
backport-14461-to-cloud-1.48
Jul 31, 2026
Merged

[backport cloud/1.48] fix: preserve subgraph node size when editing or promoting widgets (FE-853)#14492
comfy-pr-bot merged 1 commit into
cloud/1.48from
backport-14461-to-cloud-1.48

Conversation

@comfy-pr-bot

Copy link
Copy Markdown
Member

Backport of #14461 to cloud/1.48

Automatically created by backport workflow.

…E-853) (#14461)

*PR Created by the Glary-Bot Agent*

---

Single unified PR for FE-853 — the fix plus full regression coverage,
targeting `main`.

**Supersedes #14374, #14415 and #14418, all of which can be closed.**
This branch contains the fix originally proposed in #14374 (authorship
preserved) with the regression test from #14415 folded in, rebased onto
current `main`.

- Fixes
[FE-853](https://linear.app/comfyorg/issue/FE-853/bug-promotingunpromoting-a-widget-collapses-subgraph-to-minimum-size)

## The bug

Resize a subgraph node, then touch the widget-editing UI, and the node
snaps back to its computed minimum size — silently discarding the size
you set. Reported in #bug-dump via the "Edit Subgraph Widgets" button;
FE-853 tracks the same collapse when promoting or un-promoting a widget.

Measured against `main` before the fix:

| Step | Node size |
| --- | --- |
| After the user's resize drag | **506 × 339** |
| After clicking "Edit Subgraph Widgets" | **225 × 58** |
| After promoting an interior widget | **225 × 58** |

## The fix

Three call sites refreshed a subgraph host node's rendering with
`computeSize(node.size)`. `computeSize` returns the *minimum* size for
the node's content and those calls assigned it back, so every refresh
clamped the node down and destroyed any larger user-set size.

Replaced with `expandToFitContent()`, which grows the node when content
requires more room but never shrinks it:

- `src/components/rightSidePanel/subgraph/SubgraphEditor.vue` —
`refreshPromotedWidgetRendering()`, the path the "Edit Subgraph Widgets"
button hits
- `src/core/graph/subgraph/promotionUtils.ts` —
`refreshPromotedWidgetRendering()` (promote/demote) and
`promoteRecommendedWidgets()`

## Regression coverage

**`subgraphEditWidgetsResize.spec.ts`** (2 tests) — approaches the bug
from the user-reported entry point:
1. Clicking the "Edit Subgraph Widgets" selection-toolbox button, which
is what the screen recording shows
2. Promoting an interior widget, the trigger in FE-853's title

**`subgraphResizePreservation.spec.ts`** (6 tests) — promote,
un-promote, panel open, multi-widget sequences,
resize-still-works-after-promotion, and a nested-subgraph host.

**Unit tests** (60) across `promotionUtils.test.ts` and
`SubgraphEditor.test.ts`.

Sizes are read from the graph model rather than DOM bounding boxes, so
assertions aren't confounded by canvas zoom or by the canvas shrinking
when the side panel opens. The promotion test asserts `steps` actually
reached the host node before checking size, so it can't pass vacuously
if promotion silently became a no-op.

Supporting fixtures: `NodeOperationsHelper.growNodeByDrag()` (user-style
resize drag returning model-space size, beside the existing canvas-based
`resizeNode`) and `SubgraphEditor.openFromSelectionToolbox()`
(toolbox-button path, complementing the context-menu `ensureOpen()`).

## Verification

The tests were confirmed to detect the regression rather than pass
incidentally, by reverting the fix in place on this branch:

| `src` state | `subgraphEditWidgetsResize` |
| --- | --- |
| `expandToFitContent()` | **2 passed** |
| reverted to `computeSize(node.size)` | **2 failed** — `expected
506.0625, received 225` |

In the reverted run the failing assertion is the width check, not the
promotion guard.

Against current `main` after rebase: **8 e2e passed**, **60 unit
passed**, and `pnpm typecheck`, `pnpm typecheck:browser`, ESLint,
oxlint, oxfmt `--check` and `pnpm knip` all clean.

## Review history carried over

- @DrJKL (#14415): `growNodeByDrag` belongs outside `SubgraphHelper` →
it lives in `NodeOperationsHelper`; `SubgraphHelper` is unchanged apart
from #14374's own edit.
- CodeRabbit (#14415): promotion test could pass vacuously → added the
`getPromotedWidgetOrder()` guard. CodeRabbit approved #14415 and #14418.


## Screenshots

![Subgraph node manually resized to 506x339 with the selection toolbox
above
it](https://pub-1fd11710d4c8405b948c9edc4287a3f2.r2.dev/sessions/6ee0bca4776459e64f1aa10734090b387b188cbfe277699718f93639efeb8ea7/pr-images/1785469931216-f5c374cd-1f31-4814-8af7-8b324f6ab95f.png)

![Pre-fix behavior: after clicking Edit Subgraph Widgets the node
collapsed to
225x58](https://pub-1fd11710d4c8405b948c9edc4287a3f2.r2.dev/sessions/6ee0bca4776459e64f1aa10734090b387b188cbfe277699718f93639efeb8ea7/pr-images/1785469931526-e2eea7f3-aa47-455e-b4b0-9f99066bd46d.png)

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Glary-Bot <glary-bot@users.noreply.github.com>
@comfy-pr-bot comfy-pr-bot added the backport Backporting a PR onto a release candidate label Jul 31, 2026
@comfy-pr-bot
comfy-pr-bot enabled auto-merge (squash) July 31, 2026 17:19
@dosubot dosubot Bot added the size:M This PR changes 30-99 lines, ignoring generated files. label Jul 31, 2026
@dosubot

dosubot Bot commented Jul 31, 2026

Copy link
Copy Markdown

📄 Knowledge review

Dosu skipped reviewing this PR because your organization has used its 200 included credits for the month. Your usage will reset on 2026-08-01. To have Dosu review this PR before then, ask your organization admin to upgrade to a pro account.


Leave Feedback Ask Dosu about ComfyUI_frontend Add Dosu to your team

@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 07/31/2026, 05:21:44 PM 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 · 68.5 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 56.1 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.6 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 52.9 MB heap
large-graph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 64.4 MB heap
large-graph-pan: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 60.1 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 57.8 MB heap
minimap-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 64.5 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.4 MB heap
subgraph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 56.1 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 45.3 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 87ms TBT · 92.4 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 72.0 MB heap
vue-large-graph-idle: · 56.3 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 155.0 MB heap
vue-large-graph-pan: · 57.1 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 59ms TBT · 161.1 MB heap
workflow-execution: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 48.9 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 8ms
canvas-idle: layout count 0
canvas-idle: style recalc count 10
canvas-idle: task duration 578ms
canvas-idle: script duration 25ms
canvas-idle: TBT 0ms
canvas-idle: heap used 68.5 MB
canvas-idle: DOM nodes 20
canvas-idle: event listeners 6
canvas-mouse-sweep: avg frame time 17ms
canvas-mouse-sweep: p95 frame time 17ms
canvas-mouse-sweep: layout duration 3ms
canvas-mouse-sweep: style recalc duration 33ms
canvas-mouse-sweep: layout count 12
canvas-mouse-sweep: style recalc count 73
canvas-mouse-sweep: task duration 791ms
canvas-mouse-sweep: script duration 109ms
canvas-mouse-sweep: TBT 0ms
canvas-mouse-sweep: heap used 56.1 MB
canvas-mouse-sweep: DOM nodes -109
canvas-mouse-sweep: event listeners -70
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 372ms
canvas-zoom-sweep: script duration 24ms
canvas-zoom-sweep: TBT 0ms
canvas-zoom-sweep: heap used 71.6 MB
canvas-zoom-sweep: DOM nodes 77
canvas-zoom-sweep: event listeners 20
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 7ms
dom-widget-clipping: layout count 0
dom-widget-clipping: style recalc count 12
dom-widget-clipping: task duration 348ms
dom-widget-clipping: script duration 53ms
dom-widget-clipping: TBT 0ms
dom-widget-clipping: heap used 52.9 MB
dom-widget-clipping: DOM nodes 20
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 10
large-graph-idle: task duration 728ms
large-graph-idle: script duration 112ms
large-graph-idle: TBT 0ms
large-graph-idle: heap used 64.4 MB
large-graph-idle: DOM nodes -272
large-graph-idle: event listeners -144
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 68
large-graph-pan: task duration 1160ms
large-graph-pan: script duration 376ms
large-graph-pan: TBT 0ms
large-graph-pan: heap used 60.1 MB
large-graph-pan: DOM nodes -277
large-graph-pan: event listeners -143
large-graph-zoom: avg frame time 17ms
large-graph-zoom: p95 frame time 17ms
large-graph-zoom: layout duration 8ms
large-graph-zoom: style recalc duration 16ms
large-graph-zoom: layout count 60
large-graph-zoom: style recalc count 66
large-graph-zoom: task duration 1435ms
large-graph-zoom: script duration 509ms
large-graph-zoom: TBT 0ms
large-graph-zoom: heap used 57.8 MB
large-graph-zoom: DOM nodes -280
large-graph-zoom: event listeners -147
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 728ms
minimap-idle: script duration 112ms
minimap-idle: TBT 0ms
minimap-idle: heap used 64.5 MB
minimap-idle: DOM nodes -277
minimap-idle: event listeners -144
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 347ms
subgraph-dom-widget-clipping: script duration 100ms
subgraph-dom-widget-clipping: TBT 0ms
subgraph-dom-widget-clipping: heap used 53.4 MB
subgraph-dom-widget-clipping: DOM nodes 20
subgraph-dom-widget-clipping: event listeners 8
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 514ms
subgraph-idle: script duration 21ms
subgraph-idle: TBT 0ms
subgraph-idle: heap used 56.1 MB
subgraph-idle: DOM nodes 20
subgraph-idle: event listeners 6
subgraph-mouse-sweep: avg frame time 17ms
subgraph-mouse-sweep: p95 frame time 17ms
subgraph-mouse-sweep: layout duration 4ms
subgraph-mouse-sweep: style recalc duration 35ms
subgraph-mouse-sweep: layout count 16
subgraph-mouse-sweep: style recalc count 78
subgraph-mouse-sweep: task duration 749ms
subgraph-mouse-sweep: script duration 88ms
subgraph-mouse-sweep: TBT 0ms
subgraph-mouse-sweep: heap used 45.3 MB
subgraph-mouse-sweep: DOM nodes -273
subgraph-mouse-sweep: event listeners -148
subgraph-transition-enter: avg frame time 17ms
subgraph-transition-enter: p95 frame time 17ms
subgraph-transition-enter: layout duration 10ms
subgraph-transition-enter: style recalc duration 26ms
subgraph-transition-enter: layout count 14
subgraph-transition-enter: style recalc count 18
subgraph-transition-enter: task duration 849ms
subgraph-transition-enter: script duration 32ms
subgraph-transition-enter: TBT 87ms
subgraph-transition-enter: heap used 92.4 MB
subgraph-transition-enter: DOM nodes 13673
subgraph-transition-enter: event listeners 2369
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 39ms
viewport-pan-sweep: layout count 0
viewport-pan-sweep: style recalc count 249
viewport-pan-sweep: task duration 3962ms
viewport-pan-sweep: script duration 1168ms
viewport-pan-sweep: TBT 0ms
viewport-pan-sweep: heap used 72.0 MB
viewport-pan-sweep: DOM nodes -275
viewport-pan-sweep: event listeners -128
vue-large-graph-idle: avg frame time 18ms
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 14999ms
vue-large-graph-idle: script duration 467ms
vue-large-graph-idle: TBT 0ms
vue-large-graph-idle: heap used 155.0 MB
vue-large-graph-idle: DOM nodes -8312
vue-large-graph-idle: event listeners -16389
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 18ms
vue-large-graph-pan: layout count 0
vue-large-graph-pan: style recalc count 123
vue-large-graph-pan: task duration 17780ms
vue-large-graph-pan: script duration 769ms
vue-large-graph-pan: TBT 59ms
vue-large-graph-pan: heap used 161.1 MB
vue-large-graph-pan: DOM nodes -8312
vue-large-graph-pan: event listeners -16385
workflow-execution: avg frame time 17ms
workflow-execution: p95 frame time 17ms
workflow-execution: layout duration 1ms
workflow-execution: style recalc duration 19ms
workflow-execution: layout count 4
workflow-execution: style recalc count 19
workflow-execution: task duration 113ms
workflow-execution: script duration 11ms
workflow-execution: TBT 0ms
workflow-execution: heap used 48.9 MB
workflow-execution: DOM nodes 149
workflow-execution: event listeners 66
Raw data
{
  "timestamp": "2026-07-31T17:32:02.099Z",
  "gitSha": "41e1ec64445e3d2671de1b48f5b97a6ced3eac9f",
  "branch": "backport-14461-to-cloud-1.48",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2093.471999999963,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.588999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 618.4730000000001,
      "heapDeltaBytes": 3902972,
      "heapUsedBytes": 71831984,
      "domNodes": 20,
      "jsHeapTotalBytes": 20316160,
      "scriptDurationMs": 25.721999999999998,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-idle",
      "durationMs": 2047.050000000013,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.088000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 536.947,
      "heapDeltaBytes": 3943360,
      "heapUsedBytes": 71808904,
      "domNodes": 20,
      "jsHeapTotalBytes": 20578304,
      "scriptDurationMs": 24.755,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1731.997999999976,
      "styleRecalcs": 72,
      "styleRecalcDurationMs": 30.898000000000003,
      "layouts": 12,
      "layoutDurationMs": 3.027,
      "taskDurationMs": 743.925,
      "heapDeltaBytes": -1712564,
      "heapUsedBytes": 66080892,
      "domNodes": 56,
      "jsHeapTotalBytes": 21364736,
      "scriptDurationMs": 106.95200000000001,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1795.2630000000909,
      "styleRecalcs": 74,
      "styleRecalcDurationMs": 34.513999999999996,
      "layouts": 12,
      "layoutDurationMs": 3.398,
      "taskDurationMs": 837.801,
      "heapDeltaBytes": -16264340,
      "heapUsedBytes": 51606896,
      "domNodes": -273,
      "jsHeapTotalBytes": 20180992,
      "scriptDurationMs": 110.705,
      "eventListeners": -144,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1675.5019999999945,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 15.51,
      "layouts": 6,
      "layoutDurationMs": 0.6180000000000001,
      "taskDurationMs": 377.06899999999996,
      "heapDeltaBytes": 7292184,
      "heapUsedBytes": 75203072,
      "domNodes": 77,
      "jsHeapTotalBytes": 20316160,
      "scriptDurationMs": 23.722000000000005,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1664.13399999999,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 15.701,
      "layouts": 6,
      "layoutDurationMs": 0.6629999999999999,
      "taskDurationMs": 366.668,
      "heapDeltaBytes": 7175084,
      "heapUsedBytes": 74929752,
      "domNodes": 77,
      "jsHeapTotalBytes": 20316160,
      "scriptDurationMs": 23.609,
      "eventListeners": 21,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 546.5979999999604,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 6.9609999999999985,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 332.467,
      "heapDeltaBytes": -12392464,
      "heapUsedBytes": 55607296,
      "domNodes": 20,
      "jsHeapTotalBytes": 21102592,
      "scriptDurationMs": 48.65,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66666666666665,
      "p95FrameDurationMs": 16.799999999999727
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 590.5089999999973,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 7.265000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 364.042,
      "heapDeltaBytes": -12359632,
      "heapUsedBytes": 55351444,
      "domNodes": 20,
      "jsHeapTotalBytes": 21102592,
      "scriptDurationMs": 56.553999999999995,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2074.1049999999746,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.28,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 706.418,
      "heapDeltaBytes": 7801432,
      "heapUsedBytes": 69015436,
      "domNodes": -273,
      "jsHeapTotalBytes": 3735552,
      "scriptDurationMs": 107.691,
      "eventListeners": -144,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2052.8130000000147,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.15,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 750.443,
      "heapDeltaBytes": 7061540,
      "heapUsedBytes": 65964316,
      "domNodes": -270,
      "jsHeapTotalBytes": 5308416,
      "scriptDurationMs": 115.395,
      "eventListeners": -144,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2123.5110000000077,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 14.378000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1136.42,
      "heapDeltaBytes": 4364604,
      "heapUsedBytes": 64497364,
      "domNodes": -277,
      "jsHeapTotalBytes": 5251072,
      "scriptDurationMs": 366.18899999999996,
      "eventListeners": -144,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2149.3709999999737,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 14.738000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1183.264,
      "heapDeltaBytes": 1653248,
      "heapUsedBytes": 61499784,
      "domNodes": -277,
      "jsHeapTotalBytes": 4988928,
      "scriptDurationMs": 386.766,
      "eventListeners": -142,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3218.5399999999618,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 15.405999999999999,
      "layouts": 60,
      "layoutDurationMs": 7.771,
      "taskDurationMs": 1423.354,
      "heapDeltaBytes": -285212,
      "heapUsedBytes": 61238852,
      "domNodes": -279,
      "jsHeapTotalBytes": 8192000,
      "scriptDurationMs": 502.018,
      "eventListeners": -146,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3184.8019999999906,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 15.734000000000002,
      "layouts": 60,
      "layoutDurationMs": 7.984999999999999,
      "taskDurationMs": 1447.623,
      "heapDeltaBytes": -1191572,
      "heapUsedBytes": 59923756,
      "domNodes": -281,
      "jsHeapTotalBytes": 7929856,
      "scriptDurationMs": 516.8549999999999,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 2028.6199999999894,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.082999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 702.332,
      "heapDeltaBytes": 6978408,
      "heapUsedBytes": 67529228,
      "domNodes": -277,
      "jsHeapTotalBytes": 3997696,
      "scriptDurationMs": 110.209,
      "eventListeners": -144,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2028.6409999999933,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.431,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 753.927,
      "heapDeltaBytes": 7138500,
      "heapUsedBytes": 67681864,
      "domNodes": -277,
      "jsHeapTotalBytes": 4259840,
      "scriptDurationMs": 114.50100000000002,
      "eventListeners": -144,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 545.9490000000073,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 9.988,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 344.57300000000004,
      "heapDeltaBytes": -12097756,
      "heapUsedBytes": 55793356,
      "domNodes": 20,
      "jsHeapTotalBytes": 22151168,
      "scriptDurationMs": 99.125,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 537.8979999999274,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 9.497,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 349.192,
      "heapDeltaBytes": -11788000,
      "heapUsedBytes": 56134428,
      "domNodes": 20,
      "jsHeapTotalBytes": 21102592,
      "scriptDurationMs": 100.78000000000002,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1999.0419999999745,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.562,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 517.299,
      "heapDeltaBytes": -22053696,
      "heapUsedBytes": 45859504,
      "domNodes": 20,
      "jsHeapTotalBytes": 20180992,
      "scriptDurationMs": 20.725,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2018.0330000000595,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.793,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 511.084,
      "heapDeltaBytes": 3645960,
      "heapUsedBytes": 71696352,
      "domNodes": 20,
      "jsHeapTotalBytes": 20054016,
      "scriptDurationMs": 21.951999999999998,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1754.9609999999802,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 35.69199999999999,
      "layouts": 16,
      "layoutDurationMs": 3.862,
      "taskDurationMs": 757.829,
      "heapDeltaBytes": -19963928,
      "heapUsedBytes": 48004164,
      "domNodes": -273,
      "jsHeapTotalBytes": 21229568,
      "scriptDurationMs": 87.31,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1730.8869999999388,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 33.654,
      "layouts": 16,
      "layoutDurationMs": 4.079,
      "taskDurationMs": 739.653,
      "heapDeltaBytes": -20874336,
      "heapUsedBytes": 47085496,
      "domNodes": -273,
      "jsHeapTotalBytes": 20705280,
      "scriptDurationMs": 89.292,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1300.4040000000714,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 25.888,
      "layouts": 14,
      "layoutDurationMs": 9.616999999999999,
      "taskDurationMs": 848.5310000000002,
      "heapDeltaBytes": 31312036,
      "heapUsedBytes": 96850160,
      "domNodes": 13673,
      "jsHeapTotalBytes": 12845056,
      "scriptDurationMs": 32.444999999999986,
      "eventListeners": 2369,
      "totalBlockingTimeMs": 87,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8160.774000000003,
      "styleRecalcs": 248,
      "styleRecalcDurationMs": 38.703,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3966.831,
      "heapDeltaBytes": 24457776,
      "heapUsedBytes": 83248128,
      "domNodes": -274,
      "jsHeapTotalBytes": 7348224,
      "scriptDurationMs": 1168.618,
      "eventListeners": -128,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8159.080000000017,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 39.86299999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3957.8170000000005,
      "heapDeltaBytes": 9027868,
      "heapUsedBytes": 67675520,
      "domNodes": -275,
      "jsHeapTotalBytes": 5775360,
      "scriptDurationMs": 1167.2509999999997,
      "eventListeners": -128,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 14949.89099999998,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14911.799000000003,
      "heapDeltaBytes": -45904668,
      "heapUsedBytes": 156599288,
      "domNodes": -8312,
      "jsHeapTotalBytes": -12783616,
      "scriptDurationMs": 475.591,
      "eventListeners": -16389,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.330000000000048,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 15099.41600000002,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 15086.035,
      "heapDeltaBytes": -41352468,
      "heapUsedBytes": 168538912,
      "domNodes": -8312,
      "jsHeapTotalBytes": -11993088,
      "scriptDurationMs": 457.77500000000003,
      "eventListeners": -16389,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 17799.052000000018,
      "styleRecalcs": 124,
      "styleRecalcDurationMs": 17.745999999999984,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 17777.521999999997,
      "heapDeltaBytes": -54426040,
      "heapUsedBytes": 169979764,
      "domNodes": -8312,
      "jsHeapTotalBytes": -17321984,
      "scriptDurationMs": 783.148,
      "eventListeners": -16387,
      "totalBlockingTimeMs": 83,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 17799.776000000064,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 17.375,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 17783.206,
      "heapDeltaBytes": -47166828,
      "heapUsedBytes": 167867192,
      "domNodes": -8312,
      "jsHeapTotalBytes": -15929344,
      "scriptDurationMs": 754.2899999999998,
      "eventListeners": -16383,
      "totalBlockingTimeMs": 34,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 459.51800000000276,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 23.618,
      "layouts": 4,
      "layoutDurationMs": 1.471,
      "taskDurationMs": 125.477,
      "heapDeltaBytes": -15649504,
      "heapUsedBytes": 51329624,
      "domNodes": 154,
      "jsHeapTotalBytes": 7471104,
      "scriptDurationMs": 11.708000000000002,
      "eventListeners": 65,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666682,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "workflow-execution",
      "durationMs": 455.8640000000196,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 14.726,
      "layouts": 3,
      "layoutDurationMs": 0.998,
      "taskDurationMs": 100.922,
      "heapDeltaBytes": -15977500,
      "heapUsedBytes": 51134708,
      "domNodes": 143,
      "jsHeapTotalBytes": 7733248,
      "scriptDurationMs": 9.601000000000003,
      "eventListeners": 67,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999727
    }
  ]
}

🎭 Playwright: ✅ 1761 passed, 0 failed · 1 flaky

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

@github-actions

Copy link
Copy Markdown

🎭 Playwright: ⏳ Running...

@codecov

codecov Bot commented Jul 31, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@              Coverage Diff              @@
##             cloud/1.48   #14492   +/-   ##
=============================================
  Coverage              ?   69.12%           
=============================================
  Files                 ?     1659           
  Lines                 ?    85635           
  Branches              ?    24658           
=============================================
  Hits                  ?    59199           
  Misses                ?    26326           
  Partials              ?      110           
Flag Coverage Δ
unit 69.12% <100.00%> (?)

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

Files with missing lines Coverage Δ
...ponents/rightSidePanel/subgraph/SubgraphEditor.vue 85.14% <100.00%> (ø)
src/core/graph/subgraph/promotionUtils.ts 76.94% <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.

@dante01yoon dante01yoon assigned DrJKL and unassigned christian-byrne Jul 31, 2026
@comfy-pr-bot
comfy-pr-bot merged commit 509deeb into cloud/1.48 Jul 31, 2026
100 of 102 checks passed
@comfy-pr-bot
comfy-pr-bot deleted the backport-14461-to-cloud-1.48 branch July 31, 2026 19:59
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 size:M This PR changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants