diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /devtools/client/shared/test/helper_html_tooltip.js | |
parent | Initial commit. (diff) | |
download | thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.tar.xz thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'devtools/client/shared/test/helper_html_tooltip.js')
-rw-r--r-- | devtools/client/shared/test/helper_html_tooltip.js | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/devtools/client/shared/test/helper_html_tooltip.js b/devtools/client/shared/test/helper_html_tooltip.js new file mode 100644 index 0000000000..24b28ad702 --- /dev/null +++ b/devtools/client/shared/test/helper_html_tooltip.js @@ -0,0 +1,116 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ +/* eslint no-unused-vars: [2, {"vars": "local", "args": "none"}] */ +/* import-globals-from ../../shared/test/shared-head.js */ + +"use strict"; + +/** + * Helper methods for the HTMLTooltip integration tests. + */ + +/** + * Display an existing HTMLTooltip on an anchor and properly wait for the popup to be + * repainted. + * + * @param {HTMLTooltip} tooltip + * The tooltip instance to display + * @param {Node} anchor + * The anchor that should be used to display the tooltip + * @param {Object} see HTMLTooltip:show documentation + * @return {Promise} promise that resolves when reflow and repaint are done. + */ +async function showTooltip(tooltip, anchor, { position, x, y } = {}) { + await tooltip.show(anchor, { position, x, y }); + await waitForReflow(tooltip); + + // Wait for next tick. Tooltip tests sometimes fail to successively hide and + // show tooltips on Win32 debug. + await waitForTick(); +} + +/** + * Hide an existing HTMLTooltip. After the tooltip "hidden" event has been fired + * a reflow will be triggered. + * + * @param {HTMLTooltip} tooltip + * The tooltip instance to hide + * @return {Promise} promise that resolves when "hidden" has been fired, reflow + * and repaint done. + */ +async function hideTooltip(tooltip) { + const onPopupHidden = tooltip.once("hidden"); + tooltip.hide(); + await onPopupHidden; + await waitForReflow(tooltip); + + // Wait for next tick. Tooltip tests sometimes fail to successively hide and + // show tooltips on Win32 debug. + await waitForTick(); +} + +/** + * Forces the reflow of an HTMLTooltip document and waits for the next repaint. + * + * @param {HTMLTooltip} the tooltip to reflow + * @return {Promise} a promise that will resolve after the reflow and repaint + * have been executed. + */ +function waitForReflow(tooltip) { + const { doc } = tooltip; + return new Promise(resolve => { + doc.documentElement.offsetWidth; + doc.defaultView.requestAnimationFrame(resolve); + }); +} + +/** + * Test helper designed to check that a tooltip is displayed at the expected + * position relative to an anchor, given a set of expectations. + * + * @param {HTMLTooltip} tooltip + * The HTMLTooltip instance to check + * @param {Node} anchor + * The tooltip's anchor + * @param {Object} expected + * - {String} position : "top" or "bottom" + * - {Boolean} leftAligned + * - {Number} width: expected tooltip width + * - {Number} height: expected tooltip height + */ +function checkTooltipGeometry( + tooltip, + anchor, + { position, leftAligned = true, height, width } = {} +) { + info("Check the tooltip geometry matches expected position and dimensions"); + const tooltipRect = tooltip.container.getBoundingClientRect(); + const anchorRect = anchor.getBoundingClientRect(); + + if (position === "top") { + is( + tooltipRect.bottom, + Math.round(anchorRect.top), + "Tooltip is above the anchor" + ); + } else if (position === "bottom") { + is( + tooltipRect.top, + Math.round(anchorRect.bottom), + "Tooltip is below the anchor" + ); + } else { + ok(false, "Invalid position provided to checkTooltipGeometry"); + } + + if (leftAligned) { + is( + tooltipRect.left, + Math.round(anchorRect.left), + "Tooltip left-aligned with the anchor" + ); + } + + is(tooltipRect.height, height, "Tooltip has the expected height"); + is(tooltipRect.width, width, "Tooltip has the expected width"); +} |