Path: blob/main/src/vs/workbench/electron-browser/actions/developerActions.ts
3296 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 { localize, localize2 } from '../../../nls.js';6import { INativeHostService } from '../../../platform/native/common/native.js';7import { IEditorService } from '../../services/editor/common/editorService.js';8import { Action2, MenuId } from '../../../platform/actions/common/actions.js';9import { Categories } from '../../../platform/action/common/actionCommonCategories.js';10import { ServicesAccessor } from '../../../platform/instantiation/common/instantiation.js';11import { IWorkbenchEnvironmentService } from '../../services/environment/common/environmentService.js';12import { KeybindingWeight } from '../../../platform/keybinding/common/keybindingsRegistry.js';13import { IsDevelopmentContext } from '../../../platform/contextkey/common/contextkeys.js';14import { KeyCode, KeyMod } from '../../../base/common/keyCodes.js';15import { INativeWorkbenchEnvironmentService } from '../../services/environment/electron-browser/environmentService.js';16import { URI } from '../../../base/common/uri.js';17import { getActiveWindow } from '../../../base/browser/dom.js';18import { IDialogService } from '../../../platform/dialogs/common/dialogs.js';19import { INativeEnvironmentService } from '../../../platform/environment/common/environment.js';20import { IProgressService, ProgressLocation } from '../../../platform/progress/common/progress.js';2122export class ToggleDevToolsAction extends Action2 {2324constructor() {25super({26id: 'workbench.action.toggleDevTools',27title: localize2('toggleDevTools', 'Toggle Developer Tools'),28category: Categories.Developer,29f1: true,30keybinding: {31weight: KeybindingWeight.WorkbenchContrib + 50,32when: IsDevelopmentContext,33primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KeyI,34mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KeyI }35},36menu: {37id: MenuId.MenubarHelpMenu,38group: '5_tools',39order: 140}41});42}4344async run(accessor: ServicesAccessor): Promise<void> {45const nativeHostService = accessor.get(INativeHostService);4647return nativeHostService.toggleDevTools({ targetWindowId: getActiveWindow().vscodeWindowId });48}49}5051export class ConfigureRuntimeArgumentsAction extends Action2 {5253constructor() {54super({55id: 'workbench.action.configureRuntimeArguments',56title: localize2('configureRuntimeArguments', 'Configure Runtime Arguments'),57category: Categories.Preferences,58f1: true59});60}6162async run(accessor: ServicesAccessor): Promise<void> {63const editorService = accessor.get(IEditorService);64const environmentService = accessor.get(IWorkbenchEnvironmentService);6566await editorService.openEditor({67resource: environmentService.argvResource,68options: { pinned: true }69});70}71}7273export class ReloadWindowWithExtensionsDisabledAction extends Action2 {7475constructor() {76super({77id: 'workbench.action.reloadWindowWithExtensionsDisabled',78title: localize2('reloadWindowWithExtensionsDisabled', 'Reload with Extensions Disabled'),79category: Categories.Developer,80f1: true81});82}8384async run(accessor: ServicesAccessor): Promise<void> {85return accessor.get(INativeHostService).reload({ disableExtensions: true });86}87}8889export class OpenUserDataFolderAction extends Action2 {9091constructor() {92super({93id: 'workbench.action.revealUserDataFolder',94title: localize2('revealUserDataFolder', 'Reveal User Data Folder'),95category: Categories.Developer,96f1: true97});98}99100async run(accessor: ServicesAccessor): Promise<void> {101const nativeHostService = accessor.get(INativeHostService);102const environmentService = accessor.get(INativeWorkbenchEnvironmentService);103104return nativeHostService.showItemInFolder(URI.file(environmentService.userDataPath).fsPath);105}106}107108export class ShowGPUInfoAction extends Action2 {109110constructor() {111super({112id: 'workbench.action.showGPUInfo',113title: localize2('showGPUInfo', 'Show GPU Info'),114category: Categories.Developer,115f1: true116});117}118119run(accessor: ServicesAccessor) {120const nativeHostService = accessor.get(INativeHostService);121nativeHostService.openGPUInfoWindow();122}123}124125export class StopTracing extends Action2 {126127static readonly ID = 'workbench.action.stopTracing';128129constructor() {130super({131id: StopTracing.ID,132title: localize2('stopTracing', 'Stop Tracing'),133category: Categories.Developer,134f1: true135});136}137138override async run(accessor: ServicesAccessor): Promise<void> {139const environmentService = accessor.get(INativeEnvironmentService);140const dialogService = accessor.get(IDialogService);141const nativeHostService = accessor.get(INativeHostService);142const progressService = accessor.get(IProgressService);143144if (!environmentService.args.trace) {145const { confirmed } = await dialogService.confirm({146message: localize('stopTracing.message', "Tracing requires to launch with a '--trace' argument"),147primaryButton: localize({ key: 'stopTracing.button', comment: ['&& denotes a mnemonic'] }, "&&Relaunch and Enable Tracing"),148});149150if (confirmed) {151return nativeHostService.relaunch({ addArgs: ['--trace'] });152}153}154155await progressService.withProgress({156location: ProgressLocation.Dialog,157title: localize('stopTracing.title', "Creating trace file..."),158cancellable: false,159detail: localize('stopTracing.detail', "This can take up to one minute to complete.")160}, () => nativeHostService.stopTracing());161}162}163164165