fune/netwerk/test/unit/test_substituting_protocol_handler.js
Kris Maglione 1ff74da18d Bug 1461590: Lower-case hostnames when adding substitutions. r=smaug f=dveditz
Since URI hostnames are defined to be case-insensitive, we only ever see
lower-case hostnames when looking up substitutions. That means that
substitutions containing capital letters are inaccessible, which is a footgun
that has hit many people.

The handler should lower-case substitutions when they're added so that
look-ups are always case-insensitive.

MozReview-Commit-ID: C936hS2cSyY

--HG--
extra : rebase_source : a70e8ceb822879e51c3a40232b7dffdfb9c0a185
2018-05-15 13:02:08 -07:00

41 lines
1.8 KiB
JavaScript

"use strict";
ChromeUtils.import("resource://gre/modules/Services.jsm");
add_task(async function test_case_insensitive_substitutions() {
let resProto = Services.io.getProtocolHandler("resource")
.QueryInterface(Ci.nsISubstitutingProtocolHandler);
let uri = Services.io.newFileURI(do_get_file("data"));
resProto.setSubstitution("FooBar", uri);
resProto.setSubstitutionWithFlags("BarBaz", uri, 0);
equal(resProto.resolveURI(Services.io.newURI("resource://foobar/")),
uri.spec, "Got correct resolved URI for setSubstitution");
equal(resProto.resolveURI(Services.io.newURI("resource://foobar/")),
uri.spec, "Got correct resolved URI for setSubstitutionWithFlags");
ok(resProto.hasSubstitution("foobar"), "hasSubstitution works with all-lower-case root");
ok(resProto.hasSubstitution("FooBar"), "hasSubstitution works with mixed-case root");
equal(resProto.getSubstitution("foobar").spec, uri.spec,
"getSubstitution works with all-lower-case root");
equal(resProto.getSubstitution("FooBar").spec, uri.spec,
"getSubstitution works with mixed-case root");
resProto.setSubstitution("foobar", null);
resProto.setSubstitution("barbaz", null);
Assert.throws(() => resProto.resolveURI(Services.io.newURI("resource://foobar/")),
e => e.result == Cr.NS_ERROR_NOT_AVAILABLE,
"Correctly unregistered case-insensitive substitution in setSubstitution");
Assert.throws(() => resProto.resolveURI(Services.io.newURI("resource://barbaz/")),
e => e.result == Cr.NS_ERROR_NOT_AVAILABLE,
"Correctly unregistered case-insensitive substitution in setSubstitutionWithFlags");
Assert.throws(() => resProto.getSubstitution("foobar"),
e => e.result == Cr.NS_ERROR_NOT_AVAILABLE,
"foobar substitution has been removed");
});