|
1 <?xml version="1.0"?> |
|
2 <?xml-stylesheet type="text/css" href="chrome://global/skin"?> |
|
3 <?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?> |
|
4 <!-- |
|
5 https://bugzilla.mozilla.org/show_bug.cgi?id=624329 |
|
6 --> |
|
7 <window title="Mozilla Bug 624329 context menu position" |
|
8 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> |
|
9 <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> |
|
10 <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/> |
|
11 |
|
12 <!-- test results are displayed in the html:body --> |
|
13 <body xmlns="http://www.w3.org/1999/xhtml" |
|
14 onload="openTestWindow()"> |
|
15 <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=624329" |
|
16 target="_blank">Mozilla Bug 624329</a> |
|
17 </body> |
|
18 |
|
19 <!-- test code goes here --> |
|
20 <script type="application/javascript"> |
|
21 <![CDATA[ |
|
22 /** Test for Bug 624329 **/ |
|
23 |
|
24 SimpleTest.waitForExplicitFinish(); |
|
25 |
|
26 var win; |
|
27 var timeoutID; |
|
28 var menu; |
|
29 |
|
30 function openTestWindow() { |
|
31 win = open("bug624329_window.xul", "_blank", "width=300,resizable=yes,chrome"); |
|
32 // Close our window if the test times out so that it doesn't interfere |
|
33 // with later tests. |
|
34 timeoutID = setTimeout(function () { |
|
35 ok(false, "Test timed out."); |
|
36 // Provide some time for a screenshot |
|
37 setTimeout(finish, 1000); |
|
38 }, 20000); |
|
39 } |
|
40 |
|
41 function listenOnce(event, callback) { |
|
42 win.addEventListener(event, function listener() { |
|
43 win.removeEventListener(event, listener, false); |
|
44 callback(); |
|
45 }, false); |
|
46 } |
|
47 |
|
48 function childFocused() { |
|
49 // maximizing the window is a simple way to ensure that the menu is near |
|
50 // the right edge of the screen. |
|
51 |
|
52 listenOnce("resize", childResized); |
|
53 win.maximize(); |
|
54 } |
|
55 |
|
56 function childResized() { |
|
57 const isOSXLion = navigator.userAgent.indexOf("Mac OS X 10.7") != -1; |
|
58 const isOSXMtnLion = navigator.userAgent.indexOf("Mac OS X 10.8") != -1; |
|
59 const isOSXMavericks = navigator.userAgent.indexOf("Mac OS X 10.9") != -1; |
|
60 if (isOSXLion || isOSXMtnLion || isOSXMavericks) { |
|
61 todo_is(win.windowState, win.STATE_MAXIMIZED, |
|
62 "A resize before being maximized breaks this test on 10.7 and 10.8 and 10.9"); |
|
63 finish(); |
|
64 return; |
|
65 } |
|
66 |
|
67 is(win.windowState, win.STATE_MAXIMIZED, |
|
68 "window should be maximized"); |
|
69 |
|
70 isnot(win.innerWidth, 300, |
|
71 "window inner width should have changed"); |
|
72 |
|
73 openContextMenu(); |
|
74 } |
|
75 |
|
76 function openContextMenu() { |
|
77 var mouseX = win.innerWidth - 10; |
|
78 var mouseY = 10; |
|
79 |
|
80 menu = win.document.getElementById("menu"); |
|
81 var screenX = menu.boxObject.screenX; |
|
82 var screenY = menu.boxObject.screenY; |
|
83 var utils = |
|
84 win.QueryInterface(Components.interfaces.nsIInterfaceRequestor). |
|
85 getInterface(Components.interfaces.nsIDOMWindowUtils); |
|
86 |
|
87 utils.sendMouseEvent("contextmenu", mouseX, mouseY, 2, 0, 0); |
|
88 |
|
89 var interval = setInterval(checkMoved, 200); |
|
90 function checkMoved() { |
|
91 if (menu.boxObject.screenX != screenX || |
|
92 menu.boxObject.screenY != screenY) { |
|
93 clearInterval(interval); |
|
94 // Wait further to check that the window does not move again. |
|
95 setTimeout(checkPosition, 1000); |
|
96 } |
|
97 } |
|
98 |
|
99 function checkPosition() { |
|
100 var menubox = menu.boxObject; |
|
101 var winbox = win.document.documentElement.boxObject |
|
102 |
|
103 var x = menubox.screenX - winbox.screenX; |
|
104 var y = menubox.screenY - winbox.screenY; |
|
105 ok(y >= mouseY, |
|
106 "menu top " + y + " should be below click point " + mouseY); |
|
107 ok(y <= mouseY + 20, |
|
108 "menu top " + y + " should not be too far below click point " + mouseY); |
|
109 |
|
110 ok(x < mouseX, |
|
111 "menu left " + x + " should be left of click point " + mouseX); |
|
112 var right = x + menubox.width; |
|
113 ok(right > mouseX, |
|
114 "menu right " + right + " should be right of click point " + mouseX); |
|
115 |
|
116 clearTimeout(timeoutID); |
|
117 finish(); |
|
118 } |
|
119 |
|
120 } |
|
121 |
|
122 function finish() { |
|
123 if (menu && navigator.platform.indexOf("Win") >= 0) { |
|
124 todo(false, "Should not have to hide popup before closing its window"); |
|
125 // This avoids mochitest "Unable to restore focus" errors (bug 670053). |
|
126 menu.hidePopup(); |
|
127 } |
|
128 win.close(); |
|
129 SimpleTest.finish(); |
|
130 } |
|
131 |
|
132 ]]> |
|
133 </script> |
|
134 </window> |