Skip to content

Commit b24bda9

Browse files
authored
use textbox instead of div for accessibility buffer (#4377)
1 parent 9895691 commit b24bda9

File tree

1 file changed

+13
-15
lines changed

1 file changed

+13
-15
lines changed

src/browser/AccessibilityManager.ts

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export class AccessibilityManager extends Disposable {
2828
private _rowElements: HTMLElement[];
2929
private _liveRegion: HTMLElement;
3030
private _liveRegionLineCount: number = 0;
31-
private _accessiblityBuffer: HTMLElement;
31+
private _accessiblityBuffer: HTMLTextAreaElement;
3232

3333
private _renderRowsDebouncer: IRenderDebouncer;
3434
private _screenDprMonitor: ScreenDprMonitor;
@@ -89,7 +89,7 @@ export class AccessibilityManager extends Disposable {
8989
throw new Error('Cannot enable accessibility before Terminal.open');
9090
}
9191

92-
this._accessiblityBuffer = document.createElement('div');
92+
this._accessiblityBuffer = document.createElement('textarea');
9393
this._accessiblityBuffer.ariaLabel = Strings.accessibilityBuffer;
9494
this._accessiblityBuffer.classList.add('xterm-accessibility-buffer');
9595
this._accessiblityBuffer.contentEditable = 'true';
@@ -323,25 +323,23 @@ export class AccessibilityManager extends Disposable {
323323
return;
324324
}
325325

326-
const { bufferElements, cursorElement } = this._terminal.viewport.getBufferElements(0);
326+
const { bufferElements } = this._terminal.viewport.getBufferElements(0);
327+
const content = [];
327328
for (const element of bufferElements) {
328329
if (element.textContent) {
329-
element.textContent = element.textContent.replace(new RegExp(' ', 'g'), '\xA0');
330+
content.push(element.textContent.replace(new RegExp(' ', 'g'), '\xA0'));
330331
}
331332
}
332-
this._accessiblityBuffer.ariaRoleDescription = 'document';
333-
this._accessiblityBuffer.replaceChildren(...bufferElements);
333+
this._accessiblityBuffer.textContent = content.join('\n');
334+
this._accessiblityBuffer.tabIndex = 0;
335+
this._accessiblityBuffer.ariaRoleDescription = 'textbox';
336+
this._accessibilityTreeRoot.spellcheck = false;
334337
this._accessiblityBuffer.scrollTop = this._accessiblityBuffer.scrollHeight;
335-
const s = document.getSelection();
336-
if (s && cursorElement) {
337-
s.removeAllRanges();
338-
const r = document.createRange();
339-
r.selectNode(bufferElements[bufferElements.length - 1]);
340-
r.setStart(cursorElement, 0);
341-
r.setEnd(cursorElement, 0);
342-
s.addRange(r);
343-
}
344338
this._accessiblityBuffer.focus();
339+
340+
const end = this._accessiblityBuffer.value.length;
341+
this._accessiblityBuffer.scrollTop = this._accessiblityBuffer.scrollHeight;
342+
this._accessiblityBuffer.setSelectionRange(end, end);
345343
}
346344

347345
private _handleColorChange(colorSet: ReadonlyColorSet): void {

0 commit comments

Comments
 (0)