1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=665540
-->
<head>
<title>Test for Bug 665540 Select dropdown position in fullscreen window</title>
<script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<script src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
</head>
<body onload="openFullscreenWindow()">
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=665540">Mozilla Bug 665540</a>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script type="application/javascript">
/** Test for Bug 665540 **/
SimpleTest.waitForExplicitFinish();
var win;
var select;
var optiona;
var eventType = "mouseover";
var timeoutID;
var eventOffsetX = 2;
var eventOffsetY = 2;
let sizemodeChanged = false;
let fullscreenChanged = false;
let childHasFocused = false;
function openFullscreenWindow() {
win = window.browsingContext.topChromeWindow
.openDialog("bug665540_window.xhtml", "_blank", "resizable=yes,chrome");
win.addEventListener("sizemodechange", () => {
info("sizemodechange. windowState = " + win.windowState + " fullScreen = " + win.fullScreen);
sizemodeChanged = true;
tryStart();
}, { once: true });
win.addEventListener("fullscreen", () => {
info("fullscreen event. windowState = " + win.windowState + " fullScreen = " + win.fullScreen);
fullscreenChanged = true;
tryStart();
}, { once: true });
SimpleTest.waitForFocus(() => {
win.fullScreen = true;
}, win);
// 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 tryStart() {
// wait until the window goes full screen and its size mode actually changes.
if (!sizemodeChanged || !fullscreenChanged) {
return;
}
SimpleTest.waitForFocus(start, win);
}
function start() {
// The select doesn't open if the mouse click is fired too soon
// (on X11 at least).
setTimeout(openSelect, 1000);
}
function openSelect() {
select = win.document.getElementById("select");
synthesizeMouseAtCenter(select, {}, win);
// A yield was required on X11 tinderbox machines.
// (Wasn't required on other platforms nor on an X11 system with kwin.)
setTimeout(checkPosition, 1000);
}
function checkPosition() {
optiona = win.document.getElementById("optiona");
optiona.addEventListener(eventType, eventReceived);
// If the select dropdown is opened in the position where
// getBoundingClientRect() predicts, then optiona will receive the event.
// The event is received asynchronously (I don't know why), so the handler
// is removed later.
synthesizeMouse(optiona, eventOffsetX, eventOffsetY,
{ type: eventType }, win);
}
function eventReceived(event) {
clearTimeout(timeoutID);
optiona.removeEventListener(eventType, eventReceived);
var rect = optiona.getBoundingClientRect();
// Note that fullscreen only fully covers one monitor, so win.screenX can
// be non-zero.
is(event.screenX, win.screenX + rect.left + eventOffsetX,
"event.screenX should match sent event");
is(event.screenY, win.screenY + rect.top + eventOffsetY,
"event.screenY should match sent event");
finish();
}
function finish() {
if (select && navigator.platform.includes("Win")) {
todo(false,
"Should not have to close select before closing its window");
// This avoids mochitest "Unable to restore focus" errors (bug 670053).
synthesizeMouseAtCenter(select, {}, win);
}
is(win.windowState, win.STATE_FULLSCREEN,
"window state should still be fullscreen");
win.close();
SimpleTest.finish();
}
</script>
</pre>
</body>
</html>
|