diff --git a/src/vs/base/browser/ui/progressbar/progressbar.ts b/src/vs/base/browser/ui/progressbar/progressbar.ts index 7d294d601f5..602b7d93dd9 100644 --- a/src/vs/base/browser/ui/progressbar/progressbar.ts +++ b/src/vs/base/browser/ui/progressbar/progressbar.ts @@ -6,10 +6,8 @@ 'use strict'; import 'vs/css!./progressbar'; -import { TPromise, ValueCallback } from 'vs/base/common/winjs.base'; import * as assert from 'vs/base/common/assert'; import { Builder, $ } from 'vs/base/browser/builder'; -import * as DOM from 'vs/base/browser/dom'; import { Disposable } from 'vs/base/common/lifecycle'; import { Color } from 'vs/base/common/color'; import { mixin } from 'vs/base/common/objects'; @@ -41,7 +39,6 @@ export class ProgressBar extends Disposable { private element: Builder; private bit: HTMLElement; private totalWork: number; - private animationStopToken: ValueCallback; private progressBarBackground: Color; constructor(container: HTMLElement, options?: IProgressBarOptions) { @@ -60,19 +57,7 @@ export class ProgressBar extends Disposable { private create(container: HTMLElement): void { $(container).div({ 'class': css_progress_container }, builder => { this.element = builder.clone(); - - builder.div({ 'class': css_progress_bit }).on([DOM.EventType.ANIMATION_START, DOM.EventType.ANIMATION_END, DOM.EventType.ANIMATION_ITERATION], (e: Event) => { - switch (e.type) { - case DOM.EventType.ANIMATION_ITERATION: - if (this.animationStopToken) { - this.animationStopToken(null); - } - break; - } - - }, this.toDispose); - - this.bit = builder.getHTMLElement(); + this.bit = builder.div({ 'class': css_progress_bit }).getHTMLElement(); }); this.applyStyles(); @@ -111,7 +96,7 @@ export class ProgressBar extends Disposable { this.bit.style.width = 'inherit'; if (delayed) { - TPromise.timeout(200).then(() => this.off()); + setTimeout(200, () => this.off()); } else { this.off(); } @@ -121,7 +106,7 @@ export class ProgressBar extends Disposable { else { this.bit.style.opacity = '0'; if (delayed) { - TPromise.timeout(200).then(() => this.off()); + setTimeout(200, () => this.off()); } else { this.off(); } diff --git a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts index ca63a6398d1..0b73a959113 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts @@ -6,7 +6,6 @@ import 'vs/css!./quickopen'; import * as nls from 'vs/nls'; -import { TPromise } from 'vs/base/common/winjs.base'; import * as platform from 'vs/base/common/platform'; import * as types from 'vs/base/common/types'; import * as errors from 'vs/base/common/errors'; @@ -980,11 +979,8 @@ export class QuickOpenWidget extends Disposable implements IModelProvider { } this.isLoosingFocus = true; - TPromise.timeout(0).then(() => { - if (!this.isLoosingFocus) { - return; - } - if (this.isDisposed) { + setTimeout(() => { + if (!this.isLoosingFocus || this.isDisposed) { return; } @@ -992,7 +988,7 @@ export class QuickOpenWidget extends Disposable implements IModelProvider { if (!veto) { this.hide(HideReason.FOCUS_LOST); } - }); + }, 0); } dispose(): void { diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index a52ce64b90d..e0ff559f804 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -65,6 +65,7 @@ import { MenubarService } from 'vs/platform/menubar/electron-main/menubarService import { MenubarChannel } from 'vs/platform/menubar/common/menubarIpc'; import { IUriDisplayService } from 'vs/platform/uriDisplay/common/uriDisplay'; import { CodeMenu } from 'vs/code/electron-main/menus'; +import { RunOnceScheduler } from 'vs/base/common/async'; export class CodeApplication { @@ -529,7 +530,9 @@ export class CodeApplication { this.historyMainService.onRecentlyOpenedChange(() => this.historyMainService.updateWindowsJumpList()); // Start shared process after a while - TPromise.timeout(3000).then(() => this.sharedProcess.spawn()); + const sharedProcess = new RunOnceScheduler(() => this.sharedProcess.spawn(), 3000); + sharedProcess.schedule(); + this.toDispose.push(sharedProcess); } private dispose(): void { diff --git a/src/vs/editor/standalone/browser/quickOpen/quickCommand.ts b/src/vs/editor/standalone/browser/quickOpen/quickCommand.ts index 7fe59dd0453..7a0168883c7 100644 --- a/src/vs/editor/standalone/browser/quickOpen/quickCommand.ts +++ b/src/vs/editor/standalone/browser/quickOpen/quickCommand.ts @@ -50,7 +50,7 @@ export class EditorActionCommandEntry extends QuickOpenEntryGroup { if (mode === Mode.OPEN) { // Use a timeout to give the quick open widget a chance to close itself first - TPromise.timeout(50).done(() => { + setTimeout(() => { // Some actions are enabled only when editor has focus this.editor.focus(); @@ -61,7 +61,7 @@ export class EditorActionCommandEntry extends QuickOpenEntryGroup { } catch (error) { onUnexpectedError(error); } - }, onUnexpectedError); + }, 50); return true; } diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index a4db8633e97..d7156eec4e6 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -999,7 +999,7 @@ export class ChangeModeAction extends Action { }; }); - TPromise.timeout(50 /* quick open is sensitive to being opened so soon after another */).done(() => { + setTimeout(() => { this.quickInputService.pick(picks, { placeHolder: nls.localize('pickLanguageToConfigure', "Select Language Mode to Associate with '{0}'", extension || basename) }).done(language => { if (language) { const fileAssociationsConfig = this.configurationService.inspect(FILES_ASSOCIATIONS_CONFIG); @@ -1027,8 +1027,8 @@ export class ChangeModeAction extends Action { this.configurationService.updateValue(FILES_ASSOCIATIONS_CONFIG, currentAssociations, target); } - }); - }); + }, error => errors.onUnexpectedError(error)); + }, 50 /* quick open is sensitive to being opened so soon after another */); } } diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index 5d64bc0a385..5ae172239da 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -56,7 +56,7 @@ import { Dimension, addClass } from 'vs/base/browser/dom'; import { IEditorService, ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; import { IUriDisplayService } from 'vs/platform/uriDisplay/common/uriDisplay'; -import { isThenable } from 'vs/base/common/async'; +import { isThenable, timeout } from 'vs/base/common/async'; const HELP_PREFIX = '?'; @@ -394,11 +394,11 @@ export class QuickOpenController extends Component implements IQuickOpenService }); // Progress if task takes a long time - TPromise.timeout(800).then(() => { + setTimeout(() => { if (!picksPromiseDone && this.currentPickerToken === currentPickerToken) { this.pickOpenWidget.getProgressBar().infinite().show(); } - }); + }, 800); // Show picker empty if resolving takes a while if (!picksPromiseDone) { @@ -670,11 +670,11 @@ export class QuickOpenController extends Component implements IQuickOpenService this.previousActiveHandlerDescriptor = handlerDescriptor; // Progress if task takes a long time - TPromise.timeout(instantProgress ? 0 : 800).then(() => { + setTimeout(() => { if (!resultPromiseDone && currentResultToken === this.currentResultToken) { this.quickOpenWidget.getProgressBar().infinite().show(); } - }); + }, instantProgress ? 0 : 800); // Promise done handling resultPromise.done(() => { @@ -709,7 +709,14 @@ export class QuickOpenController extends Component implements IQuickOpenService const previousInput = this.quickOpenWidget.getInput(); const wasShowingHistory = previousInput && previousInput.entries && previousInput.entries.some(e => e instanceof EditorHistoryEntry || e instanceof EditorHistoryEntryGroup); if (wasShowingHistory || matchingHistoryEntries.length > 0) { - (resolvedHandler.hasShortResponseTime() ? TPromise.timeout(QuickOpenController.MAX_SHORT_RESPONSE_TIME) : TPromise.as(undefined)).then(() => { + let responseDelay: Thenable; + if (resolvedHandler.hasShortResponseTime()) { + responseDelay = timeout(QuickOpenController.MAX_SHORT_RESPONSE_TIME); + } else { + responseDelay = Promise.resolve(void 0); + } + + responseDelay.then(() => { if (this.currentResultToken === currentResultToken && !inputSet) { this.quickOpenWidget.setInput(quickOpenModel, { autoFocusFirstEntry: true }); inputSet = true; diff --git a/src/vs/workbench/parts/files/browser/editors/fileEditorTracker.ts b/src/vs/workbench/parts/files/browser/editors/fileEditorTracker.ts index 9f6bd55fff9..3ca77a2a912 100644 --- a/src/vs/workbench/parts/files/browser/editors/fileEditorTracker.ts +++ b/src/vs/workbench/parts/files/browser/editors/fileEditorTracker.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { TPromise } from 'vs/base/common/winjs.base'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import URI from 'vs/base/common/uri'; import * as resources from 'vs/base/common/resources'; @@ -27,7 +26,7 @@ import { IWindowService } from 'vs/platform/windows/common/windows'; import { BINARY_FILE_EDITOR_ID } from 'vs/workbench/parts/files/common/files'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; -import { ResourceQueue } from 'vs/base/common/async'; +import { ResourceQueue, timeout } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; export class FileEditorTracker extends Disposable implements IWorkbenchContribution { @@ -170,14 +169,14 @@ export class FileEditorTracker extends Disposable implements IWorkbenchContribut // file is really gone and not just a faulty file event. // This only applies to external file events, so we need to check for the isExternal // flag. - let checkExists: TPromise; + let checkExists: Thenable; if (isExternal) { - checkExists = TPromise.timeout(100).then(() => this.fileService.existsFile(resource)); + checkExists = timeout(100).then(() => this.fileService.existsFile(resource)); } else { - checkExists = TPromise.as(false); + checkExists = Promise.resolve(false); } - checkExists.done(exists => { + checkExists.then(exists => { if (!exists && !editor.isDisposed()) { editor.dispose(); } else if (this.environmentService.verbose) { diff --git a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts index e76351076f2..1454998d2d9 100644 --- a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts @@ -293,7 +293,7 @@ abstract class BaseCommandEntry extends QuickOpenEntryGroup { this.onBeforeRun(this.commandId); // Use a timeout to give the quick open widget a chance to close itself first - TPromise.timeout(50).done(() => { + setTimeout(() => { if (action && (!(action instanceof Action) || action.enabled)) { try { /* __GDPR__ @@ -314,7 +314,7 @@ abstract class BaseCommandEntry extends QuickOpenEntryGroup { } else { this.notificationService.info(nls.localize('actionNotEnabled', "Command '{0}' is not enabled in the current context.", this.getLabel())); } - }, err => this.onError(err)); + }, 50); } private onError(error?: Error): void { diff --git a/src/vs/workbench/services/contextview/electron-browser/contextmenuService.ts b/src/vs/workbench/services/contextview/electron-browser/contextmenuService.ts index c4fdf722b72..22429b85715 100644 --- a/src/vs/workbench/services/contextview/electron-browser/contextmenuService.ts +++ b/src/vs/workbench/services/contextview/electron-browser/contextmenuService.ts @@ -37,46 +37,44 @@ export class ContextMenuService extends Disposable implements IContextMenuServic showContextMenu(delegate: IContextMenuDelegate): void { delegate.getActions().then(actions => { - if (!actions.length) { - return TPromise.as(null); - } + if (actions.length) { + setTimeout(() => { + const onHide = once(() => { + if (delegate.onHide) { + delegate.onHide(undefined); + } - return TPromise.timeout(0).then(() => { // https://github.com/Microsoft/vscode/issues/3638 - const onHide = once(() => { - if (delegate.onHide) { - delegate.onHide(undefined); + this._onDidContextMenu.fire(); + }); + + const menu = this.createMenu(delegate, actions, onHide); + const anchor = delegate.getAnchor(); + let x: number, y: number; + + if (dom.isHTMLElement(anchor)) { + let elementPosition = dom.getDomNodePagePosition(anchor); + + x = elementPosition.left; + y = elementPosition.top + elementPosition.height; + } else { + const pos = <{ x: number; y: number; }>anchor; + x = pos.x + 1; /* prevent first item from being selected automatically under mouse */ + y = pos.y; } - this._onDidContextMenu.fire(); - }); + let zoom = webFrame.getZoomFactor(); + x *= zoom; + y *= zoom; - const menu = this.createMenu(delegate, actions, onHide); - const anchor = delegate.getAnchor(); - let x: number, y: number; - - if (dom.isHTMLElement(anchor)) { - let elementPosition = dom.getDomNodePagePosition(anchor); - - x = elementPosition.left; - y = elementPosition.top + elementPosition.height; - } else { - const pos = <{ x: number; y: number; }>anchor; - x = pos.x + 1; /* prevent first item from being selected automatically under mouse */ - y = pos.y; - } - - let zoom = webFrame.getZoomFactor(); - x *= zoom; - y *= zoom; - - menu.popup({ - window: remote.getCurrentWindow(), - x: Math.floor(x), - y: Math.floor(y), - positioningItem: delegate.autoSelectFirstItem ? 0 : void 0, - callback: () => onHide() - }); - }); + menu.popup({ + window: remote.getCurrentWindow(), + x: Math.floor(x), + y: Math.floor(y), + positioningItem: delegate.autoSelectFirstItem ? 0 : void 0, + callback: () => onHide() + }); + }, 0); // https://github.com/Microsoft/vscode/issues/3638 + } }); } diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 0c3642145b3..6faef447dc3 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -25,7 +25,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IModeService } from 'vs/editor/common/services/modeService'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { RunOnceScheduler } from 'vs/base/common/async'; +import { RunOnceScheduler, timeout } from 'vs/base/common/async'; import { ITextBufferFactory } from 'vs/editor/common/model'; import { IHashService } from 'vs/workbench/services/hash/common/hashService'; import { createTextBufferFactory } from 'vs/editor/common/model/textModel'; @@ -153,13 +153,13 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } if (fileEventImpactsModel && this.inOrphanMode !== newInOrphanModeGuess) { - let checkOrphanedPromise: TPromise; + let checkOrphanedPromise: Thenable; if (newInOrphanModeGuess) { // We have received reports of users seeing delete events even though the file still // exists (network shares issue: https://github.com/Microsoft/vscode/issues/13665). // Since we do not want to mark the model as orphaned, we have to check if the // file is really gone and not just a faulty file event. - checkOrphanedPromise = TPromise.timeout(100).then(() => { + checkOrphanedPromise = timeout(100).then(() => { if (this.disposed) { return true; } @@ -167,10 +167,10 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil return this.fileService.existsFile(this.resource).then(exists => !exists); }); } else { - checkOrphanedPromise = TPromise.as(false); + checkOrphanedPromise = Promise.resolve(false); } - checkOrphanedPromise.done(newInOrphanModeValidated => { + checkOrphanedPromise.then(newInOrphanModeValidated => { if (this.inOrphanMode !== newInOrphanModeValidated && !this.disposed) { this.setOrphaned(newInOrphanModeValidated); }