summaryrefslogtreecommitdiffstats
path: root/devtools
diff options
context:
space:
mode:
Diffstat (limited to 'devtools')
-rw-r--r--devtools/shared/DevToolsUtils.js38
-rw-r--r--devtools/startup/tests/browser/browser_command_line_urls.js3
2 files changed, 18 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
diff --git a/devtools/startup/tests/browser/browser_command_line_urls.js b/devtools/startup/tests/browser/browser_command_line_urls.js
index e435d08406..99c5214eac 100644
--- a/devtools/startup/tests/browser/browser_command_line_urls.js
+++ b/devtools/startup/tests/browser/browser_command_line_urls.js
@@ -93,6 +93,9 @@ add_task(async function openingWithDevToolsButUnknownSource() {
);
await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () {
+ // View source may not have updated the selection just yet
+ ContentTaskUtils.waitForCondition(() => !!content.getSelection());
+
const selection = content.getSelection();
Assert.equal(
selection.toString(),