From eaf18ad3377e4113c741b92ccb2544ad675681fe Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 09:34:41 +0200 Subject: [PATCH] Adopt accessibilitySupportEnabled in the editor (#26730) --- src/vs/base/browser/browser.ts | 21 +-- src/vs/base/common/platform.ts | 11 ++ src/vs/editor/browser/config/configuration.ts | 4 +- .../browser/controller/textAreaHandler.ts | 28 +++- src/vs/editor/browser/view/viewImpl.ts | 7 +- .../browser/viewParts/lines/viewLines.ts | 9 +- .../common/config/commonEditorConfig.ts | 4 +- src/vs/editor/common/config/editorOptions.ts | 126 ++++++++++++++++-- src/vs/editor/common/view/viewEvents.ts | 2 + .../common/config/commonEditorConfig.test.ts | 4 +- .../test/common/mocks/testConfiguration.ts | 4 +- src/vs/monaco.d.ts | 1 + .../browser/parts/editor/editorStatus.ts | 6 +- src/vs/workbench/electron-browser/main.ts | 2 +- src/vs/workbench/electron-browser/window.ts | 2 +- 15 files changed, 175 insertions(+), 56 deletions(-) diff --git a/src/vs/base/browser/browser.ts b/src/vs/base/browser/browser.ts index 633a3a4d25e..447f4fe3b2c 100644 --- a/src/vs/base/browser/browser.ts +++ b/src/vs/base/browser/browser.ts @@ -8,17 +8,6 @@ import * as Platform from 'vs/base/common/platform'; import Event, { Emitter } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; -export const enum AccessibilitySupport { - /** - * This should be the browser case where it is not known if a screen reader is attached or no. - */ - Unknown = 0, - - Disabled = 1, - - Enabled = 2 -} - class WindowManager { public static INSTANCE = new WindowManager(); @@ -88,11 +77,11 @@ class WindowManager { } // --- Accessibility - private _accessibilitySupport = AccessibilitySupport.Unknown; + private _accessibilitySupport = Platform.AccessibilitySupport.Unknown; private _onDidChangeAccessibilitySupport: Emitter = new Emitter(); public onDidChangeAccessibilitySupport: Event = this._onDidChangeAccessibilitySupport.event; - public setAccessibilitySupport(accessibilitySupport: AccessibilitySupport): void { + public setAccessibilitySupport(accessibilitySupport: Platform.AccessibilitySupport): void { if (this._accessibilitySupport === accessibilitySupport) { return; } @@ -100,7 +89,7 @@ class WindowManager { this._accessibilitySupport = accessibilitySupport; this._onDidChangeAccessibilitySupport.fire(); } - public getAccessibilitySupport(): AccessibilitySupport { + public getAccessibilitySupport(): Platform.AccessibilitySupport { return this._accessibilitySupport; } @@ -144,10 +133,10 @@ export function onDidChangeFullscreen(callback: () => void): IDisposable { return WindowManager.INSTANCE.onDidChangeFullscreen(callback); } -export function setAccessibilitySupport(accessibilitySupport: AccessibilitySupport): void { +export function setAccessibilitySupport(accessibilitySupport: Platform.AccessibilitySupport): void { WindowManager.INSTANCE.setAccessibilitySupport(accessibilitySupport); } -export function getAccessibilitySupport(): AccessibilitySupport { +export function getAccessibilitySupport(): Platform.AccessibilitySupport { return WindowManager.INSTANCE.getAccessibilitySupport(); } export function onDidChangeAccessibilitySupport(callback: () => void): IDisposable { diff --git a/src/vs/base/common/platform.ts b/src/vs/base/common/platform.ts index c69370665fd..bf1aa3268f4 100644 --- a/src/vs/base/common/platform.ts +++ b/src/vs/base/common/platform.ts @@ -142,3 +142,14 @@ export const enum OperatingSystem { Linux = 3 } export const OS = (_isMacintosh ? OperatingSystem.Macintosh : (_isWindows ? OperatingSystem.Windows : OperatingSystem.Linux)); + +export const enum AccessibilitySupport { + /** + * This should be the browser case where it is not known if a screen reader is attached or no. + */ + Unknown = 0, + + Disabled = 1, + + Enabled = 2 +} diff --git a/src/vs/editor/browser/config/configuration.ts b/src/vs/editor/browser/config/configuration.ts index 86fe73ad6de..960faa7b1e6 100644 --- a/src/vs/editor/browser/config/configuration.ts +++ b/src/vs/editor/browser/config/configuration.ts @@ -310,6 +310,7 @@ export class Configuration extends CommonEditorConfiguration { } this._register(browser.onDidChangeZoomLevel(_ => this._recomputeOptions())); + this._register(browser.onDidChangeAccessibilitySupport(() => this._recomputeOptions())); this._recomputeOptions(); } @@ -353,7 +354,8 @@ export class Configuration extends CommonEditorConfiguration { canUseTranslate3d: browser.canUseTranslate3d(), emptySelectionClipboard: browser.isWebKit, pixelRatio: browser.getPixelRatio(), - zoomLevel: browser.getZoomLevel() + zoomLevel: browser.getZoomLevel(), + accessibilitySupport: browser.getAccessibilitySupport() }; } diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 8c8b4ae5b83..65a7639b2d5 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -5,6 +5,7 @@ 'use strict'; import 'vs/css!./textAreaHandler'; +import * as platform from 'vs/base/common/platform'; import * as browser from 'vs/base/browser/browser'; import { TextAreaInput, ITextAreaInputHost, IPasteData, ICompositionData } from 'vs/editor/browser/controller/textAreaInput'; import { ISimpleModel, ITypeData, TextAreaState, IENarratorStrategy, NVDAPagedStrategy } from 'vs/editor/browser/controller/textAreaState'; @@ -54,6 +55,7 @@ export class TextAreaHandler extends ViewPart { private readonly _viewHelper: ITextAreaHandlerHelper; private _pixelRatio: number; + private _accessibilitySupport: platform.AccessibilitySupport; private _contentLeft: number; private _contentWidth: number; private _contentHeight: number; @@ -85,6 +87,7 @@ export class TextAreaHandler extends ViewPart { const conf = this._context.configuration.editor; this._pixelRatio = conf.pixelRatio; + this._accessibilitySupport = conf.accessibilitySupport; this._contentLeft = conf.layoutInfo.contentLeft; this._contentWidth = conf.layoutInfo.contentWidth; this._contentHeight = conf.layoutInfo.contentHeight; @@ -160,6 +163,11 @@ export class TextAreaHandler extends ViewPart { return TextAreaState.EMPTY; } + if (this._accessibilitySupport === platform.AccessibilitySupport.Disabled) { + // We know for a fact that a screen reader is not attached + return TextAreaState.EMPTY; + } + const selection = this._selections[0]; if (this._experimentalScreenReader) { @@ -286,6 +294,10 @@ export class TextAreaHandler extends ViewPart { if (e.pixelRatio) { this._pixelRatio = conf.pixelRatio; } + if (e.accessibilitySupport) { + this._accessibilitySupport = conf.accessibilitySupport; + this._textAreaInput.writeScreenReaderContent('strategy changed'); + } if (e.emptySelectionClipboard) { this._emptySelectionClipboard = conf.emptySelectionClipboard; } @@ -294,6 +306,7 @@ export class TextAreaHandler extends ViewPart { } public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean { this._selections = e.selections.slice(0); + this._textAreaInput.writeScreenReaderContent('selection changed'); return true; } public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { @@ -333,10 +346,6 @@ export class TextAreaHandler extends ViewPart { this._textAreaInput.focusTextArea(); } - public writeToTextArea(): void { - this._textAreaInput.writeScreenReaderContent('selection changed'); - } - public setAriaActiveDescendant(id: string): void { if (id) { this.textArea.setAttribute('role', 'combobox'); @@ -356,11 +365,18 @@ export class TextAreaHandler extends ViewPart { private _primaryCursorVisibleRange: HorizontalRange = null; public prepareRender(ctx: RenderingContext): void { - const primaryCursorPosition = new Position(this._selections[0].positionLineNumber, this._selections[0].positionColumn); - this._primaryCursorVisibleRange = ctx.visibleRangeForPosition(primaryCursorPosition); + if (this._accessibilitySupport === platform.AccessibilitySupport.Enabled) { + // Do not move the textarea with the cursor, as this generates accessibility events that might confuse screen readers + // See https://github.com/Microsoft/vscode/issues/26730 + this._primaryCursorVisibleRange = null; + } else { + const primaryCursorPosition = new Position(this._selections[0].positionLineNumber, this._selections[0].positionColumn); + this._primaryCursorVisibleRange = ctx.visibleRangeForPosition(primaryCursorPosition); + } } public render(ctx: RestrictedRenderingContext): void { + this._textAreaInput.writeScreenReaderContent('render'); this._render(); } diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 3ad217b9787..321c4719a6d 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -403,7 +403,6 @@ export class View extends ViewEventHandler { if (!this.viewLines.shouldRender() && viewPartsToRender.length === 0) { // Nothing to render - this._textAreaHandler.writeToTextArea(); return; } @@ -413,15 +412,11 @@ export class View extends ViewEventHandler { let viewportData = new ViewportData(partialViewportData, this._context.model); if (this.viewLines.shouldRender()) { - this.viewLines.renderText(viewportData, () => { - this._textAreaHandler.writeToTextArea(); - }); + this.viewLines.renderText(viewportData); this.viewLines.onDidRender(); // Rendering of viewLines might cause scroll events to occur, so collect view parts to render again viewPartsToRender = this._getViewPartsToRender(); - } else { - this._textAreaHandler.writeToTextArea(); } let renderingContext = new RenderingContext(this._context.viewLayout, viewportData, this.viewLines); diff --git a/src/vs/editor/browser/viewParts/lines/viewLines.ts b/src/vs/editor/browser/viewParts/lines/viewLines.ts index fc5cd9f21de..f6bb857221b 100644 --- a/src/vs/editor/browser/viewParts/lines/viewLines.ts +++ b/src/vs/editor/browser/viewParts/lines/viewLines.ts @@ -405,17 +405,14 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, throw new Error('Not supported'); } - public renderText(viewportData: ViewportData, onAfterLinesRendered: () => void): void { + public renderText(viewportData: ViewportData): void { // (1) render lines - ensures lines are in the DOM this._visibleLines.renderLines(viewportData); this._lastRenderedData.setCurrentVisibleRange(viewportData.visibleRange); this.domNode.setWidth(this._context.viewLayout.getScrollWidth()); this.domNode.setHeight(Math.min(this._context.viewLayout.getScrollHeight(), 1000000)); - // (2) execute DOM writing that forces sync layout (e.g. textArea manipulation) - onAfterLinesRendered(); - - // (3) compute horizontal scroll position: + // (2) compute horizontal scroll position: // - this must happen after the lines are in the DOM since it might need a line that rendered just now // - it might change `scrollWidth` and `scrollLeft` if (this._lastCursorRevealRangeHorizontallyEvent) { @@ -440,7 +437,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, }); } - // (4) handle scrolling + // (3) handle scrolling const adjustedScrollTop = this._context.viewLayout.getScrollTop() - viewportData.bigNumbersDelta; if (this._canUseTranslate3d) { let transform = 'translate3d(' + -this._context.viewLayout.getScrollLeft() + 'px, ' + -adjustedScrollTop + 'px, 0px)'; diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 375c20c5a9c..6fca4c237d0 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -59,6 +59,7 @@ export interface IEnvConfiguration { emptySelectionClipboard: boolean; pixelRatio: number; zoomLevel: number; + accessibilitySupport: platform.AccessibilitySupport; } export abstract class CommonEditorConfiguration extends Disposable implements editorCommon.IConfiguration { @@ -122,7 +123,8 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed canUseTranslate3d: partialEnv.canUseTranslate3d, emptySelectionClipboard: partialEnv.emptySelectionClipboard, pixelRatio: partialEnv.pixelRatio, - tabFocusMode: TabFocus.getTabFocusMode() + tabFocusMode: TabFocus.getTabFocusMode(), + accessibilitySupport: partialEnv.accessibilitySupport }; return editorOptions.InternalEditorOptionsFactory.createInternalEditorOptions(env, opts); } diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 7a3f80fc043..4787fcbaba5 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -789,7 +789,6 @@ export interface IValidatedEditorOptions { readonly dragAndDrop: boolean; readonly emptySelectionClipboard: boolean; readonly useTabStops: boolean; - readonly performanceCritical: boolean; readonly viewInfo: InternalEditorViewOptions; readonly contribInfo: EditorContribOptions; @@ -806,6 +805,10 @@ export class InternalEditorOptions { readonly editorClassName: string; readonly lineHeight: number; readonly readOnly: boolean; + /** + * @internal + */ + readonly accessibilitySupport: platform.AccessibilitySupport; // ---- cursor options readonly wordSeparators: string; @@ -831,6 +834,7 @@ export class InternalEditorOptions { editorClassName: string; lineHeight: number; readOnly: boolean; + accessibilitySupport: platform.AccessibilitySupport; wordSeparators: string; autoClosingBrackets: boolean; useTabStops: boolean; @@ -848,6 +852,7 @@ export class InternalEditorOptions { this.editorClassName = source.editorClassName; this.lineHeight = source.lineHeight | 0; this.readOnly = source.readOnly; + this.accessibilitySupport = source.accessibilitySupport; this.wordSeparators = source.wordSeparators; this.autoClosingBrackets = source.autoClosingBrackets; this.useTabStops = source.useTabStops; @@ -871,6 +876,7 @@ export class InternalEditorOptions { && this.editorClassName === other.editorClassName && this.lineHeight === other.lineHeight && this.readOnly === other.readOnly + && this.accessibilitySupport === other.accessibilitySupport && this.wordSeparators === other.wordSeparators && this.autoClosingBrackets === other.autoClosingBrackets && this.useTabStops === other.useTabStops @@ -895,6 +901,7 @@ export class InternalEditorOptions { editorClassName: (this.editorClassName !== newOpts.editorClassName), lineHeight: (this.lineHeight !== newOpts.lineHeight), readOnly: (this.readOnly !== newOpts.readOnly), + accessibilitySupport: (this.accessibilitySupport !== newOpts.accessibilitySupport), wordSeparators: (this.wordSeparators !== newOpts.wordSeparators), autoClosingBrackets: (this.autoClosingBrackets !== newOpts.autoClosingBrackets), useTabStops: (this.useTabStops !== newOpts.useTabStops), @@ -1232,6 +1239,7 @@ export interface IConfigurationChangedEvent { readonly editorClassName: boolean; readonly lineHeight: boolean; readonly readOnly: boolean; + readonly accessibilitySupport: boolean; readonly wordSeparators: boolean; readonly autoClosingBrackets: boolean; readonly useTabStops: boolean; @@ -1259,6 +1267,7 @@ export interface IEnvironmentalOptions { readonly emptySelectionClipboard: boolean; readonly pixelRatio: number; readonly tabFocusMode: boolean; + readonly accessibilitySupport: platform.AccessibilitySupport; } function _boolean(value: any, defaultValue: T): boolean | T { @@ -1381,9 +1390,8 @@ export class EditorOptionsValidator { wordWrap = _stringSet<'off' | 'on' | 'wordWrapColumn' | 'bounded'>(wordWrap, defaults.wordWrap, ['off', 'on', 'wordWrapColumn', 'bounded']); } - const performanceCritical = false; const viewInfo = this._sanitizeViewInfo(opts, defaults.viewInfo); - const contribInfo = this._sanitizeContribInfo(opts, defaults.contribInfo, performanceCritical); + const contribInfo = this._sanitizeContribInfo(opts, defaults.contribInfo); return { inDiffEditor: _boolean(opts.inDiffEditor, defaults.inDiffEditor), @@ -1405,7 +1413,6 @@ export class EditorOptionsValidator { dragAndDrop: _boolean(opts.dragAndDrop, defaults.dragAndDrop), emptySelectionClipboard: _boolean(opts.emptySelectionClipboard, defaults.emptySelectionClipboard), useTabStops: _boolean(opts.useTabStops, defaults.useTabStops), - performanceCritical: performanceCritical, viewInfo: viewInfo, contribInfo: contribInfo, }; @@ -1564,7 +1571,7 @@ export class EditorOptionsValidator { }; } - private static _sanitizeContribInfo(opts: IEditorOptions, defaults: EditorContribOptions, performanceCritical: boolean): EditorContribOptions { + private static _sanitizeContribInfo(opts: IEditorOptions, defaults: EditorContribOptions): EditorContribOptions { let quickSuggestions: boolean | { other: boolean, comments: boolean, strings: boolean }; if (typeof opts.quickSuggestions === 'object') { quickSuggestions = { other: true, ...opts.quickSuggestions }; @@ -1589,12 +1596,12 @@ export class EditorOptionsValidator { wordBasedSuggestions: _boolean(opts.wordBasedSuggestions, defaults.wordBasedSuggestions), suggestFontSize: _clampedInt(opts.suggestFontSize, defaults.suggestFontSize, 0, 1000), suggestLineHeight: _clampedInt(opts.suggestLineHeight, defaults.suggestLineHeight, 0, 1000), - selectionHighlight: !performanceCritical && _boolean(opts.selectionHighlight, defaults.selectionHighlight), - occurrencesHighlight: !performanceCritical && _boolean(opts.occurrencesHighlight, defaults.occurrencesHighlight), - codeLens: !performanceCritical && _boolean(opts.codeLens, defaults.codeLens) && _boolean(opts.referenceInfos, true), - folding: !performanceCritical && _boolean(opts.folding, defaults.folding), + selectionHighlight: _boolean(opts.selectionHighlight, defaults.selectionHighlight), + occurrencesHighlight: _boolean(opts.occurrencesHighlight, defaults.occurrencesHighlight), + codeLens: _boolean(opts.codeLens, defaults.codeLens) && _boolean(opts.referenceInfos, true), + folding: _boolean(opts.folding, defaults.folding), showFoldingControls: _stringSet<'always' | 'mouseover'>(opts.showFoldingControls, defaults.showFoldingControls, ['always', 'mouseover']), - matchBrackets: !performanceCritical && _boolean(opts.matchBrackets, defaults.matchBrackets), + matchBrackets: _boolean(opts.matchBrackets, defaults.matchBrackets), find: find }; } @@ -1605,7 +1612,100 @@ export class EditorOptionsValidator { */ export class InternalEditorOptionsFactory { - public static createInternalEditorOptions(env: IEnvironmentalOptions, opts: IValidatedEditorOptions) { + private static _handlePerformanceCritical(opts: IValidatedEditorOptions, performanceCritical: boolean): IValidatedEditorOptions { + if (!performanceCritical) { + return opts; + } + + return { + inDiffEditor: opts.inDiffEditor, + wordSeparators: opts.wordSeparators, + lineNumbersMinChars: opts.lineNumbersMinChars, + lineDecorationsWidth: opts.lineDecorationsWidth, + readOnly: opts.readOnly, + mouseStyle: opts.mouseStyle, + disableTranslate3d: opts.disableTranslate3d, + automaticLayout: opts.automaticLayout, + wordWrap: opts.wordWrap, + wordWrapColumn: opts.wordWrapColumn, + wordWrapMinified: opts.wordWrapMinified, + wrappingIndent: opts.wrappingIndent, + wordWrapBreakBeforeCharacters: opts.wordWrapBreakBeforeCharacters, + wordWrapBreakAfterCharacters: opts.wordWrapBreakAfterCharacters, + wordWrapBreakObtrusiveCharacters: opts.wordWrapBreakObtrusiveCharacters, + autoClosingBrackets: opts.autoClosingBrackets, + dragAndDrop: opts.dragAndDrop, + emptySelectionClipboard: opts.emptySelectionClipboard, + useTabStops: opts.useTabStops, + + viewInfo: { + extraEditorClassName: opts.viewInfo.extraEditorClassName, + disableMonospaceOptimizations: opts.viewInfo.disableMonospaceOptimizations, + experimentalScreenReader: opts.viewInfo.experimentalScreenReader, + rulers: opts.viewInfo.rulers, + ariaLabel: opts.viewInfo.ariaLabel, + renderLineNumbers: opts.viewInfo.renderLineNumbers, + renderCustomLineNumbers: opts.viewInfo.renderCustomLineNumbers, + renderRelativeLineNumbers: opts.viewInfo.renderRelativeLineNumbers, + selectOnLineNumbers: opts.viewInfo.selectOnLineNumbers, + glyphMargin: opts.viewInfo.glyphMargin, + revealHorizontalRightPadding: opts.viewInfo.revealHorizontalRightPadding, + roundedSelection: false, // DISABLED + overviewRulerLanes: opts.viewInfo.overviewRulerLanes, + overviewRulerBorder: opts.viewInfo.overviewRulerBorder, + cursorBlinking: opts.viewInfo.cursorBlinking, + mouseWheelZoom: opts.viewInfo.mouseWheelZoom, + cursorStyle: opts.viewInfo.cursorStyle, + hideCursorInOverviewRuler: opts.viewInfo.hideCursorInOverviewRuler, + scrollBeyondLastLine: opts.viewInfo.scrollBeyondLastLine, + stopRenderingLineAfter: opts.viewInfo.stopRenderingLineAfter, + renderWhitespace: 'none', // DISABLED + renderControlCharacters: false, // DISABLED + fontLigatures: false, // DISABLED + renderIndentGuides: false, // DISABLED + renderLineHighlight: 'none', // DISABLED + scrollbar: opts.viewInfo.scrollbar, + minimap: { + enabled: false, // DISABLED + renderCharacters: opts.viewInfo.minimap.renderCharacters, + maxColumn: opts.viewInfo.minimap.maxColumn + }, + fixedOverflowWidgets: opts.viewInfo.fixedOverflowWidgets + }, + + contribInfo: { + selectionClipboard: opts.contribInfo.selectionClipboard, + hover: opts.contribInfo.hover, + contextmenu: opts.contribInfo.contextmenu, + quickSuggestions: opts.contribInfo.quickSuggestions, + quickSuggestionsDelay: opts.contribInfo.quickSuggestionsDelay, + parameterHints: opts.contribInfo.parameterHints, + iconsInSuggestions: opts.contribInfo.iconsInSuggestions, + formatOnType: opts.contribInfo.formatOnType, + formatOnPaste: opts.contribInfo.formatOnPaste, + suggestOnTriggerCharacters: opts.contribInfo.suggestOnTriggerCharacters, + acceptSuggestionOnEnter: opts.contribInfo.acceptSuggestionOnEnter, + acceptSuggestionOnCommitCharacter: opts.contribInfo.acceptSuggestionOnCommitCharacter, + snippetSuggestions: opts.contribInfo.snippetSuggestions, + wordBasedSuggestions: opts.contribInfo.wordBasedSuggestions, + suggestFontSize: opts.contribInfo.suggestFontSize, + suggestLineHeight: opts.contribInfo.suggestLineHeight, + selectionHighlight: false, // DISABLED + occurrencesHighlight: false, // DISABLED + codeLens: false, // DISABLED + folding: false, // DISABLED + showFoldingControls: opts.contribInfo.showFoldingControls, + matchBrackets: false, // DISABLED + find: opts.contribInfo.find + } + }; + } + + public static createInternalEditorOptions(env: IEnvironmentalOptions, _opts: IValidatedEditorOptions) { + + // Disable some non critical features to get as best performance as possible + // See https://github.com/Microsoft/vscode/issues/26730 + const opts = this._handlePerformanceCritical(_opts, (env.accessibilitySupport === platform.AccessibilitySupport.Enabled)); let lineDecorationsWidth: number; if (typeof opts.lineDecorationsWidth === 'string' && /^\d+(\.\d+)?ch$/.test(opts.lineDecorationsWidth)) { @@ -1713,6 +1813,7 @@ export class InternalEditorOptionsFactory { editorClassName: className, lineHeight: env.fontInfo.lineHeight, readOnly: opts.readOnly, + accessibilitySupport: env.accessibilitySupport, wordSeparators: opts.wordSeparators, autoClosingBrackets: opts.autoClosingBrackets, useTabStops: opts.useTabStops, @@ -1723,7 +1824,7 @@ export class InternalEditorOptionsFactory { fontInfo: env.fontInfo, viewInfo: opts.viewInfo, wrappingInfo: wrappingInfo, - contribInfo: opts.contribInfo, + contribInfo: opts.contribInfo }); } } @@ -1931,7 +2032,6 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { dragAndDrop: false, emptySelectionClipboard: true, useTabStops: true, - performanceCritical: false, viewInfo: { extraEditorClassName: '', diff --git a/src/vs/editor/common/view/viewEvents.ts b/src/vs/editor/common/view/viewEvents.ts index 875b465166e..f6696746fbf 100644 --- a/src/vs/editor/common/view/viewEvents.ts +++ b/src/vs/editor/common/view/viewEvents.ts @@ -38,6 +38,7 @@ export class ViewConfigurationChangedEvent { public readonly editorClassName: boolean; public readonly lineHeight: boolean; public readonly readOnly: boolean; + public readonly accessibilitySupport: boolean; public readonly emptySelectionClipboard: boolean; public readonly layoutInfo: boolean; public readonly fontInfo: boolean; @@ -50,6 +51,7 @@ export class ViewConfigurationChangedEvent { this.editorClassName = source.editorClassName; this.lineHeight = source.lineHeight; this.readOnly = source.readOnly; + this.accessibilitySupport = source.accessibilitySupport; this.emptySelectionClipboard = source.emptySelectionClipboard; this.layoutInfo = source.layoutInfo; this.fontInfo = source.fontInfo; diff --git a/src/vs/editor/test/common/config/commonEditorConfig.test.ts b/src/vs/editor/test/common/config/commonEditorConfig.test.ts index 5e6e1dd062a..6abc5412b03 100644 --- a/src/vs/editor/test/common/config/commonEditorConfig.test.ts +++ b/src/vs/editor/test/common/config/commonEditorConfig.test.ts @@ -8,6 +8,7 @@ import * as assert from 'assert'; import { EditorZoom } from 'vs/editor/common/config/editorZoom'; import { TestConfiguration } from 'vs/editor/test/common/mocks/testConfiguration'; import { IEnvConfiguration } from "vs/editor/common/config/commonEditorConfig"; +import { AccessibilitySupport } from "vs/base/common/platform"; suite('Common Editor Config', () => { test('Zoom Level', () => { @@ -61,7 +62,8 @@ suite('Common Editor Config', () => { canUseTranslate3d: true, emptySelectionClipboard: true, pixelRatio: 1, - zoomLevel: 0 + zoomLevel: 0, + accessibilitySupport: AccessibilitySupport.Unknown }; } } diff --git a/src/vs/editor/test/common/mocks/testConfiguration.ts b/src/vs/editor/test/common/mocks/testConfiguration.ts index 9c3fdd69c06..edddfa74fdd 100644 --- a/src/vs/editor/test/common/mocks/testConfiguration.ts +++ b/src/vs/editor/test/common/mocks/testConfiguration.ts @@ -7,6 +7,7 @@ import { CommonEditorConfiguration, IEnvConfiguration } from 'vs/editor/common/config/commonEditorConfig'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { FontInfo, BareFontInfo } from 'vs/editor/common/config/fontInfo'; +import { AccessibilitySupport } from "vs/base/common/platform"; export class TestConfiguration extends CommonEditorConfiguration { @@ -23,7 +24,8 @@ export class TestConfiguration extends CommonEditorConfiguration { canUseTranslate3d: true, emptySelectionClipboard: true, pixelRatio: 1, - zoomLevel: 0 + zoomLevel: 0, + accessibilitySupport: AccessibilitySupport.Unknown }; } diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 34f68d6d237..72ca96c80cb 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3389,6 +3389,7 @@ declare module monaco.editor { readonly editorClassName: boolean; readonly lineHeight: boolean; readonly readOnly: boolean; + readonly accessibilitySupport: boolean; readonly wordSeparators: boolean; readonly autoClosingBrackets: boolean; readonly useTabStops: boolean; diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index 3f71eda9b05..831f6897471 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -17,7 +17,7 @@ import errors = require('vs/base/common/errors'); import * as browser from 'vs/base/browser/browser'; import { IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { Action } from 'vs/base/common/actions'; -import { language, LANGUAGE_DEFAULT } from 'vs/base/common/platform'; +import { language, LANGUAGE_DEFAULT, AccessibilitySupport } from 'vs/base/common/platform'; import { IMode } from 'vs/editor/common/modes'; import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput'; import { IFileEditorInput, EncodingMode, IEncodingSupport, toResource, SideBySideEditorInput } from 'vs/workbench/common/editor'; @@ -383,7 +383,7 @@ export class EditorStatus implements IStatusbarItem { } if (changed.selectionStatus) { - if (this.state.selectionStatus) { + if (this.state.selectionStatus && !this.state.screenReaderMode) { this.selectionElement.textContent = this.state.selectionStatus; show(this.selectionElement); } else { @@ -686,7 +686,7 @@ export class EditorStatus implements IStatusbarItem { } private onScreenReaderModeChange(): void { - const info: StateDelta = { screenReaderMode: browser.getAccessibilitySupport() === browser.AccessibilitySupport.Enabled }; + const info: StateDelta = { screenReaderMode: browser.getAccessibilitySupport() === AccessibilitySupport.Enabled }; this.updateState(info); } diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 6792fab85e3..fb179f3196c 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -70,7 +70,7 @@ export function startup(configuration: IWindowConfiguration): TPromise { KeyboardMapperFactory.INSTANCE._onKeyboardLayoutChanged(configuration.isISOKeyboard); - browser.setAccessibilitySupport(configuration.accessibilitySupportEnabled ? browser.AccessibilitySupport.Enabled : browser.AccessibilitySupport.Disabled); + browser.setAccessibilitySupport(configuration.accessibilitySupportEnabled ? platform.AccessibilitySupport.Enabled : platform.AccessibilitySupport.Disabled); // Setup Intl comparer.setFileNameComparer(new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' })); diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 4a494496e37..be59101349e 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -298,7 +298,7 @@ export class ElectronWindow extends Themable { // keyboard layout changed event ipc.on('vscode:accessibilitySupportChanged', (event, accessibilitySupportEnabled: boolean) => { - browser.setAccessibilitySupport(accessibilitySupportEnabled ? browser.AccessibilitySupport.Enabled : browser.AccessibilitySupport.Disabled); + browser.setAccessibilitySupport(accessibilitySupportEnabled ? platform.AccessibilitySupport.Enabled : platform.AccessibilitySupport.Disabled); }); // Configuration changes -- GitLab