Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

var gMimeSvc = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService);
var gHandlerSvc = Cc["@mozilla.org/uriloader/handler-service;1"].getService(
Ci.nsIHandlerService
);
const testItemType = "text/x-test-handler";
SimpleTest.requestCompleteLog();
function setupFakeHandler() {
let info = gMimeSvc.getFromTypeAndExtension("text/plain", "foo.txt");
ok(
info.possibleLocalHandlers.length,
"Should have at least one known handler"
);
let handler = info.possibleLocalHandlers.queryElementAt(
0,
Ci.nsILocalHandlerApp
);
let infoToModify = gMimeSvc.getFromTypeAndExtension(
"text/x-test-handler",
null
);
infoToModify.possibleApplicationHandlers.appendElement(handler);
gHandlerSvc.store(infoToModify);
}
add_task(async function () {
await SpecialPowers.pushPrefEnv({
set: [["browser.settings-redesign.enabled", true]],
});
setupFakeHandler();
let appHandlerInitialized = TestUtils.topicObserved("app-handler-loaded");
let prefs = await openPreferencesViaOpenPreferencesAPI("paneGeneral", {
leaveOpen: true,
});
is(prefs.selectedPane, "paneGeneral", "General pane was selected");
let win = gBrowser.selectedBrowser.contentWindow;
await appHandlerInitialized;
let container = win.document.getElementById("applicationsHandlersView");
ok(container, "handlersView is present");
let ourItem = container.querySelector(`moz-box-item[type="${testItemType}"]`);
ok(ourItem, "at least one item is present");
ourItem.scrollIntoView();
let list = ourItem.querySelector(".actionsMenu");
let chooseItem = list.querySelector(".choose-app-item");
let dialogLoadedPromise = promiseLoadSubDialog(
"chrome://global/content/appPicker.xhtml"
);
/**
* Must choose option by manually changing to replicate
* what the component does to select an option.
*/
list.value = chooseItem.value;
list.dispatchEvent(new CustomEvent("change"));
await list.updateComplete;
let dialog = await dialogLoadedPromise;
ok(dialog, "Dialog loaded");
let dialogDoc = dialog.document;
let dialogElement = dialogDoc.getElementById("app-picker");
let dialogList = dialogDoc.getElementById("app-picker-listbox");
dialogList.selectItem(dialogList.firstElementChild);
let selectedApp = dialogList.firstElementChild.handlerApp;
let dialogClosePromise = BrowserTestUtils.waitForEvent(
dialog,
"dialogclosing"
);
dialogElement.acceptDialog();
await dialogClosePromise;
// Verify results are correct in mime service:
let mimeInfo = gMimeSvc.getFromTypeAndExtension(testItemType, null);
ok(
mimeInfo.preferredApplicationHandler.equals(selectedApp),
"App should be set as preferred."
);
const selectedAppItem = list.querySelector(
`moz-option[value="${list.value}"]`
);
ok(
selectedAppItem.handlerApp.equals(selectedApp),
"Selected item matches app in dropdown"
);
// Now try to 'manage' this list:
dialogLoadedPromise = promiseLoadSubDialog(
"chrome://browser/content/preferences/dialogs/applicationManager.xhtml"
);
let manageItem = list.querySelector(".manage-app-item");
list.value = manageItem.value;
list.dispatchEvent(new CustomEvent("change"));
await list.updateComplete;
dialog = await dialogLoadedPromise;
ok(dialog, "Dialog loaded the second time");
dialogDoc = dialog.document;
dialogElement = dialogDoc.getElementById("appManager");
dialogList = dialogDoc.getElementById("appList");
let itemToRemove = dialogList.querySelector(
'richlistitem > label[value="' + selectedApp.name + '"]'
).parentNode;
dialogList.selectItem(itemToRemove);
let itemsBefore = dialogList.children.length;
dialogDoc.getElementById("remove").click();
ok(!itemToRemove.parentNode, "Item got removed from DOM");
is(dialogList.children.length, itemsBefore - 1, "Item got removed");
dialogClosePromise = BrowserTestUtils.waitForEvent(dialog, "dialogclosing");
dialogElement.acceptDialog();
await dialogClosePromise;
// Verify results are correct in mime service:
mimeInfo = gMimeSvc.getFromTypeAndExtension(testItemType, null);
ok(
!mimeInfo.preferredApplicationHandler,
"App should no longer be set as preferred."
);
const selectedItem = list.querySelector(`moz-option[value="${list.value}"]`);
ok(!selectedItem.handlerApp, "No app should be visible as preferred item.");
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
registerCleanupFunction(function () {
let infoToModify = gMimeSvc.getFromTypeAndExtension(testItemType, null);
gHandlerSvc.remove(infoToModify);
});