browser_webextension_dropdown.js (3566B)
1 /* Any copyright is dedicated to the Public Domain. 2 * http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 /* globals browser */ 7 8 const URL = 9 "data:text/html;charset=utf8,test for drop down menu in devtools extension"; 10 11 add_task(async function runTest() { 12 const extension = await startupExtension(); 13 14 const tab = await addTab(URL); 15 const toolbox = await gDevTools.showToolboxForTab(tab, { 16 toolId: "webconsole", 17 }); 18 const { 19 Toolbox, 20 } = require("resource://devtools/client/framework/toolbox.js"); 21 await toolbox.switchHost(Toolbox.HostType.WINDOW); 22 23 await extension.awaitMessage("devtools_page_loaded"); 24 25 const toolboxAdditionalTools = toolbox.getAdditionalTools(); 26 is( 27 toolboxAdditionalTools.length, 28 1, 29 "Got the expected number of toolbox specific panel registered." 30 ); 31 32 const panelId = toolboxAdditionalTools[0].id; 33 34 await gDevTools.showToolboxForTab(tab, { toolId: panelId }); 35 36 await extension.awaitMessage("devtools_panel_loaded"); 37 38 const panel = findExtensionPanel(); 39 ok(panel, "found extension panel"); 40 41 const iframe = panel.firstChild; 42 const popupShownPromise = BrowserTestUtils.waitForSelectPopupShown( 43 toolbox.win.browsingContext.topChromeWindow 44 ); 45 46 const browser = iframe.contentDocument.getElementById( 47 "webext-panels-browser" 48 ); 49 ok(browser, "found extension panel browser"); 50 51 info("Waiting for menu"); 52 await ContentTask.spawn(browser, null, async function () { 53 const menu = content.document.getElementById("menu"); 54 const event = new content.MouseEvent("mousedown"); 55 menu.dispatchEvent(event); 56 }); 57 58 const popup = await popupShownPromise; 59 info("popup is shown"); 60 61 popup.hidePopup(); 62 63 await toolbox.destroy(); 64 65 gBrowser.removeCurrentTab(); 66 67 await extension.unload(); 68 }); 69 70 async function startupExtension() { 71 async function devtools_page() { 72 await browser.devtools.panels.create( 73 "drop", 74 "/icon.png", 75 "/devtools_panel.html" 76 ); 77 browser.test.sendMessage("devtools_page_loaded"); 78 } 79 80 async function devtools_panel() { 81 browser.test.sendMessage("devtools_panel_loaded"); 82 } 83 84 const extension = ExtensionTestUtils.loadExtension({ 85 manifest: { 86 devtools_page: "devtools_page.html", 87 }, 88 files: { 89 "devtools_page.html": `<!DOCTYPE html> 90 <html> 91 <head> 92 <meta charset="utf-8"> 93 </head> 94 <body> 95 <script src="devtools_page.js"></script> 96 </body> 97 </html>`, 98 "devtools_page.js": devtools_page, 99 "icon.png": "", 100 "devtools_panel.html": `<!DOCTYPE html> 101 <html> 102 <head> 103 <meta charset="utf-8"> 104 </head> 105 <body> 106 <select id="menu"> 107 <option value="A" selected>A</option> 108 <option value="B">B</option> 109 <option value="C">C</option> 110 </select> 111 <script src="devtools_panel.js"></script> 112 </body> 113 </html>`, 114 "devtools_panel.js": devtools_panel, 115 }, 116 }); 117 118 await extension.startup(); 119 120 return extension; 121 } 122 123 function findExtensionPanel() { 124 const win = Services.wm.getMostRecentWindow("devtools:toolbox"); 125 ok(win, "toolbox separate window exists"); 126 127 const iframe = win.document.querySelector(".devtools-toolbox-window-iframe"); 128 const deck = iframe.contentDocument.getElementById("toolbox-deck"); 129 for (const box of deck.childNodes) { 130 if (box.id && box.id.startsWith("toolbox-panel-webext-devtools-panel")) { 131 return box; 132 } 133 } 134 return null; 135 }