<!doctype html>
<html>
  <head>
    <title>allowTargetOrigin with real dataTransfer should block dragenter, dragover, dragleave and drop synthetic events</title>
    <style type="text/css">
p + div { height: 100px; width: 100px; background: orange; }
    </style>
    <script type="text/javascript">
window.onload = function () {
  var orange = document.getElementsByTagName('div')[0], targ = document.getElementsByTagName('div')[1], evtdone = {}, fails = [];
  orange.ondragstart = function (e) {
    var evt;
    e.dataTransfer.effectAllowed = 'copy';
    e.dataTransfer.setData('text','dummy text');
    try {
      e.dataTransfer.allowTargetOrigin('http://example.com');
    } catch(e) {
      fails[fails.length] = 'allowTargetOrigin threw an error: '+e;
    }
    try {
      evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
      targ.dispatchEvent(evt);
      evt = new DragEvent('drag', {dataTransfer:e.dataTransfer});
      targ.dispatchEvent(evt);
      evt = new DragEvent('dragenter', {dataTransfer:e.dataTransfer});
      targ.dispatchEvent(evt);
      evt = new DragEvent('dragover', {dataTransfer:e.dataTransfer});
      targ.dispatchEvent(evt);
      evt = new DragEvent('dragleave', {dataTransfer:e.dataTransfer});
      targ.dispatchEvent(evt);
      evt = new DragEvent('drop', {dataTransfer:e.dataTransfer});
      targ.dispatchEvent(evt);
      evt = new DragEvent('dragend', {dataTransfer:e.dataTransfer});
      targ.dispatchEvent(evt);
    } catch(e) {
      fails[fails.length] = 'Synthetic event threw an error: '+e;
    }
    if( !evtdone.dragstart ) {
      fails[fails.length] = 'dragstart did not fire';
    }
    if( !evtdone.drag ) {
      fails[fails.length] = 'drag did not fire';
    }
    if( !evtdone.dragend ) {
      fails[fails.length] = 'dragend did not fire';
    }
    if( evtdone.dragenter ) {
      fails[fails.length] = 'dragenter fired';
    }
    if( evtdone.dragover ) {
      fails[fails.length] = 'dragover fired';
    }
    if( evtdone.dragleave ) {
      fails[fails.length] = 'dragleave fired';
    }
    if( evtdone.drop ) {
      fails[fails.length] = 'drop fired';
    }
    document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL:<br>' + fails.join('<br>') ) : 'PASS';
  };
  targ.ondragstart = function (e) {
    evtdone[e.type] = true;
  };
  targ.ondragenter = targ.ondragover = targ.ondrop = function (e) {
    e.preventDefault();
    evtdone[e.type] = true;
  };
  targ.ondrag = targ.ondragleave = function (e) {
    evtdone[e.type] = true;
  };
  targ.ondragend = function (e) {
    evtdone[e.type] = true;
  };
};
    </script>
  </head>
  <body>
    <p>Drag the orange square to the right until the drag placeholder appears, then release it. Fail if this text does not change.</p>
    <div draggable="true"></div>
    <div></div>
    <noscript><p>Enable JavaScript and reload</p></noscript>
  </body>
</html>
