tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit d6119e8633b864e36fc2d2da9d26b6e208151f8b
parent 7420cbb45fe087b5ef623e4cb9774d14deaf6f1c
Author: Jonathan Sudiaman <jsudiaman@mozilla.com>
Date:   Thu, 18 Dec 2025 13:52:10 +0000

Bug 1997881 - Ensure that find bar is placed on top, and can be clicked in order to select a panel. r=tabbrowser-reviewers,desktop-theme-reviewers,dao

Differential Revision: https://phabricator.services.mozilla.com/D276203

Diffstat:
Mbrowser/components/tabbrowser/test/browser/tabs/browser_tab_splitview.js | 49+++++++++++++++++++++++++++++++++++++++++++++----
Mbrowser/components/tabbrowser/test/browser/tabs/browser_tab_splitview_footer.js | 30++++++++++++++++++++++++++++++
Mbrowser/themes/shared/browser-shared.css | 1+
Mtoolkit/content/widgets/tabbox.js | 14++++++++++----
4 files changed, 86 insertions(+), 8 deletions(-)

diff --git a/browser/components/tabbrowser/test/browser/tabs/browser_tab_splitview.js b/browser/components/tabbrowser/test/browser/tabs/browser_tab_splitview.js @@ -47,8 +47,8 @@ add_task(async function test_splitViewCreateAndAddTabs() { let tab4 = BrowserTestUtils.addTab(gBrowser, "about:blank"); // Add tabs to split view - let splitview = gBrowser.addTabSplitView([tab1, tab2]); - let splitview2 = gBrowser.addTabSplitView([tab3, tab4]); + let splitview = gBrowser.addTabSplitView([tab1, tab2], { id: "1" }); + let splitview2 = gBrowser.addTabSplitView([tab3, tab4], { id: "2" }); let tabbrowserTabs = document.getElementById("tabbrowser-tabs"); await BrowserTestUtils.waitForMutationCondition( tabbrowserTabs, @@ -61,8 +61,14 @@ add_task(async function test_splitViewCreateAndAddTabs() { Assert.ok(splitview.tabs.includes(tab1), "tab1 is in split view wrapper"); Assert.ok(splitview.tabs.includes(tab2), "tab2 is in split view wrapper"); - Assert.ok( - splitview2.splitViewId && splitview.splitViewId !== splitview2.splitViewId, + await BrowserTestUtils.waitForMutationCondition( + splitview2, + { attributeFilter: ["splitViewId"] }, + () => splitview2.hasAttribute("splitViewId") + ); + Assert.notEqual( + splitview.splitViewId, + splitview2.splitViewId, "Split view has different id than split view 2" ); Assert.equal(splitview2.tabs.length, 2, "Split view 2 has 2 tabs"); @@ -290,3 +296,38 @@ add_task(async function test_resize_split_view_panels() { BrowserTestUtils.removeTab(tab1); BrowserTestUtils.removeTab(tab2); }); + +add_task(async function test_click_findbar_to_select_panel() { + const tab1 = await addTabAndLoadBrowser(); + const tab2 = await addTabAndLoadBrowser(); + const panel1 = document.getElementById(tab1.linkedPanel); + const panel2 = document.getElementById(tab2.linkedPanel); + await BrowserTestUtils.switchTab(gBrowser, tab1); + + info("Activate split view with the first panel selected."); + const splitView = gBrowser.addTabSplitView([tab1, tab2]); + await SimpleTest.promiseFocus(tab1.linkedBrowser); + Assert.ok( + panel1.classList.contains("deck-selected"), + "First panel is selected." + ); + + info("Activate Find in Page within the second panel."); + const findbar = await gBrowser.getFindBar(tab2); + const promiseFindbarOpen = BrowserTestUtils.waitForEvent( + findbar, + "findbaropen" + ); + findbar.open(); + await promiseFindbarOpen; + + info("Select the second panel by clicking the find bar."); + EventUtils.synthesizeMouseAtCenter(findbar, {}); + await BrowserTestUtils.waitForMutationCondition( + panel2, + { attributeFilter: ["class"] }, + () => panel2.classList.contains("deck-selected") + ); + + splitView.close(); +}); diff --git a/browser/components/tabbrowser/test/browser/tabs/browser_tab_splitview_footer.js b/browser/components/tabbrowser/test/browser/tabs/browser_tab_splitview_footer.js @@ -220,3 +220,33 @@ add_task(async function test_menu_close_tabs() { await activateCommand(inactivePanel, "splitViewCmd_closeTabs"); await promiseTabsClosed; }); + +add_task(async function test_findbar_displayed_over_footer() { + const { tabs, splitView } = await setupSplitView(); + const [tab1, tab2] = tabs; + await SimpleTest.promiseFocus(tab1.linkedBrowser); + + info("Activate Find in Page within the second panel."); + const findbar = await gBrowser.getFindBar(tab2); + const promiseFindbarOpen = BrowserTestUtils.waitForEvent( + findbar, + "findbaropen" + ); + findbar.open(); + await promiseFindbarOpen; + + const panel = document.getElementById(tab2.linkedPanel); + const footer = panel.querySelector("split-view-footer"); + const footerRect = footer.getBoundingClientRect(); + Assert.ok( + !footer.contains( + document.elementFromPoint( + footerRect.left + footerRect.width / 2, + footerRect.top + footerRect.height / 2 + ) + ), + "Findbar is displayed over split view footer." + ); + + splitView.close(); +}); diff --git a/browser/themes/shared/browser-shared.css b/browser/themes/shared/browser-shared.css @@ -622,6 +622,7 @@ menupopup::part(drop-indicator) { color: var(--toolbar-color); color-scheme: var(--toolbar-color-scheme); border-top-color: var(--chrome-content-separator-color); + z-index: var(--browser-area-z-index-sidebar); :root[lwtheme] & { background-color: var(--lwt-accent-color); diff --git a/toolkit/content/widgets/tabbox.js b/toolkit/content/widgets/tabbox.js @@ -272,7 +272,6 @@ static #SPLIT_VIEW_PANEL_EVENTS = Object.freeze([ "click", - "focus", "mouseover", "mouseout", ]); @@ -283,7 +282,10 @@ } handleEvent(e) { - const browser = e.currentTarget; + const browser = + e.currentTarget.tagName === "browser" + ? e.currentTarget + : e.currentTarget.querySelector("browser"); switch (e.type) { case "click": case "focus": { @@ -372,9 +374,11 @@ panelEl?.classList.add("split-view-panel"); panelEl?.setAttribute("column", i); const browser = panelEl?.querySelector("browser"); + const browserContainer = panelEl?.querySelector(".browserContainer"); for (const eventType of MozTabpanels.#SPLIT_VIEW_PANEL_EVENTS) { - browser?.addEventListener(eventType, this); + browserContainer?.addEventListener(eventType, this); } + browser?.addEventListener("focus", this); } this.#splitViewPanels = newPanels; this.isSplitViewActive = !!newPanels.length; @@ -396,9 +400,11 @@ panelEl?.classList.remove("split-view-panel"); panelEl?.removeAttribute("column"); const browser = panelEl?.querySelector("browser"); + const browserContainer = panelEl?.querySelector(".browserContainer"); for (const eventType of MozTabpanels.#SPLIT_VIEW_PANEL_EVENTS) { - browser?.removeEventListener(eventType, this); + browserContainer?.removeEventListener(eventType, this); } + browser?.removeEventListener("focus", this); if (updateArray) { const index = this.#splitViewPanels.indexOf(panel); if (index !== -1) {