diff options
Diffstat (limited to '')
7 files changed, 474 insertions, 0 deletions
diff --git a/browser/base/content/test/sidebar/browser.ini b/browser/base/content/test/sidebar/browser.ini new file mode 100644 index 0000000000..5be49123b5 --- /dev/null +++ b/browser/base/content/test/sidebar/browser.ini @@ -0,0 +1,8 @@ +[DEFAULT] + +[browser_sidebar_adopt.js] +[browser_sidebar_app_locale_changed.js] +[browser_sidebar_keys.js] +[browser_sidebar_move.js] +[browser_sidebar_persist.js] +[browser_sidebar_switcher.js] diff --git a/browser/base/content/test/sidebar/browser_sidebar_adopt.js b/browser/base/content/test/sidebar/browser_sidebar_adopt.js new file mode 100644 index 0000000000..344a71cb9b --- /dev/null +++ b/browser/base/content/test/sidebar/browser_sidebar_adopt.js @@ -0,0 +1,74 @@ +/* This test checks that the SidebarFocused event doesn't fire in adopted + * windows when the sidebar gets opened during window opening, to make sure + * that sidebars don't steal focus from the page in this case (Bug 1394207). + * There's another case not covered here that has the same expected behavior - + * during the initial browser startup - but it would be hard to do with a mochitest. */ + +registerCleanupFunction(() => { + SidebarUI.hide(); +}); + +function failIfSidebarFocusedFires() { + ok(false, "This event shouldn't have fired"); +} + +add_setup(function () { + CustomizableUI.addWidgetToArea("sidebar-button", "nav-bar"); + registerCleanupFunction(() => + CustomizableUI.removeWidgetFromArea("sidebar-button") + ); +}); + +add_task(async function testAdoptedTwoWindows() { + // First open a new window, show the sidebar in that window, and close it. + // Then, open another new window and confirm that the sidebar is closed since it is + // being adopted from the main window which doesn't have a shown sidebar. See Bug 1407737. + info("Ensure that sidebar state is adopted only from the opener"); + + let win1 = await BrowserTestUtils.openNewBrowserWindow(); + await win1.SidebarUI.show("viewBookmarksSidebar"); + await BrowserTestUtils.closeWindow(win1); + + let win2 = await BrowserTestUtils.openNewBrowserWindow(); + ok( + !win2.document.getElementById("sidebar-button").hasAttribute("checked"), + "Sidebar button isn't checked" + ); + ok(!win2.SidebarUI.isOpen, "Sidebar is closed"); + await BrowserTestUtils.closeWindow(win2); +}); + +add_task(async function testEventsReceivedInMainWindow() { + info( + "Opening the sidebar and expecting both SidebarShown and SidebarFocused events" + ); + + let initialShown = BrowserTestUtils.waitForEvent(window, "SidebarShown"); + let initialFocus = BrowserTestUtils.waitForEvent(window, "SidebarFocused"); + + await SidebarUI.show("viewBookmarksSidebar"); + await initialShown; + await initialFocus; + + ok(true, "SidebarShown and SidebarFocused events fired on a new window"); +}); + +add_task(async function testEventReceivedInNewWindow() { + info( + "Opening a new window and expecting the SidebarFocused event to not fire" + ); + + let promiseNewWindow = BrowserTestUtils.waitForNewWindow(); + let win = OpenBrowserWindow(); + + let adoptedShown = BrowserTestUtils.waitForEvent(win, "SidebarShown"); + win.addEventListener("SidebarFocused", failIfSidebarFocusedFires); + registerCleanupFunction(async function () { + win.removeEventListener("SidebarFocused", failIfSidebarFocusedFires); + await BrowserTestUtils.closeWindow(win); + }); + + await promiseNewWindow; + await adoptedShown; + ok(true, "SidebarShown event fired on an adopted window"); +}); diff --git a/browser/base/content/test/sidebar/browser_sidebar_app_locale_changed.js b/browser/base/content/test/sidebar/browser_sidebar_app_locale_changed.js new file mode 100644 index 0000000000..5b07da9839 --- /dev/null +++ b/browser/base/content/test/sidebar/browser_sidebar_app_locale_changed.js @@ -0,0 +1,111 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +/** + * This file tests that the sidebar recreates the contents of the <tree> element + * for live app locale switching. + */ + +add_task(function cleanup() { + registerCleanupFunction(() => { + SidebarUI.hide(); + }); +}); + +/** + * @param {string} sidebarName + */ +async function testLiveReloading(sidebarName) { + info("Showing the sidebar " + sidebarName); + await SidebarUI.show(sidebarName); + + function getTreeChildren() { + const sidebarDoc = + document.querySelector("#sidebar").contentWindow.document; + return sidebarDoc.querySelector(".sidebar-placesTreechildren"); + } + + const childrenBefore = getTreeChildren(); + ok(childrenBefore, "Found the sidebar children"); + is(childrenBefore, getTreeChildren(), "The children start out as equal"); + + info("Simulating an app locale change."); + Services.obs.notifyObservers(null, "intl:app-locales-changed"); + + await TestUtils.waitForCondition( + getTreeChildren, + "Waiting for a new child tree element." + ); + + isnot( + childrenBefore, + getTreeChildren(), + "The tree's contents are re-computed." + ); + + info("Hiding the sidebar"); + SidebarUI.hide(); +} + +add_task(async function test_bookmarks_sidebar() { + await testLiveReloading("viewBookmarksSidebar"); +}); + +add_task(async function test_history_sidebar() { + await testLiveReloading("viewHistorySidebar"); +}); + +add_task(async function test_ext_sidebar_panel_reloaded_on_locale_changes() { + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + sidebar_action: { + default_panel: "sidebar.html", + }, + }, + useAddonManager: "temporary", + + files: { + "sidebar.html": `<html> + <head> + <meta charset="utf-8"/> + <script src="sidebar.js"></script> + </head> + <body> + A Test Sidebar + </body> + </html>`, + "sidebar.js": function () { + const { browser } = this; + window.onload = () => { + browser.test.sendMessage("sidebar"); + }; + }, + }, + }); + await extension.startup(); + // Test sidebar is opened on install + await extension.awaitMessage("sidebar"); + + // Test sidebar is opened on simulated locale changes. + info("Switch browser to bidi and expect the sidebar panel to be reloaded"); + + await SpecialPowers.pushPrefEnv({ + set: [["intl.l10n.pseudo", "bidi"]], + }); + await extension.awaitMessage("sidebar"); + is( + window.document.documentElement.getAttribute("dir"), + "rtl", + "browser window changed direction to rtl as expected" + ); + + await SpecialPowers.popPrefEnv(); + await extension.awaitMessage("sidebar"); + is( + window.document.documentElement.getAttribute("dir"), + "ltr", + "browser window changed direction to ltr as expected" + ); + + await extension.unload(); +}); diff --git a/browser/base/content/test/sidebar/browser_sidebar_keys.js b/browser/base/content/test/sidebar/browser_sidebar_keys.js new file mode 100644 index 0000000000..f12d1cf5f7 --- /dev/null +++ b/browser/base/content/test/sidebar/browser_sidebar_keys.js @@ -0,0 +1,108 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +async function testSidebarKeyToggle(key, options, expectedSidebarId) { + EventUtils.synthesizeMouseAtCenter(gURLBar.textbox, {}); + let promiseShown = BrowserTestUtils.waitForEvent(window, "SidebarShown"); + EventUtils.synthesizeKey(key, options); + await promiseShown; + Assert.equal( + document.getElementById("sidebar-box").getAttribute("sidebarcommand"), + expectedSidebarId + ); + EventUtils.synthesizeKey(key, options); + Assert.ok(!SidebarUI.isOpen); +} + +add_task(async function test_sidebar_keys() { + registerCleanupFunction(() => SidebarUI.hide()); + + await testSidebarKeyToggle("b", { accelKey: true }, "viewBookmarksSidebar"); + + let options = { accelKey: true, shiftKey: AppConstants.platform == "macosx" }; + await testSidebarKeyToggle("h", options, "viewHistorySidebar"); +}); + +add_task(async function test_sidebar_in_customize_mode() { + // Test bug 1756385 - widgets to appear unchecked in customize mode. Test that + // the sidebar button widget doesn't appear checked, and that the sidebar + // button toggle is inert while in customize mode. + let { CustomizableUI } = ChromeUtils.importESModule( + "resource:///modules/CustomizableUI.sys.mjs" + ); + registerCleanupFunction(() => SidebarUI.hide()); + + let placement = CustomizableUI.getPlacementOfWidget("sidebar-button"); + if (!(placement?.area == CustomizableUI.AREA_NAVBAR)) { + CustomizableUI.addWidgetToArea( + "sidebar-button", + CustomizableUI.AREA_NAVBAR, + 0 + ); + CustomizableUI.ensureWidgetPlacedInWindow("sidebar-button", window); + registerCleanupFunction(function () { + CustomizableUI.removeWidgetFromArea("sidebar-button"); + }); + } + + let widgetIcon = CustomizableUI.getWidget("sidebar-button") + .forWindow(window) + .node?.querySelector(".toolbarbutton-icon"); + // Get the alpha value of the sidebar toggle widget's background + let getBGAlpha = () => + InspectorUtils.colorToRGBA( + getComputedStyle(widgetIcon).getPropertyValue("background-color") + ).a; + + let promiseShown = BrowserTestUtils.waitForEvent(window, "SidebarShown"); + SidebarUI.show("viewBookmarksSidebar"); + await promiseShown; + + Assert.greater( + getBGAlpha(), + 0, + "Sidebar widget background should appear checked" + ); + + // Enter customize mode. This should disable the toggle and make the sidebar + // toggle widget appear unchecked. + let customizationReadyPromise = BrowserTestUtils.waitForEvent( + gNavToolbox, + "customizationready" + ); + gCustomizeMode.enter(); + await customizationReadyPromise; + + Assert.equal( + getBGAlpha(), + 0, + "Sidebar widget background should appear unchecked" + ); + + // Attempt toggle - should fail in customize mode. + await SidebarUI.toggle(); + ok(SidebarUI.isOpen, "Sidebar is still open"); + + // Exit customize mode. This should re-enable the toggle and make the sidebar + // toggle widget appear checked again, since toggle() didn't hide the sidebar. + let afterCustomizationPromise = BrowserTestUtils.waitForEvent( + gNavToolbox, + "aftercustomization" + ); + gCustomizeMode.exit(); + await afterCustomizationPromise; + + Assert.greater( + getBGAlpha(), + 0, + "Sidebar widget background should appear checked again" + ); + + await SidebarUI.toggle(); + ok(!SidebarUI.isOpen, "Sidebar is closed"); + Assert.equal( + getBGAlpha(), + 0, + "Sidebar widget background should appear unchecked" + ); +}); diff --git a/browser/base/content/test/sidebar/browser_sidebar_move.js b/browser/base/content/test/sidebar/browser_sidebar_move.js new file mode 100644 index 0000000000..3de26b7966 --- /dev/null +++ b/browser/base/content/test/sidebar/browser_sidebar_move.js @@ -0,0 +1,72 @@ +registerCleanupFunction(() => { + Services.prefs.clearUserPref("sidebar.position_start"); + SidebarUI.hide(); +}); + +const EXPECTED_START_ORDINALS = [ + ["sidebar-box", 1], + ["sidebar-splitter", 2], + ["appcontent", 3], +]; + +const EXPECTED_END_ORDINALS = [ + ["sidebar-box", 3], + ["sidebar-splitter", 2], + ["appcontent", 1], +]; + +function getBrowserChildrenWithOrdinals() { + let browser = document.getElementById("browser"); + return [...browser.children].map(node => { + return [node.id, node.style.order]; + }); +} + +add_task(async function () { + await SidebarUI.show("viewBookmarksSidebar"); + SidebarUI.showSwitcherPanel(); + + let reversePositionButton = document.getElementById( + "sidebar-reverse-position" + ); + let originalLabel = reversePositionButton.getAttribute("label"); + let box = document.getElementById("sidebar-box"); + + // Default (position: left) + Assert.deepEqual( + getBrowserChildrenWithOrdinals(), + EXPECTED_START_ORDINALS, + "Correct ordinal (start)" + ); + ok(!box.hasAttribute("positionend"), "Positioned start"); + + // Moved to right + SidebarUI.reversePosition(); + SidebarUI.showSwitcherPanel(); + Assert.deepEqual( + getBrowserChildrenWithOrdinals(), + EXPECTED_END_ORDINALS, + "Correct ordinal (end)" + ); + isnot( + reversePositionButton.getAttribute("label"), + originalLabel, + "Label changed" + ); + ok(box.hasAttribute("positionend"), "Positioned end"); + + // Moved to back to left + SidebarUI.reversePosition(); + SidebarUI.showSwitcherPanel(); + Assert.deepEqual( + getBrowserChildrenWithOrdinals(), + EXPECTED_START_ORDINALS, + "Correct ordinal (start)" + ); + ok(!box.hasAttribute("positionend"), "Positioned start"); + is( + reversePositionButton.getAttribute("label"), + originalLabel, + "Label is back to normal" + ); +}); diff --git a/browser/base/content/test/sidebar/browser_sidebar_persist.js b/browser/base/content/test/sidebar/browser_sidebar_persist.js new file mode 100644 index 0000000000..fe67bed9e0 --- /dev/null +++ b/browser/base/content/test/sidebar/browser_sidebar_persist.js @@ -0,0 +1,37 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +add_task(async function persist_sidebar_width() { + { + // Make the main test window not count as a browser window any longer, + // which allows the persitence code to kick in. + const docEl = document.documentElement; + const oldWinType = docEl.getAttribute("windowtype"); + docEl.setAttribute("windowtype", "navigator:testrunner"); + registerCleanupFunction(() => { + docEl.setAttribute("windowtype", oldWinType); + }); + } + + { + info("Showing new window and setting sidebar box"); + const win = await BrowserTestUtils.openNewBrowserWindow(); + await win.SidebarUI.show("viewBookmarksSidebar"); + win.document.getElementById("sidebar-box").style.width = "100px"; + await BrowserTestUtils.closeWindow(win); + } + + { + info("Showing new window and seeing persisted width"); + const win = await BrowserTestUtils.openNewBrowserWindow(); + await win.SidebarUI.show("viewBookmarksSidebar"); + is( + win.document.getElementById("sidebar-box").style.width, + "100px", + "Width style should be persisted" + ); + await BrowserTestUtils.closeWindow(win); + } +}); diff --git a/browser/base/content/test/sidebar/browser_sidebar_switcher.js b/browser/base/content/test/sidebar/browser_sidebar_switcher.js new file mode 100644 index 0000000000..81d7c29776 --- /dev/null +++ b/browser/base/content/test/sidebar/browser_sidebar_switcher.js @@ -0,0 +1,64 @@ +registerCleanupFunction(() => { + SidebarUI.hide(); +}); + +function showSwitcherPanelPromise() { + return new Promise(resolve => { + SidebarUI._switcherPanel.addEventListener( + "popupshown", + () => { + resolve(); + }, + { once: true } + ); + SidebarUI.showSwitcherPanel(); + }); +} + +function clickSwitcherButton(querySelector) { + let sidebarPopup = document.querySelector("#sidebarMenu-popup"); + let switcherPromise = Promise.all([ + BrowserTestUtils.waitForEvent(window, "SidebarFocused"), + BrowserTestUtils.waitForEvent(sidebarPopup, "popuphidden"), + ]); + document.querySelector(querySelector).click(); + return switcherPromise; +} + +add_task(async function () { + // If a sidebar is already open, close it. + if (!document.getElementById("sidebar-box").hidden) { + ok( + false, + "Unexpected sidebar found - a previous test failed to cleanup correctly" + ); + SidebarUI.hide(); + } + + let sidebar = document.querySelector("#sidebar-box"); + await SidebarUI.show("viewBookmarksSidebar"); + + await showSwitcherPanelPromise(); + await clickSwitcherButton("#sidebar-switcher-history"); + is( + sidebar.getAttribute("sidebarcommand"), + "viewHistorySidebar", + "History sidebar loaded" + ); + + await showSwitcherPanelPromise(); + await clickSwitcherButton("#sidebar-switcher-tabs"); + is( + sidebar.getAttribute("sidebarcommand"), + "viewTabsSidebar", + "Tabs sidebar loaded" + ); + + await showSwitcherPanelPromise(); + await clickSwitcherButton("#sidebar-switcher-bookmarks"); + is( + sidebar.getAttribute("sidebarcommand"), + "viewBookmarksSidebar", + "Bookmarks sidebar loaded" + ); +}); |