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.xhtml168
1 files changed, 168 insertions, 0 deletions
diff --git a/widget/tests/test_bug596600.xhtml b/widget/tests/test_bug596600.xhtml
new file mode 100644
index 0000000000..6312590876
--- /dev/null
+++ b/widget/tests/test_bug596600.xhtml
@@ -0,0 +1,168 @@
+<?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" />
+
+<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";
+const NSEventTypeMouseMoved = 5;
+
+var gLeftWindow, gRightWindow, gBrowserElement;
+var gExpectedEvents = [];
+
+function moveMouseTo(x, y, andThen) {
+ var utils = gLeftWindow.windowUtils;
+ utils.sendNativeMouseEvent(x, y, NSEventTypeMouseMoved, 0, gLeftWindow.documentElement);
+ SimpleTest.executeSoon(andThen);
+}
+
+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", function (e) {
+ test1();
+ }, { capture: true, once: true });
+}
+
+function test1() {
+ // gRightWindow is active, gLeftWindow is inactive.
+ moveMouseTo(0, 0, function () {
+ var expectMouseOver = false, expectMouseOut = false;
+ function mouseOverListener(e) {
+ ok(expectMouseOver, "Got expected mouseover at " + e.screenX + ", " + e.screenY);
+ expectMouseOver = false;
+ }
+ function mouseOutListener(e) {
+ ok(expectMouseOut, "Got expected mouseout at " + e.screenX + ", " + e.screenY);
+ expectMouseOut = false;
+ }
+ gLeftWindow.addEventListener("mouseover", mouseOverListener);
+ gLeftWindow.addEventListener("mouseout", mouseOutListener);
+
+ // Move into the left window
+ expectMouseOver = true;
+ moveMouseTo(80, 80, function () {
+ ok(!expectMouseOver, "Should have got mouseover event");
+
+ // Move over the browser
+ expectMouseOut = true;
+ moveMouseTo(150, 150, function () {
+ ok (!expectMouseOut, "Should have got mouseout event");
+ gLeftWindow.removeEventListener("mouseover", mouseOverListener);
+ gLeftWindow.removeEventListener("mouseout", mouseOutListener);
+ test2();
+ });
+ });
+ });
+}
+
+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(callback, winToFocus,
+ elementToWatchForMouseEventOn) {
+ function mouseWatcher() {
+ elementToWatchForMouseEventOn.removeEventListener("mouseover",
+ mouseWatcher);
+ elementToWatchForMouseEventOn.removeEventListener("mouseout",
+ mouseWatcher);
+ SimpleTest.executeSoon(callback);
+ }
+ elementToWatchForMouseEventOn.addEventListener("mouseover",
+ mouseWatcher);
+ elementToWatchForMouseEventOn.addEventListener("mouseout",
+ mouseWatcher);
+ // Just pass a dummy function to waitForFocus; the mouseout/over listener
+ // will actually handle things for us.
+ SimpleTest.waitForFocus(function() {}, winToFocus);
+ }
+
+ // Move the mouse over the box.
+ moveMouseTo(100, 150, function () {
+ 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.
+ changeFocusAndAwaitSyntheticMouse(function () {
+ 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).
+ changeFocusAndAwaitSyntheticMouse(function () {
+ ok(!gBrowserElement.matches(":hover"), "browser shouldn't be hovered");
+ ok(!box.matches(":hover"), "Box shouldn't be hovered");
+ // Re-activate it.
+ changeFocusAndAwaitSyntheticMouse(function () {
+ ok(gBrowserElement.matches(":hover"), "browser should be hovered");
+ ok(box.matches(":hover"), "Box should be hovered");
+ // Unhover box and browser by moving the mouse outside the window.
+ moveMouseTo(0, 150, function () {
+ ok(!gBrowserElement.matches(":hover"), "browser shouldn't be hovered");
+ ok(!box.matches(":hover"), "box shouldn't be hovered");
+ finalize();
+ });
+ }, gLeftWindow, box);
+ }, gRightWindow, box);
+ }, gLeftWindow, box);
+ });
+}
+
+function finalize() {
+ gRightWindow.close();
+ gLeftWindow.close();
+ SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.waitForFocus(openWindows);
+
+]]>
+</script>
+
+</window>