From f33f502267455f40e64a89a6a554b8d6beae6284 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sat, 6 Jun 2026 09:09:32 -0700 Subject: [PATCH] fix(DomRenderer): resilience when buffer lines are missing (#5998) * fix(DomRenderer): skip missing buffer lines during row render renderRows and link underline refresh stopped updating when any viewport row lacked buffer data, leaving stale DOM on rows below. Match ImageStorage.render behavior: clear the row element when present and continue with remaining rows. Co-authored-by: Cursor * fix(DomRenderer): clear blink state when skipping missing lines When a viewport row has no buffer line, renderRows clears the row DOM and continues but did not reset _rowHasBlinkingCells for that row. That could leave the text blink manager thinking blinking cells remain after the row was emptied. Clear blink state for the row when skipping a missing buffer line, including during link underline refresh. Co-authored-by: Cursor --------- Co-authored-by: Cursor --- src/browser/renderer/dom/DomRenderer.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/browser/renderer/dom/DomRenderer.ts b/src/browser/renderer/dom/DomRenderer.ts index 383cf3025..657217f71 100644 --- a/src/browser/renderer/dom/DomRenderer.ts +++ b/src/browser/renderer/dom/DomRenderer.ts @@ -536,9 +536,14 @@ export class DomRenderer extends Disposable implements IRenderer { for (let y = start; y <= end; y++) { const row = y + buffer.ydisp; const rowElement = this._rowElements[y]; + if (!rowElement) { + continue; + } const lineData = buffer.lines.get(row); - if (!rowElement || !lineData) { - break; + if (!lineData) { + rowElement.replaceChildren(); + this._setRowBlinkState(y, false); + continue; } rowElement.replaceChildren( ...this._rowFactory.createRow( @@ -610,9 +615,14 @@ export class DomRenderer extends Disposable implements IRenderer { for (let i = y; i <= y2; ++i) { const row = i + buffer.ydisp; const rowElement = this._rowElements[i]; + if (!rowElement) { + continue; + } const bufferline = buffer.lines.get(row); - if (!rowElement || !bufferline) { - break; + if (!bufferline) { + rowElement.replaceChildren(); + this._setRowBlinkState(i, false); + continue; } rowElement.replaceChildren( ...this._rowFactory.createRow(