diff options
Diffstat (limited to 'dom/html/test/test_ignoreuserfocus.html')
-rw-r--r-- | dom/html/test/test_ignoreuserfocus.html | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/dom/html/test/test_ignoreuserfocus.html b/dom/html/test/test_ignoreuserfocus.html new file mode 100644 index 000000000..629790182 --- /dev/null +++ b/dom/html/test/test_ignoreuserfocus.html @@ -0,0 +1,158 @@ +<!DOCTYPE HTML> +<html> + <head> + <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> + </head> + <body> + <script type="application/javascript;version=1.7"> + "use strict"; + + SimpleTest.requestCompleteLog(); + SimpleTest.waitForExplicitFinish(); + + // Copied from EventUtils.js, but we want *ToWindow methods. + function synthesizeMouseAtPoint(left, top, aEvent, aWindow) { + var utils = _getDOMWindowUtils(aWindow); + var defaultPrevented = false; + if (utils) { + var button = aEvent.button || 0; + var clickCount = aEvent.clickCount || 1; + var modifiers = _parseModifiers(aEvent); + var pressure = ("pressure" in aEvent) ? aEvent.pressure : 0; + var inputSource = ("inputSource" in aEvent) ? aEvent.inputSource : 0; + + if (("type" in aEvent) && aEvent.type) { + defaultPrevented = utils.sendMouseEventToWindow(aEvent.type, left, top, button, clickCount, modifiers, false, pressure, inputSource); + } + else { + utils.sendMouseEventToWindow("mousedown", left, top, button, clickCount, modifiers, false, pressure, inputSource); + utils.sendMouseEventToWindow("mouseup", left, top, button, clickCount, modifiers, false, pressure, inputSource); + } + } + } + + function runTest() { + var witness = document.createElement("input"); + witness.setAttribute("type", "text"); + var witness2 = document.createElement("input"); + witness2.setAttribute("type", "text"); + + var iframe = document.createElement("iframe"); + iframe.setAttribute("mozbrowser", "true"); + iframe.setAttribute("ignoreuserfocus", "true"); + iframe.setAttribute("height", "300px"); + + iframe.addEventListener('load', function (e) { + // Get privileged iframe because mozbrowser iframe is not same origin + // with the parent. We need to access its content through the wrapper. + var privilegedIframe = SpecialPowers.wrap(iframe); + privilegedIframe.contentWindow.addEventListener("MozAfterPaint", function afterPaint(e) { + privilegedIframe.contentWindow.removeEventListener("MozAfterPaint", afterPaint); + + privilegedIframe.contentWindow.addEventListener("focus", + function(e) { + ok(!iframe.hasAttribute("ignoreuserfocus"), "Shouldn't get a focus event in ignoreuserfocus iframe!"); + }, + true); + privilegedIframe.contentWindow.addEventListener("blur", + function(e) { + ok(!iframe.hasAttribute("ignoreuserfocus"), "Shouldn't get a blur event in ignoreuserfocus iframe!"); + }, + true); + + // Sanity check + witness.focus(); + is(document.activeElement, witness, "witness should have the focus"); + + iframe.focus(); + isnot(document.activeElement, iframe, "[explicit iframe.focus()] iframe should not get the focus"); + + iframe.removeAttribute("ignoreuserfocus"); + iframe.focus(); + is(document.activeElement, iframe, "[explicit iframe.focus()] iframe should get the focus"); + + iframe.setAttribute("ignoreuserfocus", "true"); + + // Test the case when iframe contains <input> and .focus() + // is called and explicit focus using mouse + witness.focus(); + + var innerInput = privilegedIframe.contentDocument.getElementsByTagName("input")[0]; + innerInput.focus(); + isnot(document.activeElement, iframe, "[explicit innerInput.focus()] iframe should not have the focus"); + + var iframeWindow = SpecialPowers.unwrap(privilegedIframe.contentWindow); + witness.focus(); + synthesizeMouseAtCenter(innerInput, {}, iframeWindow); + is(document.activeElement, witness, "[synthesize mouse click] witness should have the focus"); + + // Test the case when iframe contains <iframe> and .focus() + // is called and explicit focus using mouse + witness.focus(); + + var innerIframe = privilegedIframe.contentDocument.getElementsByTagName("iframe")[0]; + innerIframe.focus(); + isnot(document.activeElement, iframe, "[explicit innerIframe.focus()] iframe should not have the focus"); + + witness.focus(); + synthesizeMouseAtCenter(innerIframe, {}, iframeWindow); + is(document.activeElement, witness, "[synthesize mouse click inner iframe] witness should have the focus"); + + // Test the case when iframe contains <area> and .focus() + // is called and explicit focus using mouse + + // Wait for paint to setup frame for area. Currently the area frame + // map is reset for each paint. If we are in the middle of a paint + // then the area will not be focusable. + privilegedIframe.contentWindow.addEventListener("MozAfterPaint", function afterPaintArea(e) { + privilegedIframe.contentWindow.removeEventListener("MozAfterPaint", afterPaintArea); + var innerArea = privilegedIframe.contentDocument.getElementsByTagName("area")[0]; + innerArea.focus(); + isnot(document.activeElement, iframe, "[explicit innerArea.focus()] iframe should not have the focus"); + + witness.focus(); + synthesizeMouseAtCenter(innerArea, {}, iframeWindow); + is(document.activeElement, witness, "[synthesize mouse click] witness should have the focus"); + + // Test tabindex + witness.focus(); + is(document.activeElement, witness, "witness should have the focus"); + synthesizeKey("VK_TAB", {}); + isnot(document.activeElement, iframe, "[synthesize tab key] iframe should not have the focus"); + is(document.activeElement, witness2, "witness2 should have the focus"); + + SimpleTest.finish(); + }); + witness.focus(); + // force reflow + iframe.setAttribute("height", "298px"); + }); + // force reflow + iframe.setAttribute("height", "299px"); + }); + + document.body.appendChild(witness); + document.body.appendChild(iframe); + document.body.appendChild(witness2); + + iframe.setAttribute("src", "file_ignoreuserfocus.html"); + } + addEventListener("load", function() { + SpecialPowers.pushPermissions( + [{'type': 'browser', 'allow': true, 'context': document}], + function() { + SpecialPowers.pushPrefEnv({ + "set": [ + ["dom.mozBrowserFramesEnabled", true], + ["network.disable.ipc.security", true], + ] + }, function() { + SimpleTest.waitForFocus(runTest); + }); + }); + }); + </script> + </body> +</html> |