gecko/toolkit/content/tests/chrome/window_largemenu.xul

155 lines
4.6 KiB
XML

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<window title="Large Menu Tests"
onfocus="setTimeout(runTests, 0);"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<title>Large Menu Tests</title>
<script type="application/javascript"
src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>
<!--
This test checks that a large menu is displayed with arrow buttons
and is on the screen.
-->
<script>
<![CDATA[
var gOverflowed = false, gUnderflowed = false;
var gScreenY = -1;
var gTestIndex = 0;
var gTests = ["open normal", "open flipped position", "open with scrolling",
"open after scrolling", "open small again"];
function runTests()
{
var mouseFn = function(event) { gScreenY = event.screenY; }
// a hacky way to get the screen position of the document
window.addEventListener("mousedown", mouseFn, false);
synthesizeMouse(document.documentElement, 0, 0, { });
window.removeEventListener("mousedown", mouseFn, false);
nextTest();
}
function nextTest()
{
gOverflowed = false, gUnderflowed = false;
var y = screen.height;
if (gTestIndex == 1) // open flipped position test:
y -= 100;
else
y /= 2;
var popup = document.getElementById("popup");
if (gTestIndex == 2) {
// add some more menuitems so that scrolling will be necessary
for (var t = 1; t <= 30; t++) {
var menu = document.createElement("menuitem");
menu.setAttribute("label", "More" + t);
popup.appendChild(menu);
}
}
else if (gTestIndex == 4) {
for (var t = 1; t <= 30; t++)
popup.removeChild(popup.lastChild);
}
popup.openPopupAtScreen(100, y, false);
}
function popupShown()
{
var popup = document.getElementById("popup");
var rect = popup.getBoundingClientRect();
var sbo = document.getAnonymousNodes(popup)[0].scrollBoxObject;
var expectedScrollPos = 0;
if (gTestIndex == 0) {
// the popup should be in the center of the screen
is(Math.round(rect.top) + gScreenY, screen.height / 2,
gTests[gTestIndex] + " top");
ok(Math.round(rect.bottom) + gScreenY < screen.height,
gTests[gTestIndex] + " bottom");
ok(!gOverflowed && !gUnderflowed, gTests[gTestIndex] + " overflow")
}
else if (gTestIndex == 1) {
// the popup was supposed to open 100 pixels from the bottom, but that
// would put it off screen so it should be flipped to have its bottom
// edge 100 pixels from the bottom
ok(Math.round(rect.top) + gScreenY >= screen.top, gTests[gTestIndex] + " top");
is(Math.round(rect.bottom) + gScreenY, screen.height - 100,
gTests[gTestIndex] + " bottom");
ok(!gOverflowed && !gUnderflowed, gTests[gTestIndex] + " overflow")
}
else if (gTestIndex == 2) {
// the popup is too large so ensure that it is on screen
ok(Math.round(rect.top) + gScreenY >= screen.top, gTests[gTestIndex] + " top");
ok(Math.round(rect.bottom) + gScreenY < screen.height, gTests[gTestIndex] + " bottom");
ok(gOverflowed && !gUnderflowed, gTests[gTestIndex] + " overflow")
sbo.scrollTo(0, 40);
expectedScrollPos = 40;
}
else if (gTestIndex == 3) {
expectedScrollPos = 40;
}
else if (gTestIndex == 4) {
is(Math.round(rect.top) + gScreenY, screen.height / 2,
gTests[gTestIndex] + " top");
ok(Math.round(rect.bottom) + gScreenY < screen.height,
gTests[gTestIndex] + " bottom");
ok(!gOverflowed && gUnderflowed, gTests[gTestIndex] + " overflow")
}
var sx = { }, sy = { };
sbo.getPosition(sx, sy);
is(sy.value, expectedScrollPos, "menu scroll position");
popup.hidePopup();
}
function is(l, r, n) { window.opener.wrappedJSObject.SimpleTest.is(l,r,n); }
function ok(v, n) { window.opener.wrappedJSObject.SimpleTest.ok(v,n); }
function popupHidden()
{
gTestIndex++;
if (gTestIndex == gTests.length) {
window.opener.wrappedJSObject.SimpleTest.finish();
window.close();
}
else {
nextTest();
}
}
]]>
</script>
<label value="OK" popup="popup"/>
<menupopup id="popup" onpopupshown="popupShown();" onpopuphidden="popupHidden();"
onoverflow="gOverflowed = true" onunderflow="gUnderflowed = true;">
<menuitem label="1"/>
<menuitem label="2"/>
<menuitem label="3"/>
<menuitem label="4"/>
<menuitem label="5"/>
<menuitem label="6"/>
<menuitem label="7"/>
<menuitem label="8"/>
<menuitem label="9"/>
<menuitem label="10"/>
<menuitem label="11"/>
<menuitem label="12"/>
<menuitem label="13"/>
<menuitem label="14"/>
<menuitem label="15"/>
</menupopup>
</window>