From 166110a1bcf80077e51f7b7c451d05dde65ef608 Mon Sep 17 00:00:00 2001 From: Krzysztof Cieslak Date: Wed, 16 May 2018 13:06:52 +0200 Subject: [PATCH 01/19] Add activePanel context key --- .../browser/parts/panel/panelPart.ts | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index c22eec7af83..fa06f0b7907 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -30,7 +30,11 @@ import { IBadge } from 'vs/workbench/services/activity/common/activity'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { Dimension } from 'vs/base/browser/dom'; import { localize } from 'vs/nls'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; + +const ActivePanleContextId = 'activePanel'; +export const ActivePanelContext = new RawContextKey(ActivePanleContextId, ''); export class PanelPart extends CompositePart implements IPanelService { @@ -40,10 +44,12 @@ export class PanelPart extends CompositePart implements IPanelService { public _serviceBrand: any; + private activePanelContextKey: IContextKey; private blockOpeningPanel: boolean; private compositeBar: CompositeBar; private compositeActions: { [compositeId: string]: { activityAction: PanelActivityAction, pinnedAction: ToggleCompositePinnedAction } }; private dimension: Dimension; + private disposables: IDisposable[] = []; constructor( id: string, @@ -54,7 +60,8 @@ export class PanelPart extends CompositePart implements IPanelService { @IPartService partService: IPartService, @IKeybindingService keybindingService: IKeybindingService, @IInstantiationService instantiationService: IInstantiationService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @IContextKeyService contextKeyService: IContextKeyService, ) { super( notificationService, @@ -100,6 +107,9 @@ export class PanelPart extends CompositePart implements IPanelService { for (const panel of this.getPanels()) { this.compositeBar.addComposite(panel, false); } + this.activePanelContextKey = ActivePanelContext.bindTo(contextKeyService); + this.onDidPanelOpen(this._onDidPanelOpen, this, this.disposables); + this.onDidPanelClose(this._onDidPanelClose, this, this.disposables); this.registerListeners(); } @@ -119,6 +129,18 @@ export class PanelPart extends CompositePart implements IPanelService { this.toUnbind.push(this.onDidPanelClose(panel => this.compositeBar.deactivateComposite(panel.getId()))); } + private _onDidPanelOpen(viewlet: IPanel): void { + this.activePanelContextKey.set(viewlet.getId()); + } + + private _onDidPanelClose(viewlet: IPanel): void { + const id = viewlet.getId(); + + if (this.activePanelContextKey.get() === id) { + this.activePanelContextKey.set(''); + } + } + public get onDidPanelOpen(): Event { return this._onDidCompositeOpen.event; } @@ -277,6 +299,10 @@ export class PanelPart extends CompositePart implements IPanelService { } return this.toolBar.getItemsWidth(); } + + dispose(): void { + this.disposables = dispose(this.disposables); + } } registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { From b6a508818f42d1ee9a3019f8f6a6b4ea0e1dfe72 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 18 May 2018 15:00:00 +0200 Subject: [PATCH 02/19] minor polish --- src/vs/workbench/browser/parts/panel/panelPart.ts | 3 ++- src/vs/workbench/services/viewlet/browser/viewletService.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index fa06f0b7907..06578335499 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -137,7 +137,7 @@ export class PanelPart extends CompositePart implements IPanelService { const id = viewlet.getId(); if (this.activePanelContextKey.get() === id) { - this.activePanelContextKey.set(''); + this.activePanelContextKey.reset(); } } @@ -301,6 +301,7 @@ export class PanelPart extends CompositePart implements IPanelService { } dispose(): void { + super.dispose(); this.disposables = dispose(this.disposables); } } diff --git a/src/vs/workbench/services/viewlet/browser/viewletService.ts b/src/vs/workbench/services/viewlet/browser/viewletService.ts index 6b3d31eaaff..0a6b990f23f 100644 --- a/src/vs/workbench/services/viewlet/browser/viewletService.ts +++ b/src/vs/workbench/services/viewlet/browser/viewletService.ts @@ -57,7 +57,7 @@ export class ViewletService implements IViewletService { const id = viewlet.getId(); if (this.activeViewletContextKey.get() === id) { - this.activeViewletContextKey.set(''); + this.activeViewletContextKey.reset(); } } From 416f24c4ad9cf983c297a2578d13aa06b8aa4c34 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 18 May 2018 15:33:21 +0200 Subject: [PATCH 03/19] allow to stop an initialising session fixes #47863 --- src/vs/workbench/parts/debug/browser/debugActions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/browser/debugActions.ts b/src/vs/workbench/parts/debug/browser/debugActions.ts index 356ce009c82..e42bf7208f0 100644 --- a/src/vs/workbench/parts/debug/browser/debugActions.ts +++ b/src/vs/workbench/parts/debug/browser/debugActions.ts @@ -340,7 +340,7 @@ export class StopAction extends AbstractDebugAction { } protected isEnabled(state: State): boolean { - return super.isEnabled(state) && (state === State.Running || state === State.Stopped); + return super.isEnabled(state) && (state !== State.Inactive); } } From 19a13966ecdf107c970cc0bd8cbeec97082caa14 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 18 May 2018 15:35:30 +0200 Subject: [PATCH 04/19] show debug actions bar also while initatising fixes #47863 --- src/vs/workbench/parts/debug/browser/debugActionsWidget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts b/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts index f82d0e8d385..bb1215bd6d7 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts @@ -92,7 +92,7 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi this.updateScheduler = new RunOnceScheduler(() => { const state = this.debugService.state; - if (state === State.Inactive || state === State.Initializing || this.configurationService.getValue('debug').hideActionBar + if (state === State.Inactive || this.configurationService.getValue('debug').hideActionBar || this.configurationService.getValue('debug').toolbar !== 'float') { return this.hide(); } From 5f2489523f3cf11c95ad5f094fd93a48a4a11402 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 18 May 2018 09:49:23 -0700 Subject: [PATCH 05/19] Bump node2 --- build/builtInExtensions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/builtInExtensions.json b/build/builtInExtensions.json index 1e61897c5ed..65a8a64d140 100644 --- a/build/builtInExtensions.json +++ b/build/builtInExtensions.json @@ -6,7 +6,7 @@ }, { "name": "ms-vscode.node-debug2", - "version": "1.24.1", + "version": "1.24.2", "repo": "https://github.com/Microsoft/vscode-node-debug2" } ] From 8af4d59348ceb1d0b2a3337051547268bf3c2c54 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 18 May 2018 12:21:34 -0700 Subject: [PATCH 06/19] Simplify dom renderer notification --- .../parts/terminal/electron-browser/terminalInstance.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 065134148d9..d67d6c40f50 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -463,7 +463,7 @@ export class TerminalInstance implements ITerminalInstance { ]; this._notificationService.prompt( Severity.Warning, - nls.localize('terminal.slowRendering', 'The current standard canvas renderer for the integrated terminal appears to be slow on your computer. Using the DOM-based renderer may improve performance, do you want to switch to the DOM-based renderer? [Read more about terminal settings](https://code.visualstudio.com/docs/editor/integrated-terminal#_changing-how-the-terminal-is-rendered).'), + nls.localize('terminal.slowRendering', 'The standard renderer for the integrated terminal appears to be slow on your computer. Would you like to switch to the alternative DOM-based renderer which may improve performance? [Read more about terminal settings](https://code.visualstudio.com/docs/editor/integrated-terminal#_changing-how-the-terminal-is-rendered).'), promptChoices ); } From 5ce6a2ea6bf3ad1749bc1ef0671efd92cafba5f0 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 18 May 2018 12:25:00 -0700 Subject: [PATCH 07/19] vscode-xterm@3.5.0-beta6 Fixes #50125 --- package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 5695269c991..34878ee1799 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "vscode-nsfw": "1.0.17", "vscode-ripgrep": "^0.8.1", "vscode-textmate": "^3.3.3", - "vscode-xterm": "3.5.0-beta5", + "vscode-xterm": "3.5.0-beta6", "yauzl": "^2.9.1" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index b5a7ee24423..c960fa4db67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5997,9 +5997,9 @@ vscode-textmate@^3.3.3: fast-plist "^0.1.2" oniguruma "^6.0.1" -vscode-xterm@3.5.0-beta5: - version "3.5.0-beta5" - resolved "https://registry.yarnpkg.com/vscode-xterm/-/vscode-xterm-3.5.0-beta5.tgz#f44c0e327d292a90110ef086d9d98954f479b74b" +vscode-xterm@3.5.0-beta6: + version "3.5.0-beta6" + resolved "https://registry.yarnpkg.com/vscode-xterm/-/vscode-xterm-3.5.0-beta6.tgz#215df0c812536830ce65c3266ad5fc9ffe7b4a4f" vso-node-api@^6.1.2-preview: version "6.1.2-preview" From 6f1731c5c2b29fa10eb4ee60f8d45b5cfce7c75b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 18 May 2018 12:27:59 -0700 Subject: [PATCH 08/19] Prevent error when hitting No button Fixes #50124 --- .../parts/terminal/electron-browser/terminalInstance.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index d67d6c40f50..6f8ff9a4f3b 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -453,7 +453,8 @@ export class TerminalInstance implements ITerminalInstance { } } as IPromptChoice, { - label: nls.localize('no', "No") + label: nls.localize('no', "No"), + run: () => { } } as IPromptChoice, { label: nls.localize('dontShowAgain', "Don't Show Again"), From 28e770f4027421fead2909bec9070f7383d813fd Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 18 May 2018 12:29:52 -0700 Subject: [PATCH 09/19] Double DOM renderer suggestion time Part of #50130 --- .../parts/terminal/electron-browser/terminalInstance.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 6f8ff9a4f3b..1f92278b010 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -37,7 +37,7 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag // How long in milliseconds should an average frame take to render for a notification to appear // which suggests the fallback DOM-based renderer -const SLOW_CANVAS_RENDER_THRESHOLD = 50; +const SLOW_CANVAS_RENDER_THRESHOLD = 100; let Terminal: typeof XTermTerminal; From b8a9da5a1f62a4e7d88e12fb12e4b82d56f62fe4 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 18 May 2018 14:55:02 -0700 Subject: [PATCH 10/19] Improve when dom renderer notification is displayed Fixes #50130 --- .../electron-browser/terminalInstance.ts | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 1f92278b010..6bcd8d7dd2e 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -37,7 +37,8 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag // How long in milliseconds should an average frame take to render for a notification to appear // which suggests the fallback DOM-based renderer -const SLOW_CANVAS_RENDER_THRESHOLD = 100; +const SLOW_CANVAS_RENDER_THRESHOLD = 50; +const NUMBER_OF_FRAMES_TO_MEASURE = 20; let Terminal: typeof XTermTerminal; @@ -436,13 +437,16 @@ export class TerminalInstance implements ITerminalInstance { } private _measureRenderTime(): void { + let frameTimes: number[] = []; const textRenderLayer = (this._xterm).renderer._renderLayers[0]; const originalOnGridChanged = textRenderLayer.onGridChanged; - textRenderLayer.onGridChanged = (terminal: XTermTerminal, firstRow: number, lastRow: number) => { - const startTime = performance.now(); - originalOnGridChanged.call(textRenderLayer, terminal, firstRow, lastRow); - const renderTimeMilliseconds = performance.now() - startTime; - if (renderTimeMilliseconds > SLOW_CANVAS_RENDER_THRESHOLD) { + + const evaluateCanvasRenderer = () => { + // Discard first frame time as it's normal to take longer + frameTimes.shift(); + + const averageTime = frameTimes.reduce((p, c) => p + c) / frameTimes.length; + if (averageTime > SLOW_CANVAS_RENDER_THRESHOLD) { const promptChoices: IPromptChoice[] = [ { label: nls.localize('yes', "Yes"), @@ -468,9 +472,17 @@ export class TerminalInstance implements ITerminalInstance { promptChoices ); } + }; - // Restore original function - textRenderLayer.onGridChanged = originalOnGridChanged; + textRenderLayer.onGridChanged = (terminal: XTermTerminal, firstRow: number, lastRow: number) => { + const startTime = performance.now(); + originalOnGridChanged.call(textRenderLayer, terminal, firstRow, lastRow); + frameTimes.push(performance.now() - startTime); + if (frameTimes.length === NUMBER_OF_FRAMES_TO_MEASURE) { + evaluateCanvasRenderer(); + // Restore original function + textRenderLayer.onGridChanged = originalOnGridChanged; + } }; } From be224bdf25d4edcd3d63f6f1d10ea816a9af7467 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 18 May 2018 15:35:07 -0700 Subject: [PATCH 11/19] Pick up updated md grammar #50097 --- .../syntaxes/markdown.tmLanguage.json | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json b/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json index 820134b366a..091e4378a90 100644 --- a/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json +++ b/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/microsoft/vscode-markdown-tm-grammar/commit/e667795f83c83e36dc6f90bde14632a963c52e34", + "version": "https://github.com/microsoft/vscode-markdown-tm-grammar/commit/ab08007feb924996eff9399c169f171fa17899ca", "name": "Markdown", "scopeName": "text.html.markdown", "patterns": [ @@ -162,6 +162,9 @@ { "include": "#fenced_code_block_fsharp" }, + { + "include": "#fenced_code_block_dart" + }, { "include": "#fenced_code_block_unknown" }, @@ -1649,6 +1652,39 @@ } ] }, + "fenced_code_block_dart": { + "begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(dart)(\\s+[^`~]*)?$)", + "name": "markup.fenced_code.block.markdown", + "end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$", + "beginCaptures": { + "3": { + "name": "punctuation.definition.markdown" + }, + "5": { + "name": "fenced_code.block.language" + }, + "6": { + "name": "fenced_code.block.language.attributes" + } + }, + "endCaptures": { + "3": { + "name": "punctuation.definition.markdown" + } + }, + "patterns": [ + { + "begin": "(^|\\G)(\\s*)(.*)", + "while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)", + "contentName": "meta.embedded.block.dart", + "patterns": [ + { + "include": "source.dart" + } + ] + } + ] + }, "fenced_code_block_unknown": { "begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?=([^`~]*)?$)", "beginCaptures": { From 9676323da4432b694d3d460e1b9897636a1b4ed9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 18 May 2018 16:09:48 -0700 Subject: [PATCH 12/19] Use HTMLElementEventMap --- src/vs/base/browser/event.ts | 101 +---------------------------------- 1 file changed, 1 insertion(+), 100 deletions(-) diff --git a/src/vs/base/browser/event.ts b/src/vs/base/browser/event.ts index 25b85a6807d..5a641e95041 100644 --- a/src/vs/base/browser/event.ts +++ b/src/vs/base/browser/event.ts @@ -2,112 +2,13 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; import { Event as _Event, Emitter, mapEvent } from 'vs/base/common/event'; export type EventHandler = HTMLElement | HTMLDocument | Window; export interface IDomEvent { - (element: EventHandler, type: 'MSContentZoom', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSGestureChange', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSGestureDoubleTap', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSGestureEnd', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSGestureHold', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSGestureStart', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSGestureTap', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSGotPointerCapture', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSInertiaStart', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSLostPointerCapture', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerCancel', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerDown', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerEnter', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerLeave', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerMove', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerOut', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerOver', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerUp', useCapture?: boolean): _Event; - (element: EventHandler, type: 'abort', useCapture?: boolean): _Event; - (element: EventHandler, type: 'activate', useCapture?: boolean): _Event; - (element: EventHandler, type: 'beforeactivate', useCapture?: boolean): _Event; - (element: EventHandler, type: 'beforecopy', useCapture?: boolean): _Event; - (element: EventHandler, type: 'beforecut', useCapture?: boolean): _Event; - (element: EventHandler, type: 'beforedeactivate', useCapture?: boolean): _Event; - (element: EventHandler, type: 'beforepaste', useCapture?: boolean): _Event; - (element: EventHandler, type: 'blur', useCapture?: boolean): _Event; - (element: EventHandler, type: 'canplay', useCapture?: boolean): _Event; - (element: EventHandler, type: 'canplaythrough', useCapture?: boolean): _Event; - (element: EventHandler, type: 'change', useCapture?: boolean): _Event; - (element: EventHandler, type: 'click', useCapture?: boolean): _Event; - (element: EventHandler, type: 'contextmenu', useCapture?: boolean): _Event; - (element: EventHandler, type: 'copy', useCapture?: boolean): _Event; - (element: EventHandler, type: 'cuechange', useCapture?: boolean): _Event; - (element: EventHandler, type: 'cut', useCapture?: boolean): _Event; - (element: EventHandler, type: 'dblclick', useCapture?: boolean): _Event; - (element: EventHandler, type: 'deactivate', useCapture?: boolean): _Event; - (element: EventHandler, type: 'drag', useCapture?: boolean): _Event; - (element: EventHandler, type: 'dragend', useCapture?: boolean): _Event; - (element: EventHandler, type: 'dragenter', useCapture?: boolean): _Event; - (element: EventHandler, type: 'dragleave', useCapture?: boolean): _Event; - (element: EventHandler, type: 'dragover', useCapture?: boolean): _Event; - (element: EventHandler, type: 'dragstart', useCapture?: boolean): _Event; - (element: EventHandler, type: 'drop', useCapture?: boolean): _Event; - (element: EventHandler, type: 'durationchange', useCapture?: boolean): _Event; - (element: EventHandler, type: 'emptied', useCapture?: boolean): _Event; - (element: EventHandler, type: 'ended', useCapture?: boolean): _Event; - (element: EventHandler, type: 'error', useCapture?: boolean): _Event; - (element: EventHandler, type: 'focus', useCapture?: boolean): _Event; - (element: EventHandler, type: 'gotpointercapture', useCapture?: boolean): _Event; - (element: EventHandler, type: 'input', useCapture?: boolean): _Event; - (element: EventHandler, type: 'keydown', useCapture?: boolean): _Event; - (element: EventHandler, type: 'keypress', useCapture?: boolean): _Event; - (element: EventHandler, type: 'keyup', useCapture?: boolean): _Event; - (element: EventHandler, type: 'load', useCapture?: boolean): _Event; - (element: EventHandler, type: 'loadeddata', useCapture?: boolean): _Event; - (element: EventHandler, type: 'loadedmetadata', useCapture?: boolean): _Event; - (element: EventHandler, type: 'loadstart', useCapture?: boolean): _Event; - (element: EventHandler, type: 'lostpointercapture', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mousedown', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mouseenter', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mouseleave', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mousemove', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mouseout', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mouseover', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mouseup', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mousewheel', useCapture?: boolean): _Event; - (element: EventHandler, type: 'paste', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pause', useCapture?: boolean): _Event; - (element: EventHandler, type: 'play', useCapture?: boolean): _Event; - (element: EventHandler, type: 'playing', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointercancel', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointerdown', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointerenter', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointerleave', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointermove', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointerout', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointerover', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointerup', useCapture?: boolean): _Event; - (element: EventHandler, type: 'progress', useCapture?: boolean): _Event; - (element: EventHandler, type: 'ratechange', useCapture?: boolean): _Event; - (element: EventHandler, type: 'reset', useCapture?: boolean): _Event; - (element: EventHandler, type: 'scroll', useCapture?: boolean): _Event; - (element: EventHandler, type: 'seeked', useCapture?: boolean): _Event; - (element: EventHandler, type: 'seeking', useCapture?: boolean): _Event; - (element: EventHandler, type: 'select', useCapture?: boolean): _Event; - (element: EventHandler, type: 'selectstart', useCapture?: boolean): _Event; - (element: EventHandler, type: 'stalled', useCapture?: boolean): _Event; - (element: EventHandler, type: 'submit', useCapture?: boolean): _Event; - (element: EventHandler, type: 'suspend', useCapture?: boolean): _Event; - (element: EventHandler, type: 'timeupdate', useCapture?: boolean): _Event; - (element: EventHandler, type: 'touchcancel', useCapture?: boolean): _Event; - (element: EventHandler, type: 'touchend', useCapture?: boolean): _Event; - (element: EventHandler, type: 'touchmove', useCapture?: boolean): _Event; - (element: EventHandler, type: 'touchstart', useCapture?: boolean): _Event; - (element: EventHandler, type: 'volumechange', useCapture?: boolean): _Event; - (element: EventHandler, type: 'waiting', useCapture?: boolean): _Event; - (element: EventHandler, type: 'webkitfullscreenchange', useCapture?: boolean): _Event; - (element: EventHandler, type: 'webkitfullscreenerror', useCapture?: boolean): _Event; - (element: EventHandler, type: 'wheel', useCapture?: boolean): _Event; + (element: EventHandler, type: K, useCapture?: boolean): _Event; (element: EventHandler, type: string, useCapture?: boolean): _Event; } From e95a1f45bb4bad71d327860dd1e314d3b869c6ff Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 18 May 2018 16:10:19 -0700 Subject: [PATCH 13/19] Remove unneeded alias --- src/vs/base/browser/event.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/base/browser/event.ts b/src/vs/base/browser/event.ts index 5a641e95041..ba6349a1471 100644 --- a/src/vs/base/browser/event.ts +++ b/src/vs/base/browser/event.ts @@ -3,13 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event as _Event, Emitter, mapEvent } from 'vs/base/common/event'; +import { Event, Emitter, mapEvent } from 'vs/base/common/event'; export type EventHandler = HTMLElement | HTMLDocument | Window; export interface IDomEvent { - (element: EventHandler, type: K, useCapture?: boolean): _Event; - (element: EventHandler, type: string, useCapture?: boolean): _Event; + (element: EventHandler, type: K, useCapture?: boolean): Event; + (element: EventHandler, type: string, useCapture?: boolean): Event; } export const domEvent: IDomEvent = (element: EventHandler, type: string, useCapture?: boolean) => { @@ -31,7 +31,7 @@ export interface CancellableEvent { stopPropagation(); } -export function stop(event: _Event): _Event { +export function stop(event: Event): Event { return mapEvent(event, e => { e.preventDefault(); e.stopPropagation(); From a7326715f6a791116e803eccdd7a40f657a0daf6 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 18 May 2018 16:31:09 -0700 Subject: [PATCH 14/19] Explicitly implement IStandardWindow --- src/vs/base/browser/dom.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 1ebfa695413..e9ce2f8dd18 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -634,11 +634,11 @@ export function getDomNodePagePosition(domNode: HTMLElement): IDomNodePagePositi } export interface IStandardWindow { - scrollX: number; - scrollY: number; + readonly scrollX: number; + readonly scrollY: number; } -export const StandardWindow: IStandardWindow = new class { +export const StandardWindow: IStandardWindow = new class implements IStandardWindow { get scrollX(): number { if (typeof window.scrollX === 'number') { // modern browsers From 03873b8458c358157228719ba832a62f29100c32 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 18 May 2018 17:02:11 -0700 Subject: [PATCH 15/19] Restore focus to webview when vs code window is refocused Fixes #49998 --- .../webview/electron-browser/webviewEditor.ts | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts index 8d4ce8cb3db..c2da4e65cd1 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts @@ -4,19 +4,21 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from 'vs/base/browser/dom'; +import { domEvent } from 'vs/base/browser/event'; import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { Position } from 'vs/platform/editor/common/editor'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { EditorOptions } from 'vs/workbench/common/editor'; import { WebviewEditorInput } from 'vs/workbench/parts/webview/electron-browser/webviewEditorInput'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { BaseWebviewEditor, KEYBINDING_CONTEXT_WEBVIEWEDITOR_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_WEBVIEWEDITOR_FOCUS, KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE } from './baseWebviewEditor'; import { WebviewElement } from './webviewElement'; @@ -30,6 +32,7 @@ export class WebviewEditor extends BaseWebviewEditor { private _webviewFocusTracker?: DOM.IFocusTracker; private _webviewFocusListenerDisposable?: IDisposable; + private _onFocusWindowHandler?: IDisposable; private readonly _onDidFocusWebview = new Emitter(); @@ -40,6 +43,7 @@ export class WebviewEditor extends BaseWebviewEditor { @IPartService private readonly _partService: IPartService, @IWorkspaceContextService private readonly _contextService: IWorkspaceContextService, @IInstantiationService private readonly _instantiationService: IInstantiationService, + @IWorkbenchEditorService private readonly _editorService: IWorkbenchEditorService, ) { super(WebviewEditor.ID, telemetryService, themeService, _contextKeyService); } @@ -71,6 +75,20 @@ export class WebviewEditor extends BaseWebviewEditor { super.layout(dimension); } + public focus() { + super.focus(); + if (this._onFocusWindowHandler) { + return; + } + + // Make sure we restore focus when switching back to a VS Code window + this._onFocusWindowHandler = domEvent(window, 'focus')(() => { + if (this._editorService.getActiveEditor() === this) { + this.focus(); + } + }); + } + public dispose(): void { // Let the editor input dispose of the webview. this._webview = undefined; @@ -86,6 +104,10 @@ export class WebviewEditor extends BaseWebviewEditor { this._webviewFocusListenerDisposable.dispose(); } + if (this._onFocusWindowHandler) { + this._onFocusWindowHandler.dispose(); + } + super.dispose(); } From dea67d945254bb32c41243a628fa8f72fdaa6f87 Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Fri, 18 May 2018 17:19:59 -0700 Subject: [PATCH 16/19] Fixes ##50126 --- .../electron-browser/issue/issueReporterMain.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index 3ed0c5dbd22..e01747b0061 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -321,20 +321,6 @@ export class IssueReporter extends Disposable { }); }); - const labelElements = document.getElementsByClassName('caption'); - for (let i = 0; i < labelElements.length; i++) { - const label = labelElements.item(i); - label.addEventListener('click', (e) => { - e.stopPropagation(); - - const containingDiv = (e.target).parentElement; - const checkbox = containingDiv.firstElementChild; - if (checkbox) { - this.issueReporterModel.update({ [checkbox.id]: !this.issueReporterModel.getData()[checkbox.id] }); - } - }); - } - const showInfoElements = document.getElementsByClassName('showInfo'); for (let i = 0; i < showInfoElements.length; i++) { const showInfo = showInfoElements.item(i); From 792fea6c974a765bcbd15b7cd2c9480cd8d743d5 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 18 May 2018 17:19:47 -0700 Subject: [PATCH 17/19] Cleaning up ts symbol provider --- .../src/features/documentSymbolProvider.ts | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/extensions/typescript-language-features/src/features/documentSymbolProvider.ts b/extensions/typescript-language-features/src/features/documentSymbolProvider.ts index 82a23b34cf6..b765b04d060 100644 --- a/extensions/typescript-language-features/src/features/documentSymbolProvider.ts +++ b/extensions/typescript-language-features/src/features/documentSymbolProvider.ts @@ -10,22 +10,25 @@ import * as PConst from '../protocol.const'; import { ITypeScriptServiceClient } from '../typescriptService'; import * as typeConverters from '../utils/typeConverters'; -const outlineTypeTable: { [kind: string]: SymbolKind } = Object.create(null); -outlineTypeTable[PConst.Kind.module] = SymbolKind.Module; -outlineTypeTable[PConst.Kind.class] = SymbolKind.Class; -outlineTypeTable[PConst.Kind.enum] = SymbolKind.Enum; -outlineTypeTable[PConst.Kind.interface] = SymbolKind.Interface; -outlineTypeTable[PConst.Kind.memberFunction] = SymbolKind.Method; -outlineTypeTable[PConst.Kind.memberVariable] = SymbolKind.Property; -outlineTypeTable[PConst.Kind.memberGetAccessor] = SymbolKind.Property; -outlineTypeTable[PConst.Kind.memberSetAccessor] = SymbolKind.Property; -outlineTypeTable[PConst.Kind.variable] = SymbolKind.Variable; -outlineTypeTable[PConst.Kind.const] = SymbolKind.Variable; -outlineTypeTable[PConst.Kind.localVariable] = SymbolKind.Variable; -outlineTypeTable[PConst.Kind.variable] = SymbolKind.Variable; -outlineTypeTable[PConst.Kind.function] = SymbolKind.Function; -outlineTypeTable[PConst.Kind.localFunction] = SymbolKind.Function; - +const getSymbolKind = (kind: string): SymbolKind => { + switch (kind) { + case PConst.Kind.module: return SymbolKind.Module; + case PConst.Kind.class: return SymbolKind.Class; + case PConst.Kind.enum: return SymbolKind.Enum; + case PConst.Kind.interface: return SymbolKind.Interface; + case PConst.Kind.memberFunction: return SymbolKind.Method; + case PConst.Kind.memberVariable: return SymbolKind.Property; + case PConst.Kind.memberGetAccessor: return SymbolKind.Property; + case PConst.Kind.memberSetAccessor: return SymbolKind.Property; + case PConst.Kind.variable: return SymbolKind.Variable; + case PConst.Kind.const: return SymbolKind.Variable; + case PConst.Kind.localVariable: return SymbolKind.Variable; + case PConst.Kind.variable: return SymbolKind.Variable; + case PConst.Kind.function: return SymbolKind.Function; + case PConst.Kind.localFunction: return SymbolKind.Function; + } + return SymbolKind.Variable; +}; export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolProvider { public constructor( @@ -45,9 +48,9 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP const response = await this.client.execute('navtree', args, token); if (response.body) { // The root represents the file. Ignore this when showing in the UI - let tree = response.body; + const tree = response.body; if (tree.childItems) { - let result = new Array>(); + const result = new Array>(); tree.childItems.forEach(item => TypeScriptDocumentSymbolProvider.convertNavTree(resource.uri, result, item)); return result; } @@ -55,8 +58,8 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP } else { const response = await this.client.execute('navbar', args, token); if (response.body) { - let result = new Array(); - let foldingMap: ObjectMap = Object.create(null); + const result = new Array(); + const foldingMap: ObjectMap = Object.create(null); response.body.forEach(item => TypeScriptDocumentSymbolProvider.convertNavBar(resource.uri, 0, foldingMap, result as SymbolInformation[], item)); return result; } @@ -68,11 +71,11 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP } private static convertNavBar(resource: Uri, indent: number, foldingMap: ObjectMap, bucket: SymbolInformation[], item: Proto.NavigationBarItem, containerLabel?: string): void { - let realIndent = indent + item.indent; - let key = `${realIndent}|${item.text}`; + const realIndent = indent + item.indent; + const key = `${realIndent}|${item.text}`; if (realIndent !== 0 && !foldingMap[key] && TypeScriptDocumentSymbolProvider.shouldInclueEntry(item.text)) { - let result = new SymbolInformation(item.text, - outlineTypeTable[item.kind as string] || SymbolKind.Variable, + const result = new SymbolInformation(item.text, + getSymbolKind(item.kind), containerLabel ? containerLabel : '', typeConverters.Location.fromTextSpan(resource, item.spans[0])); foldingMap[key] = result; @@ -89,10 +92,11 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP if (!TypeScriptDocumentSymbolProvider.shouldInclueEntry(item.text)) { return; } + const symbolInfo = new SymbolInformation2( item.text, '', // todo@joh detail - outlineTypeTable[item.kind as string] || SymbolKind.Variable, + getSymbolKind(item.kind), typeConverters.Range.fromTextSpan(item.spans[0]), typeConverters.Location.fromTextSpan(resource, item.spans[0]), ); From 3b0e26939cbc913edc40419930b243567c2bc726 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 18 May 2018 17:25:12 -0700 Subject: [PATCH 18/19] Include anon functions and class in symbol view if they have children Fixes #49985 --- .../src/features/documentSymbolProvider.ts | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/extensions/typescript-language-features/src/features/documentSymbolProvider.ts b/extensions/typescript-language-features/src/features/documentSymbolProvider.ts index b765b04d060..e81ebf49584 100644 --- a/extensions/typescript-language-features/src/features/documentSymbolProvider.ts +++ b/extensions/typescript-language-features/src/features/documentSymbolProvider.ts @@ -73,7 +73,7 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP private static convertNavBar(resource: Uri, indent: number, foldingMap: ObjectMap, bucket: SymbolInformation[], item: Proto.NavigationBarItem, containerLabel?: string): void { const realIndent = indent + item.indent; const key = `${realIndent}|${item.text}`; - if (realIndent !== 0 && !foldingMap[key] && TypeScriptDocumentSymbolProvider.shouldInclueEntry(item.text)) { + if (realIndent !== 0 && !foldingMap[key] && TypeScriptDocumentSymbolProvider.shouldInclueEntry(item)) { const result = new SymbolInformation(item.text, getSymbolKind(item.kind), containerLabel ? containerLabel : '', @@ -88,11 +88,7 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP } } - private static convertNavTree(resource: Uri, bucket: Hierarchy[], item: Proto.NavigationTree): void { - if (!TypeScriptDocumentSymbolProvider.shouldInclueEntry(item.text)) { - return; - } - + private static convertNavTree(resource: Uri, bucket: Hierarchy[], item: Proto.NavigationTree): boolean { const symbolInfo = new SymbolInformation2( item.text, '', // todo@joh detail @@ -100,17 +96,23 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP typeConverters.Range.fromTextSpan(item.spans[0]), typeConverters.Location.fromTextSpan(resource, item.spans[0]), ); + const hierarchy = new Hierarchy(symbolInfo); + let shouldInclude = TypeScriptDocumentSymbolProvider.shouldInclueEntry(item); + if (item.childItems && item.childItems.length > 0) { for (const child of item.childItems) { - TypeScriptDocumentSymbolProvider.convertNavTree(resource, hierarchy.children, child); + shouldInclude = shouldInclude || TypeScriptDocumentSymbolProvider.convertNavTree(resource, hierarchy.children, child); } } - bucket.push(hierarchy); + if (shouldInclude) { + bucket.push(hierarchy); + } + return shouldInclude; } - private static shouldInclueEntry(name: string): boolean { - return !!(name && name !== '' && name !== ''); + private static shouldInclueEntry(item: Proto.NavigationTree | Proto.NavigationBarItem): boolean { + return !!(item.text && item.text !== '' && item.text !== ''); } } From 23727446c52af376c5ae2c90911565040848bc3d Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Fri, 18 May 2018 17:25:51 -0700 Subject: [PATCH 19/19] Change 'send' to 'include' in issue reporter, fixes #50127 --- src/vs/code/electron-browser/issue/issueReporterPage.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/code/electron-browser/issue/issueReporterPage.ts b/src/vs/code/electron-browser/issue/issueReporterPage.ts index c922c3fd8a5..afa0c79c4b8 100644 --- a/src/vs/code/electron-browser/issue/issueReporterPage.ts +++ b/src/vs/code/electron-browser/issue/issueReporterPage.ts @@ -66,7 +66,7 @@ export default (): string => ` + }, "Include my system information ({0})")).replace('{0}', `${escape(localize('show', "show"))}`)} @@ -76,7 +76,7 @@ export default (): string => ` + }, "Include my currently running processes ({0})")).replace('{0}', `${escape(localize('show', "show"))}`)}