Skip to content

Commit 4a152e9

Browse files
jeanp413mustard-mh
authored andcommitted
IExternalUriResolver can return URI or URL
Tool: gitpod/catfood.gitpod.cloud
1 parent c5b8669 commit 4a152e9

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
@@ -105,7 +105,7 @@ export class OpenerService implements IOpenerService {
105105
private readonly _openers = new LinkedList<IOpener>();
106106
private readonly _validators = new LinkedList<IValidator>();
107107
private readonly _resolvers = new LinkedList<IExternalUriResolver>();
108-
private readonly _resolvedUriTargets = new ResourceMap<URI>(uri => uri.with({ path: null, fragment: null, query: null }).toString());
108+
private readonly _resolvedUriTargets = new ResourceMap<URI | URL>(uri => uri.with({ path: null, fragment: null, query: null }).toString());
109109

110110
private _defaultExternalOpener: IExternalOpener;
111111
private readonly _externalOpeners = new LinkedList<IExternalOpener>();
@@ -174,7 +174,8 @@ export class OpenerService implements IOpenerService {
174174
// check with contributed validators
175175
if (!options?.skipValidation) {
176176
const targetURI = typeof target === 'string' ? URI.parse(target) : target;
177-
const validationTarget = this._resolvedUriTargets.get(targetURI) ?? target; // validate against the original URI that this URI resolves to, if one exists
177+
const resolvedTarget = this._resolvedUriTargets.get(targetURI) ?? target; // validate against the original URI that this URI resolves to, if one exists
178+
const validationTarget = (resolvedTarget instanceof URL ? resolvedTarget.toString() : resolvedTarget) ?? target;
178179
for (const validator of this._validators) {
179180
if (!(await validator.shouldOpen(validationTarget, options))) {
180181
return false;
@@ -198,8 +199,9 @@ export class OpenerService implements IOpenerService {
198199
try {
199200
const result = await resolver.resolveExternalUri(resource, options);
200201
if (result) {
201-
if (!this._resolvedUriTargets.has(result.resolved)) {
202-
this._resolvedUriTargets.set(result.resolved, resource);
202+
const resolved = result.resolved instanceof URL ? URI.parse(result.resolved.toString()) : result.resolved;
203+
if (!this._resolvedUriTargets.has(resolved)) {
204+
this._resolvedUriTargets.set(resolved, result.resolved);
203205
}
204206
return result;
205207
}
@@ -215,7 +217,7 @@ export class OpenerService implements IOpenerService {
215217

216218
//todo@jrieken IExternalUriResolver should support `uri: URI | string`
217219
const uri = typeof resource === 'string' ? URI.parse(resource) : resource;
218-
let externalUri: URI;
220+
let externalUri: URI | URL;
219221

220222
try {
221223
externalUri = (await this.resolveExternalUri(uri, options)).resolved;
@@ -227,9 +229,11 @@ export class OpenerService implements IOpenerService {
227229
if (typeof resource === 'string' && uri.toString() === externalUri.toString()) {
228230
// open the url-string AS IS
229231
href = resource;
230-
} else {
232+
} else if (externalUri instanceof URI) {
231233
// open URI using the toString(noEncode)+encodeURI-trick
232234
href = encodeURI(externalUri.toString(true));
235+
} else {
236+
href = externalUri.toString();
233237
}
234238

235239
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
@@ -74,6 +74,6 @@ export class MainThreadWindow implements MainThreadWindowShape {
7474

7575
async $asExternalUri(uriComponents: UriComponents, options: IOpenUriOptions): Promise<UriComponents> {
7676
const result = await this.openerService.resolveExternalUri(URI.revive(uriComponents), options);
77-
return result.resolved;
77+
return result.resolved instanceof URL ? URI.parse(result.resolved.toString()) : result.resolved;
7878
}
7979
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ export interface ICommonTelemetryPropertiesResolver {
446446
}
447447

448448
export interface IExternalUriResolver {
449-
(uri: URI): Promise<URI>;
449+
(uri: URI): Promise<URI | URL>;
450450
}
451451

452452
export interface IExternalURLOpener {

0 commit comments

Comments
 (0)