diff options
Diffstat (limited to 'devtools/client/responsive/test/browser/browser_tooltip.js')
-rw-r--r-- | devtools/client/responsive/test/browser/browser_tooltip.js | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/devtools/client/responsive/test/browser/browser_tooltip.js b/devtools/client/responsive/test/browser/browser_tooltip.js new file mode 100644 index 0000000000..6721463725 --- /dev/null +++ b/devtools/client/responsive/test/browser/browser_tooltip.js @@ -0,0 +1,129 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const TEST_CONTENT = `<h1 title="test title" style="margin: 5px">test h1</h1>`; +const TEST_URL = `data:text/html;charset=utf-8,${TEST_CONTENT}`; + +// Test for the tooltip coordinate on the browsing document in RDM. + +addRDMTask(TEST_URL, async ({ ui }) => { + // Make this synthesize mouse events via the parent process because some + // code may cache the mouse cursor position like PresShell. That may prevent + // unexpected DOM events coming from the parent process. + await pushPref("test.events.async.enabled", true); + + info("Create a promise which waits until the tooltip will be shown"); + const tooltip = ui.browserWindow.gBrowser.ownerDocument.getElementById( + "remoteBrowserTooltip" + ); + const onTooltipShown = BrowserTestUtils.waitForEvent(tooltip, "popupshown"); + const onTooltipHidden = BrowserTestUtils.waitForEvent(tooltip, "popuphidden"); + + info("Show a tooltip"); + await spawnViewportTask(ui, {}, async () => { + const target = content.document.querySelector("h1"); + + // First, make sure to move mouse cursor outside the target. + info("Waiting for initial mousemove"); + { + // FYI: Some `mousemove` events may not be sent to the content process + // until all preparations done in the main process and the content + // process. Therefore, we need to synthesize `mousemove`s until we + // get it in the remote process at least once. Therefore, we cannot + // use a promise to wait a `mousemove` here and we need to use the while + // loop below. + let mouseMoveFired = false; + content.document.addEventListener( + "mousemove", + event => { + isnot( + event.target, + target, + "The first mousemove should be fired outside the target" + ); + mouseMoveFired = true; + }, + { + once: true, + } + ); + while (!mouseMoveFired) { + await EventUtils.synthesizeMouse( + target, + -2, + -2, + { type: "mousemove" }, + content + ); + await EventUtils.synthesizeMouse( + target, + -1, + -1, + { type: "mousemove" }, + content + ); + // Wait for the tooltip for the target is hidden even if it was visible. + await new Promise(resolve => + content.window.requestAnimationFrame(() => + content.window.requestAnimationFrame(resolve) + ) + ); + } + } + + const eventLogger = event => + info( + `${event.type}: path=[${event.composedPath()}], outerHTML=${ + event.target.outerHTML + }, relatedTarget=${event.relatedTarget?.outerHTML}` + ); + target.addEventListener("mouseover", eventLogger); + target.addEventListener("mouseout", eventLogger); + content.document.addEventListener("mousemove", eventLogger); + // Then, move cursor over the target. + await EventUtils.synthesizeMouse( + target, + 1, + 1, + { type: "mousemove", isSynthesized: false }, + content + ); + await EventUtils.synthesizeMouse( + target, + 2, + 1, + { type: "mousemove", isSynthesized: false }, + content + ); + await EventUtils.synthesizeMouse( + target, + 3, + 1, + { type: "mousemove", isSynthesized: false }, + content + ); + }); + + info("Wait for showing the tooltip"); + await onTooltipShown; + + info("Test the X coordinate of the tooltip"); + isnot(tooltip.screenX, 0, "The X coordinate of tooltip should not be 0"); + + // Finally, clean up the tooltip if we're running in the verify mode. + info("Wait for hiding the tooltip"); + await spawnViewportTask(ui, {}, async () => { + info("Cleaning up the tooltip with moving the cursor"); + const target = content.document.querySelector("h1"); + await EventUtils.synthesizeMouse( + target, + -1, + -1, + { type: "mousemove", isSynthesized: false }, + content + ); + }); + await onTooltipHidden; +}); |