diff options
Diffstat (limited to 'widget/tests/test_bug596600.xhtml')
-rw-r--r-- | widget/tests/test_bug596600.xhtml | 168 |
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> |