diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index d4508cc68b8..9932881cf06 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -349,8 +349,7 @@ export class IssueReporter extends Disposable { const disableExtensions = document.getElementById('disableExtensions'); disableExtensions.addEventListener('click', () => { - ipcRenderer.send('workbenchCommand', 'workbench.extensions.action.disableAll'); - ipcRenderer.send('workbenchCommand', 'workbench.action.reloadWindow'); + ipcRenderer.send('workbenchCommand', 'workbench.action.reloadWindowWithExtensionsDisabled'); }); disableExtensions.addEventListener('keydown', (e) => { diff --git a/src/vs/code/electron-browser/issue/media/issueReporter.css b/src/vs/code/electron-browser/issue/media/issueReporter.css index 8f1de9a6a4d..13006e1e10c 100644 --- a/src/vs/code/electron-browser/issue/media/issueReporter.css +++ b/src/vs/code/electron-browser/issue/media/issueReporter.css @@ -263,9 +263,12 @@ input:disabled { margin-top: .5em; } +.workbenchCommand { + cursor: pointer; +} + .workbenchCommand:disabled { color: #868e96; - cursor: pointer; } .block-extensions .block-info { diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index dbe69eb291e..83598a3b6a8 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -482,7 +482,7 @@ export class CodeWindow implements ICodeWindow { }); } - public load(config: IWindowConfiguration, isReload?: boolean): void { + public load(config: IWindowConfiguration, isReload?: boolean, disableExtensions?: boolean): void { // If this is the first time the window is loaded, we associate the paths // directly with the window because we assume the loading will just work @@ -499,6 +499,13 @@ export class CodeWindow implements ICodeWindow { this._readyState = ReadyState.NAVIGATING; } + // Copy the config so that the change to disable-extensions is not preserved + // on another reload. + const configuration = objects.mixin({}, config); + if (disableExtensions) { + configuration['disable-extensions'] = true; + } + // Clear Document Edited if needed if (isMacintosh && this._win.isDocumentEdited()) { if (!isReload || !this.backupMainService.isHotExitEnabled()) { @@ -517,7 +524,7 @@ export class CodeWindow implements ICodeWindow { // Load URL mark('main:loadWindow'); - this._win.loadURL(this.getUrl(config)); + this._win.loadURL(this.getUrl(configuration)); // Make window visible if it did not open in N seconds because this indicates an error // Only do this when running out of sources and not when running tests @@ -532,7 +539,7 @@ export class CodeWindow implements ICodeWindow { } } - public reload(configuration?: IWindowConfiguration, cli?: ParsedArgs): void { + public reload(configuration?: IWindowConfiguration, cli?: ParsedArgs, disableExtensions?: boolean): void { // If config is not provided, copy our current one if (!configuration) { @@ -558,7 +565,7 @@ export class CodeWindow implements ICodeWindow { configuration.isInitialStartup = false; // since this is a reload // Load config - this.load(configuration, true); + this.load(configuration, true, disableExtensions); } private getUrl(windowConfiguration: IWindowConfiguration): string { diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index ce7112ed726..4eb0ab9c85c 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -1266,12 +1266,12 @@ export class WindowsManager implements IWindowsMainService { return state; } - public reload(win: CodeWindow, cli?: ParsedArgs): void { + public reload(win: CodeWindow, cli?: ParsedArgs, disableExtensions?: boolean): void { // Only reload when the window has not vetoed this this.lifecycleService.unload(win, UnloadReason.RELOAD).done(veto => { if (!veto) { - win.reload(void 0, cli); + win.reload(void 0, cli, disableExtensions); // Emit this._onWindowReload.fire(win.id); diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 227a9a81106..fe1b297c5fa 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -109,6 +109,7 @@ export interface IWindowsService { showOpenDialog(windowId: number, options: OpenDialogOptions): TPromise; reloadWindow(windowId: number): TPromise; + reloadWindowExtensionsDisabled(windowId: number): TPromise; openDevTools(windowId: number): TPromise; toggleDevTools(windowId: number): TPromise; closeWorkspace(windowId: number): TPromise; @@ -184,6 +185,7 @@ export interface IWindowService { pickFolderAndOpen(options: INativeOpenDialogOptions): TPromise; pickWorkspaceAndOpen(options: INativeOpenDialogOptions): TPromise; reloadWindow(): TPromise; + reloadWindowExtensionsDisabled(): TPromise; openDevTools(): TPromise; toggleDevTools(): TPromise; closeWorkspace(): TPromise; diff --git a/src/vs/platform/windows/common/windowsIpc.ts b/src/vs/platform/windows/common/windowsIpc.ts index 6a899f79556..7f4c21287b2 100644 --- a/src/vs/platform/windows/common/windowsIpc.ts +++ b/src/vs/platform/windows/common/windowsIpc.ts @@ -26,6 +26,7 @@ export interface IWindowsChannel extends IChannel { call(command: 'showSaveDialog', arg: [number, SaveDialogOptions]): TPromise; call(command: 'showOpenDialog', arg: [number, OpenDialogOptions]): TPromise; call(command: 'reloadWindow', arg: number): TPromise; + call(command: 'reloadWindowExtensionsDisabled', arg: number): TPromise; call(command: 'toggleDevTools', arg: number): TPromise; call(command: 'closeWorkspace', arg: number): TPromise; call(command: 'createAndEnterWorkspace', arg: [number, IWorkspaceFolderCreationData[], string]): TPromise; @@ -91,6 +92,7 @@ export class WindowsChannel implements IWindowsChannel { case 'showMessageBox': return this.service.showMessageBox(arg[0], arg[1]); case 'showSaveDialog': return this.service.showSaveDialog(arg[0], arg[1]); case 'showOpenDialog': return this.service.showOpenDialog(arg[0], arg[1]); + case 'reloadWindowExtensionsDisabled': return this.service.reloadWindowExtensionsDisabled(arg); case 'reloadWindow': return this.service.reloadWindow(arg); case 'openDevTools': return this.service.openDevTools(arg); case 'toggleDevTools': return this.service.toggleDevTools(arg); @@ -196,6 +198,10 @@ export class WindowsChannelClient implements IWindowsService { return this.channel.call('reloadWindow', windowId); } + reloadWindowExtensionsDisabled(windowId: number): TPromise { + return this.channel.call('reloadWindowExtensionsDisabled', windowId); + } + openDevTools(windowId: number): TPromise { return this.channel.call('openDevTools', windowId); } diff --git a/src/vs/platform/windows/electron-browser/windowService.ts b/src/vs/platform/windows/electron-browser/windowService.ts index 8548cf17b9f..56f566d1e9f 100644 --- a/src/vs/platform/windows/electron-browser/windowService.ts +++ b/src/vs/platform/windows/electron-browser/windowService.ts @@ -64,6 +64,10 @@ export class WindowService implements IWindowService { return this.windowsService.reloadWindow(this.windowId); } + reloadWindowExtensionsDisabled(): TPromise { + return this.windowsService.reloadWindowExtensionsDisabled(this.windowId); + } + openDevTools(): TPromise { return this.windowsService.openDevTools(this.windowId); } diff --git a/src/vs/platform/windows/electron-main/windows.ts b/src/vs/platform/windows/electron-main/windows.ts index c105c89f2d2..837eee39463 100644 --- a/src/vs/platform/windows/electron-main/windows.ts +++ b/src/vs/platform/windows/electron-main/windows.ts @@ -59,7 +59,7 @@ export interface IWindowsMainService { // methods ready(initialUserEnv: IProcessEnvironment): void; - reload(win: ICodeWindow, cli?: ParsedArgs): void; + reload(win: ICodeWindow, cli?: ParsedArgs, disableExtensions?: boolean): void; createAndEnterWorkspace(win: ICodeWindow, folders?: IWorkspaceFolderCreationData[], path?: string): TPromise; saveAndEnterWorkspace(win: ICodeWindow, path: string): TPromise; closeWorkspace(win: ICodeWindow): void; diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index 553b78f3dfc..96da008f7b6 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -98,6 +98,16 @@ export class WindowsService implements IWindowsService, IDisposable { return this.windowsMainService.showOpenDialog(options, codeWindow); } + reloadWindowExtensionsDisabled(windowId: number): TPromise { + const codeWindow = this.windowsMainService.getWindowById(windowId); + + if (codeWindow) { + this.windowsMainService.reload(codeWindow, undefined, true); + } + + return TPromise.as(null); + } + reloadWindow(windowId: number): TPromise { const codeWindow = this.windowsMainService.getWindowById(windowId); diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index f04c6bdbf0e..b9bdfa6ecaf 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -556,6 +556,24 @@ export class ReloadWindowAction extends Action { } } +export class ReloadWindowWithExtensionsDisabledAction extends Action { + + static readonly ID = 'workbench.action.reloadWindowWithExtensionsDisabled'; + static LABEL = nls.localize('reloadWindowWithExntesionsDisabled', "Reload Window With Extensions Disabled"); + + constructor( + id: string, + label: string, + @IWindowService private windowService: IWindowService + ) { + super(id, label); + } + + run(): TPromise { + return this.windowService.reloadWindowExtensionsDisabled().then(() => true); + } +} + export abstract class BaseSwitchWindow extends Action { private closeWindowAction: CloseWindowAction; diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 3666039dbf0..31ad4f8aa2e 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -86,7 +86,7 @@ import { MenuService } from 'vs/platform/actions/common/menuService'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions'; -import { OpenRecentAction, ToggleDevToolsAction, ReloadWindowAction, ShowPreviousWindowTab, MoveWindowTabToNewWindow, MergeAllWindowTabs, ShowNextWindowTab, ToggleWindowTabsBar } from 'vs/workbench/electron-browser/actions'; +import { OpenRecentAction, ToggleDevToolsAction, ReloadWindowAction, ShowPreviousWindowTab, MoveWindowTabToNewWindow, MergeAllWindowTabs, ShowNextWindowTab, ToggleWindowTabsBar, ReloadWindowWithExtensionsDisabledAction } from 'vs/workbench/electron-browser/actions'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; import { WorkspaceEditingService } from 'vs/workbench/services/workspace/node/workspaceEditingService'; @@ -405,7 +405,7 @@ export class Workbench implements IPartService { workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ReloadWindowAction, ReloadWindowAction.ID, ReloadWindowAction.LABEL, isDeveloping ? { primary: KeyMod.CtrlCmd | KeyCode.KEY_R } : void 0), 'Reload Window'); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleDevToolsAction, ToggleDevToolsAction.ID, ToggleDevToolsAction.LABEL, isDeveloping ? { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_I, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_I } } : void 0), 'Developer: Toggle Developer Tools', localize('developer', "Developer")); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenRecentAction, OpenRecentAction.ID, OpenRecentAction.LABEL, { primary: isDeveloping ? null : KeyMod.CtrlCmd | KeyCode.KEY_R, mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_R } }), 'File: Open Recent...', localize('file', "File")); - + workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ReloadWindowWithExtensionsDisabledAction, ReloadWindowWithExtensionsDisabledAction.ID, ReloadWindowWithExtensionsDisabledAction.LABEL), 'Reload Window Without Extensions'); // Actions for macOS native tabs management (only when enabled) const windowConfig = this.configurationService.getValue(); if (windowConfig && windowConfig.window && windowConfig.window.nativeTabs) { diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 0910cc68b03..95114e28e67 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -923,6 +923,10 @@ export class TestWindowService implements IWindowService { return TPromise.as(void 0); } + reloadWindowExtensionsDisabled(): TPromise { + return TPromise.as(void 0); + } + openDevTools(): TPromise { return TPromise.as(void 0); } @@ -1057,6 +1061,10 @@ export class TestWindowsService implements IWindowsService { return TPromise.as(void 0); } + reloadWindowExtensionsDisabled(): TPromise { + return TPromise.as(void 0); + } + openDevTools(windowId: number): TPromise { return TPromise.as(void 0); }