Skip to content

Commit

Permalink
Use viewType instead of uri for webviews
Browse files Browse the repository at this point in the history
As discussed in #45994, move from using a uri to using a viewType. The view type is shared among all webviews of a given type, such as all markdown previews

Fixes #44575
  • Loading branch information
mjbvz committed Mar 20, 2018
1 parent 18146e8 commit ea1fed9
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 21 deletions.
7 changes: 2 additions & 5 deletions extensions/markdown-language-features/src/features/preview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,8 @@ const localize = nls.loadMessageBundle();

export class MarkdownPreview {

public static previewScheme = 'vscode-markdown-preview';
private static previewCount = 0;
public static previewViewType = 'markdown.preview';

public readonly uri: vscode.Uri;
private readonly webview: vscode.Webview;
private throttleTimer: any;
private initialLine: number | undefined = undefined;
Expand All @@ -41,9 +39,8 @@ export class MarkdownPreview {
topmostLineMonitor: MarkdownFileTopmostLineMonitor,
private readonly contributions: MarkdownContributions
) {
this.uri = vscode.Uri.parse(`${MarkdownPreview.previewScheme}:${MarkdownPreview.previewCount++}`);
this.webview = vscode.window.createWebview(
this.uri,
MarkdownPreview.previewViewType,
this.getPreviewTitle(this._resource),
previewColumn, {
enableScripts: true,
Expand Down
10 changes: 5 additions & 5 deletions src/vs/vscode.proposed.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -577,13 +577,13 @@ declare module 'vscode' {
}

/**
* A webview is an editor with html content, like an iframe.
* A webview displays html content, like an iframe.
*/
export interface Webview {
/**
* Unique identifer of the webview.
* The type of the webview, such as `'markdownw.preview'`
*/
readonly uri: Uri;
readonly viewType: string;

/**
* Content settings for the webview.
Expand Down Expand Up @@ -653,12 +653,12 @@ declare module 'vscode' {
/**
* Create and show a new webview.
*
* @param uri Unique identifier for the webview.
* @param viewType Identifier the type of the webview.
* @param title Title of the webview.
* @param column Editor column to show the new webview in.
* @param options Content settings for the webview.
*/
export function createWebview(uri: Uri, title: string, column: ViewColumn, options: WebviewOptions): Webview;
export function createWebview(viewType: string, title: string, column: ViewColumn, options: WebviewOptions): Webview;
}

//#endregion
Expand Down
11 changes: 9 additions & 2 deletions src/vs/workbench/api/electron-browser/mainThreadWebview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,15 @@ export class MainThreadWebviews implements MainThreadWebviewsShape {
this._toDispose = dispose(this._toDispose);
}

$createWebview(handle: WebviewHandle, uri: URI, title: string, column: Position, options: vscode.WebviewOptions, extensionFolderPath: string): void {
const webviewInput = new WebviewInput(URI.revive(uri), title, options, '', {
$createWebview(
handle: WebviewHandle,
viewType: string,
title: string,
column: Position,
options: vscode.WebviewOptions,
extensionFolderPath: string
): void {
const webviewInput = new WebviewInput(URI.parse('webview://' + handle), title, options, '', {
onMessage: message => this._proxy.$onMessage(handle, message),
onDidChangePosition: position => this._proxy.$onDidChangePosition(handle, position),
onDispose: () => {
Expand Down
4 changes: 2 additions & 2 deletions src/vs/workbench/api/node/extHost.api.impl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -413,8 +413,8 @@ export function createApiFactory(
registerDecorationProvider: proposedApiFunction(extension, (provider: vscode.DecorationProvider) => {
return extHostDecorations.registerDecorationProvider(provider, extension.id);
}),
createWebview: proposedApiFunction(extension, (uri: vscode.Uri, title: string, column: vscode.ViewColumn, options: vscode.WebviewOptions) => {
return extHostWebviews.createWebview(uri, title, column, options, extension.extensionFolderPath);
createWebview: proposedApiFunction(extension, (viewType: string, title: string, column: vscode.ViewColumn, options: vscode.WebviewOptions) => {
return extHostWebviews.createWebview(viewType, title, column, options, extension.extensionFolderPath);
})
};

Expand Down
2 changes: 1 addition & 1 deletion src/vs/workbench/api/node/extHost.protocol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,7 @@ export interface MainThreadTelemetryShape extends IDisposable {
export type WebviewHandle = number;

export interface MainThreadWebviewsShape extends IDisposable {
$createWebview(handle: WebviewHandle, uri: URI, title: string, column: EditorPosition, options: vscode.WebviewOptions, extensionFolderPath: string): void;
$createWebview(handle: WebviewHandle, viewType: string, title: string, column: EditorPosition, options: vscode.WebviewOptions, extensionFolderPath: string): void;
$disposeWebview(handle: WebviewHandle): void;
$show(handle: WebviewHandle, column: EditorPosition): void;
$setTitle(handle: WebviewHandle, value: string): void;
Expand Down
14 changes: 8 additions & 6 deletions src/vs/workbench/api/node/extHostWebview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { TPromise } from 'vs/base/common/winjs.base';

export class ExtHostWebview implements vscode.Webview {

private readonly _viewType: string;
private _title: string;
private _html: string;
private _options: vscode.WebviewOptions;
Expand All @@ -31,10 +32,11 @@ export class ExtHostWebview implements vscode.Webview {
constructor(
private readonly _handle: WebviewHandle,
private readonly _proxy: MainThreadWebviewsShape,
private readonly _uri: vscode.Uri,
viewType: string,
viewColumn: vscode.ViewColumn,
options: vscode.WebviewOptions
) {
this._viewType = viewType;
this._viewColumn = viewColumn;
this._options = options;
}
Expand All @@ -52,9 +54,9 @@ export class ExtHostWebview implements vscode.Webview {
this.onDidChangeViewStateEmitter.dispose();
}

get uri(): vscode.Uri {
get viewType(): string {
this.assertNotDisposed();
return this._uri;
return this._viewType;
}

get title(): string {
Expand Down Expand Up @@ -141,16 +143,16 @@ export class ExtHostWebviews implements ExtHostWebviewsShape {
}

createWebview(
uri: vscode.Uri,
viewType: string,
title: string,
viewColumn: vscode.ViewColumn,
options: vscode.WebviewOptions,
extensionFolderPath: string
): vscode.Webview {
const handle = ExtHostWebviews.handlePool++;
this._proxy.$createWebview(handle, uri, title, typeConverters.fromViewColumn(viewColumn), options, extensionFolderPath);
this._proxy.$createWebview(handle, viewType, title, typeConverters.fromViewColumn(viewColumn), options, extensionFolderPath);

const webview = new ExtHostWebview(handle, this._proxy, uri, viewColumn, options);
const webview = new ExtHostWebview(handle, this._proxy, viewType, viewColumn, options);
this._webviews.set(handle, webview);
return webview;
}
Expand Down

0 comments on commit ea1fed9

Please sign in to comment.