<!DOCTYPE HTML>
<html>
<head>
  <title>Test for middle-click to paste selection with paste events</title>
  <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <script src="/tests/SimpleTest/EventUtils.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<p id="display"></p>
<input id="copy-area" value="CLIPBOARD">
<input id="paste-selection-area" value="" onpaste="pastedSelection(event)">
<input id="paste-global-area" value="" onpaste="pastedGlobal(event)">

<script>

var supportsSelectionClipboard = SpecialPowers.supportsSelectionClipboard();

function checkSelectionClipboardText(count)
{
  if ((!supportsSelectionClipboard ||
       SpecialPowers.getClipboardData("text/plain", SpecialPowers.Ci.nsIClipboard.kSelectionClipboard) == "COPY TEXT") &&
      SpecialPowers.getClipboardData("text/plain", SpecialPowers.Ci.nsIClipboard.kGlobalClipboard) == "CLIPBOARD") {
    pasteArea();
    return;
  }

  if (count > 10) {
    ok(false, "could not set clipboards");
    pasteArea();
    SimpleTest.finish();
    return;
  }

  setTimeout(checkSelectionClipboardText, 5, count + 1);
}

function selectArea()
{
  var copyArea = document.getElementById("copy-area");
  copyArea.focus();
  copyArea.select();
  synthesizeKey("x", { accelKey: true });

  if (supportsSelectionClipboard) {
    var clipboardHelper = SpecialPowers.Cc["@mozilla.org/widget/clipboardhelper;1"]
                                       .getService(SpecialPowers.Ci.nsIClipboardHelper);
    clipboardHelper.copyStringToClipboard("COPY TEXT",
                                          SpecialPowers.Ci.nsIClipboard.kSelectionClipboard);
  }

  setTimeout(checkSelectionClipboardText, 50, 0);
}

var selectionPasted = false;
var globalPasted = false;

function pasteArea()
{
  var pasteArea = document.getElementById("paste-selection-area");
  var pasteAreaRect = pasteArea.getBoundingClientRect();
  var pasteAreaCenterX = pasteAreaRect.left + pasteAreaRect.width/2;
  var pasteAreaCenterY = pasteAreaRect.top + pasteAreaRect.height/2;
  var util = SpecialPowers.getDOMWindowUtils(window);

  pasteArea.focus();
  util.sendMouseEventToWindow("mousedown", pasteAreaCenterX, pasteAreaCenterY, 1, 1, 0, true);
  util.sendMouseEventToWindow("mouseup",   pasteAreaCenterX, pasteAreaCenterY, 1, 1, 0, true);

  var usesMouseButtonPaste = SpecialPowers.getBoolPref("middlemouse.paste");
  if (usesMouseButtonPaste) {
    // The data transfer should contain the selection data when the selection clipboard is supported,
    // not the global clipboard data.
    var expectedText = supportsSelectionClipboard ? "COPY TEXT" : "CLIPBOARD";
    is(document.getElementById("paste-selection-area").value, expectedText, "In pasteArea(): data pasted properly from selection");
    ok(selectionPasted, "selection event fired");
  }
  else {
    is(pasteArea.value, "", "data not pasted when middle click not supported");
  }

  var pasteArea = document.getElementById("paste-global-area");
  pasteArea.focus();
  synthesizeKey("v", { accelKey: true });

  ok(globalPasted, "global event fired");
  is(document.getElementById("paste-global-area").value, "CLIPBOARD", "data pasted properly from global clipboard");
  SimpleTest.finish();
}

function pastedSelection(event)
{
  ok(SpecialPowers.getBoolPref("middlemouse.paste"), "paste on middle click is valid");

  // Mac and Windows shouldn't get here as the middle mouse preference is false by default
  ok(!navigator.platform.includes("Mac") && !navigator.platform.includes("Win"), "middle click enabled on right platforms");

  var expectedText = supportsSelectionClipboard ? "COPY TEXT" : "CLIPBOARD";
  is(event.clipboardData.getData("text/plain"), expectedText, "In pastedSelection(): data pasted properly from selection");

  selectionPasted = true;
}

function pastedGlobal(event)
{
  // The data transfer should contain the global data.
  is(event.clipboardData.getData("text/plain"), "CLIPBOARD", "data correct in global clipboard data transfer");
  globalPasted = true;
}

SimpleTest.waitForExplicitFinish();
SimpleTest.requestFlakyTimeout("untriaged");
SimpleTest.waitForFocus(function() {
  SpecialPowers.pushPrefEnv({"set": [["general.autoScroll", false]]}, selectArea);
});
</script>

</pre>
</body>
</html>

