in src/extension.ts [60:244]
export function activate(context: vscode.ExtensionContext): void {
if (!telemetryReporter) {
telemetryReporter = createTelemetryReporter(context);
}
// enable/disable standalone screencast target panel icon.
const standaloneScreencast = SettingsProvider.instance.getScreencastSettings();
void vscode.commands.executeCommand('setContext', 'standaloneScreencast', standaloneScreencast);
// Check if launch.json exists and has supported config to populate side pane welcome message
LaunchConfigManager.instance.updateLaunchConfig();
context.subscriptions.push(vscode.commands.registerCommand(`${SETTINGS_STORE_NAME}.attach`, (): void => {
void attach(context);
}));
context.subscriptions.push(vscode.commands.registerCommand(`${SETTINGS_STORE_NAME}.launch`, (): void => {
void launch(context);
}));
context.subscriptions.push(vscode.commands.registerCommand(`${SETTINGS_STORE_NAME}.attachToCurrentDebugTarget`, (debugSessionId): void => {
void attachToCurrentDebugTarget(context, debugSessionId);
}));
// Register the launch provider
vscode.debug.registerDebugConfigurationProvider(`${SETTINGS_STORE_NAME}.debug`,
new LaunchDebugProvider(context, telemetryReporter, attach, launch));
// Register the Microsoft Edge debugger types
vscode.debug.registerDebugConfigurationProvider('edge',
new LaunchDebugProvider(context, telemetryReporter, attach, launch));
vscode.debug.registerDebugConfigurationProvider('msedge',
new LaunchDebugProvider(context, telemetryReporter, attach, launch));
// Register the side-panel view and its commands
cdpTargetsProvider = new CDPTargetsProvider(context, telemetryReporter);
context.subscriptions.push(vscode.window.registerTreeDataProvider(
`${SETTINGS_VIEW_NAME}.targets`,
cdpTargetsProvider));
context.subscriptions.push(vscode.commands.registerCommand(
`${SETTINGS_VIEW_NAME}.launch`,
async (fromEmptyTargetView?: boolean) => {
if (fromEmptyTargetView) {
telemetryReporter.sendTelemetryEvent('user/buttonPress', { 'VSCode.buttonCode': buttonCode.emptyTargetListLaunchBrowserInstance });
} else {
telemetryReporter.sendTelemetryEvent('user/buttonPress', { 'VSCode.buttonCode': buttonCode.launchBrowserInstance });
}
await launch(context);
cdpTargetsProvider.refresh();
}));
context.subscriptions.push(vscode.commands.registerCommand(
`${SETTINGS_VIEW_NAME}.refresh`,
() => {
telemetryReporter.sendTelemetryEvent('user/buttonPress', { 'VSCode.buttonCode': buttonCode.refreshTargetList });
cdpTargetsProvider.refresh();
}));
context.subscriptions.push(vscode.commands.registerCommand(
`${SETTINGS_VIEW_NAME}.attach`,
(target?: CDPTarget) => {
if (!target){
telemetryReporter.sendTelemetryEvent('command/attach/noTarget');
return;
}
telemetryReporter.sendTelemetryEvent('user/buttonPress', { 'VSCode.buttonCode': buttonCode.attachToTarget });
telemetryReporter.sendTelemetryEvent('view/devtools');
const runtimeConfig = getRuntimeConfig();
DevToolsPanel.createOrShow(context, telemetryReporter, target.websocketUrl, runtimeConfig);
}));
context.subscriptions.push(vscode.commands.registerCommand(
`${SETTINGS_VIEW_NAME}.toggleScreencast`,
(target?: CDPTarget, isJsDebugProxiedCDPConnection = false) => {
if (!target){
const errorMessage = 'No target selected';
telemetryReporter.sendTelemetryErrorEvent('command/screencast/target', {message: errorMessage});
return;
}
telemetryReporter.sendTelemetryEvent('user/buttonPress', { 'VSCode.buttonCode': buttonCode.toggleScreencast });
telemetryReporter.sendTelemetryEvent('view/screencast');
ScreencastPanel.createOrShow(context, telemetryReporter, target.websocketUrl, isJsDebugProxiedCDPConnection);
}));
context.subscriptions.push(vscode.commands.registerCommand(
`${SETTINGS_VIEW_NAME}.toggleInspect`,
(enabled: boolean) => {
if (ScreencastPanel.instance) {
ScreencastPanel.instance.toggleInspect(enabled);
}
}));
context.subscriptions.push(vscode.commands.registerCommand(`${SETTINGS_VIEW_NAME}.openSettings`, () => {
telemetryReporter.sendTelemetryEvent('user/buttonPress', { 'VSCode.buttonCode': buttonCode.openSettings });
void vscode.commands.executeCommand('workbench.action.openSettings', `${SETTINGS_STORE_NAME}`);
}));
context.subscriptions.push(vscode.commands.registerCommand(`${SETTINGS_VIEW_NAME}.viewChangelog`, () => {
telemetryReporter.sendTelemetryEvent('user/buttonPress', { 'VSCode.buttonCode': buttonCode.viewChangelog });
void vscode.env.openExternal(vscode.Uri.parse('https://github.com/microsoft/vscode-edge-devtools/blob/main/CHANGELOG.md'));
}));
context.subscriptions.push(vscode.commands.registerCommand(
`${SETTINGS_VIEW_NAME}.close-instance`,
async (target?: CDPTarget) => {
if (!target) {
telemetryReporter.sendTelemetryEvent('command/close/noTarget');
return;
}
telemetryReporter.sendTelemetryEvent('user/buttonPress', { 'VSCode.buttonCode': buttonCode.closeTarget });
// disable buttons for this target
target.contextValue = 'cdpTargetClosing';
cdpTargetsProvider.changeDataEvent.fire(target);
// update with the latest information, in case user has navigated to a different page via browser.
cdpTargetsProvider.refresh();
const normalizedPath = new URL(target.description).toString();
if (browserInstance) {
const browserPages = await browserInstance.pages();
for (const page of browserPages) {
// URL needs to be accessed through the target as the page could be handling errors in a different way.
// e.g redirecting to chrome-error: protocol
if (!page.isClosed() && (normalizedPath === page.target().url())) {
// fire and forget
void page.close();
break;
}
}
// display the latest information to user.
cdpTargetsProvider.refresh();
}
}));
context.subscriptions.push(vscode.commands.registerCommand(
`${SETTINGS_VIEW_NAME}.copyItem`,
(target: CDPTarget) => vscode.env.clipboard.writeText(target.tooltip)));
context.subscriptions.push(vscode.commands.registerCommand(
`${SETTINGS_VIEW_NAME}.configureLaunchJson`,
() => {
telemetryReporter.sendTelemetryEvent('user/buttonPress', {
'VSCode.buttonCode': LaunchConfigManager.instance.getLaunchConfig() === 'None' ? buttonCode.generateLaunchJson : buttonCode.configureLaunchJson,
});
void LaunchConfigManager.instance.configureLaunchJson();
}));
context.subscriptions.push(vscode.commands.registerCommand(
`${SETTINGS_VIEW_NAME}.launchProject`,
() => {
telemetryReporter.sendTelemetryEvent('user/buttonPress', { 'VSCode.buttonCode': buttonCode.launchProject });
LaunchConfigManager.instance.updateLaunchConfig();
if (vscode.workspace.workspaceFolders && LaunchConfigManager.instance.isValidLaunchConfig) {
void vscode.debug.startDebugging(vscode.workspace.workspaceFolders[0], LaunchConfigManager.instance.getLaunchConfig());
cdpTargetsProvider.refresh();
}
}));
context.subscriptions.push(vscode.commands.registerCommand(`${SETTINGS_VIEW_NAME}.viewDocumentation`, () => {
telemetryReporter.sendTelemetryEvent('user/buttonPress', { 'VSCode.buttonCode': buttonCode.viewDocumentation });
void vscode.env.openExternal(vscode.Uri.parse('https://docs.microsoft.com/en-us/microsoft-edge/visual-studio-code/microsoft-edge-devtools-extension'));
}));
const settingsConfig = vscode.workspace.getConfiguration(SETTINGS_STORE_NAME);
const mirrorEditsEnabled = settingsConfig.get('mirrorEdits');
void vscode.commands.executeCommand('setContext', 'mirrorEditingEnabled', mirrorEditsEnabled);
context.subscriptions.push(vscode.commands.registerCommand(`${SETTINGS_VIEW_NAME}.toggleMirrorEditingOn`, () => {
void settingsConfig.update('mirrorEdits', true, true);
void vscode.commands.executeCommand('setContext', 'mirrorEditingEnabled', true);
}));
context.subscriptions.push(vscode.commands.registerCommand(`${SETTINGS_VIEW_NAME}.toggleMirrorEditingOff`, () => {
void settingsConfig.update('mirrorEdits', false, true);
void vscode.commands.executeCommand('setContext', 'mirrorEditingEnabled', false);
}));
void settingsConfig.update('mirrorEdits', true, true);
void vscode.commands.executeCommand('setContext', 'mirrorEditingEnabled', true);
void vscode.commands.executeCommand('setContext', 'titleCommandsRegistered', true);
void reportFileExtensionTypes(telemetryReporter);
reportExtensionSettings(telemetryReporter);
vscode.workspace.onDidChangeConfiguration(event => reportChangedExtensionSetting(event, telemetryReporter));
if (settingsConfig.get('webhint')) {
startWebhint(context);
}
vscode.workspace.onDidChangeConfiguration(event => {
if (event.affectsConfiguration(`${SETTINGS_STORE_NAME}.webhint`)) {
if (vscode.workspace.getConfiguration(SETTINGS_STORE_NAME).get('webhint')) {
startWebhint(context);
} else {
void stopWebhint();
}
}
});
}