Skip to content

Commit 64d45b9

Browse files
jeanp413mustard-mh
authored andcommitted
IExternalUriResolver can return URI or URL
1 parent 74d24a6 commit 64d45b9

File tree

4 files changed

+14
-10
lines changed

4 files changed

+14
-10
lines changed

src/vs/editor/browser/services/openerService.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ export class OpenerService implements IOpenerService {
103103
private readonly _openers = new LinkedList<IOpener>();
104104
private readonly _validators = new LinkedList<IValidator>();
105105
private readonly _resolvers = new LinkedList<IExternalUriResolver>();
106-
private readonly _resolvedUriTargets = new ResourceMap<URI>(uri => uri.with({ path: null, fragment: null, query: null }).toString());
106+
private readonly _resolvedUriTargets = new ResourceMap<URI | URL>(uri => uri.with({ path: null, fragment: null, query: null }).toString());
107107

108108
private _defaultExternalOpener: IExternalOpener;
109109
private readonly _externalOpeners = new LinkedList<IExternalOpener>();
@@ -171,7 +171,8 @@ export class OpenerService implements IOpenerService {
171171
// check with contributed validators
172172
const targetURI = typeof target === 'string' ? URI.parse(target) : target;
173173
// validate against the original URI that this URI resolves to, if one exists
174-
const validationTarget = this._resolvedUriTargets.get(targetURI) ?? target;
174+
const resolvedTarget = this._resolvedUriTargets.get(targetURI);
175+
const validationTarget = (resolvedTarget instanceof URL ? resolvedTarget.toString() : resolvedTarget) ?? target;
175176
for (const validator of this._validators) {
176177
if (!(await validator.shouldOpen(validationTarget, options))) {
177178
return false;
@@ -194,8 +195,9 @@ export class OpenerService implements IOpenerService {
194195
try {
195196
const result = await resolver.resolveExternalUri(resource, options);
196197
if (result) {
197-
if (!this._resolvedUriTargets.has(result.resolved)) {
198-
this._resolvedUriTargets.set(result.resolved, resource);
198+
const resolved = result.resolved instanceof URL ? URI.parse(result.resolved.toString()) : result.resolved;
199+
if (!this._resolvedUriTargets.has(resolved)) {
200+
this._resolvedUriTargets.set(resolved, result.resolved);
199201
}
200202
return result;
201203
}
@@ -211,7 +213,7 @@ export class OpenerService implements IOpenerService {
211213

212214
//todo@jrieken IExternalUriResolver should support `uri: URI | string`
213215
const uri = typeof resource === 'string' ? URI.parse(resource) : resource;
214-
let externalUri: URI;
216+
let externalUri: URI | URL;
215217

216218
try {
217219
externalUri = (await this.resolveExternalUri(uri, options)).resolved;
@@ -223,9 +225,11 @@ export class OpenerService implements IOpenerService {
223225
if (typeof resource === 'string' && uri.toString() === externalUri.toString()) {
224226
// open the url-string AS IS
225227
href = resource;
226-
} else {
228+
} else if (externalUri instanceof URI) {
227229
// open URI using the toString(noEncode)+encodeURI-trick
228230
href = encodeURI(externalUri.toString(true));
231+
} else {
232+
href = externalUri.toString();
229233
}
230234

231235
if (options?.allowContributedOpeners) {

src/vs/platform/opener/common/opener.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export type OpenOptions = OpenInternalOptions & OpenExternalOptions;
5151
export type ResolveExternalUriOptions = { readonly allowTunneling?: boolean };
5252

5353
export interface IResolvedExternalUri extends IDisposable {
54-
resolved: URI;
54+
resolved: URI | URL;
5555
}
5656

5757
export interface IOpener {
@@ -68,7 +68,7 @@ export interface IValidator {
6868
}
6969

7070
export interface IExternalUriResolver {
71-
resolveExternalUri(resource: URI, options?: OpenOptions): Promise<{ resolved: URI; dispose(): void } | undefined>;
71+
resolveExternalUri(resource: URI, options?: OpenOptions): Promise<{ resolved: URI | URL; dispose(): void } | undefined>;
7272
}
7373

7474
export interface IOpenerService {

src/vs/workbench/api/browser/mainThreadWindow.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,6 @@ export class MainThreadWindow implements MainThreadWindowShape {
6161

6262
async $asExternalUri(uriComponents: UriComponents, options: IOpenUriOptions): Promise<UriComponents> {
6363
const result = await this.openerService.resolveExternalUri(URI.revive(uriComponents), options);
64-
return result.resolved;
64+
return result.resolved instanceof URL ? URI.parse(result.resolved.toString()) : result.resolved;
6565
}
6666
}

src/vs/workbench/browser/web.api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ export interface ICommonTelemetryPropertiesResolver {
379379
}
380380

381381
export interface IExternalUriResolver {
382-
(uri: URI): Promise<URI>;
382+
(uri: URI): Promise<URI | URL>;
383383
}
384384

385385
export interface IExternalURLOpener {

0 commit comments

Comments
 (0)