<!DOCTYPE html>
<html>
<script src="../resources/run-after-layout-and-paint.js"></script>

<style>
  img, canvas { margin: 5px; width: 48% }
</style>

<body style="overflow: hidden">
  <!-- The _blue_ sector of the <img> image should be at 12 o'clock. -->
  <img>
  <!-- The red sector of the <canvas> image should be at 12 o'clock. -->
  <canvas></canvas>
</body>

<script>
if (window.testRunner) {
  // The pixel result will be the drag image. The blue sector if the
  // drag image should be at 12 o'clock.
  testRunner.dumpDragImage();
}

window.onload = function() {
  if (window.testRunner)
    testRunner.waitUntilDone();

  var image = document.querySelector('img');
  image.onload = function() {
    runAfterLayoutAndPaint(drawImagePatternToCanvas);
  };

  image.src = 'resources/red-at-12-oclock-with-color-profile.jpg';
};

function drawImagePatternToCanvas() {
  var canvas = document.querySelector('canvas');
  var ctx = canvas.getContext('2d');
  var pattern = ctx.createPattern(document.querySelector('img'), null);
  var scale = 0.1870;

  ctx.clearRect(0, 0, canvas.width = 300, canvas.height = 300);
  ctx.save();
  ctx.scale(scale, scale);
  ctx.fillStyle = pattern;
  ctx.fillRect(0, 0, canvas.width / scale, canvas.height / scale);
  ctx.restore();

  if (window.testRunner)
    runAfterLayoutAndPaint(dragImage);
}

function dragImage() {
  var image = document.querySelector('img');

  if (window.eventSender) {
    var x = image.offsetLeft + image.offsetWidth / 2;
    var y = image.offsetTop + image.offsetHeight / 2;

    eventSender.dragMode = true;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseDown();

    eventSender.leapForward(1000);
    eventSender.mouseMoveTo(x + 100, y + 100);
    eventSender.mouseUp();
  }

  if (window.testRunner)
    setTimeout(function() { testRunner.notifyDone() }, 100);
}

</script>
</html>
