Path: blob/main/src/vs/platform/browserView/node/browserViewGroupRemoteService.ts
13397 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 { Event } from '../../../base/common/event.js';6import { Disposable } from '../../../base/common/lifecycle.js';7import { ProxyChannel } from '../../../base/parts/ipc/common/ipc.js';8import { IMainProcessService } from '../../ipc/common/mainProcessService.js';9import { IBrowserViewGroup, IBrowserViewGroupService, IBrowserViewGroupViewEvent, ipcBrowserViewGroupChannelName } from '../common/browserViewGroup.js';10import { IBrowserViewOwner } from '../common/browserView.js';11import { CDPEvent, CDPRequest, CDPResponse } from '../common/cdp/types.js';1213/**14* Remote-process service for managing browser view groups.15*16* Connects to the main-process {@link BrowserViewGroupMainService} via17* IPC and provides {@link IBrowserViewGroup} instances for18* interacting with groups.19*20* Usable from the shared process.21*/22export interface IBrowserViewGroupRemoteService {23/**24* Create a new browser view group.25* @param owner The owner of the group's lifecycle.26*/27createGroup(owner: IBrowserViewOwner): Promise<IBrowserViewGroup>;28}2930/**31* Remote proxy for a browser view group living in the main process.32*/33class RemoteBrowserViewGroup extends Disposable implements IBrowserViewGroup {34constructor(35readonly id: string,36private readonly groupService: IBrowserViewGroupService,37) {38super();3940this._register(groupService.onDynamicDidDestroy(this.id)(() => {41// Avoid loops42this.dispose(true);43}));44}4546get onDidAddView(): Event<IBrowserViewGroupViewEvent> {47return this.groupService.onDynamicDidAddView(this.id);48}4950get onDidRemoveView(): Event<IBrowserViewGroupViewEvent> {51return this.groupService.onDynamicDidRemoveView(this.id);52}5354get onDidDestroy(): Event<void> {55return this.groupService.onDynamicDidDestroy(this.id);56}5758async addView(viewId: string): Promise<void> {59return this.groupService.addViewToGroup(this.id, viewId);60}6162async removeView(viewId: string): Promise<void> {63return this.groupService.removeViewFromGroup(this.id, viewId);64}6566async sendCDPMessage(msg: CDPRequest): Promise<void> {67return this.groupService.sendCDPMessage(this.id, msg);68}6970get onCDPMessage(): Event<CDPResponse | CDPEvent> {71return this.groupService.onDynamicCDPMessage(this.id);72}7374override dispose(fromService = false): void {75if (!fromService) {76this.groupService.destroyGroup(this.id);77}78super.dispose();79}80}8182export class BrowserViewGroupRemoteService implements IBrowserViewGroupRemoteService {83private readonly _groupService: IBrowserViewGroupService;84private readonly _groups = new Map<string, IBrowserViewGroup>();8586constructor(87mainProcessService: IMainProcessService,88) {89const channel = mainProcessService.getChannel(ipcBrowserViewGroupChannelName);90this._groupService = ProxyChannel.toService<IBrowserViewGroupService>(channel);91}9293async createGroup(owner: IBrowserViewOwner): Promise<IBrowserViewGroup> {94const id = await this._groupService.createGroup(owner);95return this._wrap(id);96}9798private _wrap(id: string): IBrowserViewGroup {99const group = new RemoteBrowserViewGroup(id, this._groupService);100this._groups.set(id, group);101102Event.once(group.onDidDestroy)(() => {103this._groups.delete(id);104});105106return group;107}108}109110111