summaryrefslogtreecommitdiffstats
path: root/toolkit/content/tests/chrome/test_popup_scaled.xul
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/content/tests/chrome/test_popup_scaled.xul')
-rw-r--r--toolkit/content/tests/chrome/test_popup_scaled.xul105
1 files changed, 105 insertions, 0 deletions
diff --git a/toolkit/content/tests/chrome/test_popup_scaled.xul b/toolkit/content/tests/chrome/test_popup_scaled.xul
new file mode 100644
index 000000000..6bbf6c653
--- /dev/null
+++ b/toolkit/content/tests/chrome/test_popup_scaled.xul
@@ -0,0 +1,105 @@
+<?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,&lt;html&gt;&lt;body&gt;&lt;input size='4' id='one'&gt;&lt;input size='4' id='two'&gt;&lt;/body&gt;&lt;/html&gt;"/>
+
+<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>