<!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(window.testRunner ? changeColorProfile : profileChanged);
  };

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

function changeColorProfile() {
  window.testRunner.setColorProfile('colorSpin', profileChanged);
}

function profileChanged() {
  setTimeout(drawImagePatternToCanvas, 0);
}

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() { window.testRunner.notifyDone() }, 100);
}

</script>
</html>
