summaryrefslogtreecommitdiffstats
path: root/layout/generic/test/plugin_focus_helper.html
diff options
context:
space:
mode:
Diffstat (limited to 'layout/generic/test/plugin_focus_helper.html')
-rw-r--r--layout/generic/test/plugin_focus_helper.html134
1 files changed, 134 insertions, 0 deletions
diff --git a/layout/generic/test/plugin_focus_helper.html b/layout/generic/test/plugin_focus_helper.html
new file mode 100644
index 000000000..49f712b5a
--- /dev/null
+++ b/layout/generic/test/plugin_focus_helper.html
@@ -0,0 +1,134 @@
+<html>
+<head>
+ <title>Test that clicking on plugins transfers focus correctly</title>
+ <style>
+ embed { width:200px; height:200px; }
+ </style>
+</head>
+<body>
+
+<p><input type="text" id="input"></input>
+<p><embed id="p1" type="application/x-test" wmode="window" paintscript="didPaint('p1')">
+ <embed id="p2" type="application/x-test" paintscript="didPaint('p2')"></p>
+
+<script type="text/javascript">
+var SimpleTest = window.opener.SimpleTest;
+var is = window.opener.is;
+var ok = window.opener.ok;
+var todo = window.opener.todo;
+var info = window.opener.info;
+
+SimpleTest.waitForExplicitFinish();
+
+// We don't want to trigger native mouse events until the document is fully
+// loaded and each plugin has painted once.
+var expectPaints = 2;
+var loaded = false;
+function didPaint(id) {
+ ok(--expectPaints >= 0, "Got plugin painted event from "+id);
+ document.getElementById(id).setAttribute("paintscript", null);
+ if (expectPaints == 0) {
+ if (document.readyState == "complete") {
+ theTest();
+ } else {
+ info("Waiting for document load to continue");
+ window.addEventListener("load", function() { theTest(); });
+ }
+ }
+}
+
+//
+// Begin the test
+//
+function theTest() {
+
+const Cc = SpecialPowers.Cc;
+const Ci = SpecialPowers.Ci;
+var gWindowUtils = SpecialPowers.wrap(window)
+ .QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDOMWindowUtils);
+
+var nativeMouseDown;
+var nativeMouseUp;
+
+function nativeClickElement(id) {
+ return function() {
+
+ var element = document.getElementById(id);
+ var bounds = element.getBoundingClientRect();
+ var x = (bounds.left + window.mozInnerScreenX + 10);
+ var y = (bounds.top + window.mozInnerScreenY + 10);
+
+ SimpleTest.executeSoon(function () {
+ gWindowUtils.sendNativeMouseEvent(x, y, nativeMouseDown, 0, element);
+ gWindowUtils.sendNativeMouseEvent(x, y, nativeMouseUp, 0, element);
+ });
+ };
+}
+
+function done() {
+ // Something about this test is losing focus to the OS intermittently, remove
+ // the windowed plugins and wait for this window to be focused before
+ // continuing. (Bug 874843)
+ for (var p of [ "p1", "p2" ]) {
+ p = document.getElementById(p);
+ p.parentNode.removeChild(p);
+ p = null;
+ }
+ SimpleTest.waitForFocus(window.opener.childDone, window);
+}
+
+var step = 0;
+var steps = [
+ { event:"focus", id:"input", action:nativeClickElement("p1") },
+ { event:"blur", id:"input" },
+ { event:"focus", id:"p1", action:nativeClickElement("p2") },
+ { event:"blur", id:"p1" },
+ { event:"focus", id:"p2", action:nativeClickElement("input") },
+ { event:"blur", id:"p2" },
+ { event:"focus", id:"input", action:done }
+];
+
+function handleEvent(event) {
+ if (step >= steps.length)
+ return;
+
+ var s = steps[step++];
+ is(event.type, s.event, "Check event type");
+ is(event.target.id, s.id, "Check event target");
+
+ if (s.action) {
+ SimpleTest.executeSoon(s.action);
+ }
+}
+
+var elems = ["input", "p1", "p2"];
+for (var i = 0; i < elems.length; ++i) {
+ var e = document.getElementById(elems[i]);
+ e.addEventListener("focus", handleEvent, false);
+ e.addEventListener("blur", handleEvent, false);
+}
+
+function doTest() {
+ input.focus();
+}
+
+if (navigator.platform.indexOf("Mac") >= 0) {
+ nativeMouseDown = 1; // NSLeftMouseDown
+ nativeMouseUp = 2; // NSLeftMouseUp
+ SimpleTest.waitForFocus(doTest, window);
+} else if (navigator.platform.indexOf("Win") >= 0) {
+ nativeMouseDown = 2; // MOUSEEVENTF_LEFTDOWN
+ nativeMouseUp = 4; // MOUSEEVENTF_LEFTUP
+ SimpleTest.waitForFocus(doTest, window);
+} else {
+ // XXX(johns): our gtk2 sendNativeMouseEvent doesn't support clicks
+ todo(false, "Platform not supported");
+ done();
+}
+
+} // function theTest
+</script>
+
+</body>
+</html>