diff options
Diffstat (limited to 'browser/components/customizableui')
9 files changed, 204 insertions, 38 deletions
diff --git a/browser/components/customizableui/CustomizableWidgets.sys.mjs b/browser/components/customizableui/CustomizableWidgets.sys.mjs index 1f37af7963..09b57be4c9 100644 --- a/browser/components/customizableui/CustomizableWidgets.sys.mjs +++ b/browser/components/customizableui/CustomizableWidgets.sys.mjs @@ -99,6 +99,21 @@ export const CustomizableWidgets = [ case "unload": this.onWindowUnload(event); break; + case "command": { + let { target } = event; + let { PanelUI, PlacesCommandHook } = target.ownerGlobal; + if (target.id == "appMenuRecentlyClosedTabs") { + PanelUI.showSubView(this.recentlyClosedTabsPanel, target); + } else if (target.id == "appMenuRecentlyClosedWindows") { + PanelUI.showSubView(this.recentlyClosedWindowsPanel, target); + } else if (target.id == "appMenuSearchHistory") { + PlacesCommandHook.searchHistory(); + } else if (target.id == "PanelUI-historyMore") { + PlacesCommandHook.showPlacesOrganizer("History"); + lazy.CustomizableUI.hidePanelForNode(target); + } + break; + } default: throw new Error(`Unsupported event for '${this.id}'`); } @@ -153,6 +168,7 @@ export const CustomizableWidgets = [ // When the popup is hidden (thus the panelmultiview node as well), make // sure to stop listening to PlacesDatabase updates. panelview.panelMultiView.addEventListener("PanelMultiViewHidden", this); + panelview.addEventListener("command", this); window.addEventListener("unload", this); }, onViewHiding() { @@ -172,6 +188,10 @@ export const CustomizableWidgets = [ document, this.recentlyClosedWindowsPanel ).removeEventListener("ViewShowing", this); + lazy.PanelMultiView.getViewNode( + document, + this.viewId + ).removeEventListener("command", this); } panelMultiView.removeEventListener("PanelMultiViewHidden", this); }, @@ -260,7 +280,7 @@ export const CustomizableWidgets = [ tooltiptext: "sidebar-button.tooltiptext2", onCommand(aEvent) { let win = aEvent.target.ownerGlobal; - win.SidebarUI.toggle(); + win.SidebarController.toggle(); }, onCreated(aNode) { // Add an observer so the button is checked while the sidebar is open @@ -419,7 +439,7 @@ export const CustomizableWidgets = [ id: "characterencoding-button", l10nId: "repair-text-encoding-button", onCommand(aEvent) { - aEvent.view.BrowserForceEncodingDetection(); + aEvent.view.BrowserCommands.forceEncodingDetection(); }, }, { @@ -464,10 +484,52 @@ if (Services.prefs.getBoolPref("identity.fxaccounts.enabled")) { lazy.PanelMultiView.getViewNode(doc, "PanelUI-remotetabs-deck"), lazy.PanelMultiView.getViewNode(doc, "PanelUI-remotetabs-tabslist") ); + panelview.addEventListener("command", this); + let syncNowButton = lazy.PanelMultiView.getViewNode( + aEvent.target.ownerDocument, + "PanelUI-remotetabs-syncnow" + ); + syncNowButton.addEventListener("mouseover", this); }, onViewHiding(aEvent) { - aEvent.target.syncedTabsPanelList.destroy(); - aEvent.target.syncedTabsPanelList = null; + let panelview = aEvent.target; + panelview.syncedTabsPanelList.destroy(); + panelview.syncedTabsPanelList = null; + panelview.removeEventListener("command", this); + let syncNowButton = lazy.PanelMultiView.getViewNode( + aEvent.target.ownerDocument, + "PanelUI-remotetabs-syncnow" + ); + syncNowButton.removeEventListener("mouseover", this); + }, + handleEvent(aEvent) { + let button = aEvent.target; + let { gSync } = button.ownerGlobal; + switch (aEvent.type) { + case "mouseover": + gSync.refreshSyncButtonsTooltip(); + break; + case "command": { + switch (button.id) { + case "PanelUI-remotetabs-syncnow": + gSync.doSync(); + break; + case "PanelUI-remotetabs-view-managedevices": + gSync.openDevicesManagementPage("syncedtabs-menupanel"); + break; + case "PanelUI-remotetabs-tabsdisabledpane-button": + case "PanelUI-remotetabs-setupsync-button": + case "PanelUI-remotetabs-syncdisabled-button": + case "PanelUI-remotetabs-reauthsync-button": + case "PanelUI-remotetabs-unverified-button": + gSync.openPrefs("synced-tabs"); + break; + case "PanelUI-remotetabs-connect-device-button": + gSync.openConnectAnotherDevice("synced-tabs"); + break; + } + } + } }, }); } diff --git a/browser/components/customizableui/CustomizeMode.sys.mjs b/browser/components/customizableui/CustomizeMode.sys.mjs index 7b4ee373be..41f347130e 100644 --- a/browser/components/customizableui/CustomizeMode.sys.mjs +++ b/browser/components/customizableui/CustomizeMode.sys.mjs @@ -1376,7 +1376,7 @@ CustomizeMode.prototype = { }, openAddonsManagerThemes() { - this.window.BrowserOpenAddonsMgr("addons://list/theme"); + this.window.BrowserAddonUI.openAddonsMgr("addons://list/theme"); }, getMoreThemes(aEvent) { diff --git a/browser/components/customizableui/content/panelUI.inc.xhtml b/browser/components/customizableui/content/panelUI.inc.xhtml index 956a6ae45d..7607f59ec4 100644 --- a/browser/components/customizableui/content/panelUI.inc.xhtml +++ b/browser/components/customizableui/content/panelUI.inc.xhtml @@ -107,7 +107,7 @@ <toolbarbutton id="unified-extensions-manage-extensions" class="subviewbutton panel-subview-footer-button unified-extensions-manage-extensions" data-l10n-id="unified-extensions-manage-extensions" - oncommand="BrowserOpenAddonsMgr('addons://list/extension');" /> + oncommand="BrowserAddonUI.openAddonsMgr('addons://list/extension');" /> </panelview> </panelmultiview> </panel> @@ -271,7 +271,7 @@ flip="slide" position="bottomright topright" noautofocus="true"> - <panelmultiview id="appMenu-multiView" mainViewId="appMenu-protonMainView" + <panelmultiview id="appMenu-multiView" mainViewId="appMenu-mainView" viewCacheId="appMenu-viewCache"> </panelmultiview> </panel> diff --git a/browser/components/customizableui/content/panelUI.js b/browser/components/customizableui/content/panelUI.js index cb32085fd7..cbd27e465e 100644 --- a/browser/components/customizableui/content/panelUI.js +++ b/browser/components/customizableui/content/panelUI.js @@ -128,10 +128,16 @@ const PanelUI = { this.panel.addEventListener(event, this); } + this._onLibraryCommand = this._onLibraryCommand.bind(this); PanelMultiView.getViewNode(document, "PanelUI-helpView").addEventListener( "ViewShowing", this._onHelpViewShow ); + PanelMultiView.getViewNode( + document, + "appMenu-libraryView" + ).addEventListener("command", this._onLibraryCommand); + this.mainView.addEventListener("command", this); this._eventListenersAdded = true; }, @@ -143,6 +149,11 @@ const PanelUI = { document, "PanelUI-helpView" ).removeEventListener("ViewShowing", this._onHelpViewShow); + PanelMultiView.getViewNode( + document, + "appMenu-libraryView" + ).removeEventListener("command", this._onLibraryCommand); + this.mainView.removeEventListener("command", this); this._eventListenersAdded = false; }, @@ -299,6 +310,54 @@ const PanelUI = { case "activate": this.updateNotifications(); break; + case "command": + this.onCommand(aEvent); + break; + } + }, + + // Note that we listen for bubbling command events. In the case where the + // button that the user clicks has a command attribute, those events are + // redirected to the relevant command element, and we never see them in + // here. Bear this in mind if you want to write code that applies to + // all commands, for which this wouldn't work well. + onCommand(aEvent) { + let { target } = aEvent; + switch (target.id) { + case "appMenu-update-banner": + this._onBannerItemSelected(aEvent); + break; + case "appMenu-fxa-label2": + gSync.toggleAccountPanel(target, aEvent); + break; + case "appMenu-profiles-button": + gProfiles.updateView(target); + break; + case "appMenu-bookmarks-button": + BookmarkingUI.showSubView(target); + break; + case "appMenu-history-button": + this.showSubView("PanelUI-history", target); + break; + case "appMenu-passwords-button": + LoginHelper.openPasswordManager(window, { entryPoint: "mainmenu" }); + break; + case "appMenu-fullscreen-button2": + // Note that we're custom-handling the hiding of the panel to make + // sure it disappears before entering fullscreen. Otherwise it can + // end up moving around on the screen during the fullscreen transition. + target.closest("panel").hidePopup(); + setTimeout(() => BrowserCommands.fullScreen(), 0); + break; + case "appMenu-settings-button": + openPreferences(); + break; + case "appMenu-more-button2": + this.showMoreToolsPanel(target); + break; + case "appMenu-help-button2": + this.showSubView("PanelUI-helpView", target); + break; } }, @@ -632,6 +691,22 @@ const PanelUI = { items.appendChild(fragment); }, + _onLibraryCommand(aEvent) { + let button = aEvent.target; + let { BookmarkingUI, DownloadsPanel } = button.ownerGlobal; + switch (button.id) { + case "appMenu-library-bookmarks-button": + BookmarkingUI.showSubView(button); + break; + case "appMenu-library-history-button": + this.showSubView("PanelUI-history", button); + break; + case "appMenu-library-downloads-button": + DownloadsPanel.showDownloadsHistory(); + break; + } + }, + _hidePopup() { if (!this._notificationPanel) { return; @@ -840,10 +915,7 @@ const PanelUI = { get mainView() { if (!this._mainView) { - this._mainView = PanelMultiView.getViewNode( - document, - "appMenu-protonMainView" - ); + this._mainView = PanelMultiView.getViewNode(document, "appMenu-mainView"); } return this._mainView; }, @@ -852,7 +924,7 @@ const PanelUI = { if (!this._addonNotificationContainer) { this._addonNotificationContainer = PanelMultiView.getViewNode( document, - "appMenu-proton-addon-banners" + "appMenu-addon-banners" ); } diff --git a/browser/components/customizableui/test/browser_PanelMultiView_keyboard.js b/browser/components/customizableui/test/browser_PanelMultiView_keyboard.js index b41fc2ef23..d8c687d88a 100644 --- a/browser/components/customizableui/test/browser_PanelMultiView_keyboard.js +++ b/browser/components/customizableui/test/browser_PanelMultiView_keyboard.js @@ -150,7 +150,6 @@ add_setup(async function () { gLink.innerText = "gLink"; gLink.id = "gLink"; gMainView.appendChild(gLink); - await window.ensureCustomElements("moz-toggle"); gToggle = document.createElement("moz-toggle"); gToggle.label = "Test label"; gMainView.appendChild(gToggle); diff --git a/browser/components/customizableui/test/browser_ctrl_click_panel_opening.js b/browser/components/customizableui/test/browser_ctrl_click_panel_opening.js index 9377c28950..92528f2537 100644 --- a/browser/components/customizableui/test/browser_ctrl_click_panel_opening.js +++ b/browser/components/customizableui/test/browser_ctrl_click_panel_opening.js @@ -13,8 +13,8 @@ add_task(async function test_appMenu_mainView() { return; } - let mainViewID = "appMenu-protonMainView"; - const mainView = document.getElementById(mainViewID); + let mainViewID = "appMenu-mainView"; + const mainView = PanelMultiView.getViewNode(document, mainViewID); let shownPromise = BrowserTestUtils.waitForEvent(mainView, "ViewShown"); // Should still open the panel when Ctrl key is pressed. diff --git a/browser/components/customizableui/test/browser_panelUINotifications_bannerVisibility.js b/browser/components/customizableui/test/browser_panelUINotifications_bannerVisibility.js index df856dd4cf..686d600601 100644 --- a/browser/components/customizableui/test/browser_panelUINotifications_bannerVisibility.js +++ b/browser/components/customizableui/test/browser_panelUINotifications_bannerVisibility.js @@ -24,7 +24,7 @@ add_task(async function testBannerVisibilityBeforeOpen() { menuButton.click(); await shown; - let banner = newWin.document.getElementById("appMenu-proton-update-banner"); + let banner = newWin.document.getElementById("appMenu-update-banner"); let labelPromise = BrowserTestUtils.waitForMutationCondition( banner, @@ -62,7 +62,7 @@ add_task(async function testBannerVisibilityDuringOpen() { menuButton.click(); await shown; - let banner = newWin.document.getElementById("appMenu-proton-update-banner"); + let banner = newWin.document.getElementById("appMenu-update-banner"); ok( !banner.hasAttribute("label"), "Update banner shouldn't contain text before notification" @@ -109,7 +109,7 @@ add_task(async function testBannerVisibilityAfterClose() { ok(newWin.PanelUI.mainView.hasAttribute("visible")); - let banner = newWin.document.getElementById("appMenu-proton-update-banner"); + let banner = newWin.document.getElementById("appMenu-update-banner"); ok(banner.hidden, "Update banner should be hidden before notification"); ok( diff --git a/browser/components/customizableui/test/browser_sidebar_toggle.js b/browser/components/customizableui/test/browser_sidebar_toggle.js index 5742f368ee..a063cc26cf 100644 --- a/browser/components/customizableui/test/browser_sidebar_toggle.js +++ b/browser/components/customizableui/test/browser_sidebar_toggle.js @@ -9,7 +9,7 @@ registerCleanupFunction(async function () { // Ensure sidebar is hidden after each test: if (!document.getElementById("sidebar-box").hidden) { - SidebarUI.hide(); + SidebarController.hide(); } }); @@ -21,14 +21,14 @@ var showSidebar = async function (win = window) { ); EventUtils.synthesizeMouseAtCenter(button, {}, win); await sidebarFocusedPromise; - ok(win.SidebarUI.isOpen, "Sidebar is opened"); + ok(win.SidebarController.isOpen, "Sidebar is opened"); ok(button.hasAttribute("checked"), "Toolbar button is checked"); }; var hideSidebar = async function (win = window) { let button = win.document.getElementById("sidebar-button"); EventUtils.synthesizeMouseAtCenter(button, {}, win); - ok(!win.SidebarUI.isOpen, "Sidebar is closed"); + ok(!win.SidebarController.isOpen, "Sidebar is closed"); ok(!button.hasAttribute("checked"), "Toolbar button isn't checked"); }; @@ -37,18 +37,26 @@ add_task(async function () { CustomizableUI.addWidgetToArea("sidebar-button", "nav-bar"); await showSidebar(); - is(SidebarUI.currentID, "viewBookmarksSidebar", "Default sidebar selected"); - await SidebarUI.show("viewHistorySidebar"); + is( + SidebarController.currentID, + "viewBookmarksSidebar", + "Default sidebar selected" + ); + await SidebarController.show("viewHistorySidebar"); await hideSidebar(); await showSidebar(); - is(SidebarUI.currentID, "viewHistorySidebar", "Selected sidebar remembered"); + is( + SidebarController.currentID, + "viewHistorySidebar", + "Selected sidebar remembered" + ); await hideSidebar(); let otherWin = await BrowserTestUtils.openNewBrowserWindow(); await showSidebar(otherWin); is( - otherWin.SidebarUI.currentID, + otherWin.SidebarController.currentID, "viewHistorySidebar", "Selected sidebar remembered across windows" ); diff --git a/browser/components/customizableui/test/browser_synced_tabs_menu.js b/browser/components/customizableui/test/browser_synced_tabs_menu.js index 33c8f6a845..c99223a80e 100644 --- a/browser/components/customizableui/test/browser_synced_tabs_menu.js +++ b/browser/components/customizableui/test/browser_synced_tabs_menu.js @@ -216,6 +216,17 @@ add_task(async function () { ok(button, "found the button"); await document.getElementById("nav-bar").overflowable.show(); + // Actually show the fxa view: + let shown = BrowserTestUtils.waitForEvent( + document.getElementById("PanelUI-remotetabs"), + "ViewShown" + ); + PanelUI.showSubView( + "PanelUI-remotetabs", + document.getElementById("sync-button") + ); + await shown; + let expectedUrl = "https://example.com/connect_another_device?context=" + "fx_desktop_v3&entrypoint=synced-tabs&service=sync&uid=uid&email=foo%40bar.com"; @@ -325,20 +336,28 @@ add_task(async function () { node = node.firstElementChild; is(node.getAttribute("itemtype"), "client", "node is a client entry"); is(node.textContent, "My Desktop", "correct client"); - // Next entry is the most-recent tab + // Next node is an hbox, that contains the tab and potentially + // a button for closing the tab remotely node = node.nextElementSibling; - is(node.getAttribute("itemtype"), "tab", "node is a tab"); - is(node.getAttribute("label"), "http://example.com/10"); + is(node.nodeName, "hbox"); + // Next entry is the most-recent tab + let childNode = node.firstElementChild; + is(childNode.getAttribute("itemtype"), "tab", "node is a tab"); + is(childNode.getAttribute("label"), "http://example.com/10"); // Next entry is the next-most-recent tab node = node.nextElementSibling; - is(node.getAttribute("itemtype"), "tab", "node is a tab"); - is(node.getAttribute("label"), "http://example.com/5"); + is(node.nodeName, "hbox"); + childNode = node.firstElementChild; + is(childNode.getAttribute("itemtype"), "tab", "node is a tab"); + is(childNode.getAttribute("label"), "http://example.com/5"); // Next entry is the least-recent tab from the first client. node = node.nextElementSibling; - is(node.getAttribute("itemtype"), "tab", "node is a tab"); - is(node.getAttribute("label"), "http://example.com/1"); + is(node.nodeName, "hbox"); + childNode = node.firstElementChild; + is(childNode.getAttribute("itemtype"), "tab", "node is a tab"); + is(childNode.getAttribute("label"), "http://example.com/1"); node = node.nextElementSibling; is(node, null, "no more siblings"); @@ -357,8 +376,10 @@ add_task(async function () { is(node.textContent, "My Other Desktop", "correct client"); // Its single tab node = node.nextElementSibling; - is(node.getAttribute("itemtype"), "tab", "node is a tab"); - is(node.getAttribute("label"), "http://example.com/6"); + is(node.nodeName, "hbox"); + childNode = node.firstElementChild; + is(childNode.getAttribute("itemtype"), "tab", "node is a tab"); + is(childNode.getAttribute("label"), "http://example.com/6"); node = node.nextElementSibling; is(node, null, "no more siblings"); @@ -468,14 +489,16 @@ add_task(async function () { is(node.textContent, "My Desktop", "correct client"); for (let i = 0; i < tabsShownCount; i++) { node = node.nextElementSibling; - is(node.getAttribute("itemtype"), "tab", "node is a tab"); + is(node.nodeName, "hbox"); + let childNode = node.firstElementChild; + is(childNode.getAttribute("itemtype"), "tab", "node is a tab"); is( - node.getAttribute("label"), + childNode.getAttribute("label"), "Tab #" + (i + 1), "the tab is the correct one" ); is( - node.getAttribute("targetURI"), + childNode.getAttribute("targetURI"), SAMPLE_TAB_URL, "url is the correct one" ); @@ -498,7 +521,9 @@ add_task(async function () { async function checkCanOpenURL() { let tabList = document.getElementById("PanelUI-remotetabs-tabslist"); - let node = tabList.firstElementChild.firstElementChild.nextElementSibling; + let node = + tabList.firstElementChild.firstElementChild.nextElementSibling + .firstElementChild; let promiseTabOpened = BrowserTestUtils.waitForLocationChange( gBrowser, SAMPLE_TAB_URL |