extHostUrls.ts 2.3 KB
Newer Older
J
Joao Moreno 已提交
1 2 3 4 5 6
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

import * as vscode from 'vscode';
J
Johannes Rieken 已提交
7
import { MainContext, IMainContext, ExtHostUrlsShape, MainThreadUrlsShape } from './extHost.protocol';
8
import { URI, UriComponents } from 'vs/base/common/uri';
J
Joao Moreno 已提交
9
import { toDisposable } from 'vs/base/common/lifecycle';
10
import { onUnexpectedError } from 'vs/base/common/errors';
11
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
J
Joao Moreno 已提交
12 13 14 15 16 17

export class ExtHostUrls implements ExtHostUrlsShape {

	private static HandlePool = 0;
	private readonly _proxy: MainThreadUrlsShape;

18
	private handles = new Set<string>();
J
Joao Moreno 已提交
19
	private handlers = new Map<number, vscode.UriHandler>();
J
Joao Moreno 已提交
20 21 22 23 24 25 26

	constructor(
		mainContext: IMainContext
	) {
		this._proxy = mainContext.getProxy(MainContext.MainThreadUrls);
	}

27 28
	registerUriHandler(extensionId: ExtensionIdentifier, handler: vscode.UriHandler): vscode.Disposable {
		if (this.handles.has(ExtensionIdentifier.toKey(extensionId))) {
29 30 31
			throw new Error(`Protocol handler already registered for extension ${extensionId}`);
		}

J
Joao Moreno 已提交
32
		const handle = ExtHostUrls.HandlePool++;
33
		this.handles.add(ExtensionIdentifier.toKey(extensionId));
J
Joao Moreno 已提交
34
		this.handlers.set(handle, handler);
J
Joao Moreno 已提交
35
		this._proxy.$registerUriHandler(handle, extensionId);
J
Joao Moreno 已提交
36 37

		return toDisposable(() => {
38
			this.handles.delete(ExtensionIdentifier.toKey(extensionId));
J
Joao Moreno 已提交
39
			this.handlers.delete(handle);
J
Joao Moreno 已提交
40
			this._proxy.$unregisterUriHandler(handle);
J
Joao Moreno 已提交
41 42 43
		});
	}

J
Johannes Rieken 已提交
44
	$handleExternalUri(handle: number, uri: UriComponents): Promise<void> {
J
Joao Moreno 已提交
45 46 47
		const handler = this.handlers.get(handle);

		if (!handler) {
R
Rob Lourens 已提交
48
			return Promise.resolve(undefined);
J
Joao Moreno 已提交
49
		}
50 51 52 53 54
		try {
			handler.handleUri(URI.revive(uri));
		} catch (err) {
			onUnexpectedError(err);
		}
55

R
Rob Lourens 已提交
56
		return Promise.resolve(undefined);
J
Joao Moreno 已提交
57
	}
58

59 60 61 62 63 64
	async createAppUri(uri: URI): Promise<vscode.Uri> {
		return URI.revive(await this._proxy.$createAppUri(uri));
	}

	async proposedCreateAppUri(extensionId: ExtensionIdentifier, options?: vscode.AppUriOptions): Promise<vscode.Uri> {
		return URI.revive(await this._proxy.$proposedCreateAppUri(extensionId, options));
65
	}
66
}