<?xml version="1.0"?> <?xml-stylesheet type="text/css" href="chrome://global/skin"?> <?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=624329 --> <window title="Mozilla Bug 624329 context menu position" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/> <!-- test results are displayed in the html:body --> <body xmlns="http://www.w3.org/1999/xhtml" onload="openTestWindow()"> <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=624329" target="_blank">Mozilla Bug 624329</a> </body> <!-- test code goes here --> <script type="application/javascript"> <![CDATA[ /** Test for Bug 624329 **/ SimpleTest.waitForExplicitFinish(); var win; var timeoutID; var menu; function openTestWindow() { win = open("bug624329_window.xul", "_blank", "width=300,resizable=yes,chrome"); // Close our window if the test times out so that it doesn't interfere // with later tests. timeoutID = setTimeout(function () { ok(false, "Test timed out."); // Provide some time for a screenshot setTimeout(finish, 1000); }, 20000); } function listenOnce(event, callback) { win.addEventListener(event, function listener() { win.removeEventListener(event, listener, false); callback(); }, false); } function childFocused() { // maximizing the window is a simple way to ensure that the menu is near // the right edge of the screen. listenOnce("resize", childResized); win.maximize(); } function childResized() { const isOSXLion = navigator.userAgent.indexOf("Mac OS X 10.7") != -1; const isOSXMtnLion = navigator.userAgent.indexOf("Mac OS X 10.8") != -1; const isOSXMavericks = navigator.userAgent.indexOf("Mac OS X 10.9") != -1; const isOSXYosemite = navigator.userAgent.indexOf("Mac OS X 10.10") != -1; if (isOSXLion || isOSXMtnLion || isOSXMavericks || isOSXYosemite) { todo_is(win.windowState, win.STATE_MAXIMIZED, "A resize before being maximized breaks this test on 10.7 and 10.8 and 10.9 and 10.10"); finish(); return; } is(win.windowState, win.STATE_MAXIMIZED, "window should be maximized"); isnot(win.innerWidth, 300, "window inner width should have changed"); openContextMenu(); } function openContextMenu() { var mouseX = win.innerWidth - 10; var mouseY = 10; menu = win.document.getElementById("menu"); var screenX = menu.boxObject.screenX; var screenY = menu.boxObject.screenY; var utils = win.QueryInterface(Components.interfaces.nsIInterfaceRequestor). getInterface(Components.interfaces.nsIDOMWindowUtils); utils.sendMouseEvent("contextmenu", mouseX, mouseY, 2, 0, 0); var interval = setInterval(checkMoved, 200); function checkMoved() { if (menu.boxObject.screenX != screenX || menu.boxObject.screenY != screenY) { clearInterval(interval); // Wait further to check that the window does not move again. setTimeout(checkPosition, 1000); } } function checkPosition() { var menubox = menu.boxObject; var winbox = win.document.documentElement.boxObject; var platformIsMac = navigator.userAgent.indexOf("Mac") > -1; var x = menubox.screenX - winbox.screenX; var y = menubox.screenY - winbox.screenY; if (platformIsMac) { // This check is alterered slightly for OSX which adds padding to the top // and bottom of its context menus. The menu position calculation must // be changed to allow for the pointer to be outside this padding // when the menu opens. // (Bug 1075089) ok(y + 6 >= mouseY, "menu top " + (y + 6) + " should be below click point " + mouseY); } else { ok(y >= mouseY, "menu top " + y + " should be below click point " + mouseY); } ok(y <= mouseY + 20, "menu top " + y + " should not be too far below click point " + mouseY); ok(x < mouseX, "menu left " + x + " should be left of click point " + mouseX); var right = x + menubox.width; if (platformIsMac) { // Rather than be constrained by the right hand screen edge, OSX menus flip // horizontally and appear to the left of the mouse pointer ok(right < mouseX, "menu right " + right + " should be left of click point " + mouseX); } else { ok(right > mouseX, "menu right " + right + " should be right of click point " + mouseX); } clearTimeout(timeoutID); finish(); } } function finish() { if (menu && navigator.platform.indexOf("Win") >= 0) { todo(false, "Should not have to hide popup before closing its window"); // This avoids mochitest "Unable to restore focus" errors (bug 670053). menu.hidePopup(); } win.close(); SimpleTest.finish(); } ]]> </script> </window>