Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
"use strict";
XPCOMUtils.defineLazyServiceGetter(
this,
"gExternalProtocolService",
"@mozilla.org/uriloader/external-protocol-service;1",
"nsIExternalProtocolService"
);
ChromeUtils.defineESModuleGetters(this, {
kHandlerList: "resource://gre/modules/handlers/HandlerList.sys.mjs",
});
add_task(async function test_check_defaults_get_added() {
let protocols = Object.keys(kHandlerList.default.schemes);
for (let protocol of protocols) {
let protocolHandlerCount =
kHandlerList.default.schemes[protocol].handlers.length;
Assert.ok(
gHandlerService.wrappedJSObject._store.data.schemes[protocol].stubEntry,
`Expect stub for ${protocol}`
);
let info = gExternalProtocolService.getProtocolHandlerInfo(protocol, {});
Assert.ok(
info,
`Should be able to get protocol handler info for ${protocol}`
);
let handlers = Array.from(
info.possibleApplicationHandlers.enumerate(Ci.nsIHandlerApp)
);
handlers = handlers.filter(h => h instanceof Ci.nsIWebHandlerApp);
Assert.equal(
handlers.length,
protocolHandlerCount,
`Default web handlers for ${protocol} should match`
);
let { alwaysAskBeforeHandling, preferredAction } = info;
// Actually store something, pretending there was a change:
let infoToWrite = gExternalProtocolService.getProtocolHandlerInfo(
protocol,
{}
);
gHandlerService.store(infoToWrite);
ok(
!gHandlerService.wrappedJSObject._store.data.schemes[protocol].stubEntry,
"Expect stub entry info to go away"
);
let newInfo = gExternalProtocolService.getProtocolHandlerInfo(protocol, {});
Assert.equal(
alwaysAskBeforeHandling,
newInfo.alwaysAskBeforeHandling,
protocol + " - always ask shouldn't change"
);
Assert.equal(
preferredAction,
newInfo.preferredAction,
protocol + " - preferred action shouldn't change"
);
await deleteHandlerStore();
}
});
add_task(async function test_check_default_modification() {
Assert.ok(
true,
JSON.stringify(gHandlerService.wrappedJSObject._store.data.schemes.mailto)
);
Assert.ok(
gHandlerService.wrappedJSObject._store.data.schemes.mailto.stubEntry,
"Expect stub for mailto"
);
let mailInfo = gExternalProtocolService.getProtocolHandlerInfo("mailto", {});
mailInfo.alwaysAskBeforeHandling = false;
mailInfo.preferredAction = Ci.nsIHandlerInfo.useSystemDefault;
gHandlerService.store(mailInfo);
Assert.ok(
!gHandlerService.wrappedJSObject._store.data.schemes.mailto.stubEntry,
"Stub entry should be removed immediately."
);
let newMail = gExternalProtocolService.getProtocolHandlerInfo("mailto", {});
Assert.equal(newMail.preferredAction, Ci.nsIHandlerInfo.useSystemDefault);
Assert.equal(newMail.alwaysAskBeforeHandling, false);
await deleteHandlerStore();
});
add_task(async function test_migrations() {
const kTestData = [
];
// Set up the test handlers. This doesn't use prefs like the previous test,
// because we now refuse to import insecure handler prefs. They can only
// exist if they were added into the handler store before this restriction
// was created (bug 1526890).
gHandlerService.wrappedJSObject._injectDefaultProtocolHandlers();
let handler = gExternalProtocolService.getProtocolHandlerInfo("mailto");
while (handler.possibleApplicationHandlers.length) {
handler.possibleApplicationHandlers.removeElementAt(0);
}
for (let [name, uriTemplate] of kTestData) {
let app = Cc["@mozilla.org/uriloader/web-handler-app;1"].createInstance(
Ci.nsIWebHandlerApp
);
app.uriTemplate = uriTemplate;
app.name = name;
handler.possibleApplicationHandlers.appendElement(app);
}
gHandlerService.store(handler);
// Now migrate them:
Services.prefs.setCharPref("browser.handlers.migrations", "blah,secure-mail");
gHandlerService.wrappedJSObject._migrateProtocolHandlersIfNeeded();
// Now check the result:
handler = gExternalProtocolService.getProtocolHandlerInfo("mailto");
let expectedURIs = new Set([
]);
let possibleApplicationHandlers = Array.from(
handler.possibleApplicationHandlers.enumerate(Ci.nsIWebHandlerApp)
);
// Set iterators are stable to deletion, so this works:
for (let expected of expectedURIs) {
for (let app of possibleApplicationHandlers) {
if (app instanceof Ci.nsIWebHandlerApp && app.uriTemplate == expected) {
Assert.ok(true, "Found handler with URI " + expected);
// ... even when we remove items.
expectedURIs.delete(expected);
break;
}
}
}
Assert.equal(expectedURIs.size, 0, "Should have seen all the expected URIs.");
for (let app of possibleApplicationHandlers) {
if (app instanceof Ci.nsIWebHandlerApp) {
Assert.ok(
!kTestData.some(n => n[1] == app.uriTemplate),
"Should not be any of the original handlers"
);
}
}
Assert.ok(
!handler.preferredApplicationHandler,
"Shouldn't have preferred handler initially."
);
await deleteHandlerStore();
});
/**
* Check that non-https templates or ones without a '%s' are ignored.
*/
add_task(async function invalid_handlers_are_rejected() {
let schemes = kHandlerList.default.schemes;
schemes.myfancyinvalidstuff = {
handlers: [
{
name: "No template at all",
},
{
name: "Not secure",
uriTemplate: "http://example.com/%s",
},
{
name: "No replacement percent-s bit",
uriTemplate: "https://example.com/",
},
{
name: "Actually valid",
uriTemplate: "https://example.com/%s",
},
],
};
gHandlerService.wrappedJSObject._injectDefaultProtocolHandlers();
// Now check the result:
let handler = gExternalProtocolService.getProtocolHandlerInfo(
"myfancyinvalidstuff"
);
let expectedURIs = ["https://example.com/%s"];
Assert.deepEqual(
Array.from(
handler.possibleApplicationHandlers.enumerate(Ci.nsIWebHandlerApp),
e => e.uriTemplate
),
expectedURIs,
"Should have seen only 1 handler added."
);
await deleteHandlerStore();
});