summaryrefslogtreecommitdiffstats
path: root/devtools/shared/DevToolsUtils.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/shared/DevToolsUtils.js')
-rw-r--r--devtools/shared/DevToolsUtils.js38
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