chromium/third_party/blink/web_tests/external/wpt_automation/html/editing/dnd/events/relatedTarget-attribute-manual-automation.js

const boundaryOffset = 2;

function scrollPageIfNeeded(targetSelector, targetDocument) {
  var target = targetDocument.querySelector(targetSelector);
  var targetRect = target.getBoundingClientRect();
  if (targetRect.top < 0 || targetRect.left < 0 || targetRect.bottom > window.innerHeight || targetRect.right > window.innerWidth)
    window.scrollTo(targetRect.left, targetRect.top);
}

// Drag and drop actions
function mouseDragAndDropInTargets(targetSelectorList) {
  return new Promise(function(resolve, reject) {
    if (window.eventSender) {
      scrollPageIfNeeded(targetSelectorList[0], document);
      var target = document.querySelector(targetSelectorList[0]);
      var targetRect = target.getBoundingClientRect();
      var xPosition = targetRect.left + boundaryOffset;
      var yPosition = targetRect.top + boundaryOffset;
      eventSender.mouseMoveTo(xPosition, yPosition);
      eventSender.mouseDown();
      eventSender.leapForward(100);
      for (var i = 1; i < targetSelectorList.length; i++) {
        scrollPageIfNeeded(targetSelectorList[i], document);
        target = document.querySelector(targetSelectorList[i]);
        targetRect = target.getBoundingClientRect();
        xPosition = targetRect.left + boundaryOffset;
        yPosition = targetRect.top + boundaryOffset;
        eventSender.mouseMoveTo(xPosition, yPosition);
      }
      eventSender.mouseUp();
      resolve();
    } else {
      reject();
    }
  });
}

function inject_input() {
    return mouseDragAndDropInTargets(['#draggable', '#outerdiv', '#innerdiv', '#outerdiv']);
}

{
  var pointerevent_automation = async_test("PointerEvent Automation");
  // Defined in every test and should return a promise that gets resolved when input is finished.
  inject_input().then(function() {
    pointerevent_automation.done();
  });
}