test: add E2E tests for bottom panel core behaviors#10814
test: add E2E tests for bottom panel core behaviors#10814dante01yoon wants to merge 4 commits intomainfrom
Conversation
Add bottomPanel.spec.ts covering behaviors not tested in existing bottomPanelLogs and bottomPanelShortcuts specs: close button (X), tab persistence on re-open, resize gutter visibility and drag, canvas interaction when panel is closed, and cross-panel switching. Extend BottomPanel fixture with closeButton and resizeGutter locators.
🎨 Storybook: ✅ Built — View Storybook |
🎭 Playwright: ✅ 919 passed, 0 failed · 2 flaky📊 Browser Reports
|
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
✅ Files skipped from review due to trivial changes (1)
📝 WalkthroughWalkthroughAdds two Playwright locators to the BottomPanel fixture and a new Playwright UI test suite that exercises bottom-panel open/close, shortcut/tab interactions, resize gutter visibility and drag-resize, and verifies canvas interaction when the panel is closed. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Warning Review ran into problems🔥 ProblemsGit: Failed to clone repository. Please run the Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
📦 Bundle: 5.11 MB gzip 🔴 +124 BDetailsSummary
Category Glance App Entry Points — 22.3 kB (baseline 22.3 kB) • ⚪ 0 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 1.2 MB (baseline 1.2 MB) • ⚪ 0 BGraph editor runtime, canvas, workflow orchestration
Status: 1 added / 1 removed Views & Navigation — 76.6 kB (baseline 76.6 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces
Status: 9 added / 9 removed / 2 unchanged Panels & Settings — 484 kB (baseline 484 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens
Status: 10 added / 10 removed / 12 unchanged User & Accounts — 17.1 kB (baseline 17.1 kB) • ⚪ 0 BAuthentication, profile, and account management bundles
Status: 5 added / 5 removed / 2 unchanged Editors & Dialogs — 109 kB (baseline 109 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors
Status: 2 added / 2 removed UI Components — 60.3 kB (baseline 60.3 kB) • ⚪ 0 BReusable component library chunks
Status: 5 added / 5 removed / 8 unchanged Data & Services — 2.97 MB (baseline 2.97 MB) • ⚪ 0 BStores, services, APIs, and repositories
Status: 13 added / 13 removed / 4 unchanged Utilities & Hooks — 338 kB (baseline 338 kB) • ⚪ 0 BHelpers, composables, and utility bundles
Status: 13 added / 13 removed / 13 unchanged Vendor & Third-Party — 9.8 MB (baseline 9.8 MB) • ⚪ 0 BExternal libraries and shared vendor chunks Status: 16 unchanged Other — 8.44 MB (baseline 8.44 MB) • ⚪ 0 BBundles that do not match a named category
Status: 55 added / 55 removed / 79 unchanged ⚡ Performance Report
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-04-02T13:06:49.789Z",
"gitSha": "7b695aca2955c57f7dae5b1f4357e0cbbb33ca06",
"branch": "test/bottom-panel-e2e",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2028.5180000000196,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.638999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 387.308,
"heapDeltaBytes": 20706304,
"heapUsedBytes": 63743800,
"domNodes": 16,
"jsHeapTotalBytes": 22806528,
"scriptDurationMs": 19.020999999999997,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-idle",
"durationMs": 2026.9169999999122,
"styleRecalcs": 10,
"styleRecalcDurationMs": 9.650999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 356.32,
"heapDeltaBytes": 20353244,
"heapUsedBytes": 63172112,
"domNodes": 20,
"jsHeapTotalBytes": 22806528,
"scriptDurationMs": 23.4,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-idle",
"durationMs": 2024.2899999999509,
"styleRecalcs": 11,
"styleRecalcDurationMs": 10.905000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 388.767,
"heapDeltaBytes": -4599620,
"heapUsedBytes": 44340908,
"domNodes": 22,
"jsHeapTotalBytes": 24641536,
"scriptDurationMs": 30.142999999999997,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 2026.788999999951,
"styleRecalcs": 85,
"styleRecalcDurationMs": 46.341,
"layouts": 12,
"layoutDurationMs": 3.706,
"taskDurationMs": 1022.4859999999998,
"heapDeltaBytes": 18087292,
"heapUsedBytes": 66989932,
"domNodes": 68,
"jsHeapTotalBytes": 25427968,
"scriptDurationMs": 144.955,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1782.1400000000267,
"styleRecalcs": 74,
"styleRecalcDurationMs": 36.14,
"layouts": 12,
"layoutDurationMs": 3.3489999999999998,
"taskDurationMs": 737.334,
"heapDeltaBytes": 15836960,
"heapUsedBytes": 58394200,
"domNodes": 58,
"jsHeapTotalBytes": 23592960,
"scriptDurationMs": 132.288,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 2040.185000000065,
"styleRecalcs": 84,
"styleRecalcDurationMs": 43.413,
"layouts": 12,
"layoutDurationMs": 3.1020000000000008,
"taskDurationMs": 997.0740000000001,
"heapDeltaBytes": 16302036,
"heapUsedBytes": 58828328,
"domNodes": 66,
"jsHeapTotalBytes": 23330816,
"scriptDurationMs": 137.289,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1715.1799999999753,
"styleRecalcs": 31,
"styleRecalcDurationMs": 17.127999999999997,
"layouts": 6,
"layoutDurationMs": 0.702,
"taskDurationMs": 286.34000000000003,
"heapDeltaBytes": 24343708,
"heapUsedBytes": 67451828,
"domNodes": 76,
"jsHeapTotalBytes": 20447232,
"scriptDurationMs": 19.509,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1743.6249999999518,
"styleRecalcs": 29,
"styleRecalcDurationMs": 17.707,
"layouts": 6,
"layoutDurationMs": 0.7030000000000001,
"taskDurationMs": 327.175,
"heapDeltaBytes": 15372700,
"heapUsedBytes": 66280664,
"domNodes": 79,
"jsHeapTotalBytes": 22282240,
"scriptDurationMs": 26.531,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1721.85300000001,
"styleRecalcs": 33,
"styleRecalcDurationMs": 18.750999999999998,
"layouts": 6,
"layoutDurationMs": 0.6149999999999999,
"taskDurationMs": 311.718,
"heapDeltaBytes": 24697804,
"heapUsedBytes": 67506896,
"domNodes": 81,
"jsHeapTotalBytes": 21233664,
"scriptDurationMs": 25.816000000000003,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 545.7750000000487,
"styleRecalcs": 12,
"styleRecalcDurationMs": 8.899000000000003,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 346.073,
"heapDeltaBytes": 6510232,
"heapUsedBytes": 49310616,
"domNodes": 20,
"jsHeapTotalBytes": 13107200,
"scriptDurationMs": 67.605,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000273
},
{
"name": "dom-widget-clipping",
"durationMs": 582.9710000000432,
"styleRecalcs": 13,
"styleRecalcDurationMs": 11.912,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 350.591,
"heapDeltaBytes": 7649604,
"heapUsedBytes": 50390176,
"domNodes": 22,
"jsHeapTotalBytes": 12845056,
"scriptDurationMs": 65.576,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "dom-widget-clipping",
"durationMs": 549.0280000000212,
"styleRecalcs": 12,
"styleRecalcDurationMs": 8.193,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 343.236,
"heapDeltaBytes": 7576784,
"heapUsedBytes": 50400616,
"domNodes": 20,
"jsHeapTotalBytes": 12582912,
"scriptDurationMs": 67.557,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.663333333333338,
"p95FrameDurationMs": 16.799999999999727
},
{
"name": "large-graph-idle",
"durationMs": 2020.0740000000224,
"styleRecalcs": 11,
"styleRecalcDurationMs": 10.354000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 572.6560000000001,
"heapDeltaBytes": 4133688,
"heapUsedBytes": 54840508,
"domNodes": -255,
"jsHeapTotalBytes": 16707584,
"scriptDurationMs": 106.95400000000001,
"eventListeners": -125,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-idle",
"durationMs": 2054.4360000000097,
"styleRecalcs": 11,
"styleRecalcDurationMs": 10.565999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 546.2320000000001,
"heapDeltaBytes": 5002804,
"heapUsedBytes": 55572052,
"domNodes": -256,
"jsHeapTotalBytes": 15921152,
"scriptDurationMs": 105.756,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "large-graph-idle",
"durationMs": 2039.5099999999502,
"styleRecalcs": 10,
"styleRecalcDurationMs": 9.656,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 557.6220000000001,
"heapDeltaBytes": 5014172,
"heapUsedBytes": 55869476,
"domNodes": -257,
"jsHeapTotalBytes": 16183296,
"scriptDurationMs": 108.34499999999998,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "large-graph-pan",
"durationMs": 2147.7309999999648,
"styleRecalcs": 70,
"styleRecalcDurationMs": 17.749000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1113.9889999999998,
"heapDeltaBytes": 18934836,
"heapUsedBytes": 70570996,
"domNodes": -255,
"jsHeapTotalBytes": 17960960,
"scriptDurationMs": 406.167,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-pan",
"durationMs": 2134.9519999999984,
"styleRecalcs": 70,
"styleRecalcDurationMs": 16.019000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1076.111,
"heapDeltaBytes": 15926548,
"heapUsedBytes": 68022692,
"domNodes": -258,
"jsHeapTotalBytes": 18223104,
"scriptDurationMs": 392.252,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2122.5449999999455,
"styleRecalcs": 67,
"styleRecalcDurationMs": 15.439000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1115.706,
"heapDeltaBytes": 17839276,
"heapUsedBytes": 71551180,
"domNodes": -264,
"jsHeapTotalBytes": 18485248,
"scriptDurationMs": 422.05499999999995,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3165.659000000005,
"styleRecalcs": 66,
"styleRecalcDurationMs": 17.358,
"layouts": 60,
"layoutDurationMs": 7.3149999999999995,
"taskDurationMs": 1314.3,
"heapDeltaBytes": 7028868,
"heapUsedBytes": 61645168,
"domNodes": -264,
"jsHeapTotalBytes": 17231872,
"scriptDurationMs": 490.825,
"eventListeners": -123,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-zoom",
"durationMs": 3147.8140000000394,
"styleRecalcs": 66,
"styleRecalcDurationMs": 16.582,
"layouts": 60,
"layoutDurationMs": 7.056,
"taskDurationMs": 1342.3100000000002,
"heapDeltaBytes": 8412492,
"heapUsedBytes": 63345980,
"domNodes": -265,
"jsHeapTotalBytes": 18018304,
"scriptDurationMs": 523.6010000000001,
"eventListeners": -123,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "large-graph-zoom",
"durationMs": 3187.0680000000675,
"styleRecalcs": 67,
"styleRecalcDurationMs": 18.21,
"layouts": 60,
"layoutDurationMs": 7.325,
"taskDurationMs": 1420.357,
"heapDeltaBytes": 6726284,
"heapUsedBytes": 70845060,
"domNodes": -261,
"jsHeapTotalBytes": 17084416,
"scriptDurationMs": 566.8480000000001,
"eventListeners": -125,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "minimap-idle",
"durationMs": 2006.8709999999896,
"styleRecalcs": 10,
"styleRecalcDurationMs": 9.134,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 531.6639999999999,
"heapDeltaBytes": 2227936,
"heapUsedBytes": 54845144,
"domNodes": -258,
"jsHeapTotalBytes": 15921152,
"scriptDurationMs": 96.62099999999998,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "minimap-idle",
"durationMs": 2041.7649999999412,
"styleRecalcs": 10,
"styleRecalcDurationMs": 9.534,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 546.838,
"heapDeltaBytes": 4438072,
"heapUsedBytes": 57083224,
"domNodes": -261,
"jsHeapTotalBytes": 16707584,
"scriptDurationMs": 104.945,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "minimap-idle",
"durationMs": 2049.517000000037,
"styleRecalcs": 11,
"styleRecalcDurationMs": 10.843000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 541.754,
"heapDeltaBytes": 4461468,
"heapUsedBytes": 56818848,
"domNodes": -259,
"jsHeapTotalBytes": 16707584,
"scriptDurationMs": 101.734,
"eventListeners": -125,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 533.3160000000134,
"styleRecalcs": 48,
"styleRecalcDurationMs": 11.823,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 354.42600000000004,
"heapDeltaBytes": -1795552,
"heapUsedBytes": 49417500,
"domNodes": 22,
"jsHeapTotalBytes": 16515072,
"scriptDurationMs": 123.378,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000273
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 594.3210000000363,
"styleRecalcs": 49,
"styleRecalcDurationMs": 15.700000000000003,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 370.604,
"heapDeltaBytes": 6521472,
"heapUsedBytes": 49555092,
"domNodes": 24,
"jsHeapTotalBytes": 12845056,
"scriptDurationMs": 126.92499999999998,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000273
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 547.3289999999906,
"styleRecalcs": 48,
"styleRecalcDurationMs": 12.471,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 357.61699999999996,
"heapDeltaBytes": 6825436,
"heapUsedBytes": 49664232,
"domNodes": 22,
"jsHeapTotalBytes": 13107200,
"scriptDurationMs": 124.873,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.663333333333338,
"p95FrameDurationMs": 16.700000000000273
},
{
"name": "subgraph-idle",
"durationMs": 2006.8980000000352,
"styleRecalcs": 11,
"styleRecalcDurationMs": 10.774000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 394.546,
"heapDeltaBytes": 19930516,
"heapUsedBytes": 63072184,
"domNodes": 22,
"jsHeapTotalBytes": 22544384,
"scriptDurationMs": 23.761000000000003,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-idle",
"durationMs": 1990.9200000000737,
"styleRecalcs": 11,
"styleRecalcDurationMs": 10.066000000000003,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 334.415,
"heapDeltaBytes": 19822596,
"heapUsedBytes": 63123920,
"domNodes": 21,
"jsHeapTotalBytes": 22544384,
"scriptDurationMs": 14.639,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-idle",
"durationMs": 2008.3680000000186,
"styleRecalcs": 10,
"styleRecalcDurationMs": 10.256000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 397.62299999999993,
"heapDeltaBytes": 19955020,
"heapUsedBytes": 63045144,
"domNodes": 20,
"jsHeapTotalBytes": 23068672,
"scriptDurationMs": 24.751,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1996.2790000000155,
"styleRecalcs": 83,
"styleRecalcDurationMs": 45.712,
"layouts": 16,
"layoutDurationMs": 4.104,
"taskDurationMs": 917.595,
"heapDeltaBytes": 11813572,
"heapUsedBytes": 54907848,
"domNodes": 72,
"jsHeapTotalBytes": 23068672,
"scriptDurationMs": 103.168,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1993.5550000000148,
"styleRecalcs": 88,
"styleRecalcDurationMs": 52.729,
"layouts": 16,
"layoutDurationMs": 4.62,
"taskDurationMs": 935.8649999999999,
"heapDeltaBytes": 12242160,
"heapUsedBytes": 55259132,
"domNodes": 75,
"jsHeapTotalBytes": 23330816,
"scriptDurationMs": 102.19600000000001,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1705.139000000031,
"styleRecalcs": 77,
"styleRecalcDurationMs": 38.826,
"layouts": 16,
"layoutDurationMs": 5.2989999999999995,
"taskDurationMs": 674.164,
"heapDeltaBytes": 11865368,
"heapUsedBytes": 54933800,
"domNodes": 64,
"jsHeapTotalBytes": 22806528,
"scriptDurationMs": 100.502,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "viewport-pan-sweep",
"durationMs": 8173.2910000000065,
"styleRecalcs": 252,
"styleRecalcDurationMs": 45.13699999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3690.183,
"heapDeltaBytes": 738552,
"heapUsedBytes": 51465924,
"domNodes": -252,
"jsHeapTotalBytes": 18542592,
"scriptDurationMs": 1232.2689999999998,
"eventListeners": -105,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8152.494000000047,
"styleRecalcs": 252,
"styleRecalcDurationMs": 46.016,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3863.065,
"heapDeltaBytes": 468496,
"heapUsedBytes": 51864920,
"domNodes": -255,
"jsHeapTotalBytes": 19648512,
"scriptDurationMs": 1268.434,
"eventListeners": -113,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8190.7110000000785,
"styleRecalcs": 252,
"styleRecalcDurationMs": 44.363,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3650.1660000000006,
"heapDeltaBytes": 27607816,
"heapUsedBytes": 78085464,
"domNodes": -257,
"jsHeapTotalBytes": 19533824,
"scriptDurationMs": 1235.3029999999999,
"eventListeners": -107,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 12292.153000000042,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 12281.329000000002,
"heapDeltaBytes": -29948328,
"heapUsedBytes": 166037752,
"domNodes": -8331,
"jsHeapTotalBytes": 27615232,
"scriptDurationMs": 588.4590000000001,
"eventListeners": -16462,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.223333333333237,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 12463.425000000028,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 12450.542000000001,
"heapDeltaBytes": -37074908,
"heapUsedBytes": 165389768,
"domNodes": -8331,
"jsHeapTotalBytes": 26304512,
"scriptDurationMs": 643.1170000000001,
"eventListeners": -16462,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.22666666666664,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 12460.798999999952,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 12445.813999999998,
"heapDeltaBytes": -42935044,
"heapUsedBytes": 167172984,
"domNodes": -8331,
"jsHeapTotalBytes": 29712384,
"scriptDurationMs": 583.318,
"eventListeners": -16466,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.219999999999953,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 14561.94400000004,
"styleRecalcs": 68,
"styleRecalcDurationMs": 14.336000000000016,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 14514.560999999998,
"heapDeltaBytes": -47043980,
"heapUsedBytes": 148012968,
"domNodes": -8332,
"jsHeapTotalBytes": -696320,
"scriptDurationMs": 860.746,
"eventListeners": -16488,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.219999999999953,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-pan",
"durationMs": 14595.776000000002,
"styleRecalcs": 67,
"styleRecalcDurationMs": 14.172999999999991,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 14572.106000000002,
"heapDeltaBytes": -33962012,
"heapUsedBytes": 159430148,
"domNodes": -8331,
"jsHeapTotalBytes": 614400,
"scriptDurationMs": 874.106,
"eventListeners": -16462,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.779999999999927,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 14403.654999999959,
"styleRecalcs": 68,
"styleRecalcDurationMs": 14.255999999999991,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 14384.658000000001,
"heapDeltaBytes": -35499308,
"heapUsedBytes": 160497792,
"domNodes": -8331,
"jsHeapTotalBytes": -2793472,
"scriptDurationMs": 869.6840000000001,
"eventListeners": -16460,
"totalBlockingTimeMs": 44,
"frameDurationMs": 17.219999999999953,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 448.56699999996863,
"styleRecalcs": 17,
"styleRecalcDurationMs": 28.206000000000003,
"layouts": 5,
"layoutDurationMs": 1.4429999999999998,
"taskDurationMs": 132.12399999999997,
"heapDeltaBytes": 4743396,
"heapUsedBytes": 49270032,
"domNodes": 165,
"jsHeapTotalBytes": 524288,
"scriptDurationMs": 31.766000000000002,
"eventListeners": 71,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000273
},
{
"name": "workflow-execution",
"durationMs": 452.02500000004875,
"styleRecalcs": 17,
"styleRecalcDurationMs": 23.067,
"layouts": 4,
"layoutDurationMs": 1.05,
"taskDurationMs": 114.341,
"heapDeltaBytes": 4389084,
"heapUsedBytes": 49940096,
"domNodes": 156,
"jsHeapTotalBytes": 262144,
"scriptDurationMs": 24.299,
"eventListeners": 71,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "workflow-execution",
"durationMs": 128.92899999997098,
"styleRecalcs": 13,
"styleRecalcDurationMs": 21.159000000000002,
"layouts": 5,
"layoutDurationMs": 1.8179999999999998,
"taskDurationMs": 98.40600000000002,
"heapDeltaBytes": 2780636,
"heapUsedBytes": 47023676,
"domNodes": 145,
"jsHeapTotalBytes": 262144,
"scriptDurationMs": 26.367999999999995,
"eventListeners": 37,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000273
}
]
} |
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
browser_tests/tests/bottomPanel.spec.ts (1)
98-103: Prefer a retrying height assertion after drag.A single immediate read of
newHeightcan be flaky if layout settles asynchronously after mouse up.✅ Suggested refactor
- const newHeight = await bottomPanel.root.evaluate( - (el) => el.getBoundingClientRect().height - ) - - expect(newHeight).toBeGreaterThan(initialHeight) + await expect + .poll(() => + bottomPanel.root.evaluate((el) => el.getBoundingClientRect().height) + ) + .toBeGreaterThan(initialHeight)As per coding guidelines, "Do not use waitForTimeout in Playwright tests; use Locator actions and retrying assertions instead."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@browser_tests/tests/bottomPanel.spec.ts` around lines 98 - 103, Replace the one-shot read of newHeight with a retrying assertion so layout settling after the drag is tolerated: use Playwright's expect.poll to repeatedly evaluate bottomPanel.root.getBoundingClientRect().height and assert it is greater than initialHeight (e.g., await expect.poll(() => bottomPanel.root.evaluate(el => el.getBoundingClientRect().height)).toBeGreaterThan(initialHeight)). Update the code that references newHeight and initialHeight accordingly so the assertion retries instead of using a single immediate evaluate result.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@browser_tests/tests/bottomPanel.spec.ts`:
- Around line 31-36: Replace the defensive pattern that calls
comfyPage.page.getByRole('tab', { name: /Logs/i }) then awaits
isVisible().catch(() => false) and conditionally test.skip(), with direct
Playwright locator assertions that expect the Logs tab to be present and visible
(e.g., use the logsTab locator and an assertion like
expect(logsTab).toBeVisible() or equivalent retrying assertion). Remove the
try/catch and test.skip branches in all occurrences that reference the logsTab
locator so tests fail loudly on missing UI (locations referencing the logsTab
variable and the getByRole('tab', { name: /Logs/i }) call).
- Around line 81-85: The test currently calls test.skip() when boundingBox()
returns null for bottomPanel.resizeGutter and for the canvas center, which hides
real rendering/layout failures; replace those skips with explicit assertions:
after obtaining gutterBox from await bottomPanel.resizeGutter.boundingBox(),
assert expect(gutterBox, 'Resize gutter should be visible').not.toBeNull();
likewise for canvasCenter assert expect(canvasCenter, 'Canvas should be
visible').not.toBeNull(); this ensures failures surface instead of being skipped
and references bottomPanel.resizeGutter.boundingBox(), gutterBox, and
canvasCenter to locate the checks.
---
Nitpick comments:
In `@browser_tests/tests/bottomPanel.spec.ts`:
- Around line 98-103: Replace the one-shot read of newHeight with a retrying
assertion so layout settling after the drag is tolerated: use Playwright's
expect.poll to repeatedly evaluate
bottomPanel.root.getBoundingClientRect().height and assert it is greater than
initialHeight (e.g., await expect.poll(() => bottomPanel.root.evaluate(el =>
el.getBoundingClientRect().height)).toBeGreaterThan(initialHeight)). Update the
code that references newHeight and initialHeight accordingly so the assertion
retries instead of using a single immediate evaluate result.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 9cffeafc-4b7d-447e-8967-313385e04923
📒 Files selected for processing (2)
browser_tests/fixtures/components/BottomPanel.tsbrowser_tests/tests/bottomPanel.spec.ts
Replace unreliable double-click-to-open-search-box assertion with a simple canvas click. Playwright's actionability checks already verify the element is not obscured by an invisible overlay, which is what the test intends to guard against.
There was a problem hiding this comment.
♻️ Duplicate comments (2)
browser_tests/tests/bottomPanel.spec.ts (2)
81-85:⚠️ Potential issue | 🟠 MajorDo not
test.skip()when gutter geometry is null in a resize test.Line 81–85 currently hides a real layout/render regression. For this scenario, fail explicitly instead of skipping.
Suggested fix
const gutterBox = await bottomPanel.resizeGutter.boundingBox() if (!gutterBox) { - test.skip() - return + throw new Error('Resize gutter should be visible') }As per coding guidelines: “Follow Playwright best practices documented in Playwright documentation.”
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@browser_tests/tests/bottomPanel.spec.ts` around lines 81 - 85, The current guard around bottomPanel.resizeGutter.boundingBox() calls test.skip() when gutterBox is null; instead fail the test explicitly so layout regressions surface. Replace the test.skip() branch in the block that reads bottomPanel.resizeGutter.boundingBox() with an explicit assertion or throw (e.g., use Playwright's expect(gutterBox).not.toBeNull() or throw new Error('resize gutter boundingBox is null')) so the test fails with a clear message referencing bottomPanel.resizeGutter.boundingBox().
31-36:⚠️ Potential issue | 🟠 MajorReplace Logs-tab catch/skip branches with hard assertions.
These branches allow false-pass outcomes (especially Line 136–140 and Line 185–188) when Logs/terminal tabs are missing. Since these tests validate terminal-panel core behavior, missing Logs should fail the test immediately.
Suggested fix pattern
-const hasLogsTab = await logsTab.isVisible().catch(() => false) -if (!hasLogsTab) { - test.skip() - return -} +await expect(logsTab).toBeVisible()-const hasTerminalTabs = await logsTab.isVisible().catch(() => false) -if (hasTerminalTabs) { - await expect(bottomPanel.shortcuts.essentialsTab).not.toBeVisible() - await expect(logsTab).toBeVisible() -} +await expect(logsTab).toBeVisible() +await expect(bottomPanel.shortcuts.essentialsTab).not.toBeVisible()As per coding guidelines: “Follow Playwright best practices documented in Playwright documentation.”
Also applies to: 133-140, 152-157, 183-188
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@browser_tests/tests/bottomPanel.spec.ts` around lines 31 - 36, The current pattern uses logsTab.isVisible().catch(()=>false) and conditional test.skip(), which allows false-pass when the Logs/Terminal tab is missing; replace these with hard Playwright assertions: remove the .catch and test.skip logic, and assert presence using await expect(logsTab).toBeVisible() (or await logsTab.waitFor({ state: 'visible', timeout: <reasonable ms> })) so the test fails immediately if the tab is absent; apply the same replacement for the other occurrences that use hasLogsTab (the other blocks around the terminal/Logs checks) and ensure you import/use Playwright's expect in bottomPanel.spec.ts.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Duplicate comments:
In `@browser_tests/tests/bottomPanel.spec.ts`:
- Around line 81-85: The current guard around
bottomPanel.resizeGutter.boundingBox() calls test.skip() when gutterBox is null;
instead fail the test explicitly so layout regressions surface. Replace the
test.skip() branch in the block that reads
bottomPanel.resizeGutter.boundingBox() with an explicit assertion or throw
(e.g., use Playwright's expect(gutterBox).not.toBeNull() or throw new
Error('resize gutter boundingBox is null')) so the test fails with a clear
message referencing bottomPanel.resizeGutter.boundingBox().
- Around line 31-36: The current pattern uses
logsTab.isVisible().catch(()=>false) and conditional test.skip(), which allows
false-pass when the Logs/Terminal tab is missing; replace these with hard
Playwright assertions: remove the .catch and test.skip logic, and assert
presence using await expect(logsTab).toBeVisible() (or await logsTab.waitFor({
state: 'visible', timeout: <reasonable ms> })) so the test fails immediately if
the tab is absent; apply the same replacement for the other occurrences that use
hasLogsTab (the other blocks around the terminal/Logs checks) and ensure you
import/use Playwright's expect in bottomPanel.spec.ts.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: fa3b3cce-1b4b-4a30-b26a-a122e4639897
📒 Files selected for processing (1)
browser_tests/tests/bottomPanel.spec.ts
Remove tab persistence, shortcuts↔terminal switching, and terminal tabs tests — already covered in bottomPanelLogs.spec.ts and bottomPanelShortcuts.spec.ts. Keep only unique tests: close button, resize gutter, drag resize, canvas not blocked.
There was a problem hiding this comment.
♻️ Duplicate comments (1)
browser_tests/tests/bottomPanel.spec.ts (1)
52-56:⚠️ Potential issue | 🟠 MajorDo not skip when a visible resize gutter has no geometry
test.skip()here can hide a real rendering/layout regression. If the gutter is expected visible, fail loudly instead of skipping.✅ Suggested fix
- const gutterBox = await bottomPanel.resizeGutter.boundingBox() - if (!gutterBox) { - test.skip() - return - } + const gutterBox = await bottomPanel.resizeGutter.boundingBox() + expect(gutterBox, 'Resize gutter should be visible').not.toBeNull() + if (!gutterBox) { + throw new Error('Resize gutter should be visible') + }As per coding guidelines,
browser_tests/**/*.spec.tsshould follow Playwright best practices fromdocs/guidance/playwright.md.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@browser_tests/tests/bottomPanel.spec.ts` around lines 52 - 56, The test currently calls test.skip() when bottomPanel.resizeGutter.boundingBox() returns null which hides potential rendering regressions; instead, assert or throw so the test fails loudly: replace the conditional that calls test.skip() with a failing assertion (e.g., assert/expect that gutterBox is not null) or throw a descriptive Error referencing bottomPanel.resizeGutter.boundingBox(), so the test fails if the visible gutter has no geometry; update the code path around bottomPanel.resizeGutter.boundingBox() accordingly and keep the visible-gutter expectation explicit per Playwright guidance.
🧹 Nitpick comments (1)
browser_tests/tests/bottomPanel.spec.ts (1)
81-83: Make the “panel is closed” precondition explicitThis test currently depends on default initial UI state. Explicitly close the panel if needed so the behavior under test remains stable if defaults change.
🔧 Suggested refinement
- // Ensure panel is closed - await expect(bottomPanel.root).not.toBeVisible() + // Ensure panel is closed regardless of initial default state + if (await bottomPanel.root.isVisible()) { + await bottomPanel.closeButton.click() + } + await expect(bottomPanel.root).not.toBeVisible()As per coding guidelines,
browser_tests/**/*.spec.tsshould follow Playwright best practices documented in@docs/guidance/playwright.md.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@browser_tests/tests/bottomPanel.spec.ts` around lines 81 - 83, The test relies on implicit UI state; make the "panel is closed" precondition explicit by checking bottomPanel.root visibility and closing it if visible before the assertion—e.g., use bottomPanel.close() (or click the panel's close control such as bottomPanel.closeButton) or call an ensureClosed helper: if (await bottomPanel.root.isVisible()) await bottomPanel.close(); then assert await expect(bottomPanel.root).not.toBeVisible().
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Duplicate comments:
In `@browser_tests/tests/bottomPanel.spec.ts`:
- Around line 52-56: The test currently calls test.skip() when
bottomPanel.resizeGutter.boundingBox() returns null which hides potential
rendering regressions; instead, assert or throw so the test fails loudly:
replace the conditional that calls test.skip() with a failing assertion (e.g.,
assert/expect that gutterBox is not null) or throw a descriptive Error
referencing bottomPanel.resizeGutter.boundingBox(), so the test fails if the
visible gutter has no geometry; update the code path around
bottomPanel.resizeGutter.boundingBox() accordingly and keep the visible-gutter
expectation explicit per Playwright guidance.
---
Nitpick comments:
In `@browser_tests/tests/bottomPanel.spec.ts`:
- Around line 81-83: The test relies on implicit UI state; make the "panel is
closed" precondition explicit by checking bottomPanel.root visibility and
closing it if visible before the assertion—e.g., use bottomPanel.close() (or
click the panel's close control such as bottomPanel.closeButton) or call an
ensureClosed helper: if (await bottomPanel.root.isVisible()) await
bottomPanel.close(); then assert await
expect(bottomPanel.root).not.toBeVisible().
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 6093c26f-7ceb-4b6b-8db8-8fabfe8acd2a
📒 Files selected for processing (1)
browser_tests/tests/bottomPanel.spec.ts
Per CodeRabbit review: after toBeVisible(), boundingBox() returning null is a real failure, not an environment variance.
Summary
browser_tests/tests/bottomPanel.spec.tswith tests for behaviors not covered by existingbottomPanelLogsandbottomPanelShortcutsspecsBottomPanelfixture withcloseButtonandresizeGutterlocatorsTest plan
pnpm test:browser:localpasses all new tests inbottomPanel.spec.tsbottomPanelLogs.spec.tsandbottomPanelShortcuts.spec.tsare unaffectedpnpm typecheck:browserpassespnpm lintpasses┆Issue is synchronized with this Notion page by Unito