test: pin literal rendering of HTML in node-search results - #15656
test: pin literal rendering of HTML in node-search results#15656christian-byrne wants to merge 1 commit into
Conversation
The search result label reassembles a node's display name around the query, making the display name the one place arbitrary text reaches that DOM. Rendering those runs as markup would turn a node name into live HTML; eslint bans v-html under src/components/searchbox/, but a raw innerHTML assignment would slip past it. Injects a node whose display name carries an img/onerror payload and asserts it survives as text with no element created. Complements the component-level test by covering the object_info -> node-def store -> v2 search dialog path. Part of the QA test plan for cloud 1.50 -> 1.51 (Node Search Highlights).
🎭 Playwright: ✅ 1978 passed, 0 failed · 3 flaky📊 Browser Reports
📦 Bundle: 9.11 MB gzip ⚪ 0 BDetailsSummary
Category Glance App Entry Points — 3.71 kB (baseline 3.71 kB) • ⚪ 0 BMain entry bundles and manifests Status: 1 unchanged Graph Workspace — 1.37 MB (baseline 1.37 MB) • ⚪ 0 BGraph editor runtime, canvas, workflow orchestration Status: 3 unchanged Views & Navigation — 124 kB (baseline 124 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces Status: 17 unchanged Panels & Settings — 591 kB (baseline 591 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens Status: 27 unchanged User & Accounts — 27.5 kB (baseline 27.5 kB) • ⚪ 0 BAuthentication, profile, and account management bundles Status: 11 unchanged Editors & Dialogs — 125 kB (baseline 125 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors Status: 8 unchanged UI Components — 67.1 kB (baseline 67.1 kB) • ⚪ 0 BReusable component library chunks Status: 14 unchanged Data & Services — 3.53 MB (baseline 3.53 MB) • ⚪ 0 BStores, services, APIs, and repositories Status: 17 unchanged Utilities & Hooks — 549 kB (baseline 549 kB) • ⚪ 0 BHelpers, composables, and utility bundles Status: 37 unchanged Vendor & Third-Party — 18.1 MB (baseline 18.1 MB) • ⚪ 0 BExternal libraries and shared vendor chunks Status: 18 unchanged Other — 14.1 MB (baseline 14.1 MB) • ⚪ 0 BBundles that do not match a named category Status: 285 unchanged ⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-08-23T00:32:43.370Z",
"gitSha": "696feab8d0029b6f54ab58b3f7965c3f47c47c83",
"branch": "glary/test-node-search-html-escaping",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2070.6969999999956,
"styleRecalcs": 10,
"styleRecalcDurationMs": 5.88,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 398.723,
"heapDeltaBytes": -1582108,
"heapUsedBytes": 60477324,
"domNodes": -280,
"jsHeapTotalBytes": 2875392,
"scriptDurationMs": 6.778000000000001,
"eventListeners": -181,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-idle",
"durationMs": 2008.6740000000418,
"styleRecalcs": 10,
"styleRecalcDurationMs": 4.872000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 365.923,
"heapDeltaBytes": 2358980,
"heapUsedBytes": 65145720,
"domNodes": -282,
"jsHeapTotalBytes": 3137536,
"scriptDurationMs": 5.527000000000001,
"eventListeners": -179,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1711.9470000000092,
"styleRecalcs": 71,
"styleRecalcDurationMs": 24.874999999999993,
"layouts": 12,
"layoutDurationMs": 3.272,
"taskDurationMs": 637.788,
"heapDeltaBytes": 10909844,
"heapUsedBytes": 73203632,
"domNodes": -282,
"jsHeapTotalBytes": 5496832,
"scriptDurationMs": 75.314,
"eventListeners": -179,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1694.874000000027,
"styleRecalcs": 71,
"styleRecalcDurationMs": 18.735000000000003,
"layouts": 12,
"layoutDurationMs": 1.9000000000000001,
"taskDurationMs": 568.41,
"heapDeltaBytes": -6687952,
"heapUsedBytes": 55746652,
"domNodes": -280,
"jsHeapTotalBytes": 4710400,
"scriptDurationMs": 60.31299999999999,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1727.628999999979,
"styleRecalcs": 31,
"styleRecalcDurationMs": 12.022,
"layouts": 6,
"layoutDurationMs": 0.662,
"taskDurationMs": 258.62,
"heapDeltaBytes": 2452088,
"heapUsedBytes": 64075400,
"domNodes": 76,
"jsHeapTotalBytes": 4456448,
"scriptDurationMs": 7.462999999999999,
"eventListeners": 21,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1657.3890000000802,
"styleRecalcs": 32,
"styleRecalcDurationMs": 11.193,
"layouts": 6,
"layoutDurationMs": 0.5870000000000001,
"taskDurationMs": 255.314,
"heapDeltaBytes": 2944388,
"heapUsedBytes": 65610740,
"domNodes": 78,
"jsHeapTotalBytes": 4456448,
"scriptDurationMs": 6.205999999999998,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 425.28099999998403,
"styleRecalcs": 12,
"styleRecalcDurationMs": 5.760000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 260.519,
"heapDeltaBytes": 10790340,
"heapUsedBytes": 72936684,
"domNodes": 20,
"jsHeapTotalBytes": 5242880,
"scriptDurationMs": 36.199,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000273
},
{
"name": "dom-widget-clipping",
"durationMs": 407.367000000022,
"styleRecalcs": 12,
"styleRecalcDurationMs": 4.6770000000000005,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 233.232,
"heapDeltaBytes": 9349988,
"heapUsedBytes": 71925248,
"domNodes": 20,
"jsHeapTotalBytes": 4194304,
"scriptDurationMs": 29.018,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999727
},
{
"name": "large-graph-idle",
"durationMs": 2024.1960000000176,
"styleRecalcs": 10,
"styleRecalcDurationMs": 6.000000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 489.46500000000003,
"heapDeltaBytes": -14056396,
"heapUsedBytes": 61984464,
"domNodes": -282,
"jsHeapTotalBytes": 4452352,
"scriptDurationMs": 18.816,
"eventListeners": -179,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2020.815999999968,
"styleRecalcs": 11,
"styleRecalcDurationMs": 4.927999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 416.1499999999999,
"heapDeltaBytes": -14071976,
"heapUsedBytes": 62193928,
"domNodes": -278,
"jsHeapTotalBytes": 3665920,
"scriptDurationMs": 8.568,
"eventListeners": -179,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-pan",
"durationMs": 2108.6329999999975,
"styleRecalcs": 69,
"styleRecalcDurationMs": 13.043,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 881.6820000000001,
"heapDeltaBytes": -5625700,
"heapUsedBytes": 71963800,
"domNodes": -240,
"jsHeapTotalBytes": 221184,
"scriptDurationMs": 249.70999999999998,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-pan",
"durationMs": 2076.8410000000586,
"styleRecalcs": 70,
"styleRecalcDurationMs": 9.522,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 750.4350000000001,
"heapDeltaBytes": -6098732,
"heapUsedBytes": 71519972,
"domNodes": -234,
"jsHeapTotalBytes": -40960,
"scriptDurationMs": 198.46800000000002,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3106.7979999999693,
"styleRecalcs": 67,
"styleRecalcDurationMs": 15.636999999999999,
"layouts": 60,
"layoutDurationMs": 8.01,
"taskDurationMs": 1067.394,
"heapDeltaBytes": -15791564,
"heapUsedBytes": 63106296,
"domNodes": 16,
"jsHeapTotalBytes": 4714496,
"scriptDurationMs": 283.339,
"eventListeners": -183,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-zoom",
"durationMs": 3056.155999999987,
"styleRecalcs": 66,
"styleRecalcDurationMs": 10.735999999999999,
"layouts": 60,
"layoutDurationMs": 5.468,
"taskDurationMs": 889.954,
"heapDeltaBytes": -8220032,
"heapUsedBytes": 69861068,
"domNodes": 16,
"jsHeapTotalBytes": 6590464,
"scriptDurationMs": 234.804,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "legacy-node-drag",
"durationMs": 2119.657000000018,
"styleRecalcs": 47,
"styleRecalcDurationMs": 8.869,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1019.4129999999999,
"heapDeltaBytes": -16938732,
"heapUsedBytes": 69743812,
"domNodes": 14,
"jsHeapTotalBytes": 8163328,
"scriptDurationMs": 316.041,
"eventListeners": 184,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "legacy-node-drag",
"durationMs": 2048.383999999942,
"styleRecalcs": 47,
"styleRecalcDurationMs": 6.148000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 882.4830000000001,
"heapDeltaBytes": -17080956,
"heapUsedBytes": 69785608,
"domNodes": 14,
"jsHeapTotalBytes": 8687616,
"scriptDurationMs": 270.87300000000005,
"eventListeners": 184,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "minimap-idle",
"durationMs": 2052.120000000002,
"styleRecalcs": 9,
"styleRecalcDurationMs": 4.5249999999999995,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 463.33399999999995,
"heapDeltaBytes": -12887728,
"heapUsedBytes": 64818056,
"domNodes": -285,
"jsHeapTotalBytes": 2879488,
"scriptDurationMs": 14.403999999999996,
"eventListeners": -179,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "minimap-idle",
"durationMs": 1998.5160000001088,
"styleRecalcs": 9,
"styleRecalcDurationMs": 3.8719999999999986,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 424.86999999999995,
"heapDeltaBytes": -13246956,
"heapUsedBytes": 64453736,
"domNodes": -282,
"jsHeapTotalBytes": 3403776,
"scriptDurationMs": 9.817,
"eventListeners": -177,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 429.95500000000675,
"styleRecalcs": 46,
"styleRecalcDurationMs": 7.024000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 257.49300000000005,
"heapDeltaBytes": 11586656,
"heapUsedBytes": 73867288,
"domNodes": 18,
"jsHeapTotalBytes": 5242880,
"scriptDurationMs": 74.94800000000001,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.663333333333338,
"p95FrameDurationMs": 16.799999999999727
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 389.3710000000965,
"styleRecalcs": 47,
"styleRecalcDurationMs": 6.284,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 247.35800000000003,
"heapDeltaBytes": 11895212,
"heapUsedBytes": 73917412,
"domNodes": 20,
"jsHeapTotalBytes": 5505024,
"scriptDurationMs": 66.436,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000273
},
{
"name": "subgraph-idle",
"durationMs": 2007.9279999999926,
"styleRecalcs": 10,
"styleRecalcDurationMs": 5.3229999999999995,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 379.915,
"heapDeltaBytes": -4168508,
"heapUsedBytes": 58419260,
"domNodes": -281,
"jsHeapTotalBytes": 4186112,
"scriptDurationMs": 6.273000000000001,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 2005.8340000000499,
"styleRecalcs": 10,
"styleRecalcDurationMs": 4.9750000000000005,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 344.387,
"heapDeltaBytes": 1292320,
"heapUsedBytes": 63742880,
"domNodes": -279,
"jsHeapTotalBytes": 4186112,
"scriptDurationMs": 4.360999999999999,
"eventListeners": -181,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1710.899999999981,
"styleRecalcs": 75,
"styleRecalcDurationMs": 28.781000000000002,
"layouts": 16,
"layoutDurationMs": 4.33,
"taskDurationMs": 659.0780000000001,
"heapDeltaBytes": -4361856,
"heapUsedBytes": 58221520,
"domNodes": -282,
"jsHeapTotalBytes": 5234688,
"scriptDurationMs": 70.693,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1689.1120000000228,
"styleRecalcs": 76,
"styleRecalcDurationMs": 19.855999999999998,
"layouts": 16,
"layoutDurationMs": 2.4419999999999997,
"taskDurationMs": 523.0239999999999,
"heapDeltaBytes": 5696988,
"heapUsedBytes": 68384240,
"domNodes": -278,
"jsHeapTotalBytes": 4710400,
"scriptDurationMs": 45.83,
"eventListeners": -181,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-transition-enter",
"durationMs": 849.5460000000321,
"styleRecalcs": 20,
"styleRecalcDurationMs": 20.587999999999994,
"layouts": 15,
"layoutDurationMs": 8.32,
"taskDurationMs": 593.8190000000001,
"heapDeltaBytes": 22302248,
"heapUsedBytes": 105261040,
"domNodes": 13673,
"jsHeapTotalBytes": 11534336,
"scriptDurationMs": 10.026,
"eventListeners": 2373,
"totalBlockingTimeMs": 86,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8082.4440000000095,
"styleRecalcs": 250,
"styleRecalcDurationMs": 38.029999999999994,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3028.343,
"heapDeltaBytes": 2981840,
"heapUsedBytes": 79600000,
"domNodes": -235,
"jsHeapTotalBytes": 745472,
"scriptDurationMs": 777.273,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333338,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "viewport-pan-sweep",
"durationMs": 8104.668000000061,
"styleRecalcs": 251,
"styleRecalcDurationMs": 24.126999999999995,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 2616.466,
"heapDeltaBytes": 3869000,
"heapUsedBytes": 80702280,
"domNodes": -236,
"jsHeapTotalBytes": 483328,
"scriptDurationMs": 628.948,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 11764.023000000008,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 10784.462000000001,
"heapDeltaBytes": -47485668,
"heapUsedBytes": 177835856,
"domNodes": -8312,
"jsHeapTotalBytes": -15478784,
"scriptDurationMs": 66.71300000000001,
"eventListeners": -16393,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.220000000000073,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 9840.965000000097,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 8871.442000000001,
"heapDeltaBytes": -49886624,
"heapUsedBytes": 176076100,
"domNodes": -8313,
"jsHeapTotalBytes": -18624512,
"scriptDurationMs": 49.49000000000001,
"eventListeners": -16393,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.219999999999953,
"p95FrameDurationMs": 16.80000000000291
},
{
"name": "vue-large-graph-pan",
"durationMs": 14025.629000000037,
"styleRecalcs": 71,
"styleRecalcDurationMs": 14.19999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 13266.510999999999,
"heapDeltaBytes": -45290216,
"heapUsedBytes": 180778752,
"domNodes": -8317,
"jsHeapTotalBytes": -17383424,
"scriptDurationMs": 361.908,
"eventListeners": -16389,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-pan",
"durationMs": 13450.796999999966,
"styleRecalcs": 69,
"styleRecalcDurationMs": 13.60800000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 12621.886,
"heapDeltaBytes": -53070356,
"heapUsedBytes": 172892920,
"domNodes": -8312,
"jsHeapTotalBytes": -18624512,
"scriptDurationMs": 320.359,
"eventListeners": -16389,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.223333333333358,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "workflow-execution",
"durationMs": 454.0789999999788,
"styleRecalcs": 20,
"styleRecalcDurationMs": 17.312,
"layouts": 3,
"layoutDurationMs": 1.417,
"taskDurationMs": 101.078,
"heapDeltaBytes": 5315456,
"heapUsedBytes": 67603804,
"domNodes": 154,
"jsHeapTotalBytes": 0,
"scriptDurationMs": 8.635,
"eventListeners": 99,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "workflow-execution",
"durationMs": 424.7970000000123,
"styleRecalcs": 14,
"styleRecalcDurationMs": 12.603,
"layouts": 3,
"layoutDurationMs": 0.515,
"taskDurationMs": 76.54899999999999,
"heapDeltaBytes": 4931032,
"heapUsedBytes": 67498792,
"domNodes": 123,
"jsHeapTotalBytes": 0,
"scriptDurationMs": 5.034000000000001,
"eventListeners": 97,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000273
}
]
} |
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 58 minutes Limit details: You’ve used the included review currently available. Your 92 included PR review attempts over the past 7 days set your current allowance at 1 review per hour. Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?Wait for the limit to reset, then comment An organization admin can change what happens after included review limits in Billing. How do review limits work?CodeRabbit enforces per-developer PR review limits within each organization. For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
Comment |
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## main #15656 +/- ##
==========================================
+ Coverage 79.39% 81.85% +2.46%
==========================================
Files 2217 1887 -330
Lines 112188 107227 -4961
Branches 35091 34361 -730
==========================================
- Hits 89069 87774 -1295
+ Misses 22640 19116 -3524
+ Partials 479 337 -142
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
|
Thanks — the review landed as approved with "No actionable comments were generated", so there's nothing for me to change here. No code pushed. Two things worth recording now that CI has finished, since both were open questions when I opened this: 1. The runtime concern is resolved. I flagged in the description that the 2. The one red check is On the "End-To-End Regression Coverage For Fixes" pre-merge check coming back inconclusive: that rule looks for e2e coverage accompanying a bug fix. This PR fixes no bug — it is e2e coverage — so the condition doesn't apply. CodeRabbit reported it couldn't read the PR title/commit subjects rather than finding an actual gap. For reviewers, the substantive claim to check is that the test isn't a vacuous pass. I verified that by mutation: deleting the modifier exemption in |
|
Noting for the record: CodeRabbit didn't actually review this one — it hit the org's Fair Usage rate limit ("Review limit reached", next slot in ~58 min) and posted the limit notice instead of findings. So there's no feedback to address and I've pushed nothing. It should pick this up automatically on the next reset or on a new commit. Meanwhile CI has finished and is clean, which covers the main risk I called out in the description:
That resolves the open question from the description: I could only verify this locally in a slow sandbox where the run took ~23s with a raised The claim most worth a reviewer's attention is that the test can actually fail. I checked by mutation: switching Also flagging one judgement call explicitly, since it's the part I'd most want challenged: the QA plan phrases this item as "type a query containing HTML characters", but the query never reaches the DOM — |
|
Thanks — the review landed as approved with "No actionable comments were generated", so there's nothing for me to change here. No code pushed. Two things worth recording now that CI has finished, since both were open questions when I opened this: 1. The runtime concern is resolved. I flagged in the description that the 2. The one red check is On the "End-To-End Regression Coverage For Fixes" pre-merge check coming back inconclusive: that rule looks for e2e coverage accompanying a bug fix. This PR fixes no bug — it is e2e coverage — so the condition doesn't apply. CodeRabbit reported it couldn't read the PR title/commit subjects rather than finding an actual gap. For reviewers, the substantive claim to check is that the test isn't a vacuous pass. I verified that by mutation: deleting the modifier exemption in (Apologies for the noise — an earlier copy of this comment went to #15656 by mistake.) |
|
Correction: the comment above beginning "Thanks — the review landed as approved…" was misfiled. It belongs to #15655 (the video-asset multi-select PR) and has been reposted there. Please disregard it on this PR — CodeRabbit has not approved #15656; it was rate-limited before it could review. The comment that does apply to this PR is the one beginning "Noting for the record: CodeRabbit didn't actually review this one…". |
|
Final correction, and then I'll stop adding noise here — apologies for the clutter. What applies to this PR (#15656): only the comment beginning "Noting for the record: CodeRabbit didn't actually review this one…". CodeRabbit was rate-limited on this PR and has not reviewed it. No approval, no findings, no code pushed. What does not apply: the two duplicated comments beginning "Thanks — the review landed as approved…". Those describe #15655 and were posted here by mistake. My correction just above them claimed they had been "reposted there" — that turned out to be wrong too: my commenting tool resolves to this PR regardless of which branch I'm on, so the retry landed here as well. I can't delete them, hence this note. Nothing in those two comments should be read as applying to #15656. Substance that does apply to this PR, unchanged: CI is green — all 16 |
PR Created by the Glary-Bot Agent
Automates one item from the QA test plan for cloud 1.50 → 1.51 (Node Search Highlights, #14789):
A note on what the plan item actually means
The plan phrases this as a property of the query, but the query never reaches the DOM:
highlightQuery()only ever emits slices of the node's display name, split around the match. So the display name is the real injection point, and asserting on the query would be vacuous. This test targets the display name and says so in the file header.What it asserts
Patches
object_info(via the existingrouteObjectInfoFromSetupApi) to add a node whose display name carries an<img src=x onerror=...>payload, then searches for it and asserts:imgelement was createdonerroris used deliberately — a payload that gets parsed cannot pass silently.Why an e2e when a unit test exists
NodeSearchListItem.test.tsalready covers escaping at the component level, and this does not replace it. The layer it adds is the one the unit test cannot reach: a node definition travelling fromobject_infothrough the node-def store into the v2 search dialog.eslintbansv-htmlundersrc/components/searchbox/, but a rawinnerHTMLassignment anywhere along that path would slip past both the linter and the component test.Verification
HighlightedText.vuetov-htmlturns the test red — the payload is parsed as markup and disappears from the rendered text ("HtmlEscapingProbe Comfytesting"). It is not a vacuous pass.pnpm lint,pnpm format:check,pnpm typecheckclean.The node-cloning helper is added to
browser_tests/fixtures/utils/objectInfo.tsalongside the existingobject_infomutators rather than living in the spec.Screenshots