summaryrefslogtreecommitdiffstats
path: root/layout/base/tests/browser_select_popup_position_in_out_of_process_iframe.js
diff options
context:
space:
mode:
Diffstat (limited to 'layout/base/tests/browser_select_popup_position_in_out_of_process_iframe.js')
-rw-r--r--layout/base/tests/browser_select_popup_position_in_out_of_process_iframe.js125
1 files changed, 125 insertions, 0 deletions
diff --git a/layout/base/tests/browser_select_popup_position_in_out_of_process_iframe.js b/layout/base/tests/browser_select_popup_position_in_out_of_process_iframe.js
new file mode 100644
index 0000000000..2472a658db
--- /dev/null
+++ b/layout/base/tests/browser_select_popup_position_in_out_of_process_iframe.js
@@ -0,0 +1,125 @@
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js",
+ this
+);
+
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/browser/base/content/test/forms/head.js",
+ this
+);
+
+const PAGECONTENT_TRANSLATED =
+ "<html><body>" +
+ "<div id='div'>" +
+ "<iframe id='frame' width='320' height='295' style='margin: 100px;'" +
+ " src='https://example.com/document-builder.sjs?html=<html><select id=select><option>he he he</option><option>boo boo</option><option>baz baz</option></select></html>'" +
+ "</iframe>" +
+ "</div></body></html>";
+
+function openSelectPopup(x, y, win) {
+ const popupShownPromise = BrowserTestUtils.waitForSelectPopupShown(win);
+ EventUtils.synthesizeNativeMouseEvent({
+ type: "click",
+ target: win.document.documentElement,
+ screenX: x,
+ screenY: y,
+ });
+ return popupShownPromise;
+}
+
+add_task(async function () {
+ const pageUrl = "data:text/html," + escape(PAGECONTENT_TRANSLATED);
+
+ const newWin = await BrowserTestUtils.openNewBrowserWindow({ fission: true });
+
+ const browserLoadedPromise = BrowserTestUtils.browserLoaded(
+ newWin.gBrowser.selectedBrowser,
+ true /* includeSubFrames */
+ );
+ BrowserTestUtils.startLoadingURIString(
+ newWin.gBrowser.selectedBrowser,
+ pageUrl
+ );
+ await browserLoadedPromise;
+
+ newWin.gBrowser.selectedBrowser.focus();
+
+ const tab = newWin.gBrowser.selectedTab;
+
+ // We need to explicitly call Element.focus() since dataURL is treated as
+ // cross-origin, thus autofocus doesn't work there.
+ const iframeBC = await SpecialPowers.spawn(tab.linkedBrowser, [], () => {
+ return content.document.querySelector("iframe").browsingContext;
+ });
+
+ const [iframeBorderLeft, iframeBorderTop, iframeX, iframeY] =
+ await SpecialPowers.spawn(tab.linkedBrowser, [], async function () {
+ await SpecialPowers.contentTransformsReceived(content);
+ const iframe = content.document.querySelector("iframe");
+ const rect = iframe.getBoundingClientRect();
+ const x = content.window.mozInnerScreenX + rect.left;
+ const y = content.window.mozInnerScreenY + rect.top;
+ const cs = content.window.getComputedStyle(iframe);
+ return [parseInt(cs.borderLeftWidth), parseInt(cs.borderTopWidth), x, y];
+ });
+
+ const selectRect = await SpecialPowers.spawn(iframeBC, [], async function () {
+ await SpecialPowers.contentTransformsReceived(content);
+ const input = content.document.getElementById("select");
+ const focusPromise = new Promise(resolve => {
+ input.addEventListener("focus", resolve, { once: true });
+ });
+ input.focus();
+ await focusPromise;
+ return input.getBoundingClientRect();
+ });
+
+ // Open the select popup.
+ const selectPopup = await openSelectPopup(
+ iframeX + selectRect.x + selectRect.width / 2,
+ iframeY + selectRect.y + selectRect.height / 2,
+ newWin
+ );
+
+ // Check the coordinates of 'selectPopup'.
+ let popupRect = selectPopup.getBoundingClientRect();
+ is(
+ popupRect.x,
+ iframeX +
+ iframeBorderLeft +
+ selectRect.x -
+ newWin.mozInnerScreenX +
+ parseFloat(getComputedStyle(selectPopup).marginLeft),
+ "x position of the popup"
+ );
+
+ let expectedYPosition =
+ iframeY +
+ selectRect.y +
+ iframeBorderTop -
+ newWin.mozInnerScreenY +
+ parseFloat(getComputedStyle(selectPopup).marginTop);
+
+ // On platforms other than macOS the popup menu is positioned below the
+ // option element. On macOS the top is aligned to the selected item (so the
+ // first label).
+ if (navigator.platform.includes("Mac")) {
+ const offsetToSelectedItem =
+ selectPopup.querySelector("menuitem[selected]").getBoundingClientRect()
+ .top - popupRect.top;
+ expectedYPosition -= offsetToSelectedItem;
+ } else {
+ expectedYPosition += selectRect.height;
+ }
+
+ isfuzzy(
+ popupRect.y,
+ expectedYPosition,
+ window.devicePixelRatio,
+ "y position of the popup"
+ );
+
+ await hideSelectPopup("enter", newWin);
+
+ await BrowserTestUtils.closeWindow(newWin);
+});