<?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin" type="text/css"?> <?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?> <window title="Popups in Scaled Content" onload="setTimeout(runTests, 0);" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script> <!-- This test checks that the position is correct in two cases: - a popup anchored at an element in a scaled document - a popup opened at a screen coordinate in a scaled window --> <iframe id="frame" width="60" height="140" src="data:text/html,<html><body><input size='4' id='one'><input size='4' id='two'></body></html>"/> <menupopup id="popup" onpopupshown="shown()" onpopuphidden="nextTest()"> <menuitem label="One"/> </menupopup> <script class="testbody" type="application/javascript"> <![CDATA[ var screenTest = false; var screenx = -1, screeny = -1; SimpleTest.waitForExplicitFinish(); function runTests() { setScale($("frame").contentWindow, 2); var anchor = $("frame").contentDocument.getElementById("two"); anchor.getBoundingClientRect(); // flush to update display after scale change $("popup").openPopup(anchor, "after_start"); } function setScale(win, scale) { var wn = win.QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIWebNavigation); var shell = wn.QueryInterface(Components.interfaces.nsIDocShell); var docViewer = shell.contentViewer; docViewer.fullZoom = scale; } function shown() { if (screenTest) { var box = $("popup").boxObject; is(box.screenX, screenx, "screen left position"); is(box.screenY, screeny, "screen top position"); } else { var anchor = $("frame").contentDocument.getElementById("two"); is(Math.round(anchor.getBoundingClientRect().left * 2), Math.round($("popup").getBoundingClientRect().left), "anchored left position"); is(Math.round(anchor.getBoundingClientRect().bottom * 2), Math.round($("popup").getBoundingClientRect().top), "anchored top position"); } $("popup").hidePopup(); } function nextTest() { if (screenTest) { setScale(window, 1); SimpleTest.finish(); } else { screenTest = true; var box = document.documentElement.boxObject; // - the iframe is at 4×, but out here css pixels are only 2× device pixels // - the popup manager rounds off (or truncates) the coordinates to // integers, so ensure we pass in even numbers to openPopupAtScreen screenx = (x = even(box.screenX + 120))/2; screeny = (y = even(box.screenY + 120))/2; setScale(window, 2); $("popup").openPopupAtScreen(x, y); } } function even(n) { return (n % 2) ? n+1 : n; } ]]> </script> <body xmlns="http://www.w3.org/1999/xhtml"> <p id="display"> </p> <div id="content" style="display: none"> </div> <pre id="test"> </pre> </body> </window>