Blame layout/generic/test/plugin_focus_helper.html

Packit f0b94e
<html>
Packit f0b94e
<head>
Packit f0b94e
  <title>Test that clicking on plugins transfers focus correctly</title>
Packit f0b94e
  <style>
Packit f0b94e
  embed { width:200px; height:200px; }
Packit f0b94e
  </style>
Packit f0b94e
</head>
Packit f0b94e
<body>
Packit f0b94e
Packit f0b94e

<input type="text" id="input"></input>

Packit f0b94e

<embed id="p1" type="application/x-test" wmode="window" paintscript="didPaint('p1')">

Packit f0b94e
   <embed id="p2" type="application/x-test" paintscript="didPaint('p2')">

Packit f0b94e
Packit f0b94e
<script type="text/javascript">
Packit f0b94e
var SimpleTest = window.opener.SimpleTest;
Packit f0b94e
var is = window.opener.is;
Packit f0b94e
var ok = window.opener.ok;
Packit f0b94e
var todo = window.opener.todo;
Packit f0b94e
var info = window.opener.info;
Packit f0b94e
Packit f0b94e
SimpleTest.waitForExplicitFinish();
Packit f0b94e
Packit f0b94e
// We don't want to trigger native mouse events until the document is fully
Packit f0b94e
// loaded and each plugin has painted once.
Packit f0b94e
var expectPaints = 2;
Packit f0b94e
var loaded = false;
Packit f0b94e
function didPaint(id) {
Packit f0b94e
  ok(--expectPaints >= 0, "Got plugin painted event from "+id);
Packit f0b94e
  document.getElementById(id).setAttribute("paintscript", null);
Packit f0b94e
  if (expectPaints == 0) {
Packit f0b94e
    if (document.readyState == "complete") {
Packit f0b94e
      theTest();
Packit f0b94e
    } else {
Packit f0b94e
      info("Waiting for document load to continue");
Packit f0b94e
      window.addEventListener("load", function() { theTest(); });
Packit f0b94e
    }
Packit f0b94e
  }
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
//
Packit f0b94e
// Begin the test
Packit f0b94e
//
Packit f0b94e
function theTest() {
Packit f0b94e
Packit f0b94e
const Cc = SpecialPowers.Cc;
Packit f0b94e
const Ci = SpecialPowers.Ci;
Packit f0b94e
var gWindowUtils = SpecialPowers.wrap(window)
Packit f0b94e
                                .QueryInterface(Ci.nsIInterfaceRequestor)
Packit f0b94e
                                .getInterface(Ci.nsIDOMWindowUtils);
Packit f0b94e
Packit f0b94e
var nativeMouseDown;
Packit f0b94e
var nativeMouseUp;
Packit f0b94e
Packit f0b94e
function nativeClickElement(id) {
Packit f0b94e
  return function() {
Packit f0b94e
Packit f0b94e
    var element = document.getElementById(id);
Packit f0b94e
    var bounds = element.getBoundingClientRect();
Packit f0b94e
    var x = (bounds.left + window.mozInnerScreenX + 10);
Packit f0b94e
    var y = (bounds.top + window.mozInnerScreenY + 10);
Packit f0b94e
Packit f0b94e
    SimpleTest.executeSoon(function () {
Packit f0b94e
      gWindowUtils.sendNativeMouseEvent(x, y, nativeMouseDown, 0, element);
Packit f0b94e
      gWindowUtils.sendNativeMouseEvent(x, y, nativeMouseUp, 0, element);
Packit f0b94e
    });
Packit f0b94e
  };
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function done() {
Packit f0b94e
  // Something about this test is losing focus to the OS intermittently, remove
Packit f0b94e
  // the windowed plugins and wait for this window to be focused before
Packit f0b94e
  // continuing. (Bug 874843)
Packit f0b94e
  for (var p of [ "p1", "p2" ]) {
Packit f0b94e
    p = document.getElementById(p);
Packit f0b94e
    p.remove();
Packit f0b94e
    p = null;
Packit f0b94e
  }
Packit f0b94e
  SimpleTest.waitForFocus(window.opener.childDone, window);
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
var step = 0;
Packit f0b94e
var steps = [
Packit f0b94e
  { event:"focus", id:"input", action:nativeClickElement("p1") },
Packit f0b94e
  { event:"blur", id:"input" },
Packit f0b94e
  { event:"focus", id:"p1", action:nativeClickElement("p2") },
Packit f0b94e
  { event:"blur", id:"p1" },
Packit f0b94e
  { event:"focus", id:"p2", action:nativeClickElement("input") },
Packit f0b94e
  { event:"blur", id:"p2" },
Packit f0b94e
  { event:"focus", id:"input", action:done }
Packit f0b94e
];
Packit f0b94e
Packit f0b94e
function handleEvent(event) {
Packit f0b94e
  if (step >= steps.length)
Packit f0b94e
    return;
Packit f0b94e
Packit f0b94e
  var s = steps[step++];
Packit f0b94e
  is(event.type, s.event, "Check event type");
Packit f0b94e
  is(event.target.id, s.id, "Check event target");
Packit f0b94e
Packit f0b94e
  if (s.action) {
Packit f0b94e
    SimpleTest.executeSoon(s.action);
Packit f0b94e
  }
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
var elems = ["input", "p1", "p2"];
Packit f0b94e
for (var i = 0; i < elems.length; ++i) {
Packit f0b94e
  var e = document.getElementById(elems[i]);
Packit f0b94e
  e.addEventListener("focus", handleEvent);
Packit f0b94e
  e.addEventListener("blur", handleEvent);
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function doTest() {
Packit f0b94e
  input.focus();
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
if (navigator.platform.includes("Mac")) {
Packit f0b94e
  nativeMouseDown = 1; // NSLeftMouseDown
Packit f0b94e
  nativeMouseUp = 2; // NSLeftMouseUp
Packit f0b94e
  SimpleTest.waitForFocus(doTest, window);
Packit f0b94e
} else if (navigator.platform.includes("Win")) {
Packit f0b94e
  nativeMouseDown = 2; // MOUSEEVENTF_LEFTDOWN
Packit f0b94e
  nativeMouseUp = 4; // MOUSEEVENTF_LEFTUP
Packit f0b94e
  SimpleTest.waitForFocus(doTest, window);
Packit f0b94e
} else {
Packit f0b94e
  // XXX(johns): our gtk2 sendNativeMouseEvent doesn't support clicks
Packit f0b94e
  todo(false, "Platform not supported");
Packit f0b94e
  done();
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
} // function theTest
Packit f0b94e
</script>
Packit f0b94e
Packit f0b94e
</body>
Packit f0b94e
</html>