diff --git a/extensions/git/src/protocolHandler.ts b/extensions/git/src/protocolHandler.ts index b84d6620068f13b8cfae865736c4385b413cd58b..422ca3df739705f77ed39f27bc743cb489175e90 100644 --- a/extensions/git/src/protocolHandler.ts +++ b/extensions/git/src/protocolHandler.ts @@ -5,16 +5,16 @@ 'use strict'; -import { ProtocolHandler, Uri, window, Disposable, commands } from 'vscode'; +import { UriHandler, Uri, window, Disposable, commands } from 'vscode'; import { dispose } from './util'; import * as querystring from 'querystring'; -export class GitProtocolHandler implements ProtocolHandler { +export class GitProtocolHandler implements UriHandler { private disposables: Disposable[] = []; constructor() { - this.disposables.push(window.registerProtocolHandler(this)); + this.disposables.push(window.registerUriHandler(this)); } handleUri(uri: Uri): void { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 99ece63c7de875364c94a5cbb850324bca385523..997cfb6570c74884078491abc19eeb4ee4cf88eb 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -497,16 +497,42 @@ declare module 'vscode' { //#region URLs - export interface ProtocolHandler { + /** + * A Uri handler is responsible for handling system-wide [Uris](#Uri). + * + * @see [window.registerUriHandler](#window.registerUriHandler). + */ + export interface UriHandler { + + /** + * Handle the provided system-wide [Uri](#Uri). + * + * @see [window.registerUriHandler](#window.registerUriHandler). + */ handleUri(uri: Uri): void; } export namespace window { /** - * Registers a protocol handler capable of handling system-wide URIs. + * Registers a [Uri handler](#UriHandler) capable of handling system-wide [Uris](#Uri). + * A Uri handler is scoped to the extension it is contributed from: it will only + * be able to handle Uris which are directed to the extension itself. + * + * For example, if the `vscode.git` extension registers a Uri handler, it will only + * be allowed to handle Uris with the prefix `{scheme}://vscode.git`, in which `{scheme}` + * is either `vscode` or `vscode-insiders`. All the following Uris are examples: + * + * - `vscode://vscode.git` + * - `vscode://vscode.git/` + * - `vscode-insiders://vscode.git/status` + * - `vscode-insiders://vscode.git/clone?url=foobar` + * + * An extension can only register a single Uri handler in its entire activation lifetime. + * + * @param handler The Uri handler to register for this extension. */ - export function registerProtocolHandler(handler: ProtocolHandler): Disposable; + export function registerUriHandler(handler: UriHandler): Disposable; } //#endregion diff --git a/src/vs/workbench/api/electron-browser/mainThreadUrls.ts b/src/vs/workbench/api/electron-browser/mainThreadUrls.ts index 7ba2ed813b131fd40a23b8abe057b6f4551ad96b..f85ebfdea274956d41d5b6ec11a34d63c989d981 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadUrls.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadUrls.ts @@ -42,7 +42,7 @@ export class MainThreadUrls implements MainThreadUrlsShape { this.proxy = context.getProxy(ExtHostContext.ExtHostUrls); } - $registerProtocolHandler(handle: number, extensionId: string): TPromise { + $registerUriHandler(handle: number, extensionId: string): TPromise { const handler = new ExtensionUrlHandler(this.proxy, handle, extensionId); const disposable = this.urlService.registerHandler(handler); @@ -52,7 +52,7 @@ export class MainThreadUrls implements MainThreadUrlsShape { return TPromise.as(null); } - $unregisterProtocolHandler(handle: number): TPromise { + $unregisterUriHandler(handle: number): TPromise { const tuple = this.handlers.get(handle); if (!tuple) { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 609db622a2b71949b177a3cfd0d2854727359303..2b434b1fd03650263a087ce4bd91c2b22bb95292 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -452,8 +452,8 @@ export function createApiFactory( registerWebviewPanelSerializer: proposedApiFunction(extension, (viewType: string, serializer: vscode.WebviewPanelSerializer) => { return extHostWebviews.registerWebviewPanelSerializer(viewType, serializer); }), - registerProtocolHandler: proposedApiFunction(extension, (handler: vscode.ProtocolHandler) => { - return extHostUrls.registerProtocolHandler(extension.id, handler); + registerUriHandler: proposedApiFunction(extension, (handler: vscode.UriHandler) => { + return extHostUrls.registerUriHandler(extension.id, handler); }), get quickInputBackButton() { return proposedApiFunction(extension, (): vscode.QuickInputButton => { diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 6aab73ca6f7251113778f61fa0858921e7518195..20996b207a63f89595fc68833ae6846efd68c5bd 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -462,8 +462,8 @@ export interface ExtHostWebviewsShape { } export interface MainThreadUrlsShape extends IDisposable { - $registerProtocolHandler(handle: number, extensionId: string): TPromise; - $unregisterProtocolHandler(handle: number): TPromise; + $registerUriHandler(handle: number, extensionId: string): TPromise; + $unregisterUriHandler(handle: number): TPromise; } export interface ExtHostUrlsShape { diff --git a/src/vs/workbench/api/node/extHostUrls.ts b/src/vs/workbench/api/node/extHostUrls.ts index 534dfb4f02a30fbe371b1acf6b6fa1801fd4ec1f..fd02738bdae927ba151a65064f527ffffaca6eae 100644 --- a/src/vs/workbench/api/node/extHostUrls.ts +++ b/src/vs/workbench/api/node/extHostUrls.ts @@ -15,7 +15,7 @@ export class ExtHostUrls implements ExtHostUrlsShape { private readonly _proxy: MainThreadUrlsShape; private handles = new Set(); - private handlers = new Map(); + private handlers = new Map(); constructor( mainContext: IMainContext @@ -23,7 +23,7 @@ export class ExtHostUrls implements ExtHostUrlsShape { this._proxy = mainContext.getProxy(MainContext.MainThreadUrls); } - registerProtocolHandler(extensionId: string, handler: vscode.ProtocolHandler): vscode.Disposable { + registerUriHandler(extensionId: string, handler: vscode.UriHandler): vscode.Disposable { if (this.handles.has(extensionId)) { throw new Error(`Protocol handler already registered for extension ${extensionId}`); } @@ -31,12 +31,12 @@ export class ExtHostUrls implements ExtHostUrlsShape { const handle = ExtHostUrls.HandlePool++; this.handles.add(extensionId); this.handlers.set(handle, handler); - this._proxy.$registerProtocolHandler(handle, extensionId); + this._proxy.$registerUriHandler(handle, extensionId); return toDisposable(() => { this.handles.delete(extensionId); this.handlers.delete(handle); - this._proxy.$unregisterProtocolHandler(handle); + this._proxy.$unregisterUriHandler(handle); }); }