test(e2e): custom-node empty-name widget doesn't blank the node grid (#13773)#13779
Conversation
A custom node that registers a client-side widget with an empty/placeholder name produces an un-keyable widget id (empty name segment). Before #13773 parseWidgetId threw on that id, tripping the Vue NodeWidgets error boundary and blanking the node's entire widget grid. Emulate the case via a nodeCreated extension hook that adds an empty-name widget to a KSampler, then assert the widget grid still renders (not the error boundary) and the schema-declared siblings (seed, steps, cfg) are visible. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
🎭 Playwright: ✅ 1712 passed, 0 failed · 3 flaky📊 Browser Reports
📦 Bundle Size
⚡ Performance Report
Absolute values
Raw data{
"timestamp": "2026-07-18T02:58:29.654Z",
"gitSha": "9534ee4ce307facf0e1a06ef6d3207f841ae07d3",
"branch": "test/widget-store-e2e-regressions",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2155.598999999995,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.947,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 551.832,
"heapDeltaBytes": -20623892,
"heapUsedBytes": 48156284,
"domNodes": -264,
"jsHeapTotalBytes": 19542016,
"scriptDurationMs": 25.929000000000002,
"eventListeners": -131,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "canvas-idle",
"durationMs": 2057.6409999999896,
"styleRecalcs": 10,
"styleRecalcDurationMs": 9.490999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 485.58699999999993,
"heapDeltaBytes": -22332752,
"heapUsedBytes": 46657852,
"domNodes": -265,
"jsHeapTotalBytes": 19279872,
"scriptDurationMs": 23.887999999999998,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1792.2590000000014,
"styleRecalcs": 74,
"styleRecalcDurationMs": 35.68300000000001,
"layouts": 12,
"layoutDurationMs": 3.934,
"taskDurationMs": 797.515,
"heapDeltaBytes": -15161812,
"heapUsedBytes": 53722944,
"domNodes": -266,
"jsHeapTotalBytes": 19542016,
"scriptDurationMs": 111.11699999999999,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1859.7189999999841,
"styleRecalcs": 75,
"styleRecalcDurationMs": 40.739,
"layouts": 12,
"layoutDurationMs": 3.7199999999999998,
"taskDurationMs": 859.904,
"heapDeltaBytes": -12963456,
"heapUsedBytes": 55817180,
"domNodes": -264,
"jsHeapTotalBytes": 20590592,
"scriptDurationMs": 124.93599999999999,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1723.128000000031,
"styleRecalcs": 32,
"styleRecalcDurationMs": 16.999,
"layouts": 6,
"layoutDurationMs": 0.742,
"taskDurationMs": 348.862,
"heapDeltaBytes": 7348532,
"heapUsedBytes": 76109032,
"domNodes": 78,
"jsHeapTotalBytes": 19677184,
"scriptDurationMs": 23.878999999999998,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1740.0250000000597,
"styleRecalcs": 32,
"styleRecalcDurationMs": 19.230000000000004,
"layouts": 6,
"layoutDurationMs": 0.8400000000000001,
"taskDurationMs": 353.107,
"heapDeltaBytes": 7254336,
"heapUsedBytes": 76203212,
"domNodes": 78,
"jsHeapTotalBytes": 19677184,
"scriptDurationMs": 25.447,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 575.5459999999744,
"styleRecalcs": 13,
"styleRecalcDurationMs": 9.39,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 352.36400000000003,
"heapDeltaBytes": -11689044,
"heapUsedBytes": 57172080,
"domNodes": 22,
"jsHeapTotalBytes": 19415040,
"scriptDurationMs": 57.449,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "dom-widget-clipping",
"durationMs": 592.0189999999934,
"styleRecalcs": 12,
"styleRecalcDurationMs": 8.61,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 358.23499999999996,
"heapDeltaBytes": -11535484,
"heapUsedBytes": 57198036,
"domNodes": 20,
"jsHeapTotalBytes": 19939328,
"scriptDurationMs": 55.696999999999996,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "large-graph-idle",
"durationMs": 2028.9670000000228,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.607000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 570.059,
"heapDeltaBytes": 5479504,
"heapUsedBytes": 65450596,
"domNodes": -269,
"jsHeapTotalBytes": 5193728,
"scriptDurationMs": 86.76500000000001,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "large-graph-idle",
"durationMs": 2015.8100000000445,
"styleRecalcs": 9,
"styleRecalcDurationMs": 8.165,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 589.665,
"heapDeltaBytes": 4876648,
"heapUsedBytes": 66357632,
"domNodes": -267,
"jsHeapTotalBytes": 4931584,
"scriptDurationMs": 86.982,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2144.8279999999613,
"styleRecalcs": 69,
"styleRecalcDurationMs": 15.528000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1099.17,
"heapDeltaBytes": -433908,
"heapUsedBytes": 61795932,
"domNodes": -267,
"jsHeapTotalBytes": 5136384,
"scriptDurationMs": 365.469,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-pan",
"durationMs": 2174.9060000000213,
"styleRecalcs": 69,
"styleRecalcDurationMs": 17.384999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1166.81,
"heapDeltaBytes": -4257540,
"heapUsedBytes": 56133176,
"domNodes": -269,
"jsHeapTotalBytes": 4931584,
"scriptDurationMs": 390.318,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3253.5609999999906,
"styleRecalcs": 65,
"styleRecalcDurationMs": 17.032000000000004,
"layouts": 60,
"layoutDurationMs": 9.251000000000001,
"taskDurationMs": 1360.839,
"heapDeltaBytes": 1527276,
"heapUsedBytes": 63288688,
"domNodes": -273,
"jsHeapTotalBytes": 8601600,
"scriptDurationMs": 455.762,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "large-graph-zoom",
"durationMs": 3175.4760000000033,
"styleRecalcs": 66,
"styleRecalcDurationMs": 18.851999999999997,
"layouts": 60,
"layoutDurationMs": 9.144,
"taskDurationMs": 1403.691,
"heapDeltaBytes": -4312228,
"heapUsedBytes": 57580592,
"domNodes": -270,
"jsHeapTotalBytes": 8077312,
"scriptDurationMs": 458.07300000000004,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "minimap-idle",
"durationMs": 2027.2090000000276,
"styleRecalcs": 8,
"styleRecalcDurationMs": 7.101,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 570.138,
"heapDeltaBytes": 4917052,
"heapUsedBytes": 66330772,
"domNodes": -269,
"jsHeapTotalBytes": 3883008,
"scriptDurationMs": 87.337,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "minimap-idle",
"durationMs": 2011.380000000031,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.6419999999999995,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 586.2230000000001,
"heapDeltaBytes": 4924324,
"heapUsedBytes": 65976152,
"domNodes": -268,
"jsHeapTotalBytes": 4145152,
"scriptDurationMs": 85.741,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 600.5170000000248,
"styleRecalcs": 47,
"styleRecalcDurationMs": 10.492999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 370.858,
"heapDeltaBytes": -11144564,
"heapUsedBytes": 57783076,
"domNodes": 20,
"jsHeapTotalBytes": 20725760,
"scriptDurationMs": 116.085,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 621.3050000000067,
"styleRecalcs": 49,
"styleRecalcDurationMs": 12.435000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 389.30199999999996,
"heapDeltaBytes": -11051728,
"heapUsedBytes": 57830064,
"domNodes": 24,
"jsHeapTotalBytes": 20201472,
"scriptDurationMs": 120.004,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-idle",
"durationMs": 2024.15000000002,
"styleRecalcs": 11,
"styleRecalcDurationMs": 8.166,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 424.98100000000005,
"heapDeltaBytes": -22624736,
"heapUsedBytes": 46218164,
"domNodes": 22,
"jsHeapTotalBytes": 20590592,
"scriptDurationMs": 18.069000000000003,
"eventListeners": -109,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-idle",
"durationMs": 2006.056000000001,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.666000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 455.9829999999999,
"heapDeltaBytes": -19535596,
"heapUsedBytes": 49562588,
"domNodes": -266,
"jsHeapTotalBytes": 19017728,
"scriptDurationMs": 21.061999999999998,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1737.3440000000073,
"styleRecalcs": 74,
"styleRecalcDurationMs": 36.135,
"layouts": 16,
"layoutDurationMs": 4.787000000000001,
"taskDurationMs": 735.126,
"heapDeltaBytes": -17603132,
"heapUsedBytes": 51374656,
"domNodes": -269,
"jsHeapTotalBytes": 20066304,
"scriptDurationMs": 88.193,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1747.6289999999608,
"styleRecalcs": 77,
"styleRecalcDurationMs": 42.335,
"layouts": 16,
"layoutDurationMs": 4.786,
"taskDurationMs": 810.0070000000001,
"heapDeltaBytes": -19785928,
"heapUsedBytes": 49013804,
"domNodes": -262,
"jsHeapTotalBytes": 20590592,
"scriptDurationMs": 96.93299999999999,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-transition-enter",
"durationMs": 965.4350000000136,
"styleRecalcs": 18,
"styleRecalcDurationMs": 28.29799999999999,
"layouts": 14,
"layoutDurationMs": 10.658000000000001,
"taskDurationMs": 755.6719999999999,
"heapDeltaBytes": 29068888,
"heapUsedBytes": 95341812,
"domNodes": 13673,
"jsHeapTotalBytes": 15204352,
"scriptDurationMs": 28.63199999999999,
"eventListeners": 2371,
"totalBlockingTimeMs": 123,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8164.138000000037,
"styleRecalcs": 249,
"styleRecalcDurationMs": 44.653999999999996,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3841.7909999999997,
"heapDeltaBytes": 15270876,
"heapUsedBytes": 75067088,
"domNodes": -269,
"jsHeapTotalBytes": 7757824,
"scriptDurationMs": 1192.499,
"eventListeners": -113,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "viewport-pan-sweep",
"durationMs": 8200.603000000001,
"styleRecalcs": 250,
"styleRecalcDurationMs": 47.318,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4041.552,
"heapDeltaBytes": 16005964,
"heapUsedBytes": 75395972,
"domNodes": -267,
"jsHeapTotalBytes": 7757824,
"scriptDurationMs": 1252.028,
"eventListeners": -113,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 10926.796000000024,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 10913.364000000001,
"heapDeltaBytes": -40708348,
"heapUsedBytes": 171898488,
"domNodes": -8311,
"jsHeapTotalBytes": -7802880,
"scriptDurationMs": 520.02,
"eventListeners": -16384,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.223333333333358,
"p95FrameDurationMs": 16.80000000000291
},
{
"name": "vue-large-graph-idle",
"durationMs": 11173.135999999999,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 11157.456999999999,
"heapDeltaBytes": -55957916,
"heapUsedBytes": 172040828,
"domNodes": -8311,
"jsHeapTotalBytes": -8327168,
"scriptDurationMs": 533.517,
"eventListeners": -16386,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.219999999999953,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 13956.005000000005,
"styleRecalcs": 68,
"styleRecalcDurationMs": 14.944999999999986,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 13932.878999999999,
"heapDeltaBytes": -36782332,
"heapUsedBytes": 164739924,
"domNodes": -8311,
"jsHeapTotalBytes": -13832192,
"scriptDurationMs": 795.797,
"eventListeners": -16382,
"totalBlockingTimeMs": 17,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-pan",
"durationMs": 13910.713999999985,
"styleRecalcs": 66,
"styleRecalcDurationMs": 14.980000000000022,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 13885.213,
"heapDeltaBytes": -53572360,
"heapUsedBytes": 157004488,
"domNodes": -8311,
"jsHeapTotalBytes": -12783616,
"scriptDurationMs": 804.864,
"eventListeners": -16384,
"totalBlockingTimeMs": 3,
"frameDurationMs": 16.66333333333338,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 501.28200000000334,
"styleRecalcs": 18,
"styleRecalcDurationMs": 21.081,
"layouts": 3,
"layoutDurationMs": 1.1520000000000001,
"taskDurationMs": 143.80700000000002,
"heapDeltaBytes": -15477172,
"heapUsedBytes": 52677408,
"domNodes": 154,
"jsHeapTotalBytes": 6569984,
"scriptDurationMs": 12.326000000000002,
"eventListeners": 67,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "workflow-execution",
"durationMs": 464.42400000000816,
"styleRecalcs": 12,
"styleRecalcDurationMs": 19.209,
"layouts": 3,
"layoutDurationMs": 0.8640000000000002,
"taskDurationMs": 113.016,
"heapDeltaBytes": -15851824,
"heapUsedBytes": 52237824,
"domNodes": 117,
"jsHeapTotalBytes": 6045696,
"scriptDurationMs": 9.711,
"eventListeners": 65,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66666666666665,
"p95FrameDurationMs": 16.700000000000728
}
]
} |
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## fix/widget-store-custom-node-widgets #13779 +/- ##
=====================================================================
Coverage 78.29% 78.30%
=====================================================================
Files 1683 1683
Lines 98527 98529 +2
Branches 35479 35474 -5
=====================================================================
+ Hits 77141 77149 +8
+ Misses 20921 20915 -6
Partials 465 465
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
5b14113
into
fix/widget-store-custom-node-widgets
Summary
Playwright regression for #13773: a custom node that registers a client-side widget with an empty/placeholder name (an un-keyable widget id) must not trip the Vue
NodeWidgetserror boundary and blank the node's entire widget grid.Changes
browser_tests/tests/vueNodes/widgets/emptyNameWidget.spec.ts— aregisterExtensionnodeCreatedhook adds an empty-name widget to a KSampler, then asserts the widget grid renders (not.node-error) and the schema siblings (seed/steps/cfg) stay visible. Behavioral, retrying assertions, nowaitForTimeout; a precondition poll confirms the empty-name widget is actually present so the test can't pass vacuously.Review Focus
fix/widget-store-custom-node-widgets); retarget tomainwhen that merges.Locks in the defensive guard from #13773 regardless of the exact custom-node trigger.