browser_change_app_handler.js (4414B)
1 var gMimeSvc = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService); 2 var gHandlerSvc = Cc["@mozilla.org/uriloader/handler-service;1"].getService( 3 Ci.nsIHandlerService 4 ); 5 6 SimpleTest.requestCompleteLog(); 7 8 function setupFakeHandler() { 9 let info = gMimeSvc.getFromTypeAndExtension("text/plain", "foo.txt"); 10 ok( 11 info.possibleLocalHandlers.length, 12 "Should have at least one known handler" 13 ); 14 let handler = info.possibleLocalHandlers.queryElementAt( 15 0, 16 Ci.nsILocalHandlerApp 17 ); 18 19 let infoToModify = gMimeSvc.getFromTypeAndExtension( 20 "text/x-test-handler", 21 null 22 ); 23 infoToModify.possibleApplicationHandlers.appendElement(handler); 24 25 gHandlerSvc.store(infoToModify); 26 } 27 28 add_task(async function () { 29 setupFakeHandler(); 30 31 let prefs = await openPreferencesViaOpenPreferencesAPI("paneGeneral", { 32 leaveOpen: true, 33 }); 34 is(prefs.selectedPane, "paneGeneral", "General pane was selected"); 35 let win = gBrowser.selectedBrowser.contentWindow; 36 37 let container = win.document.getElementById("handlersView"); 38 let ourItem = container.querySelector( 39 "richlistitem[type='text/x-test-handler']" 40 ); 41 ok(ourItem, "handlersView is present"); 42 ourItem.scrollIntoView(); 43 container.selectItem(ourItem); 44 ok(ourItem.selected, "Should be able to select our item."); 45 46 let list = ourItem.querySelector(".actionsMenu"); 47 48 let chooseItem = list.menupopup.querySelector(".choose-app-item"); 49 let dialogLoadedPromise = promiseLoadSubDialog( 50 "chrome://global/content/appPicker.xhtml" 51 ); 52 let cmdEvent = win.document.createEvent("xulcommandevent"); 53 cmdEvent.initCommandEvent( 54 "command", 55 true, 56 true, 57 win, 58 0, 59 false, 60 false, 61 false, 62 false, 63 0, 64 null, 65 0 66 ); 67 chooseItem.dispatchEvent(cmdEvent); 68 69 let dialog = await dialogLoadedPromise; 70 info("Dialog loaded"); 71 72 let dialogDoc = dialog.document; 73 let dialogElement = dialogDoc.getElementById("app-picker"); 74 let dialogList = dialogDoc.getElementById("app-picker-listbox"); 75 dialogList.selectItem(dialogList.firstElementChild); 76 let selectedApp = dialogList.firstElementChild.handlerApp; 77 dialogElement.acceptDialog(); 78 79 // Verify results are correct in mime service: 80 let mimeInfo = gMimeSvc.getFromTypeAndExtension("text/x-test-handler", null); 81 ok( 82 mimeInfo.preferredApplicationHandler.equals(selectedApp), 83 "App should be set as preferred." 84 ); 85 86 // Check that we display this result: 87 ok(list.selectedItem, "Should have a selected item"); 88 ok( 89 mimeInfo.preferredApplicationHandler.equals(list.selectedItem.handlerApp), 90 "App should be visible as preferred item." 91 ); 92 93 // Now try to 'manage' this list: 94 dialogLoadedPromise = promiseLoadSubDialog( 95 "chrome://browser/content/preferences/dialogs/applicationManager.xhtml" 96 ); 97 98 let manageItem = list.menupopup.querySelector(".manage-app-item"); 99 cmdEvent = win.document.createEvent("xulcommandevent"); 100 cmdEvent.initCommandEvent( 101 "command", 102 true, 103 true, 104 win, 105 0, 106 false, 107 false, 108 false, 109 false, 110 0, 111 null, 112 0 113 ); 114 manageItem.dispatchEvent(cmdEvent); 115 116 dialog = await dialogLoadedPromise; 117 info("Dialog loaded the second time"); 118 119 dialogDoc = dialog.document; 120 dialogElement = dialogDoc.getElementById("appManager"); 121 dialogList = dialogDoc.getElementById("appList"); 122 let itemToRemove = dialogList.querySelector( 123 'richlistitem > label[value="' + selectedApp.name + '"]' 124 ).parentNode; 125 dialogList.selectItem(itemToRemove); 126 let itemsBefore = dialogList.children.length; 127 dialogDoc.getElementById("remove").click(); 128 ok(!itemToRemove.parentNode, "Item got removed from DOM"); 129 is(dialogList.children.length, itemsBefore - 1, "Item got removed"); 130 dialogElement.acceptDialog(); 131 132 // Verify results are correct in mime service: 133 mimeInfo = gMimeSvc.getFromTypeAndExtension("text/x-test-handler", null); 134 ok( 135 !mimeInfo.preferredApplicationHandler, 136 "App should no longer be set as preferred." 137 ); 138 139 // Check that we display this result: 140 ok(list.selectedItem, "Should have a selected item"); 141 ok( 142 !list.selectedItem.handlerApp, 143 "No app should be visible as preferred item." 144 ); 145 146 BrowserTestUtils.removeTab(gBrowser.selectedTab); 147 }); 148 149 registerCleanupFunction(function () { 150 let infoToModify = gMimeSvc.getFromTypeAndExtension( 151 "text/x-test-handler", 152 null 153 ); 154 gHandlerSvc.remove(infoToModify); 155 });