Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/services/browserElements/electron-browser/browserElementsService.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { BrowserType, IElementData, INativeBrowserElementsService } from '../../../../platform/browserElements/common/browserElements.js';
7
import { IRectangle } from '../../../../platform/window/common/window.js';
8
import { ipcRenderer } from '../../../../base/parts/sandbox/electron-browser/globals.js';
9
import { CancellationToken } from '../../../../base/common/cancellation.js';
10
import { registerSingleton, InstantiationType } from '../../../../platform/instantiation/common/extensions.js';
11
import { IBrowserElementsService } from '../browser/browserElementsService.js';
12
import { IMainProcessService } from '../../../../platform/ipc/common/mainProcessService.js';
13
import { INativeWorkbenchEnvironmentService } from '../../environment/electron-browser/environmentService.js';
14
import { NativeBrowserElementsService } from '../../../../platform/browserElements/common/nativeBrowserElementsService.js';
15
16
class WorkbenchNativeBrowserElementsService extends NativeBrowserElementsService {
17
18
constructor(
19
@INativeWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService,
20
@IMainProcessService mainProcessService: IMainProcessService
21
) {
22
super(environmentService.window.id, mainProcessService);
23
}
24
}
25
26
let cancelSelectionIdPool = 0;
27
let cancelAndDetachIdPool = 0;
28
29
class WorkbenchBrowserElementsService implements IBrowserElementsService {
30
_serviceBrand: undefined;
31
32
constructor(
33
@INativeBrowserElementsService private readonly simpleBrowser: INativeBrowserElementsService
34
) { }
35
36
async startDebugSession(token: CancellationToken, browserType: BrowserType): Promise<void> {
37
const cancelAndDetachId = cancelAndDetachIdPool++;
38
const onCancelChannel = `vscode:cancelCurrentSession${cancelAndDetachId}`;
39
40
const disposable = token.onCancellationRequested(() => {
41
ipcRenderer.send(onCancelChannel, cancelAndDetachId);
42
disposable.dispose();
43
});
44
try {
45
await this.simpleBrowser.startDebugSession(token, browserType, cancelAndDetachId);
46
} catch (error) {
47
disposable.dispose();
48
throw new Error('No debug session target found', error);
49
}
50
}
51
52
async getElementData(rect: IRectangle, token: CancellationToken, browserType: BrowserType | undefined): Promise<IElementData | undefined> {
53
if (!browserType) {
54
return undefined;
55
}
56
const cancelSelectionId = cancelSelectionIdPool++;
57
const onCancelChannel = `vscode:cancelElementSelection${cancelSelectionId}`;
58
const disposable = token.onCancellationRequested(() => {
59
ipcRenderer.send(onCancelChannel, cancelSelectionId);
60
});
61
try {
62
const elementData = await this.simpleBrowser.getElementData(rect, token, browserType, cancelSelectionId);
63
return elementData;
64
} catch (error) {
65
disposable.dispose();
66
throw new Error(`Native Host: Error getting element data: ${error}`);
67
} finally {
68
disposable.dispose();
69
}
70
}
71
}
72
73
registerSingleton(IBrowserElementsService, WorkbenchBrowserElementsService, InstantiationType.Delayed);
74
registerSingleton(INativeBrowserElementsService, WorkbenchNativeBrowserElementsService, InstantiationType.Delayed);
75
76