@@ -105,7 +105,7 @@ export class OpenerService implements IOpenerService {
105
105
private readonly _openers = new LinkedList < IOpener > ( ) ;
106
106
private readonly _validators = new LinkedList < IValidator > ( ) ;
107
107
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 ( ) ) ;
109
109
110
110
private _defaultExternalOpener : IExternalOpener ;
111
111
private readonly _externalOpeners = new LinkedList < IExternalOpener > ( ) ;
@@ -174,7 +174,8 @@ export class OpenerService implements IOpenerService {
174
174
// check with contributed validators
175
175
if ( ! options ?. skipValidation ) {
176
176
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 ;
178
179
for ( const validator of this . _validators ) {
179
180
if ( ! ( await validator . shouldOpen ( validationTarget , options ) ) ) {
180
181
return false ;
@@ -198,8 +199,9 @@ export class OpenerService implements IOpenerService {
198
199
try {
199
200
const result = await resolver . resolveExternalUri ( resource , options ) ;
200
201
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 ) ;
203
205
}
204
206
return result ;
205
207
}
@@ -215,7 +217,7 @@ export class OpenerService implements IOpenerService {
215
217
216
218
//todo@jrieken IExternalUriResolver should support `uri: URI | string`
217
219
const uri = typeof resource === 'string' ? URI . parse ( resource ) : resource ;
218
- let externalUri : URI ;
220
+ let externalUri : URI | URL ;
219
221
220
222
try {
221
223
externalUri = ( await this . resolveExternalUri ( uri , options ) ) . resolved ;
@@ -227,9 +229,11 @@ export class OpenerService implements IOpenerService {
227
229
if ( typeof resource === 'string' && uri . toString ( ) === externalUri . toString ( ) ) {
228
230
// open the url-string AS IS
229
231
href = resource ;
230
- } else {
232
+ } else if ( externalUri instanceof URI ) {
231
233
// open URI using the toString(noEncode)+encodeURI-trick
232
234
href = encodeURI ( externalUri . toString ( true ) ) ;
235
+ } else {
236
+ href = externalUri . toString ( ) ;
233
237
}
234
238
235
239
if ( options ?. allowContributedOpeners ) {
0 commit comments