diff options
Diffstat (limited to 'widget/tests/test_bug596600.xul')
-rw-r--r-- | widget/tests/test_bug596600.xul | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/widget/tests/test_bug596600.xul b/widget/tests/test_bug596600.xul new file mode 100644 index 000000000..0468f7d4d --- /dev/null +++ b/widget/tests/test_bug596600.xul @@ -0,0 +1,177 @@ +<?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 type="application/javascript" + 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 NSMouseMoved = 5; + +var gLeftWindow, gRightWindow, gIFrame; +var gExpectedEvents = []; + +function moveMouseTo(x, y, andThen) { + var utils = gLeftWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor). + getInterface(Components.interfaces.nsIDOMWindowUtils); + utils.sendNativeMouseEvent(x, y, NSMouseMoved, 0, gLeftWindow.documentElement); + SimpleTest.executeSoon(andThen); +} + +function openWindows() { + gLeftWindow = open('empty_window.xul', '_blank', 'chrome,screenX=50,screenY=50,width=200,height=200'); + SimpleTest.waitForFocus(function () { + gRightWindow = open('empty_window.xul', '', 'chrome,screenX=300,screenY=50,width=200,height=200'); + SimpleTest.waitForFocus(attachIFrameToRightWindow, gRightWindow); + }, gLeftWindow); +} + +function attachIFrameToRightWindow() { + gIFrame = gLeftWindow.document.createElementNS(XUL_NS, "iframe"); + gIFrame.setAttribute("type", "content"); + gIFrame.setAttribute("clickthrough", "never"); + gIFrame.setAttribute("src", "data:text/html,<!DOCTYPE html>Content page"); + gIFrame.style.width = "100px"; + gIFrame.style.height = "100px"; + gIFrame.style.margin = "50px"; + gLeftWindow.document.documentElement.appendChild(gIFrame); + gIFrame.contentWindow.addEventListener("load", function (e) { + gIFrame.removeEventListener("load", arguments.callee, false); + test1(); + }, false); +} + +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, false); + gLeftWindow.addEventListener("mouseout", mouseOutListener, false); + + // Move into the left window + expectMouseOver = true; + moveMouseTo(80, 80, function () { + ok(!expectMouseOver, "Should have got mouseover event"); + + // Move over the iframe, which has clickthrough="never". + expectMouseOut = true; + moveMouseTo(150, 150, function () { + ok (!expectMouseOut, "Should have got mouseout event"); + gLeftWindow.removeEventListener("mouseover", mouseOverListener, false); + gLeftWindow.removeEventListener("mouseout", mouseOutListener, false); + test2(); + }); + }); + }); +} + +function test2() { + // Make the iframe cover the whole window. + gIFrame.style.margin = "0"; + gIFrame.style.width = gIFrame.style.height = "200px"; + + // Add a box to the iframe at the left edge. + var doc = gIFrame.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 iframe 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, + false); + elementToWatchForMouseEventOn.removeEventListener("mouseout", + mouseWatcher, + false); + SimpleTest.executeSoon(callback); + } + elementToWatchForMouseEventOn.addEventListener("mouseover", + mouseWatcher, + false); + elementToWatchForMouseEventOn.addEventListener("mouseout", + mouseWatcher, + false); + // 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 iframe in a background window)"); + // Activate the left window. + changeFocusAndAwaitSyntheticMouse(function () { + ok(gIFrame.matches(":hover"), "iframe should be hovered"); + ok(box.matches(":hover"), "Box should be hovered"); + // De-activate the window (by activating the right window). + changeFocusAndAwaitSyntheticMouse(function () { + ok(!gIFrame.matches(":hover"), "iframe shouldn't be hovered"); + ok(!box.matches(":hover"), "Box shouldn't be hovered"); + // Re-activate it. + changeFocusAndAwaitSyntheticMouse(function () { + ok(gIFrame.matches(":hover"), "iframe should be hovered"); + ok(box.matches(":hover"), "Box should be hovered"); + // Unhover box and iframe by moving the mouse outside the window. + moveMouseTo(0, 150, function () { + const isOSXSnowLeopard = navigator.userAgent.indexOf("Mac OS X 10.6") != -1; + if (!isOSXSnowLeopard) { + ok(!gIFrame.matches(":hover"), "iframe 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> |