summaryrefslogtreecommitdiffstats
path: root/widget/tests/test_bug596600.xhtml
diff options
context:
space:
mode:
Diffstat (limited to 'widget/tests/test_bug596600.xhtml')
-rw-r--r--widget/tests/test_bug596600.xhtml190
1 files changed, 190 insertions, 0 deletions
diff --git a/widget/tests/test_bug596600.xhtml b/widget/tests/test_bug596600.xhtml
new file mode 100644
index 0000000000..4acdab79bc
--- /dev/null
+++ b/widget/tests/test_bug596600.xhtml
@@ -0,0 +1,190 @@
+<?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="Native mouse event tests"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+ <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
+ <script src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js" />
+
+<body xmlns="http://www.w3.org/1999/xhtml">
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+
+<script class="testbody" type="application/javascript">
+<![CDATA[
+
+const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+
+var gLeftWindow, gRightWindow, gBrowserElement;
+
+function openWindows() {
+ gLeftWindow = window.browsingContext.topChromeWindow
+ .open('empty_window.xhtml', '_blank', 'chrome,screenX=50,screenY=50,width=200,height=200');
+ SimpleTest.waitForFocus(function () {
+ gRightWindow = window.browsingContext.topChromeWindow
+ .open('empty_window.xhtml', '', 'chrome,screenX=300,screenY=50,width=200,height=200');
+ SimpleTest.waitForFocus(attachBrowserToLeftWindow, gRightWindow);
+ }, gLeftWindow);
+}
+
+function attachBrowserToLeftWindow() {
+ gBrowserElement = gLeftWindow.document.createXULElement("browser");
+ gBrowserElement.setAttribute("type", "content");
+ gBrowserElement.setAttribute("src", "file_bug596600.html");
+ gBrowserElement.style.width = "100px";
+ gBrowserElement.style.height = "100px";
+ gBrowserElement.style.margin = "50px";
+ gLeftWindow.document.documentElement.appendChild(gBrowserElement);
+ gBrowserElement.addEventListener("load", async () => {
+ await test1();
+ await test2();
+ gRightWindow.close();
+ gLeftWindow.close();
+ SimpleTest.finish();
+ }, { capture: true, once: true });
+}
+
+async function test1() {
+ // gRightWindow is active, gLeftWindow is inactive.
+ info(`Synthesizing native "mousemove" event at top-left of the screen...`);
+ await promiseNativeMouseEvent({
+ type: "mousemove",
+ screenX: 0,
+ screenY: 0,
+ scale: "inScreenPixels",
+ });
+ await new Promise(resolve => SimpleTest.executeSoon(resolve));
+
+ // Move into the left window
+ info(`Synthesizing native "mousemove" event in the left window (but outside the content)...`);
+ await promiseNativeMouseEventAndWaitForEvent({
+ type: "mousemove",
+ target: gBrowserElement,
+ offsetX: -20,
+ offsetY: -20,
+ win: gLeftWindow,
+ eventTypeToWait: "mouseover",
+ eventTargetToListen: gLeftWindow,
+ });
+ ok(true, `"mouseover" event is fired on the left window when cursor is moved into it`);
+
+ // Move over the browser
+ info(`Synthesizing native "mousemove" event on the content in the left window...`);
+ await promiseNativeMouseEventAndWaitForEvent({
+ type: "mousemove",
+ target: gBrowserElement,
+ atCenter: true,
+ win: gLeftWindow,
+ eventTypeToWait: "mouseout",
+ eventTargetToListen: gLeftWindow,
+ });
+ ok(true, `"mouseout" event is fired on the left window when cursor is moved into its child browser`);
+}
+
+async function test2() {
+ // Make the browser cover the whole window.
+ gBrowserElement.style.margin = "0";
+ gBrowserElement.style.width = gBrowserElement.style.height = "200px";
+
+ // Add a box to the browser at the left edge.
+ var doc = gBrowserElement.contentDocument;
+ var box = doc.createElement("div");
+ box.setAttribute("id", "box");
+ box.style.position = "absolute";
+ box.style.left = "0";
+ box.style.top = "50px";
+ box.style.width = "100px";
+ box.style.height = "100px";
+ box.style.backgroundColor = "green";
+ doc.body.appendChild(box);
+
+ ok(!box.matches(":hover"), "Box shouldn't be hovered (since the mouse isn't over it and since it's in a non-clickthrough browser in a background window)");
+
+ // A function to waitForFocus and then wait for synthetic mouse
+ // events to happen. Note that those happen off the refresh driver,
+ // and happen after animation frame requests.
+ function changeFocusAndAwaitSyntheticMouse(winToFocus,
+ elementToWatchForMouseEventOn) {
+ return Promise.all([
+ new Promise(resolve => {
+ function mouseWatcher() {
+ elementToWatchForMouseEventOn.removeEventListener("mouseover",
+ mouseWatcher);
+ elementToWatchForMouseEventOn.removeEventListener("mouseout",
+ mouseWatcher);
+ SimpleTest.executeSoon(resolve);
+ }
+ elementToWatchForMouseEventOn.addEventListener("mouseover",
+ mouseWatcher);
+ elementToWatchForMouseEventOn.addEventListener("mouseout",
+ mouseWatcher);
+ }),
+ new Promise(resolve => SimpleTest.waitForFocus(resolve, winToFocus)),
+ ]);
+ }
+
+ // Move the mouse over the box.
+ info(`Synthesizing native "mousemove" event into the box...`);
+ await promiseNativeMouseEvent({
+ type: "mousemove",
+ target: box,
+ atCenter: true,
+ win: gLeftWindow,
+ });
+ await new Promise(resolve =>
+ requestAnimationFrame(() => SimpleTest.executeSoon(resolve))
+ );
+ // XXX We cannot guarantee that the native mousemouse have already handled here.
+ ok(!box.matches(":hover"), "Box shouldn't be hovered (since it's in a non-clickthrough browser in a background window)");
+
+ // Activate the left window.
+ info("Waiting the left window activated...");
+ await changeFocusAndAwaitSyntheticMouse(gLeftWindow, box);
+ ok(gBrowserElement.matches(":hover"), "browser should be hovered");
+ ok(box.matches(":hover"), "Box should be hovered");
+
+ // De-activate the window (by activating the right window).
+ info("Waiting the right window activated...");
+ await changeFocusAndAwaitSyntheticMouse(gRightWindow, box);
+ ok(!gBrowserElement.matches(":hover"), "browser shouldn't be hovered");
+ ok(!box.matches(":hover"), "Box shouldn't be hovered");
+
+ // Re-activate it.
+ info("Waiting the left window activated again...");
+ await changeFocusAndAwaitSyntheticMouse(gLeftWindow, box);
+ ok(gBrowserElement.matches(":hover"), "browser should be hovered");
+ ok(box.matches(":hover"), "Box should be hovered");
+
+ // Unhover the box and the left window.
+ info(`Synthesizing native "mousemove" event outside the box and the left window...`);
+ await promiseNativeMouseEventAndWaitForEvent({
+ type: "mousemove",
+ screenX: 0,
+ screenY: 0,
+ scale: "inScreenPixels",
+ win: gLeftWindow,
+ eventTargetToListen: box,
+ eventTypeToWait: "mouseout",
+ });
+ await new Promise(resolve =>
+ requestAnimationFrame(() => SimpleTest.executeSoon(resolve))
+ );
+
+ ok(!gBrowserElement.matches(":hover"), "browser shouldn't be hovered");
+ ok(!box.matches(":hover"), "box shouldn't be hovered");
+}
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.waitForFocus(openWindows);
+
+]]>
+</script>
+
+</window>