From caa5334413292ce22613bda9468d91d466c49ff5 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 21 Sep 2018 17:53:11 -0700 Subject: [PATCH] Fix #52590 - don't move focus when clicking the search details buttons with screenreader mode turned on. Because NVDA sends click events instead of key events when pressing space. Also update this dynamically for the search option buttons --- src/vs/editor/contrib/find/findWidget.ts | 3 -- .../parts/search/browser/searchView.ts | 9 +++- .../parts/search/browser/searchWidget.ts | 53 +++++++++++-------- 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/vs/editor/contrib/find/findWidget.ts b/src/vs/editor/contrib/find/findWidget.ts index d164bf9d6fc..a2e3e1f6067 100644 --- a/src/vs/editor/contrib/find/findWidget.ts +++ b/src/vs/editor/contrib/find/findWidget.ts @@ -33,7 +33,6 @@ import { editorFindRangeHighlight, editorFindMatch, editorFindMatchHighlight, co import { ContextScopedFindInput, ContextScopedHistoryInputBox } from 'vs/platform/widget/browser/contextScopedHistoryWidget'; import { toDisposable } from 'vs/base/common/lifecycle'; - export interface IFindController { replace(): void; replaceAll(): void; @@ -845,8 +844,6 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas findPart.appendChild(this._closeBtn.domNode); - this.updateAccessibilitySupport(); - return findPart; } diff --git a/src/vs/workbench/parts/search/browser/searchView.ts b/src/vs/workbench/parts/search/browser/searchView.ts index 99e34054fba..cc137396a0b 100644 --- a/src/vs/workbench/parts/search/browser/searchView.ts +++ b/src/vs/workbench/parts/search/browser/searchView.ts @@ -5,6 +5,7 @@ 'use strict'; +import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import * as aria from 'vs/base/browser/ui/aria/aria'; @@ -200,7 +201,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this._register(dom.addDisposableListener(this.toggleQueryDetailsButton, dom.EventType.CLICK, e => { dom.EventHelper.stop(e); - this.toggleQueryDetails(); + this.toggleQueryDetails(!this.isScreenReaderOptimized()); })); this._register(dom.addDisposableListener(this.toggleQueryDetailsButton, dom.EventType.KEY_UP, (e: KeyboardEvent) => { const event = new StandardKeyboardEvent(e); @@ -299,6 +300,12 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { } } + private isScreenReaderOptimized() { + const detected = browser.getAccessibilitySupport() === env.AccessibilitySupport.Enabled; + const config = this.configurationService.getValue('editor').accessibilitySupport; + return config === 'on' || (config === 'auto' && detected); + } + private createSearchWidget(container: HTMLElement): void { let contentPattern = this.viewletSettings['query.contentPattern'] || ''; let isRegex = this.viewletSettings['query.regex'] === true; diff --git a/src/vs/workbench/parts/search/browser/searchWidget.ts b/src/vs/workbench/parts/search/browser/searchWidget.ts index 0c4a874d4ba..031b0d44d2d 100644 --- a/src/vs/workbench/parts/search/browser/searchWidget.ts +++ b/src/vs/workbench/parts/search/browser/searchWidget.ts @@ -3,35 +3,38 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as nls from 'vs/nls'; -import * as strings from 'vs/base/common/strings'; +import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { Widget } from 'vs/base/browser/ui/widget'; -import { Action } from 'vs/base/common/actions'; +import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; -import { FindInput, IFindInputOptions } from 'vs/base/browser/ui/findinput/findInput'; -import { IMessage, HistoryInputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { Button, IButtonOptions } from 'vs/base/browser/ui/button/button'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { ContextKeyExpr, IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { FindInput, IFindInputOptions } from 'vs/base/browser/ui/findinput/findInput'; +import { HistoryInputBox, IMessage } from 'vs/base/browser/ui/inputbox/inputBox'; +import { Widget } from 'vs/base/browser/ui/widget'; +import { Action } from 'vs/base/common/actions'; +import { Delayer } from 'vs/base/common/async'; +import { Emitter, Event } from 'vs/base/common/event'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { Event, Emitter } from 'vs/base/common/event'; -import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { isSearchViewFocused, appendKeyBindingLabel } from 'vs/workbench/parts/search/browser/searchActions'; -import * as Constants from 'vs/workbench/parts/search/common/constants'; -import { attachInputBoxStyler, attachFindInputBoxStyler } from 'vs/platform/theme/common/styler'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; +import * as env from 'vs/base/common/platform'; +import * as strings from 'vs/base/common/strings'; +import { TPromise } from 'vs/base/common/winjs.base'; import { CONTEXT_FIND_WIDGET_NOT_VISIBLE } from 'vs/editor/contrib/find/findModel'; +import * as nls from 'vs/nls'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; +import { ContextKeyExpr, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { ISearchConfigurationProperties } from 'vs/platform/search/common/search'; +import { attachFindInputBoxStyler, attachInputBoxStyler } from 'vs/platform/theme/common/styler'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ContextScopedFindInput, ContextScopedHistoryInputBox } from 'vs/platform/widget/browser/contextScopedHistoryWidget'; -import { Delayer } from 'vs/base/common/async'; +import { appendKeyBindingLabel, isSearchViewFocused } from 'vs/workbench/parts/search/browser/searchActions'; +import * as Constants from 'vs/workbench/parts/search/common/constants'; +import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; +import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; +import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; export interface ISearchWidgetOptions { value?: string; @@ -142,6 +145,7 @@ export class SearchWidget extends Widget { this.updateAccessibilitySupport(); } }); + browser.onDidChangeAccessibilitySupport(() => this.updateAccessibilitySupport()); this.updateAccessibilitySupport(); } @@ -244,9 +248,14 @@ export class SearchWidget extends Widget { this.renderReplaceInput(this.domNode, options); } + private isScreenReaderOptimized() { + const detected = browser.getAccessibilitySupport() === env.AccessibilitySupport.Enabled; + const config = this.configurationService.getValue('editor').accessibilitySupport; + return config === 'on' || (config === 'auto' && detected); + } + private updateAccessibilitySupport(): void { - const value = this.configurationService.getValue('editor.accessibilitySupport'); - this.searchInput.setFocusInputOnOptionClick(value !== 'on'); + this.searchInput.setFocusInputOnOptionClick(!this.isScreenReaderOptimized()); } private renderToggleReplaceButton(parent: HTMLElement): void { -- GitLab