Move schemes to opener metadata

This commit is contained in:
Matt Bierner 2021-01-21 14:36:33 -08:00
parent 885585c7f8
commit 542de8e009
4 changed files with 24 additions and 29 deletions

View file

@ -46,7 +46,7 @@ export function activate(context: vscode.ExtensionContext) {
manager.show(url.toString(), showOptions);
}));
context.subscriptions.push(vscode.window.registerExternalUriOpener(openerId, ['http', 'https'], {
context.subscriptions.push(vscode.window.registerExternalUriOpener(openerId, {
canOpenExternalUri(uri: vscode.Uri) {
const originalUri = new URL(uri.toString());
if (enabledHosts.has(originalUri.hostname)) {
@ -63,6 +63,7 @@ export function activate(context: vscode.ExtensionContext) {
});
}
}, {
schemes: ['http', 'https'],
label: localize('openTitle', "Open in simple browser"),
}));
}

View file

@ -2450,7 +2450,7 @@ declare module 'vscode' {
/**
* The uri that triggered the open.
*
* Due to port forwarding, this may not match the `resolvedUri` passed to `openExternalUri`
* Due to port forwarding, this may not match the `resolvedUri` passed to `openExternalUri`.
*/
readonly sourceUri: Uri;
}
@ -2460,6 +2460,13 @@ declare module 'vscode' {
*/
interface ExternalUriOpenerMetadata {
/**
* List of uri schemes the opener is triggered for.
*
* Currently only `http` and `https` are supported.
*/
readonly schemes: readonly string[]
/**
* Text displayed to the user that explains what the opener does.
*
@ -2476,14 +2483,12 @@ declare module 'vscode' {
*
* @param id Unique id of the opener, such as `myExtension.browserPreview`. This is used in settings
* and commands to identify the opener.
* @param schemes List of uri schemes the opener is triggered for. Currently only `http`
* and `https` are supported.
* @param opener Opener to register.
* @param metadata Additional information about the opener.
*
* @returns Disposable that unregisters the opener.
*/
export function registerExternalUriOpener(id: string, schemes: readonly string[], opener: ExternalUriOpener, metadata: ExternalUriOpenerMetadata): Disposable;
*/
export function registerExternalUriOpener(id: string, opener: ExternalUriOpener, metadata: ExternalUriOpenerMetadata): Disposable;
}
interface OpenExternalOptions {

View file

@ -681,9 +681,9 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
checkProposedApiEnabled(extension);
return extHostNotebook.showNotebookDocument(document, options);
},
registerExternalUriOpener(id: string, schemes: readonly string[], opener: vscode.ExternalUriOpener, metadata: vscode.ExternalUriOpenerMetadata) {
registerExternalUriOpener(id: string, opener: vscode.ExternalUriOpener, metadata: vscode.ExternalUriOpenerMetadata) {
checkProposedApiEnabled(extension);
return extHostUriOpeners.registerUriOpener(extension.identifier, id, schemes, opener, metadata);
return extHostUriOpeners.registerUriOpener(extension.identifier, id, opener, metadata);
},
get openEditors() {
checkProposedApiEnabled(extension);

View file

@ -11,18 +11,12 @@ import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
import type * as vscode from 'vscode';
import { ExtHostUriOpenersShape, IMainContext, MainContext, MainThreadUriOpenersShape } from './extHost.protocol';
interface OpenerEntry {
readonly extension: ExtensionIdentifier;
readonly schemes: ReadonlySet<string>;
readonly opener: vscode.ExternalUriOpener;
readonly metadata: vscode.ExternalUriOpenerMetadata;
}
export class ExtHostUriOpeners implements ExtHostUriOpenersShape {
private readonly _proxy: MainThreadUriOpenersShape;
private readonly _openers = new Map<string, OpenerEntry>();
private readonly _openers = new Map<string, vscode.ExternalUriOpener>();
constructor(
mainContext: IMainContext,
@ -33,7 +27,6 @@ export class ExtHostUriOpeners implements ExtHostUriOpenersShape {
registerUriOpener(
extensionId: ExtensionIdentifier,
id: string,
schemes: readonly string[],
opener: vscode.ExternalUriOpener,
metadata: vscode.ExternalUriOpenerMetadata,
): vscode.Disposable {
@ -41,13 +34,8 @@ export class ExtHostUriOpeners implements ExtHostUriOpenersShape {
throw new Error(`Opener with id already registered: '${id}'`);
}
this._openers.set(id, {
opener,
extension: extensionId,
schemes: new Set(schemes),
metadata
});
this._proxy.$registerUriOpener(id, schemes, extensionId, metadata.label);
this._openers.set(id, opener);
this._proxy.$registerUriOpener(id, metadata.schemes, extensionId, metadata.label);
return toDisposable(() => {
this._openers.delete(id);
@ -56,21 +44,22 @@ export class ExtHostUriOpeners implements ExtHostUriOpenersShape {
}
async $canOpenUri(id: string, uriComponents: UriComponents, token: CancellationToken): Promise<modes.ExternalUriOpenerPriority> {
const entry = this._openers.get(id);
if (!entry) {
const opener = this._openers.get(id);
if (!opener) {
throw new Error(`Unknown opener with id: ${id}`);
}
const uri = URI.revive(uriComponents);
return entry.opener.canOpenExternalUri(uri, token);
return opener.canOpenExternalUri(uri, token);
}
async $openUri(id: string, context: { resolvedUri: UriComponents, sourceUri: UriComponents }, token: CancellationToken): Promise<void> {
const entry = this._openers.get(id);
if (!entry) {
const opener = this._openers.get(id);
if (!opener) {
throw new Error(`Unknown opener id: '${id}'`);
}
return entry.opener.openExternalUri(URI.revive(context.resolvedUri), {
return opener.openExternalUri(URI.revive(context.resolvedUri), {
sourceUri: URI.revive(context.sourceUri)
}, token);
}