Skip to content

Commit

Permalink
No commit message
Browse files Browse the repository at this point in the history
  • Loading branch information
NikolaRHristov committed Dec 16, 2024
1 parent 51f12d5 commit fa2bc7d
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 317 deletions.
304 changes: 140 additions & 164 deletions Source/targets/browser/vscodeRendererTargetManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,176 +2,152 @@
* Copyright (C) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------*/

import { URL } from "url";

import Cdp from "../../cdp/api";
import CdpConnection from "../../cdp/connection";
import { ILogger } from "../../common/logging";
import { ISourcePathResolver } from "../../common/sourcePathResolver";
import {
createTargetFilterForConfig,
TargetFilter,
} from "../../common/urlUtils";
import { ITelemetryReporter } from "../../telemetry/telemetryReporter";
import { ITargetOrigin } from "../targetOrigin";
import { BrowserTargetManager } from "./browserTargetManager";
import { BrowserTarget, BrowserTargetType } from "./browserTargets";
import { IRendererAttachParams } from "./vscodeRendererAttacher";
import { URL } from 'url';
import Cdp from '../../cdp/api';
import CdpConnection from '../../cdp/connection';
import { ILogger } from '../../common/logging';
import { ISourcePathResolver } from '../../common/sourcePathResolver';
import { createTargetFilterForConfig, TargetFilter } from '../../common/urlUtils';
import { ITelemetryReporter } from '../../telemetry/telemetryReporter';
import { ITargetOrigin } from '../targetOrigin';
import { BrowserTargetManager } from './browserTargetManager';
import { BrowserTarget, BrowserTargetType } from './browserTargets';
import { IRendererAttachParams } from './vscodeRendererAttacher';

const enum WebviewContentPurpose {
NotebookRenderer = "notebookRenderer",
CustomEditor = "customEditor",
NotebookRenderer = 'notebookRenderer',
CustomEditor = 'customEditor',
}

export class VSCodeRendererTargetManager extends BrowserTargetManager {
/**
* @override
*/
static async connectRenderer(
connection: CdpConnection,
sourcePathResolver: ISourcePathResolver,
launchParams: IRendererAttachParams,
logger: ILogger,
telemetry: ITelemetryReporter,
targetOrigin: ITargetOrigin,
): Promise<BrowserTargetManager | undefined> {
const rootSession = connection.rootSession();

const result = await rootSession.Target.attachToBrowserTarget({});

if (!result) return;

const browserSession = connection.createSession(result.sessionId);

return new this(
connection,
undefined,
browserSession,
sourcePathResolver,
logger,
telemetry,
launchParams,
targetOrigin,
);
}

private readonly baseFilter = createTargetFilterForConfig(
this.launchParams,
);

/**
* Target filter for interested attachments.
*/
public readonly filter: TargetFilter = (target) => {
const { debugWebWorkerExtHost, debugWebviews } = this
.launchParams as IRendererAttachParams;

if (debugWebWorkerExtHost) {
if (
target.type === BrowserTargetType.Worker &&
target.title.startsWith("DebugWorkerExtensionHost")
) {
return true;
}

if (
target.type === BrowserTargetType.Page &&
target.title.includes("[Extension Development Host]")
) {
return true;
}
}

if (
debugWebviews &&
target.type === BrowserTargetType.IFrame &&
this.baseFilter(target)
) {
return true;
}

return false;
};

/**
* @inheritdoc
*/
public waitForMainTarget(
filter?: (target: Cdp.Target.TargetInfo) => boolean,
): Promise<BrowserTarget | undefined> {
const params = this.launchParams as IRendererAttachParams;

if (params.debugWebWorkerExtHost) {
this._browser.Target.on(
"targetCreated",
this.enqueueLifecycleFn(async ({ targetInfo }) => {
if (!targetInfo.url.includes(params.__sessionId)) {
return;
}

const response = await this._browser.Target.attachToTarget({
targetId: targetInfo.targetId,
flatten: true,
});

if (response) {
this.attachedToTarget(
targetInfo,
response.sessionId,
false,
);
}
}),
);
}

return super.waitForMainTarget(filter);
}

/**
* @override
*/
protected attachedToTarget(
targetInfo: Cdp.Target.TargetInfo,
sessionId: Cdp.Target.SessionID,
waitingForDebugger: boolean,
parentTarget?: BrowserTarget,
): BrowserTarget {
const target = super.attachedToTarget(
targetInfo,
sessionId,
waitingForDebugger || this.filter(targetInfo),
parentTarget,
false,
);

if (targetInfo.type === BrowserTargetType.IFrame) {
target.setComputeNameFn(computeWebviewName);
}

return target;
}
/**
* @override
*/
static async connectRenderer(
connection: CdpConnection,
sourcePathResolver: ISourcePathResolver,
launchParams: IRendererAttachParams,
logger: ILogger,
telemetry: ITelemetryReporter,
targetOrigin: ITargetOrigin,
): Promise<BrowserTargetManager | undefined> {
const rootSession = connection.rootSession();
const result = await rootSession.Target.attachToBrowserTarget({});
if (!result) return;
const browserSession = connection.createSession(result.sessionId);
return new this(
connection,
undefined,
browserSession,
sourcePathResolver,
logger,
telemetry,
launchParams,
targetOrigin,
);
}

private readonly baseFilter = createTargetFilterForConfig(this.launchParams);

/**
* Target filter for interested attachments.
*/
public readonly filter: TargetFilter = target => {
const { debugWebWorkerExtHost, debugWebviews } = this.launchParams as IRendererAttachParams;
if (debugWebWorkerExtHost) {
if (
target.type === BrowserTargetType.Worker
&& target.title.startsWith('DebugExtensionHostWorker')
) {
return true;
}

if (
target.type === BrowserTargetType.Page
&& target.title.includes('[Extension Development Host]')
) {
return true;
}
}

if (debugWebviews && target.type === BrowserTargetType.IFrame && this.baseFilter(target)) {
return true;
}

return false;
};

/**
* @inheritdoc
*/
public waitForMainTarget(
filter?: (target: Cdp.Target.TargetInfo) => boolean,
): Promise<BrowserTarget | undefined> {
const params = this.launchParams as IRendererAttachParams;

if (params.debugWebWorkerExtHost) {
this._browser.Target.on(
'targetCreated',
this.enqueueLifecycleFn(async ({ targetInfo }) => {
if (!targetInfo.url.includes(params.__sessionId)) {
return;
}

const response = await this._browser.Target.attachToTarget({
targetId: targetInfo.targetId,
flatten: true,
});

if (response) {
this.attachedToTarget(targetInfo, response.sessionId, false);
}
}),
);
}

return super.waitForMainTarget(filter);
}

/**
* @override
*/
protected attachedToTarget(
targetInfo: Cdp.Target.TargetInfo,
sessionId: Cdp.Target.SessionID,
waitingForDebugger: boolean,
parentTarget?: BrowserTarget,
): BrowserTarget {
const target = super.attachedToTarget(
targetInfo,
sessionId,
waitingForDebugger || this.filter(targetInfo),
parentTarget,
false,
);

if (targetInfo.type === BrowserTargetType.IFrame) {
target.setComputeNameFn(computeWebviewName);
}

return target;
}
}

const computeWebviewName = (target: BrowserTarget) => {
let url: URL;

try {
url = new URL(target.targetInfo.url);
} catch {
return;
}

switch (url.searchParams.get("purpose")) {
case WebviewContentPurpose.CustomEditor:
return `${url.searchParams.get("extensionId")} editor: ${url.host}`;

case WebviewContentPurpose.NotebookRenderer:
return `Notebook Renderer: ${url.host}`;

default:
const extensionId = url.searchParams.get("extensionId");

return `Webview: ${extensionId ? extensionId + " " : ""} ${url.host}`;
}
let url: URL;
try {
url = new URL(target.targetInfo.url);
} catch {
return;
}

switch (url.searchParams.get('purpose')) {
case WebviewContentPurpose.CustomEditor:
return `${url.searchParams.get('extensionId')} editor: ${url.host}`;
case WebviewContentPurpose.NotebookRenderer:
return `Notebook Renderer: ${url.host}`;
default:
const extensionId = url.searchParams.get('extensionId');
return `Webview: ${extensionId ? extensionId + ' ' : ''} ${url.host}`;
}
};
Loading

0 comments on commit fa2bc7d

Please sign in to comment.