Bug 1883693 - Fix devtools expectation that newChannel throws for unsupported external handlers r=nika,devtools-reviewers,ochameau

Depends on D205296

Differential Revision: https://phabricator.services.mozilla.com/D206754
This commit is contained in:
Valentin Gosu 2024-05-02 18:11:52 +00:00
parent b74a2369f2
commit a79b4fefa9

View file

@ -730,11 +730,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;
@ -747,6 +743,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,
@ -778,24 +787,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