Path: blob/main/src/vs/workbench/services/clipboard/electron-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 { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';6import { URI } from '../../../../base/common/uri.js';7import { isMacintosh } from '../../../../base/common/platform.js';8import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';9import { INativeHostService } from '../../../../platform/native/common/native.js';10import { VSBuffer } from '../../../../base/common/buffer.js';11import { ILogService } from '../../../../platform/log/common/log.js';1213export class NativeClipboardService implements IClipboardService {1415private static readonly FILE_FORMAT = 'code/file-list'; // Clipboard format for files1617declare readonly _serviceBrand: undefined;1819constructor(20@INativeHostService private readonly nativeHostService: INativeHostService,21@ILogService private readonly logService: ILogService22) { }2324async triggerPaste(targetWindowId: number): Promise<void> {25this.logService.trace('NativeClipboardService#triggerPaste called');26return this.nativeHostService.triggerPaste({ targetWindowId });27}2829async readImage(): Promise<Uint8Array> {30return this.nativeHostService.readImage();31}3233async writeText(text: string, type?: 'selection' | 'clipboard'): Promise<void> {34this.logService.trace('NativeClipboardService#writeText called with type:', type, ' with text.length:', text.length);35return this.nativeHostService.writeClipboardText(text, type);36}3738async readText(type?: 'selection' | 'clipboard'): Promise<string> {39this.logService.trace('NativeClipboardService#readText called with type:', type);40return this.nativeHostService.readClipboardText(type);41}4243async readFindText(): Promise<string> {44if (isMacintosh) {45return this.nativeHostService.readClipboardFindText();46}4748return '';49}5051async writeFindText(text: string): Promise<void> {52if (isMacintosh) {53return this.nativeHostService.writeClipboardFindText(text);54}55}5657async writeResources(resources: URI[]): Promise<void> {58if (resources.length) {59return this.nativeHostService.writeClipboardBuffer(NativeClipboardService.FILE_FORMAT, this.resourcesToBuffer(resources));60}61}6263async readResources(): Promise<URI[]> {64return this.bufferToResources(await this.nativeHostService.readClipboardBuffer(NativeClipboardService.FILE_FORMAT));65}6667async hasResources(): Promise<boolean> {68return this.nativeHostService.hasClipboard(NativeClipboardService.FILE_FORMAT);69}7071private resourcesToBuffer(resources: URI[]): VSBuffer {72return VSBuffer.fromString(resources.map(r => r.toString()).join('\n'));73}7475private bufferToResources(buffer: VSBuffer): URI[] {76if (!buffer) {77return [];78}7980const bufferValue = buffer.toString();81if (!bufferValue) {82return [];83}8485try {86return bufferValue.split('\n').map(f => URI.parse(f));87} catch (error) {88return []; // do not trust clipboard data89}90}91}9293registerSingleton(IClipboardService, NativeClipboardService, InstantiationType.Delayed);949596