From 0f04f9fbb4951c1a81d210f61d0fd0323e32c1b7 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 17 Jan 2018 14:10:03 -0800 Subject: [PATCH] Rotate rows to ensure an item will be read in nav mode when scrolling --- src/AccessibilityManager.ts | 19 +++++++++++++++++-- src/Interfaces.ts | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/AccessibilityManager.ts b/src/AccessibilityManager.ts index e36efbec..a958d10b 100644 --- a/src/AccessibilityManager.ts +++ b/src/AccessibilityManager.ts @@ -187,14 +187,24 @@ export class AccessibilityManager implements IDisposable { private _renderRows(start: number, end: number): void { const buffer: IBuffer = (this._terminal.buffer); + const setSize = (buffer.lines.length).toString(); for (let i = start; i <= end; i++) { const lineData = buffer.translateBufferLineToString(buffer.ydisp + i, true); this._rowElements[i].textContent = lineData; - this._rowElements[i].setAttribute('aria-posinset', (buffer.ydisp + i + 1).toString()); - this._rowElements[i].setAttribute('aria-setsize', (buffer.lines.length).toString()); + const posInSet = (buffer.ydisp + i + 1).toString(); + this._rowElements[i].setAttribute('aria-posinset', posInSet); + this._rowElements[i].setAttribute('aria-setsize', setSize); } } + public rotateRows(): void { + this._rowContainer.removeChild(this._rowElements.shift()); + const newRowIndex = this._rowElements.length; + this._rowElements[newRowIndex] = this._createAccessibilityTreeNode(); + this._rowContainer.appendChild(this._rowElements[newRowIndex]); + this._refreshRowsDimensions(); + } + private _refreshRowsDimensions(): void { const buffer: IBuffer = (this._terminal.buffer); const dimensions = this._terminal.renderer.dimensions; @@ -342,6 +352,11 @@ class NavigationMode implements IDisposable { } private _navigateToElement(absoluteRow: number): void { + if (absoluteRow < this._terminal.buffer.ydisp || absoluteRow >= this._terminal.buffer.ydisp + this._terminal.rows) { + // Rotate rows to ensure the next focused item is read out correctly + this._accessibilityManager.rotateRows(); + } + absoluteRow = this._terminal.scrollToRow(absoluteRow); if (this._focusedElement) { diff --git a/src/Interfaces.ts b/src/Interfaces.ts index 4dc572d1..a1623a67 100644 --- a/src/Interfaces.ts +++ b/src/Interfaces.ts @@ -251,7 +251,7 @@ export interface IEventEmitter { export interface IListenerType { (data?: any): void; listener?: (data?: any) => void; -}; +} export interface ILinkMatcherOptions { /**