summaryrefslogtreecommitdiffstats
path: root/dom/plugins/test/mochitest/cocoa_focus.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/plugins/test/mochitest/cocoa_focus.html')
-rw-r--r--dom/plugins/test/mochitest/cocoa_focus.html142
1 files changed, 142 insertions, 0 deletions
diff --git a/dom/plugins/test/mochitest/cocoa_focus.html b/dom/plugins/test/mochitest/cocoa_focus.html
new file mode 100644
index 000000000..ca35fd7a1
--- /dev/null
+++ b/dom/plugins/test/mochitest/cocoa_focus.html
@@ -0,0 +1,142 @@
+<html>
+<head>
+ <title>NPCocoaEventFocusChanged Tests</title>
+</head>
+<body>
+ <embed id="plugin1" type="application/x-test" width="100" height="100"></embed>
+ <embed id="plugin2" type="application/x-test" width="100" height="100"></embed>
+ <script type="application/javascript">
+ function is(aLeft, aRight, aMessage) {
+ window.opener.SimpleTest.is(aLeft, aRight, aMessage);
+ }
+
+ function ok(aValue, aMessage) {
+ window.opener.SimpleTest.ok(aValue, aMessage);
+ }
+
+ function synthesizeNativeMouseEvent(aX, aY, aNativeMsg, aModifiers, aElement, aCallback) {
+ var observer = {
+ observe: function(aSubject, aTopic, aData) {
+ if (aCallback && aTopic == "mouseevent") {
+ aCallback(aData);
+ }
+ }
+ };
+ SpecialPowers.DOMWindowUtils.sendNativeMouseEvent(aX, aY, aNativeMsg, aModifiers, aElement, observer);
+ return true;
+ }
+
+ function* runTests() {
+ var utils = SpecialPowers.DOMWindowUtils;
+ var scale = utils.screenPixelsPerCSSPixel;
+
+ var plugin1 = document.getElementById("plugin1"); // What we're testing.
+ var plugin2 = document.getElementById("plugin2"); // Dummy.
+
+ var plugin1Bounds = plugin1.getBoundingClientRect();
+ var plugin2Bounds = plugin2.getBoundingClientRect();
+
+ var plugin1X = (window.mozInnerScreenX + plugin1Bounds.left + 10);
+ var plugin1Y = (window.mozInnerScreenY + plugin1Bounds.top + 10);
+ var plugin2X = (window.mozInnerScreenX + plugin2Bounds.left + 10);
+ var plugin2Y = (window.mozInnerScreenY + plugin2Bounds.top + 10);
+
+ const NSLeftMouseDown = 1,
+ NSLeftMouseUp = 2;
+
+ if (plugin1.getEventModel() != 1) {
+ window.opener.todo(false, "Skipping this test when not testing the Cocoa event model");
+ return;
+ }
+
+ // Initialize to 0 since there is no initial state event,
+ // plugins should assume they do not initially have focus.
+ var expectedEventCount = 0;
+
+ // Make sure initial event count is correct.
+ is(plugin1.getFocusEventCount(), expectedEventCount, "Focus event count should be " + expectedEventCount);
+
+ // Make sure initial focus state is unknown (assumed false).
+ var initialStateUnknown = false;
+ try {
+ plugin1.getFocusState();
+ } catch (e) {
+ initialStateUnknown = true;
+ }
+ is(initialStateUnknown, true, "Initial state should be unknown, assumed false.");
+
+ // Give the plugin focus (the window is already focused).
+ yield synthesizeNativeMouseEvent(plugin1X * scale, plugin1Y * scale, NSLeftMouseDown, 0, plugin1, continueTest);
+ yield synthesizeNativeMouseEvent(plugin1X * scale, plugin1Y * scale, NSLeftMouseUp, 0, plugin1, continueTest);
+ expectedEventCount++;
+
+ is(plugin1.getFocusState(), true, "(1) Plugin should have focus.");
+ is(plugin1.getFocusEventCount(), expectedEventCount, "Focus event count should be " + expectedEventCount);
+
+ // Make sure window activation state changes don't spontaneously
+ // change plugin focus.
+
+ // Blur the window.
+ SpecialPowers.focus(opener);
+
+ is(plugin1.getFocusState(), true, "(2) Plugin should still have focus.");
+ is(plugin1.getFocusEventCount(), expectedEventCount, "Focus event count should be " + expectedEventCount);
+
+ // Focus the window.
+ SpecialPowers.focus(window);
+
+ is(plugin1.getFocusState(), true, "(3) Plugin should still have focus.");
+ is(plugin1.getFocusEventCount(), expectedEventCount, "Focus event count should be " + expectedEventCount);
+
+ // Take focus from the plugin.
+ yield synthesizeNativeMouseEvent(plugin2X * scale, plugin2Y * scale, NSLeftMouseDown, 0, plugin2, continueTest);
+ yield synthesizeNativeMouseEvent(plugin2X * scale, plugin2Y * scale, NSLeftMouseUp, 0, plugin2, continueTest);
+ expectedEventCount++;
+
+ is(plugin1.getFocusState(), false, "(4) Plugin should not have focus.");
+ is(plugin1.getFocusEventCount(), expectedEventCount, "Focus event count should be " + expectedEventCount);
+
+ // Make sure window activation causes the plugin to be informed of focus
+ // changes that took place while the window was inactive.
+
+ // Give the plugin focus (the window is already focused).
+ yield synthesizeNativeMouseEvent(plugin1X * scale, plugin1Y * scale, NSLeftMouseDown, 0, plugin1, continueTest);
+ yield synthesizeNativeMouseEvent(plugin1X * scale, plugin1Y * scale, NSLeftMouseUp, 0, plugin1, continueTest);
+ expectedEventCount++;
+
+ // Blur the window.
+ SpecialPowers.focus(opener);
+
+ // Take focus from the plugin while the window is blurred.
+ plugin2.focus();
+
+ is(plugin1.getFocusState(), true, "(5) Plugin should still have focus.");
+ is(plugin1.getFocusEventCount(), expectedEventCount, "Focus event count should be " + expectedEventCount);
+
+ // Focus the window.
+ SpecialPowers.focus(window);
+ expectedEventCount++;
+
+ is(plugin1.getFocusState(), false, "(6) Plugin should not have focus.");
+ is(plugin1.getFocusEventCount(), expectedEventCount, "Focus event count should be " + expectedEventCount);
+ }
+
+ var gTestContinuation = null;
+ function continueTest() {
+ if (!gTestContinuation) {
+ gTestContinuation = runTests();
+ }
+ var ret = gTestContinuation.next();
+ if (ret.done) {
+ window.opener.testsFinished();
+ } else {
+ is(ret.value, true, "Mouse event successfully synthesized");
+ }
+ }
+
+ // Onload hander doesn't work for these tests -- no events arrive at the plugin.
+ window.opener.SimpleTest.waitForFocus(continueTest, window);
+
+ </script>
+</body>
+</html>