Skip to content

Commit da27479

Browse files
committed
Integrated browser fixes, configuration provider
1 parent 2a7d148 commit da27479

4 files changed

Lines changed: 75 additions & 6 deletions

File tree

src/targets/browser/editorBrowserAttacher.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { DebugType } from '../../common/contributionUtils';
1010
import { EventEmitter } from '../../common/events';
1111
import { ILogger } from '../../common/logging';
1212
import { ISourcePathResolver } from '../../common/sourcePathResolver';
13-
import { createTargetFilter } from '../../common/urlUtils';
13+
import { createTargetFilter, requirePageTarget } from '../../common/urlUtils';
1414
import {
1515
AnyChromiumConfiguration,
1616
AnyLaunchConfiguration,
@@ -21,6 +21,7 @@ import { ProtocolError } from '../../dap/protocolError';
2121
import { VSCodeApi } from '../../ioc-extras';
2222
import { ILaunchContext, ILauncher, ILaunchResult, IStopMetadata, ITarget } from '../targets';
2323
import { BrowserTargetManager } from './browserTargetManager';
24+
import { BrowserTargetType } from './browserTargets';
2425
import { EditorBrowserSessionTransport } from './editorBrowserSessionTransport';
2526

2627
@injectable()
@@ -238,7 +239,9 @@ export class EditorBrowserAttacher implements ILauncher {
238239
}
239240
});
240241

241-
await targetManager.waitForMainTarget();
242+
await targetManager.waitForMainTarget(
243+
requirePageTarget(t => t.type === BrowserTargetType.Page),
244+
);
242245

243246
return { blockSessionTermination: true };
244247
}

src/targets/browser/editorBrowserLauncher.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { DebugType } from '../../common/contributionUtils';
1010
import { EventEmitter } from '../../common/events';
1111
import { ILogger } from '../../common/logging';
1212
import { ISourcePathResolver } from '../../common/sourcePathResolver';
13+
import { requirePageTarget } from '../../common/urlUtils';
1314
import {
1415
AnyChromiumConfiguration,
1516
AnyLaunchConfiguration,
@@ -20,6 +21,7 @@ import { ProtocolError } from '../../dap/protocolError';
2021
import { VSCodeApi } from '../../ioc-extras';
2122
import { ILaunchContext, ILauncher, ILaunchResult, IStopMetadata, ITarget } from '../targets';
2223
import { BrowserTargetManager } from './browserTargetManager';
24+
import { BrowserTargetType } from './browserTargets';
2325
import { EditorBrowserSessionTransport } from './editorBrowserSessionTransport';
2426

2527
@injectable()
@@ -75,7 +77,10 @@ export class EditorBrowserLauncher implements ILauncher {
7577
);
7678
}
7779

78-
const tab = await vscodeWindow.openBrowserTab(url);
80+
// Open the browser tab to about:blank first, then attach the debugger
81+
// before navigating to the target URL. This mirrors the Chrome/Edge launch
82+
// flow and ensures early breakpoints and on-load scripts are captured.
83+
const tab = await vscodeWindow.openBrowserTab('');
7984
const session = await tab.startCDPSession();
8085

8186
const transport = new EditorBrowserSessionTransport(session);
@@ -92,7 +97,7 @@ export class EditorBrowserLauncher implements ILauncher {
9297
connection,
9398
undefined,
9499
this.pathResolver,
95-
launchParams as unknown as AnyChromiumConfiguration,
100+
{ ...launchParams, cleanUp: 'wholeBrowser' } as unknown as AnyChromiumConfiguration,
96101
this.logger,
97102
context.telemetryReporter,
98103
context.targetOrigin,
@@ -116,7 +121,15 @@ export class EditorBrowserLauncher implements ILauncher {
116121
}
117122
});
118123

119-
await targetManager.waitForMainTarget();
124+
const mainTarget = await targetManager.waitForMainTarget(
125+
requirePageTarget(t => t.type === BrowserTargetType.Page),
126+
);
127+
128+
// Navigate to the user's URL after the debugger is attached, matching
129+
// the finishLaunch() behavior in BrowserLauncher for Chrome/Edge.
130+
if (mainTarget) {
131+
await mainTarget.cdp().Page.navigate({ url });
132+
}
120133

121134
return { blockSessionTermination: true };
122135
}

src/ui/configuration/editorBrowserDebugConfigurationProvider.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,20 @@
22
* Copyright (C) Microsoft Corporation. All rights reserved.
33
*--------------------------------------------------------*/
44

5+
import * as l10n from '@vscode/l10n';
56
import { injectable } from 'inversify';
7+
import { basename } from 'path';
68
import * as vscode from 'vscode';
79
import { DebugType } from '../../common/contributionUtils';
810
import {
911
AnyEditorBrowserConfiguration,
1012
editorBrowserAttachConfigDefaults,
1113
editorBrowserLaunchConfigDefaults,
14+
IEditorBrowserLaunchConfiguration,
15+
ResolvingConfiguration,
1216
ResolvingEditorBrowserConfiguration,
1317
} from '../../configuration';
18+
import { BaseConfigurationProvider } from './baseConfigurationProvider';
1419
import { BaseConfigurationResolver } from './baseConfigurationResolver';
1520

1621
/**
@@ -50,3 +55,47 @@ export class EditorBrowserDebugConfigurationResolver
5055
return [config.rootPath, config.webRoot];
5156
}
5257
}
58+
59+
@injectable()
60+
export class EditorBrowserDebugConfigurationProvider
61+
extends BaseConfigurationProvider<IEditorBrowserLaunchConfiguration>
62+
{
63+
protected getType() {
64+
return DebugType.EditorBrowser as const;
65+
}
66+
67+
protected getTriggerKind() {
68+
return vscode.DebugConfigurationProviderTriggerKind.Initial;
69+
}
70+
71+
protected provide(): ResolvingConfiguration<IEditorBrowserLaunchConfiguration> {
72+
return this.createLaunchConfigFromContext() || this.getDefaultLaunch();
73+
}
74+
75+
public createLaunchConfigFromContext():
76+
| ResolvingConfiguration<IEditorBrowserLaunchConfiguration>
77+
| undefined
78+
{
79+
const editor = vscode.window.activeTextEditor;
80+
if (editor && editor.document.languageId === 'html') {
81+
return {
82+
type: this.getType(),
83+
request: 'launch',
84+
name: `Open ${basename(editor.document.uri.fsPath)}`,
85+
url: editor.document.uri.toString(),
86+
} as ResolvingConfiguration<IEditorBrowserLaunchConfiguration>;
87+
}
88+
89+
return undefined;
90+
}
91+
92+
private getDefaultLaunch(): ResolvingConfiguration<IEditorBrowserLaunchConfiguration> {
93+
return {
94+
type: this.getType(),
95+
request: 'launch',
96+
name: l10n.t('Launch Integrated Browser against localhost'),
97+
url: 'http://localhost:8080',
98+
webRoot: '${workspaceFolder}',
99+
} as ResolvingConfiguration<IEditorBrowserLaunchConfiguration>;
100+
}
101+
}

src/ui/configuration/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ import {
1111
EdgeDebugConfigurationProvider,
1212
EdgeDebugConfigurationResolver,
1313
} from './edgeDebugConfigurationProvider';
14-
import { EditorBrowserDebugConfigurationResolver } from './editorBrowserDebugConfigurationProvider';
14+
import {
15+
EditorBrowserDebugConfigurationProvider,
16+
EditorBrowserDebugConfigurationResolver,
17+
} from './editorBrowserDebugConfigurationProvider';
1518
import { ExtensionHostConfigurationResolver } from './extensionHostConfigurationResolver';
1619
import {
1720
NodeDynamicDebugConfigurationProvider,
@@ -32,6 +35,7 @@ export const allConfigurationResolvers = [
3235
export const allConfigurationProviders = [
3336
ChromeDebugConfigurationProvider,
3437
EdgeDebugConfigurationProvider,
38+
EditorBrowserDebugConfigurationProvider,
3539
NodeInitialDebugConfigurationProvider,
3640
NodeDynamicDebugConfigurationProvider,
3741
];

0 commit comments

Comments
 (0)