@@ -103,7 +103,7 @@ export class OpenerService implements IOpenerService {
103
103
private readonly _openers = new LinkedList < IOpener > ( ) ;
104
104
private readonly _validators = new LinkedList < IValidator > ( ) ;
105
105
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 ( ) ) ;
107
107
108
108
private _defaultExternalOpener : IExternalOpener ;
109
109
private readonly _externalOpeners = new LinkedList < IExternalOpener > ( ) ;
@@ -171,7 +171,8 @@ export class OpenerService implements IOpenerService {
171
171
// check with contributed validators
172
172
const targetURI = typeof target === 'string' ? URI . parse ( target ) : target ;
173
173
// 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 ;
175
176
for ( const validator of this . _validators ) {
176
177
if ( ! ( await validator . shouldOpen ( validationTarget , options ) ) ) {
177
178
return false ;
@@ -194,8 +195,9 @@ export class OpenerService implements IOpenerService {
194
195
try {
195
196
const result = await resolver . resolveExternalUri ( resource , options ) ;
196
197
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 ) ;
199
201
}
200
202
return result ;
201
203
}
@@ -211,7 +213,7 @@ export class OpenerService implements IOpenerService {
211
213
212
214
//todo@jrieken IExternalUriResolver should support `uri: URI | string`
213
215
const uri = typeof resource === 'string' ? URI . parse ( resource ) : resource ;
214
- let externalUri : URI ;
216
+ let externalUri : URI | URL ;
215
217
216
218
try {
217
219
externalUri = ( await this . resolveExternalUri ( uri , options ) ) . resolved ;
@@ -223,9 +225,11 @@ export class OpenerService implements IOpenerService {
223
225
if ( typeof resource === 'string' && uri . toString ( ) === externalUri . toString ( ) ) {
224
226
// open the url-string AS IS
225
227
href = resource ;
226
- } else {
228
+ } else if ( externalUri instanceof URI ) {
227
229
// open URI using the toString(noEncode)+encodeURI-trick
228
230
href = encodeURI ( externalUri . toString ( true ) ) ;
231
+ } else {
232
+ href = externalUri . toString ( ) ;
229
233
}
230
234
231
235
if ( options ?. allowContributedOpeners ) {
0 commit comments