browser_fullscreen_context_menu.js (4088B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 async function openContextMenu(itemElement, win = window) { 7 let popupShownPromise = BrowserTestUtils.waitForEvent( 8 itemElement.ownerDocument, 9 "popupshown" 10 ); 11 EventUtils.synthesizeMouseAtCenter( 12 itemElement, 13 { 14 type: "contextmenu", 15 button: 2, 16 }, 17 win 18 ); 19 let { target } = await popupShownPromise; 20 return target; 21 } 22 23 async function testContextMenu() { 24 await BrowserTestUtils.withNewTab("about:blank", async () => { 25 let panelUIMenuButton = document.getElementById("PanelUI-menu-button"); 26 let contextMenu = await openContextMenu(panelUIMenuButton); 27 let array1 = !Services.appinfo.nativeMenubar 28 ? [ 29 "#toggle_toolbar-menubar", 30 "#toggle_PersonalToolbar", 31 "#viewToolbarsMenuSeparator", 32 ".viewCustomizeToolbar", 33 ] 34 : [ 35 "#toggle_PersonalToolbar", 36 "#viewToolbarsMenuSeparator", 37 ".viewCustomizeToolbar", 38 ]; 39 let result1 = verifyContextMenu(contextMenu, array1); 40 ok(!result1, "Expected no errors verifying context menu items"); 41 contextMenu.hidePopup(); 42 let onFullscreen = Promise.all([ 43 BrowserTestUtils.waitForEvent(window, "fullscreen"), 44 BrowserTestUtils.waitForEvent( 45 window, 46 "sizemodechange", 47 false, 48 () => window.fullScreen 49 ), 50 BrowserTestUtils.waitForPopupEvent(contextMenu, "hidden"), 51 ]); 52 document.getElementById("View:FullScreen").doCommand(); 53 contextMenu.hidePopup(); 54 info("waiting for fullscreen"); 55 await onFullscreen; 56 // make sure the toolbox is visible if it's autohidden 57 FullScreen.showNavToolbox(); 58 59 info("trigger the context menu"); 60 let contextMenu2 = await openContextMenu(panelUIMenuButton); 61 info("context menu should be open, verify its menu items"); 62 let array2 = !Services.appinfo.nativeMenubar 63 ? [ 64 "#toggle_toolbar-menubar", 65 "#toggle_PersonalToolbar", 66 "#viewToolbarsMenuSeparator", 67 ".viewCustomizeToolbar", 68 `menuseparator[contexttype="fullscreen"]`, 69 `.fullscreen-context-autohide`, 70 `menuitem[contexttype="fullscreen"]`, 71 ] 72 : [ 73 "#toggle_PersonalToolbar", 74 "#viewToolbarsMenuSeparator", 75 ".viewCustomizeToolbar", 76 `menuseparator[contexttype="fullscreen"]`, 77 `.fullscreen-context-autohide`, 78 `menuitem[contexttype="fullscreen"]`, 79 ]; 80 let result2 = verifyContextMenu(contextMenu2, array2); 81 ok(!result2, "Expected no errors verifying context menu items"); 82 let onExitFullscreen = Promise.all([ 83 BrowserTestUtils.waitForEvent(window, "fullscreen"), 84 BrowserTestUtils.waitForEvent( 85 window, 86 "sizemodechange", 87 false, 88 () => !window.fullScreen 89 ), 90 BrowserTestUtils.waitForPopupEvent(contextMenu2, "hidden"), 91 ]); 92 document.getElementById("View:FullScreen").doCommand(); 93 contextMenu2.hidePopup(); 94 await onExitFullscreen; 95 }); 96 } 97 98 function verifyContextMenu(contextMenu, itemSelectors) { 99 // Ignore hidden nodes 100 let items = Array.from(contextMenu.children).filter(n => 101 BrowserTestUtils.isVisible(n) 102 ); 103 let menuAsText = items 104 .map(n => { 105 return n.nodeName == "menuseparator" 106 ? "---" 107 : `${n.label} (${n.command})`; 108 }) 109 .join("\n"); 110 info("Got actual context menu items: \n" + menuAsText); 111 112 try { 113 is( 114 items.length, 115 itemSelectors.length, 116 "Context menu has the expected number of items" 117 ); 118 for (let i = 0; i < items.length; i++) { 119 let selector = itemSelectors[i]; 120 ok( 121 items[i].matches(selector), 122 `Item at ${i} matches expected selector: ${selector}` 123 ); 124 } 125 } catch (ex) { 126 return ex; 127 } 128 return null; 129 } 130 131 add_setup(async function () { 132 await SpecialPowers.pushPrefEnv({ 133 set: [["test.wait300msAfterTabSwitch", true]], 134 }); 135 }); 136 137 add_task(testContextMenu);