diff options
Diffstat (limited to 'browser/components/customizableui/test/browser_988072_sidebar_events.js')
-rw-r--r-- | browser/components/customizableui/test/browser_988072_sidebar_events.js | 392 |
1 files changed, 392 insertions, 0 deletions
diff --git a/browser/components/customizableui/test/browser_988072_sidebar_events.js b/browser/components/customizableui/test/browser_988072_sidebar_events.js new file mode 100644 index 000000000..6791be67a --- /dev/null +++ b/browser/components/customizableui/test/browser_988072_sidebar_events.js @@ -0,0 +1,392 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +var gSidebarMenu = document.getElementById("viewSidebarMenu"); +var gTestSidebarItem = null; + +var EVENTS = { + click: 0, command: 0, + onclick: 0, oncommand: 0 +}; + +window.sawEvent = function(event, isattr) { + let type = (isattr ? "on" : "") + event.type + EVENTS[type]++; +}; + +registerCleanupFunction(() => { + delete window.sawEvent; + + // Ensure sidebar is hidden after each test: + if (!document.getElementById("sidebar-box").hidden) { + SidebarUI.hide(); + } +}); + +function checkExpectedEvents(expected) { + for (let type of Object.keys(EVENTS)) { + let count = (type in expected ? expected[type] : 0); + is(EVENTS[type], count, "Should have seen the right number of " + type + " events"); + EVENTS[type] = 0; + } +} + +function createSidebarItem() { + gTestSidebarItem = document.createElement("menuitem"); + gTestSidebarItem.id = "testsidebar"; + gTestSidebarItem.setAttribute("label", "Test Sidebar"); + gSidebarMenu.insertBefore(gTestSidebarItem, gSidebarMenu.firstChild); +} + +function addWidget() { + CustomizableUI.addWidgetToArea("sidebar-button", "nav-bar"); + PanelUI.disableSingleSubviewPanelAnimations(); +} + +function removeWidget() { + CustomizableUI.removeWidgetFromArea("sidebar-button"); + PanelUI.enableSingleSubviewPanelAnimations(); +} + +// Filters out the trailing menuseparators from the sidebar list +function getSidebarList() { + let sidebars = [...gSidebarMenu.children].filter(sidebar => { + if (sidebar.localName == "menuseparator") + return false; + if (sidebar.getAttribute("hidden") == "true") + return false; + return true; + }); + return sidebars; +} + +function compareElements(original, displayed) { + let attrs = ["label", "key", "disabled", "hidden", "origin", "image", "checked"]; + for (let attr of attrs) { + is(displayed.getAttribute(attr), original.getAttribute(attr), "Should have the same " + attr + " attribute"); + } +} + +function compareList(original, displayed) { + is(displayed.length, original.length, "Should have the same number of children"); + + for (let i = 0; i < Math.min(original.length, displayed.length); i++) { + compareElements(displayed[i], original[i]); + } +} + +var showSidebarPopup = Task.async(function*() { + let button = document.getElementById("sidebar-button"); + let subview = document.getElementById("PanelUI-sidebar"); + + let popupShownPromise = BrowserTestUtils.waitForEvent(document, "popupshown"); + + let subviewShownPromise = subviewShown(subview); + EventUtils.synthesizeMouseAtCenter(button, {}); + return Promise.all([subviewShownPromise, popupShownPromise]); +}); + +// Check the sidebar widget shows the default items +add_task(function*() { + addWidget(); + + yield showSidebarPopup(); + + let sidebars = getSidebarList(); + let displayed = [...document.getElementById("PanelUI-sidebarItems").children]; + compareList(sidebars, displayed); + + let subview = document.getElementById("PanelUI-sidebar"); + let subviewHiddenPromise = subviewHidden(subview); + document.getElementById("customizationui-widget-panel").hidePopup(); + yield subviewHiddenPromise; + + removeWidget(); +}); + +function add_sidebar_task(description, setup, teardown) { + add_task(function*() { + info(description); + createSidebarItem(); + addWidget(); + yield setup(); + + CustomizableUI.addWidgetToArea("sidebar-button", "nav-bar"); + + yield showSidebarPopup(); + + let sidebars = getSidebarList(); + let displayed = [...document.getElementById("PanelUI-sidebarItems").children]; + compareList(sidebars, displayed); + + is(displayed[0].label, "Test Sidebar", "Should have the right element at the top"); + let subview = document.getElementById("PanelUI-sidebar"); + let subviewHiddenPromise = subviewHidden(subview); + EventUtils.synthesizeMouseAtCenter(displayed[0], {}); + yield subviewHiddenPromise; + + yield teardown(); + gTestSidebarItem.remove(); + removeWidget(); + }); +} + +add_sidebar_task( + "Check that a sidebar that uses a command event listener works", +function*() { + gTestSidebarItem.addEventListener("command", window.sawEvent); +}, function*() { + checkExpectedEvents({ command: 1 }); +}); + +add_sidebar_task( + "Check that a sidebar that uses a click event listener works", +function*() { + gTestSidebarItem.addEventListener("click", window.sawEvent); +}, function*() { + checkExpectedEvents({ click: 1 }); +}); + +add_sidebar_task( + "Check that a sidebar that uses both click and command event listeners works", +function*() { + gTestSidebarItem.addEventListener("command", window.sawEvent); + gTestSidebarItem.addEventListener("click", window.sawEvent); +}, function*() { + checkExpectedEvents({ command: 1, click: 1 }); +}); + +add_sidebar_task( + "Check that a sidebar that uses an oncommand attribute works", +function*() { + gTestSidebarItem.setAttribute("oncommand", "window.sawEvent(event, true)"); +}, function*() { + checkExpectedEvents({ oncommand: 1 }); +}); + +add_sidebar_task( + "Check that a sidebar that uses an onclick attribute works", +function*() { + gTestSidebarItem.setAttribute("onclick", "window.sawEvent(event, true)"); +}, function*() { + checkExpectedEvents({ onclick: 1 }); +}); + +add_sidebar_task( + "Check that a sidebar that uses both onclick and oncommand attributes works", +function*() { + gTestSidebarItem.setAttribute("onclick", "window.sawEvent(event, true)"); + gTestSidebarItem.setAttribute("oncommand", "window.sawEvent(event, true)"); +}, function*() { + checkExpectedEvents({ onclick: 1, oncommand: 1 }); +}); + +add_sidebar_task( + "Check that a sidebar that uses an onclick attribute and a command listener works", +function*() { + gTestSidebarItem.setAttribute("onclick", "window.sawEvent(event, true)"); + gTestSidebarItem.addEventListener("command", window.sawEvent); +}, function*() { + checkExpectedEvents({ onclick: 1, command: 1 }); +}); + +add_sidebar_task( + "Check that a sidebar that uses an oncommand attribute and a click listener works", +function*() { + gTestSidebarItem.setAttribute("oncommand", "window.sawEvent(event, true)"); + gTestSidebarItem.addEventListener("click", window.sawEvent); +}, function*() { + checkExpectedEvents({ click: 1, oncommand: 1 }); +}); + +add_sidebar_task( + "A sidebar with both onclick attribute and click listener sees only one event :(", +function*() { + gTestSidebarItem.setAttribute("onclick", "window.sawEvent(event, true)"); + gTestSidebarItem.addEventListener("click", window.sawEvent); +}, function*() { + checkExpectedEvents({ onclick: 1 }); +}); + +add_sidebar_task( + "A sidebar with both oncommand attribute and command listener sees only one event :(", +function*() { + gTestSidebarItem.setAttribute("oncommand", "window.sawEvent(event, true)"); + gTestSidebarItem.addEventListener("command", window.sawEvent); +}, function*() { + checkExpectedEvents({ oncommand: 1 }); +}); + +add_sidebar_task( + "Check that a sidebar that uses a broadcaster with an oncommand attribute works", +function*() { + let broadcaster = document.createElement("broadcaster"); + broadcaster.setAttribute("id", "testbroadcaster"); + broadcaster.setAttribute("oncommand", "window.sawEvent(event, true)"); + broadcaster.setAttribute("label", "Test Sidebar"); + document.getElementById("mainBroadcasterSet").appendChild(broadcaster); + + gTestSidebarItem.setAttribute("observes", "testbroadcaster"); +}, function*() { + checkExpectedEvents({ oncommand: 1 }); + document.getElementById("testbroadcaster").remove(); +}); + +add_sidebar_task( + "Check that a sidebar that uses a broadcaster with an onclick attribute works", +function*() { + let broadcaster = document.createElement("broadcaster"); + broadcaster.setAttribute("id", "testbroadcaster"); + broadcaster.setAttribute("onclick", "window.sawEvent(event, true)"); + broadcaster.setAttribute("label", "Test Sidebar"); + document.getElementById("mainBroadcasterSet").appendChild(broadcaster); + + gTestSidebarItem.setAttribute("observes", "testbroadcaster"); +}, function*() { + checkExpectedEvents({ onclick: 1 }); + document.getElementById("testbroadcaster").remove(); +}); + +add_sidebar_task( + "Check that a sidebar that uses a broadcaster with both onclick and oncommand attributes works", +function*() { + let broadcaster = document.createElement("broadcaster"); + broadcaster.setAttribute("id", "testbroadcaster"); + broadcaster.setAttribute("onclick", "window.sawEvent(event, true)"); + broadcaster.setAttribute("oncommand", "window.sawEvent(event, true)"); + broadcaster.setAttribute("label", "Test Sidebar"); + document.getElementById("mainBroadcasterSet").appendChild(broadcaster); + + gTestSidebarItem.setAttribute("observes", "testbroadcaster"); +}, function*() { + checkExpectedEvents({ onclick: 1, oncommand: 1 }); + document.getElementById("testbroadcaster").remove(); +}); + +add_sidebar_task( + "Check that a sidebar with a click listener and a broadcaster with an oncommand attribute works", +function*() { + let broadcaster = document.createElement("broadcaster"); + broadcaster.setAttribute("id", "testbroadcaster"); + broadcaster.setAttribute("oncommand", "window.sawEvent(event, true)"); + broadcaster.setAttribute("label", "Test Sidebar"); + document.getElementById("mainBroadcasterSet").appendChild(broadcaster); + + gTestSidebarItem.setAttribute("observes", "testbroadcaster"); + gTestSidebarItem.addEventListener("click", window.sawEvent); +}, function*() { + checkExpectedEvents({ click: 1, oncommand: 1 }); + document.getElementById("testbroadcaster").remove(); +}); + +add_sidebar_task( + "Check that a sidebar with a command listener and a broadcaster with an onclick attribute works", +function*() { + let broadcaster = document.createElement("broadcaster"); + broadcaster.setAttribute("id", "testbroadcaster"); + broadcaster.setAttribute("onclick", "window.sawEvent(event, true)"); + broadcaster.setAttribute("label", "Test Sidebar"); + document.getElementById("mainBroadcasterSet").appendChild(broadcaster); + + gTestSidebarItem.setAttribute("observes", "testbroadcaster"); + gTestSidebarItem.addEventListener("command", window.sawEvent); +}, function*() { + checkExpectedEvents({ onclick: 1, command: 1 }); + document.getElementById("testbroadcaster").remove(); +}); + +add_sidebar_task( + "Check that a sidebar with a click listener and a broadcaster with an onclick " + + "attribute only sees one event :(", +function*() { + let broadcaster = document.createElement("broadcaster"); + broadcaster.setAttribute("id", "testbroadcaster"); + broadcaster.setAttribute("onclick", "window.sawEvent(event, true)"); + broadcaster.setAttribute("label", "Test Sidebar"); + document.getElementById("mainBroadcasterSet").appendChild(broadcaster); + + gTestSidebarItem.setAttribute("observes", "testbroadcaster"); + gTestSidebarItem.addEventListener("click", window.sawEvent); +}, function*() { + checkExpectedEvents({ onclick: 1 }); + document.getElementById("testbroadcaster").remove(); +}); + +add_sidebar_task( + "Check that a sidebar with a command listener and a broadcaster with an oncommand " + + "attribute only sees one event :(", +function*() { + let broadcaster = document.createElement("broadcaster"); + broadcaster.setAttribute("id", "testbroadcaster"); + broadcaster.setAttribute("oncommand", "window.sawEvent(event, true)"); + broadcaster.setAttribute("label", "Test Sidebar"); + document.getElementById("mainBroadcasterSet").appendChild(broadcaster); + + gTestSidebarItem.setAttribute("observes", "testbroadcaster"); + gTestSidebarItem.addEventListener("command", window.sawEvent); +}, function*() { + checkExpectedEvents({ oncommand: 1 }); + document.getElementById("testbroadcaster").remove(); +}); + +add_sidebar_task( + "Check that a sidebar that uses a command element with a command event listener works", +function*() { + let command = document.createElement("command"); + command.setAttribute("id", "testcommand"); + document.getElementById("mainCommandSet").appendChild(command); + command.addEventListener("command", window.sawEvent); + + gTestSidebarItem.setAttribute("command", "testcommand"); +}, function*() { + checkExpectedEvents({ command: 1 }); + document.getElementById("testcommand").remove(); +}); + +add_sidebar_task( + "Check that a sidebar that uses a command element with an oncommand attribute works", +function*() { + let command = document.createElement("command"); + command.setAttribute("id", "testcommand"); + command.setAttribute("oncommand", "window.sawEvent(event, true)"); + document.getElementById("mainCommandSet").appendChild(command); + + gTestSidebarItem.setAttribute("command", "testcommand"); +}, function*() { + checkExpectedEvents({ oncommand: 1 }); + document.getElementById("testcommand").remove(); +}); + +add_sidebar_task("Check that a sidebar that uses a command element with a " + + "command event listener and oncommand attribute works", +function*() { + let command = document.createElement("command"); + command.setAttribute("id", "testcommand"); + command.setAttribute("oncommand", "window.sawEvent(event, true)"); + document.getElementById("mainCommandSet").appendChild(command); + command.addEventListener("command", window.sawEvent); + + gTestSidebarItem.setAttribute("command", "testcommand"); +}, function*() { + checkExpectedEvents({ command: 1, oncommand: 1 }); + document.getElementById("testcommand").remove(); +}); + +add_sidebar_task( + "A sidebar with a command element will still see click events", +function*() { + let command = document.createElement("command"); + command.setAttribute("id", "testcommand"); + command.setAttribute("oncommand", "window.sawEvent(event, true)"); + document.getElementById("mainCommandSet").appendChild(command); + command.addEventListener("command", window.sawEvent); + + gTestSidebarItem.setAttribute("command", "testcommand"); + gTestSidebarItem.addEventListener("click", window.sawEvent); +}, function*() { + checkExpectedEvents({ click: 1, command: 1, oncommand: 1 }); + document.getElementById("testcommand").remove(); +}); |