accessibilityService.ts 4.3 KB
Newer Older
1 2 3 4 5
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

6
import { IAccessibilityService, AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility';
7
import { isWindows, isLinux } from 'vs/base/common/platform';
8
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
9
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
10
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
11
import { Registry } from 'vs/platform/registry/common/platform';
I
isidor 已提交
12
import { AccessibilityService } from 'vs/platform/accessibility/common/accessibilityService';
13
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
14
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
15 16 17 18
import { IJSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditing';
import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions';
import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
19
import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService';
20 21 22 23 24 25 26

interface AccessibilityMetrics {
	enabled: boolean;
}
type AccessibilityMetricsClassification = {
	enabled: { classification: 'SystemMetaData', purpose: 'FeatureInsight' };
};
27

28
export class NativeAccessibilityService extends AccessibilityService implements IAccessibilityService {
29

30
	declare readonly _serviceBrand: undefined;
31

J
Joao Moreno 已提交
32
	private didSendTelemetry = false;
33 34

	constructor(
35
		@IWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService,
J
Joao Moreno 已提交
36 37
		@IContextKeyService contextKeyService: IContextKeyService,
		@IConfigurationService configurationService: IConfigurationService,
38
		@ITelemetryService private readonly _telemetryService: ITelemetryService
39
	) {
40
		super(contextKeyService, configurationService);
J
Joao Moreno 已提交
41
		this.setAccessibilitySupport(environmentService.configuration.accessibilitySupport ? AccessibilitySupport.Enabled : AccessibilitySupport.Disabled);
42
	}
43

44
	async alwaysUnderlineAccessKeys(): Promise<boolean> {
45
		if (!isWindows) {
46
			return false;
47 48
		}

49
		const Registry = await import('vscode-windows-registry');
50

51 52 53 54 55 56
		let value: string | undefined = undefined;
		try {
			value = Registry.GetStringRegKey('HKEY_CURRENT_USER', 'Control Panel\\Accessibility\\Keyboard Preference', 'On');
		} catch {
			return false;
		}
57

58
		return value === '1';
59 60 61
	}

	setAccessibilitySupport(accessibilitySupport: AccessibilitySupport): void {
I
isidor 已提交
62
		super.setAccessibilitySupport(accessibilitySupport);
63

J
Joao Moreno 已提交
64
		if (!this.didSendTelemetry && accessibilitySupport === AccessibilitySupport.Enabled) {
65
			this._telemetryService.publicLog2<AccessibilityMetrics, AccessibilityMetricsClassification>('accessibility', { enabled: true });
J
Joao Moreno 已提交
66
			this.didSendTelemetry = true;
67
		}
68
	}
69 70
}

71
registerSingleton(IAccessibilityService, NativeAccessibilityService, true);
72 73 74 75 76 77 78 79

// On linux we do not automatically detect that a screen reader is detected, thus we have to implicitly notify the renderer to enable accessibility when user configures it in settings
class LinuxAccessibilityContribution implements IWorkbenchContribution {
	constructor(
		@IJSONEditingService jsonEditingService: IJSONEditingService,
		@IAccessibilityService accessibilityService: AccessibilityService,
		@IEnvironmentService environmentService: IEnvironmentService
	) {
I
isidor 已提交
80
		const forceRendererAccessibility = () => {
81
			if (accessibilityService.isScreenReaderOptimized()) {
S
Sandeep Somavarapu 已提交
82
				jsonEditingService.write(environmentService.argvResource, [{ path: ['force-renderer-accessibility'], value: true }], true);
83
			}
I
isidor 已提交
84 85 86
		};
		forceRendererAccessibility();
		accessibilityService.onDidChangeScreenReaderOptimized(forceRendererAccessibility);
87 88 89 90 91 92
	}
}

if (isLinux) {
	Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench).registerWorkbenchContribution(LinuxAccessibilityContribution, LifecyclePhase.Ready);
}