提交 67aec4ac 编写于 作者: J Johannes Rieken

use requestIdleCallback for Eventually-lifecyclephase

上级 1a492b5c
......@@ -8,7 +8,7 @@
import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation';
import * as errors from 'vs/base/common/errors';
import { Emitter, Event } from 'vs/base/common/event';
import { Disposable } from 'vs/base/common/lifecycle';
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
import { URI } from 'vs/base/common/uri';
import { ErrorCallback, TPromise, ValueCallback } from 'vs/base/common/winjs.base';
......@@ -692,3 +692,32 @@ export function ninvoke<T>(thisArg: any, fn: Function, ...args: any[]): TPromise
export function ninvoke(thisArg: any, fn: Function, ...args: any[]): any {
return new TPromise((c, e) => fn.call(thisArg, ...args, (err: any, result: any) => err ? e(err) : c(result)));
}
export interface IdleDeadline {
readonly didTimeout: boolean;
timeRemaining(): DOMHighResTimeStamp;
}
/**
* Execute the callback the next time the browser is idle
*/
export let runWhenIdle: (callback: (idle: IdleDeadline) => void, timeout?: number) => IDisposable;
declare module global {
export function requestIdleCallback(callback: (args: IdleDeadline) => void, options?: { timeout: number }): number;
export function cancelIdleCallback(handle: number): void;
}
(function () {
if (!global.requestIdleCallback || !global.cancelIdleCallback) {
console.warn('requestIdleCallback not available. using fallback');
runWhenIdle = (runner, timeout?) => {
let handle = setTimeout(() => runner({ didTimeout: true, timeRemaining() { return Number.MAX_VALUE; } }), timeout);
return { dispose() { clearTimeout(handle); } };
};
} else {
runWhenIdle = (runner, timeout?) => {
let handle = global.requestIdleCallback(runner, typeof timeout === 'number' ? { timeout } : undefined);
return { dispose() { global.cancelIdleCallback(handle); } };
};
}
})();
......@@ -10,7 +10,7 @@ import 'vs/css!./media/shell';
import * as platform from 'vs/base/common/platform';
import * as perf from 'vs/base/common/performance';
import * as aria from 'vs/base/browser/ui/aria/aria';
import { Disposable, toDisposable } from 'vs/base/common/lifecycle';
import { Disposable } from 'vs/base/common/lifecycle';
import * as errors from 'vs/base/common/errors';
import { toErrorMessage } from 'vs/base/common/errorMessage';
import product from 'vs/platform/node/product';
......@@ -99,6 +99,7 @@ import { DownloadServiceChannel } from 'vs/platform/download/node/downloadIpc';
import { DefaultURITransformer } from 'vs/base/common/uriIpc';
import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/extensionGalleryService';
import { ILabelService } from 'vs/platform/label/common/label';
import { runWhenIdle } from 'vs/base/common/async';
/**
* Services that we require for the Shell
......@@ -206,16 +207,12 @@ export class WorkbenchShell extends Disposable {
this.logStartupTelemetry(startupInfos);
// Set lifecycle phase to `Runnning For A Bit` after a short delay
let eventuallPhaseTimeoutHandle = setTimeout(() => {
let eventuallPhaseTimeoutHandle = runWhenIdle(() => {
eventuallPhaseTimeoutHandle = void 0;
this.lifecycleService.phase = LifecyclePhase.Eventually;
}, 3000);
}, 5000);
this._register(toDisposable(() => {
if (eventuallPhaseTimeoutHandle) {
clearTimeout(eventuallPhaseTimeoutHandle);
}
}));
this._register(eventuallPhaseTimeoutHandle);
// localStorage metrics (TODO@Ben remove me later)
if (!this.environmentService.extensionTestsPath && this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册