mirror of
https://github.com/microsoft/vscode.git
synced 2026-05-26 10:16:01 +01:00
Working on progress indicator when loading webview
This commit is contained in:
@@ -129,8 +129,8 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv
|
||||
this._revivers.delete(viewType);
|
||||
}
|
||||
|
||||
reviveWebview(webview: WebviewEditorInput) {
|
||||
this._extensionService.activateByEvent(`onView:${webview.state.viewType}`).then(() => {
|
||||
reviveWebview(webview: WebviewEditorInput): TPromise<void> {
|
||||
return this._extensionService.activateByEvent(`onView:${webview.state.viewType}`).then(() => {
|
||||
const handle = 'revival-' + MainThreadWebviews.revivalPool++;
|
||||
this._webviews.set(handle, webview);
|
||||
|
||||
@@ -145,7 +145,8 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv
|
||||
}
|
||||
};
|
||||
|
||||
this._proxy.$deserializeWebview(handle, webview.state.viewType, webview.state.state, webview.position, webview.options);
|
||||
return this._proxy.$deserializeWebview(handle, webview.state.viewType, webview.state.state, webview.position, webview.options)
|
||||
.then(() => { });
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -366,7 +366,7 @@ export interface ExtHostWebviewsShape {
|
||||
$onDidChangeActiveWeview(handle: WebviewHandle | undefined): void;
|
||||
$onDidDisposeWeview(handle: WebviewHandle): Thenable<void>;
|
||||
$onDidChangePosition(handle: WebviewHandle, newPosition: EditorPosition): void;
|
||||
$deserializeWebview(newWebviewHandle: WebviewHandle, viewType: string, state: any, position: EditorPosition, options: vscode.WebviewOptions): void;
|
||||
$deserializeWebview(newWebviewHandle: WebviewHandle, viewType: string, state: any, position: EditorPosition, options: vscode.WebviewOptions): Thenable<boolean>;
|
||||
$serializeWebview(webviewHandle: WebviewHandle): Thenable<any>;
|
||||
}
|
||||
|
||||
|
||||
@@ -237,15 +237,15 @@ export class ExtHostWebviews implements ExtHostWebviewsShape {
|
||||
state: any,
|
||||
position: Position,
|
||||
options: vscode.WebviewOptions
|
||||
): void {
|
||||
): TPromise<boolean> {
|
||||
const serializer = this._serializers.get(viewType);
|
||||
if (!serializer) {
|
||||
return;
|
||||
return TPromise.as(false);
|
||||
}
|
||||
|
||||
const revivedWebview = new ExtHostWebview(webviewHandle, this._proxy, viewType, typeConverters.toViewColumn(position), options);
|
||||
this._webviews.set(webviewHandle, revivedWebview);
|
||||
serializer.deserializeWebview(revivedWebview, state);
|
||||
return serializer.deserializeWebview(revivedWebview, state);
|
||||
}
|
||||
|
||||
$serializeWebview(
|
||||
|
||||
@@ -145,10 +145,10 @@ export class WebviewEditor extends BaseWebviewEditor {
|
||||
this._webview = undefined;
|
||||
this.webviewContent = undefined;
|
||||
}
|
||||
|
||||
await super.setInput(input, options);
|
||||
|
||||
input.onBecameActive(this.position);
|
||||
await input.resolve();
|
||||
await input.onBecameActive(this.position);
|
||||
this.updateWebview(input);
|
||||
}
|
||||
|
||||
|
||||
@@ -141,6 +141,11 @@ export class WebviewEditorInput extends EditorInput {
|
||||
}
|
||||
|
||||
public resolve(refresh?: boolean): TPromise<IEditorModel, any> {
|
||||
if (this.reviver && !this._revived) {
|
||||
this._revived = true;
|
||||
return this.reviver.reviveWebview(this).then(() => new EditorModel());
|
||||
}
|
||||
|
||||
return TPromise.as(new EditorModel());
|
||||
}
|
||||
|
||||
@@ -221,16 +226,11 @@ export class WebviewEditorInput extends EditorInput {
|
||||
this._currentWebviewHtml = '';
|
||||
}
|
||||
|
||||
public onBecameActive(position: Position) {
|
||||
public onBecameActive(position: Position): void {
|
||||
this._position = position;
|
||||
|
||||
if (this._events && this._events.onDidChangePosition) {
|
||||
this._events.onDidChangePosition(position);
|
||||
}
|
||||
|
||||
if (this.reviver && !this._revived) {
|
||||
this._revived = true;
|
||||
this.reviver.reviveWebview(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi
|
||||
import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService';
|
||||
import * as vscode from 'vscode';
|
||||
import { WebviewEditorInput } from './webviewInput';
|
||||
import { TPromise } from 'vs/base/common/winjs.base';
|
||||
|
||||
export const IWebviewService = createDecorator<IWebviewService>('webviewService');
|
||||
|
||||
@@ -55,7 +56,7 @@ export interface WebviewReviver {
|
||||
|
||||
reviveWebview(
|
||||
webview: WebviewEditorInput
|
||||
): void;
|
||||
): TPromise<void>;
|
||||
}
|
||||
|
||||
export interface WebviewEvents {
|
||||
@@ -73,7 +74,7 @@ export class WebviewService implements IWebviewService {
|
||||
_serviceBrand: any;
|
||||
|
||||
private readonly _revivers = new Map<string, WebviewReviver>();
|
||||
private readonly _needingRevival = new Map<string, WebviewEditorInput[]>();
|
||||
private _awaitingRevival: { input: WebviewEditorInput, resolve: (x: any) => void }[] = [];
|
||||
|
||||
constructor(
|
||||
@IWorkbenchEditorService private readonly _editorService: IWorkbenchEditorService,
|
||||
@@ -120,12 +121,16 @@ export class WebviewService implements IWebviewService {
|
||||
canRevive: (webview) => {
|
||||
return true;
|
||||
},
|
||||
reviveWebview: (webview) => {
|
||||
if (!this._needingRevival.has(viewType)) {
|
||||
this._needingRevival.set(viewType, []);
|
||||
reviveWebview: async (webview: WebviewEditorInput): TPromise<void> => {
|
||||
const didRevive = await this.tryRevive(webview);
|
||||
if (didRevive) {
|
||||
return;
|
||||
}
|
||||
this._needingRevival.get(viewType).push(webviewInput);
|
||||
this.tryRevive(viewType);
|
||||
// A reviver may not be registered yet. Put into queue and resolve promise when can can revive
|
||||
let resolve: (value: void) => void;
|
||||
const promise = new TPromise<void>(r => { resolve = r; });
|
||||
this._awaitingRevival.push({ input: webview, resolve });
|
||||
return promise;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -141,7 +146,15 @@ export class WebviewService implements IWebviewService {
|
||||
}
|
||||
|
||||
this._revivers.set(viewType, reviver);
|
||||
this.tryRevive(viewType);
|
||||
|
||||
// Resolve any pending views
|
||||
|
||||
const toRevive = this._awaitingRevival.filter(x => x.input.viewType === viewType);
|
||||
this._awaitingRevival = this._awaitingRevival.filter(x => x.input.viewType !== viewType);
|
||||
|
||||
for (const input of toRevive) {
|
||||
reviver.reviveWebview(input.input).then(() => input.resolve(void 0));
|
||||
}
|
||||
|
||||
return toDisposable(() => {
|
||||
this._revivers.delete(viewType);
|
||||
@@ -156,20 +169,14 @@ export class WebviewService implements IWebviewService {
|
||||
}
|
||||
|
||||
tryRevive(
|
||||
viewType: string
|
||||
) {
|
||||
const reviver = this._revivers.get(viewType);
|
||||
webview: WebviewEditorInput
|
||||
): boolean {
|
||||
const reviver = this._revivers.get(webview.viewType);
|
||||
if (!reviver) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
const toRevive = this._needingRevival.get(viewType);
|
||||
if (!toRevive) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const webview of toRevive) {
|
||||
reviver.reviveWebview(webview);
|
||||
}
|
||||
reviver.reviveWebview(webview);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user