Path: blob/main/src/vs/workbench/services/browserElements/electron-browser/browserElementsService.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 { BrowserType, IElementData, INativeBrowserElementsService } from '../../../../platform/browserElements/common/browserElements.js';6import { IRectangle } from '../../../../platform/window/common/window.js';7import { ipcRenderer } from '../../../../base/parts/sandbox/electron-browser/globals.js';8import { CancellationToken } from '../../../../base/common/cancellation.js';9import { registerSingleton, InstantiationType } from '../../../../platform/instantiation/common/extensions.js';10import { IBrowserElementsService } from '../browser/browserElementsService.js';11import { IMainProcessService } from '../../../../platform/ipc/common/mainProcessService.js';12import { INativeWorkbenchEnvironmentService } from '../../environment/electron-browser/environmentService.js';13import { NativeBrowserElementsService } from '../../../../platform/browserElements/common/nativeBrowserElementsService.js';1415class WorkbenchNativeBrowserElementsService extends NativeBrowserElementsService {1617constructor(18@INativeWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService,19@IMainProcessService mainProcessService: IMainProcessService20) {21super(environmentService.window.id, mainProcessService);22}23}2425let cancelSelectionIdPool = 0;26let cancelAndDetachIdPool = 0;2728class WorkbenchBrowserElementsService implements IBrowserElementsService {29_serviceBrand: undefined;3031constructor(32@INativeBrowserElementsService private readonly simpleBrowser: INativeBrowserElementsService33) { }3435async startDebugSession(token: CancellationToken, browserType: BrowserType): Promise<void> {36const cancelAndDetachId = cancelAndDetachIdPool++;37const onCancelChannel = `vscode:cancelCurrentSession${cancelAndDetachId}`;3839const disposable = token.onCancellationRequested(() => {40ipcRenderer.send(onCancelChannel, cancelAndDetachId);41disposable.dispose();42});43try {44await this.simpleBrowser.startDebugSession(token, browserType, cancelAndDetachId);45} catch (error) {46disposable.dispose();47throw new Error('No debug session target found', error);48}49}5051async getElementData(rect: IRectangle, token: CancellationToken, browserType: BrowserType | undefined): Promise<IElementData | undefined> {52if (!browserType) {53return undefined;54}55const cancelSelectionId = cancelSelectionIdPool++;56const onCancelChannel = `vscode:cancelElementSelection${cancelSelectionId}`;57const disposable = token.onCancellationRequested(() => {58ipcRenderer.send(onCancelChannel, cancelSelectionId);59});60try {61const elementData = await this.simpleBrowser.getElementData(rect, token, browserType, cancelSelectionId);62return elementData;63} catch (error) {64disposable.dispose();65throw new Error(`Native Host: Error getting element data: ${error}`);66} finally {67disposable.dispose();68}69}70}7172registerSingleton(IBrowserElementsService, WorkbenchBrowserElementsService, InstantiationType.Delayed);73registerSingleton(INativeBrowserElementsService, WorkbenchNativeBrowserElementsService, InstantiationType.Delayed);747576