/* 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"; async function openPreview(tab) { const previewShown = BrowserTestUtils.waitForEvent( document.getElementById("tabbrowser-tab-preview"), "previewshown", false, e => { return e.detail.tab === tab; } ); EventUtils.synthesizeMouseAtCenter(tab, { type: "mouseover" }); return previewShown; } async function closePreviews() { const tabs = document.getElementById("tabbrowser-tabs"); const previewHidden = BrowserTestUtils.waitForEvent( document.getElementById("tabbrowser-tab-preview"), "previewhidden" ); EventUtils.synthesizeMouse(tabs, 0, tabs.outerHeight + 1, { type: "mouseout", }); return previewHidden; } add_setup(async function () { await SpecialPowers.pushPrefEnv({ set: [ ["browser.tabs.cardPreview.enabled", true], ["browser.tabs.cardPreview.showThumbnails", false], ["ui.tooltip.delay_ms", 0], ], }); }); /** * Verify the following: * * 1. Tab preview card appears when the mouse hovers over a tab * 2. Tab preview card shows the correct preview for the tab being hovered * 3. Tab preview card is dismissed when the mouse leaves the tab bar */ add_task(async function hoverTests() { const tabUrl1 = "data:text/html,First New TabHello"; const tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser, tabUrl1); const tabUrl2 = "data:text/html,Second New TabHello"; const tab2 = await BrowserTestUtils.openNewForegroundTab(gBrowser, tabUrl2); const previewContainer = document.getElementById("tabbrowser-tab-preview"); await openPreview(tab1); Assert.ok( ["open", "showing"].includes(previewContainer.panel.state), "tab1 preview shown" ); Assert.equal( previewContainer.renderRoot.querySelector(".tab-preview-title").innerText, "First New Tab", "Preview of tab1 shows correct title" ); await openPreview(tab2); Assert.ok( ["open", "showing"].includes(previewContainer.panel.state), "tab2 preview shown" ); Assert.equal( previewContainer.renderRoot.querySelector(".tab-preview-title").innerText, "Second New Tab", "Preview of tab2 shows correct title" ); await closePreviews(); Assert.ok( ["closed", "hiding"].includes(previewContainer.panel.state), "preview container is now hidden" ); BrowserTestUtils.removeTab(tab1); BrowserTestUtils.removeTab(tab2); // Move the mouse outside of the tab strip. EventUtils.synthesizeMouseAtCenter(document.documentElement, { type: "mouseover", }); }); /** * Verify that non-selected tabs display a thumbnail in their preview * when browser.tabs.cardPreview.showThumbnails is set to true, * while the currently selected tab never displays a thumbnail in its preview. */ add_task(async function thumbnailTests() { await SpecialPowers.pushPrefEnv({ set: [["browser.tabs.cardPreview.showThumbnails", true]], }); const tabUrl1 = "about:blank"; const tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser, tabUrl1); const tabUrl2 = "about:blank"; const tab2 = await BrowserTestUtils.openNewForegroundTab(gBrowser, tabUrl2); const previewContainer = document.getElementById("tabbrowser-tab-preview"); const thumbnailUpdated = BrowserTestUtils.waitForEvent( previewContainer, "previewThumbnailUpdated" ); await openPreview(tab1); await thumbnailUpdated; Assert.ok( previewContainer.renderRoot.querySelectorAll("img,canvas").length, "Tab1 preview contains thumbnail" ); await openPreview(tab2); Assert.equal( previewContainer.renderRoot.querySelectorAll("img,canvas").length, 0, "Tab2 (selected) does not contain thumbnail" ); const previewHidden = BrowserTestUtils.waitForEvent( document.getElementById("tabbrowser-tab-preview"), "previewhidden" ); BrowserTestUtils.removeTab(tab1); BrowserTestUtils.removeTab(tab2); await SpecialPowers.popPrefEnv(); // Removing the tab should close the preview. await previewHidden; // Move the mouse outside of the tab strip. EventUtils.synthesizeMouseAtCenter(document.documentElement, { type: "mouseover", }); }); /** * Wheel events at the document-level of the window should hide the preview. */ add_task(async function wheelTests() { const tabUrl1 = "about:blank"; const tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser, tabUrl1); const tabUrl2 = "about:blank"; const tab2 = await BrowserTestUtils.openNewForegroundTab(gBrowser, tabUrl2); await openPreview(tab1); const tabs = document.getElementById("tabbrowser-tabs"); const previewHidden = BrowserTestUtils.waitForEvent( document.getElementById("tabbrowser-tab-preview"), "previewhidden" ); // Copied from apz_test_native_event_utils.js let message = 0; switch (AppConstants.platform) { case "win": message = 0x020a; break; case "linux": message = 4; break; case "macosx": message = 1; break; } let rect = tabs.getBoundingClientRect(); let screenRect = window.windowUtils.toScreenRect( rect.x, rect.y, rect.width, rect.height ); window.windowUtils.sendNativeMouseScrollEvent( screenRect.left, screenRect.bottom, message, 0, 3, 0, 0, Ci.nsIDOMWindowUtils.MOUSESCROLL_SCROLL_LINES, tabs, null ); await previewHidden; BrowserTestUtils.removeTab(tab1); BrowserTestUtils.removeTab(tab2); await SpecialPowers.popPrefEnv(); // Move the mouse outside of the tab strip. EventUtils.synthesizeMouseAtCenter(document.documentElement, { type: "mouseover", }); });