Path: blob/main/src/vs/workbench/services/clipboard/browser/clipboardService.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { localize } from '../../../../nls.js';6import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';7import { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';8import { BrowserClipboardService as BaseBrowserClipboardService } from '../../../../platform/clipboard/browser/clipboardService.js';9import { INotificationService, Severity } from '../../../../platform/notification/common/notification.js';10import { IOpenerService } from '../../../../platform/opener/common/opener.js';11import { Event } from '../../../../base/common/event.js';12import { DisposableStore } from '../../../../base/common/lifecycle.js';13import { IWorkbenchEnvironmentService } from '../../environment/common/environmentService.js';14import { ILogService } from '../../../../platform/log/common/log.js';15import { ILayoutService } from '../../../../platform/layout/browser/layoutService.js';16import { getActiveWindow } from '../../../../base/browser/dom.js';1718export class BrowserClipboardService extends BaseBrowserClipboardService {1920constructor(21@INotificationService private readonly notificationService: INotificationService,22@IOpenerService private readonly openerService: IOpenerService,23@IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService,24@ILogService logService: ILogService,25@ILayoutService layoutService: ILayoutService26) {27super(layoutService, logService);28}2930override async writeText(text: string, type?: string): Promise<void> {31this.logService.trace('BrowserClipboardService#writeText called with type:', type, ' with text.length:', text.length);32if (!!this.environmentService.extensionTestsLocationURI && typeof type !== 'string') {33type = 'vscode-tests'; // force in-memory clipboard for tests to avoid permission issues34}35this.logService.trace('BrowserClipboardService#super.writeText');36return super.writeText(text, type);37}3839override async readText(type?: string): Promise<string> {40this.logService.trace('BrowserClipboardService#readText called with type:', type);41if (!!this.environmentService.extensionTestsLocationURI && typeof type !== 'string') {42type = 'vscode-tests'; // force in-memory clipboard for tests to avoid permission issues43}4445if (type) {46this.logService.trace('BrowserClipboardService#super.readText');47return super.readText(type);48}4950try {51const readText = await getActiveWindow().navigator.clipboard.readText();52this.logService.trace('BrowserClipboardService#readText with readText.length:', readText.length);53return readText;54} catch (error) {55return new Promise<string>(resolve => {5657// Inform user about permissions problem (https://github.com/microsoft/vscode/issues/112089)58const listener = new DisposableStore();59const handle = this.notificationService.prompt(60Severity.Error,61localize('clipboardError', "Unable to read from the browser's clipboard. Please make sure you have granted access for this website to read from the clipboard."),62[{63label: localize('retry', "Retry"),64run: async () => {65listener.dispose();66resolve(await this.readText(type));67}68}, {69label: localize('learnMore', "Learn More"),70run: () => this.openerService.open('https://go.microsoft.com/fwlink/?linkid=2151362')71}],72{73sticky: true74}75);7677// Always resolve the promise once the notification closes78listener.add(Event.once(handle.onDidClose)(() => resolve('')));79});80}81}82}8384registerSingleton(IClipboardService, BrowserClipboardService, InstantiationType.Delayed);858687