summaryrefslogtreecommitdiffstats
path: root/browser/components/preferences/tests/browser_filetype_dialog.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/preferences/tests/browser_filetype_dialog.js')
-rw-r--r--browser/components/preferences/tests/browser_filetype_dialog.js189
1 files changed, 189 insertions, 0 deletions
diff --git a/browser/components/preferences/tests/browser_filetype_dialog.js b/browser/components/preferences/tests/browser_filetype_dialog.js
new file mode 100644
index 0000000000..0e5ac036c4
--- /dev/null
+++ b/browser/components/preferences/tests/browser_filetype_dialog.js
@@ -0,0 +1,189 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+SimpleTest.requestCompleteLog();
+const { HandlerServiceTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/HandlerServiceTestUtils.sys.mjs"
+);
+
+let gHandlerService = Cc["@mozilla.org/uriloader/handler-service;1"].getService(
+ Ci.nsIHandlerService
+);
+
+let gOldMailHandlers = [];
+let gDummyHandlers = [];
+let gOriginalPreferredMailHandler;
+let gOriginalPreferredPDFHandler;
+
+registerCleanupFunction(function () {
+ function removeDummyHandlers(handlers) {
+ // Remove any of the dummy handlers we created.
+ for (let i = handlers.Count() - 1; i >= 0; i--) {
+ try {
+ if (
+ gDummyHandlers.some(
+ h =>
+ h.uriTemplate ==
+ handlers.queryElementAt(i, Ci.nsIWebHandlerApp).uriTemplate
+ )
+ ) {
+ handlers.removeElementAt(i);
+ }
+ } catch (ex) {
+ /* ignore non-web-app handlers */
+ }
+ }
+ }
+ // Re-add the original protocol handlers:
+ let mailHandlerInfo = HandlerServiceTestUtils.getHandlerInfo("mailto");
+ let mailHandlers = mailHandlerInfo.possibleApplicationHandlers;
+ for (let h of gOldMailHandlers) {
+ mailHandlers.appendElement(h);
+ }
+ removeDummyHandlers(mailHandlers);
+ mailHandlerInfo.preferredApplicationHandler = gOriginalPreferredMailHandler;
+ gHandlerService.store(mailHandlerInfo);
+
+ let pdfHandlerInfo =
+ HandlerServiceTestUtils.getHandlerInfo("application/pdf");
+ pdfHandlerInfo.preferredAction = Ci.nsIHandlerInfo.handleInternally;
+ pdfHandlerInfo.preferredApplicationHandler = gOriginalPreferredPDFHandler;
+ let handlers = pdfHandlerInfo.possibleApplicationHandlers;
+ for (let i = handlers.Count() - 1; i >= 0; i--) {
+ let app = handlers.queryElementAt(i, Ci.nsIHandlerApp);
+ if (app.name == "Foopydoopydoo") {
+ handlers.removeElementAt(i);
+ }
+ }
+ gHandlerService.store(pdfHandlerInfo);
+
+ gBrowser.removeCurrentTab();
+});
+
+function scrubMailtoHandlers(handlerInfo) {
+ // Remove extant web handlers because they have icons that
+ // we fetch from the web, which isn't allowed in tests.
+ let handlers = handlerInfo.possibleApplicationHandlers;
+ for (let i = handlers.Count() - 1; i >= 0; i--) {
+ try {
+ let handler = handlers.queryElementAt(i, Ci.nsIWebHandlerApp);
+ gOldMailHandlers.push(handler);
+ // If we get here, this is a web handler app. Remove it:
+ handlers.removeElementAt(i);
+ } catch (ex) {}
+ }
+}
+
+("use strict");
+
+add_setup(async function () {
+ // Create our dummy handlers
+ let handler1 = Cc["@mozilla.org/uriloader/web-handler-app;1"].createInstance(
+ Ci.nsIWebHandlerApp
+ );
+ handler1.name = "Handler 1";
+ handler1.uriTemplate = "https://example.com/first/%s";
+
+ let handler2 = Cc["@mozilla.org/uriloader/web-handler-app;1"].createInstance(
+ Ci.nsIWebHandlerApp
+ );
+ handler2.name = "Handler 2";
+ handler2.uriTemplate = "http://example.org/second/%s";
+ gDummyHandlers.push(handler1, handler2);
+
+ function substituteWebHandlers(handlerInfo) {
+ // Append the dummy handlers to replace them:
+ let handlers = handlerInfo.possibleApplicationHandlers;
+ handlers.appendElement(handler1);
+ handlers.appendElement(handler2);
+ gHandlerService.store(handlerInfo);
+ }
+ // Set up our mailto handler test infrastructure.
+ let mailtoHandlerInfo = HandlerServiceTestUtils.getHandlerInfo("mailto");
+ scrubMailtoHandlers(mailtoHandlerInfo);
+ gOriginalPreferredMailHandler = mailtoHandlerInfo.preferredApplicationHandler;
+ substituteWebHandlers(mailtoHandlerInfo);
+
+ // Now add a pdf handler:
+ let pdfHandlerInfo =
+ HandlerServiceTestUtils.getHandlerInfo("application/pdf");
+ // PDF doesn't have built-in web handlers, so no need to scrub.
+ gOriginalPreferredPDFHandler = pdfHandlerInfo.preferredApplicationHandler;
+ let handlers = pdfHandlerInfo.possibleApplicationHandlers;
+ let appHandler = Cc[
+ "@mozilla.org/uriloader/local-handler-app;1"
+ ].createInstance(Ci.nsILocalHandlerApp);
+ appHandler.name = "Foopydoopydoo";
+ appHandler.executable = Services.dirsvc.get("ProfD", Ci.nsIFile);
+ appHandler.executable.append("dummy.exe");
+ // Prefs are picky and want this to exist and be executable (bug 1626009):
+ if (!appHandler.executable.exists()) {
+ appHandler.executable.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0o777);
+ }
+
+ handlers.appendElement(appHandler);
+
+ pdfHandlerInfo.preferredApplicationHandler = appHandler;
+ pdfHandlerInfo.preferredAction = Ci.nsIHandlerInfo.useHelperApp;
+ gHandlerService.store(pdfHandlerInfo);
+
+ await openPreferencesViaOpenPreferencesAPI("general", { leaveOpen: true });
+ info("Preferences page opened on the general pane.");
+
+ await gBrowser.selectedBrowser.contentWindow.promiseLoadHandlersList;
+ info("Apps list loaded.");
+});
+
+add_task(async function dialogShowsCorrectContent() {
+ let win = gBrowser.selectedBrowser.contentWindow;
+
+ let container = win.document.getElementById("handlersView");
+
+ // First, find the PDF item.
+ let pdfItem = container.querySelector("richlistitem[type='application/pdf']");
+ Assert.ok(pdfItem, "pdfItem is present in handlersView.");
+ pdfItem.scrollIntoView({ block: "center" });
+ pdfItem.closest("richlistbox").selectItem(pdfItem);
+
+ // Open its menu
+ let list = pdfItem.querySelector(".actionsMenu");
+ let popup = list.menupopup;
+ let popupShown = BrowserTestUtils.waitForEvent(popup, "popupshown");
+ EventUtils.synthesizeMouseAtCenter(list, {}, win);
+ await popupShown;
+
+ // Then open the dialog
+ const promiseDialogLoaded = promiseLoadSubDialog(
+ "chrome://browser/content/preferences/dialogs/applicationManager.xhtml"
+ );
+ EventUtils.synthesizeMouseAtCenter(
+ popup.querySelector(".manage-app-item"),
+ {},
+ win
+ );
+ let dialogWin = await promiseDialogLoaded;
+
+ // Then verify that the description is correct.
+ let desc = dialogWin.document.getElementById("appDescription");
+ let descL10n = dialogWin.document.l10n.getAttributes(desc);
+ is(descL10n.id, "app-manager-handle-file", "Should have right string");
+ let stringBundle = Services.strings.createBundle(
+ "chrome://mozapps/locale/downloads/unknownContentType.properties"
+ );
+ is(
+ descL10n.args.type,
+ stringBundle.GetStringFromName("pdfExtHandlerDescription"),
+ "Should have PDF string bits."
+ );
+
+ // And that there's one item in the list, with the correct name:
+ let appList = dialogWin.document.getElementById("appList");
+ is(appList.itemCount, 1, "Should have 1 item in the list");
+ is(
+ appList.selectedItem.querySelector("label").getAttribute("value"),
+ "Foopydoopydoo",
+ "Should have the right executable label"
+ );
+
+ dialogWin.close();
+});