diff options
Diffstat (limited to 'devtools/shared/DevToolsUtils.js')
-rw-r--r-- | devtools/shared/DevToolsUtils.js | 38 |
1 files changed, 15 insertions, 23 deletions
diff --git a/devtools/shared/DevToolsUtils.js b/devtools/shared/DevToolsUtils.js index 2a9979b456..d2b38836c7 100644 --- a/devtools/shared/DevToolsUtils.js +++ b/devtools/shared/DevToolsUtils.js @@ -718,11 +718,7 @@ function mainThreadFetch( * @param {Object} options - The options object passed to @method fetch. * @return {nsIChannel} - The newly created channel. Throws on failure. */ -function newChannelForURL( - url, - { policy, window, principal }, - recursing = false -) { +function newChannelForURL(url, { policy, window, principal }) { const securityFlags = Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL; @@ -735,6 +731,19 @@ function newChannelForURL( // scheme to see if it helps. uri = Services.io.newURI("file://" + url); } + + // In xpcshell tests on Windows, opening the channel + // can throw NS_ERROR_UNKNOWN_PROTOCOL if the external protocol isn't + // supported by Windows, so we also need to handle that case here if + // parsing the URL above doesn't throw. + const handler = Services.io.getProtocolHandler(uri.scheme); + if ( + handler instanceof Ci.nsIExternalProtocolHandler && + !handler.externalAppExistsForScheme(uri.scheme) + ) { + uri = Services.io.newURI("file://" + url); + } + const channelOptions = { contentPolicyType: policy, securityFlags, @@ -766,24 +775,7 @@ function newChannelForURL( channelOptions.loadingPrincipal = prin; } - try { - return NetUtil.newChannel(channelOptions); - } catch (e) { - // Don't infinitely recurse if newChannel keeps throwing. - if (recursing) { - throw e; - } - - // In xpcshell tests on Windows, nsExternalProtocolHandler::NewChannel() - // can throw NS_ERROR_UNKNOWN_PROTOCOL if the external protocol isn't - // supported by Windows, so we also need to handle the exception here if - // parsing the URL above doesn't throw. - return newChannelForURL( - "file://" + url, - { policy, window, principal }, - /* recursing */ true - ); - } + return NetUtil.newChannel(channelOptions); } // Fetch is defined differently depending on whether we are on the main thread |