<!DOCTYPE html>
<title>HitRegion Event Test</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="./resources/test-helpers.js"></script>
<canvas width="400" height="400">
  <button id="button"></button>
  <button id="button2"></button>
</canvas>
<style>

body {
  margin : 0px;
  padding : 0px;
}

</style>
<script>

var canvas = document.querySelector('canvas');
var button = document.querySelector('canvas > #button');
var button2 = document.querySelector('canvas > #button2');
var context = canvas.getContext('2d');

function assert_event_equivalent(actual, expected) {
  assert_equals(actual.type, expected.type);
  assert_equals(actual.target, expected.target);
  if (actual.region !== undefined)
    assert_equals(actual.region, expected.region);
  else
    assert_equals(actual.changedTouches[0].region, expected.region);
}

function assert_event_array_equivalent(actual, expected) {
  assert_true(Array.isArray(actual));
  assert_equals(actual.length, expected.length);
  for (var i = 0; i < actual.length; i++)
    assert_event_equivalent(actual[i], expected[i]);
}

async_test(function() {
  var fallback_element = document.createElement('button');
  canvas.appendChild(fallback_element);

  context.clearRect(0, 0, 400, 400);
  context.rect(0, 0, 50, 50);
  context.fill();
  context.addHitRegion({ id: 'button', control: fallback_element });

  var expected = [
    { type: 'mousedown', target: fallback_element, region: 'button' }
  ];
  var actual = [];
  fallback_element.addEventListener('mousedown', e => actual.push(e));

  if (eventSender) {
    eventSender.mouseMoveTo(40, 10);
    eventSender.mouseDown();
    eventSender.mouseUp();
  }

  // After the following code, the fallback element is no longer descendant of canvas.
  fallback_element.parentNode.parentNode.appendChild(fallback_element);

  if (eventSender) {
    eventSender.mouseMoveTo(40, 10);
    eventSender.mouseDown();
    eventSender.mouseUp();
  }

  assert_event_array_equivalent(actual, expected);
  this.done();
}, 'If the control is not descendant of canvas, event should not be fired.');

async_test(function() {
  context.clearRect(0, 0, 400, 400);
  context.rect(0, 0, 50, 50);
  context.fill();
  context.addHitRegion({ id: 'button' });

  var expected = [
    { type: 'click', target: canvas, region: 'button' },
    { type: 'click', target: canvas, region: 'button' },
  ];
  var actual = [];

  canvas.addEventListener('click', e => { canvas.style.width = '0px'; actual.push(e); });
  canvas.addEventListener('click', e => { actual.push(e); canvas.style.width = '400px'; });

  if (eventSender) {
    eventSender.mouseMoveTo(40, 10);
    eventSender.mouseDown();
    eventSender.mouseUp();
  }

  assert_event_array_equivalent(actual, expected);
  this.done();
}, 'The event object should not be changed even if mutate the DOM.');

async_test(function() {
  context.rect(1, 1, 50, 50);
  context.fill();
  context.addHitRegion({ id: 'button', control: button });

  var expected = [
    { type: 'mouseover', target: button, region: 'button' },
    { type: 'mouseenter', target: button, region: 'button' },
    { type: 'mousemove', target: button, region: 'button' },
    { type: 'mousemove', target: button, region: 'button' },
    { type: 'mousedown', target: button, region: 'button' },
    { type: 'mouseup', target: button, region: 'button' },
    { type: 'mouseout', target: button, region: 'button' },
    { type: 'mouseleave', target: button, region: 'button' },
    { type: 'touchstart', target: button, region: 'button' },
    { type: 'touchend', target: button, region: 'button' },
  ];
  var actual = [];

  button.addEventListener('mouseover', e => actual.push(e));
  button.addEventListener('mouseenter', e => actual.push(e));
  button.addEventListener('mousemove', e => actual.push(e));
  button.addEventListener('mousedown', e => actual.push(e));
  button.addEventListener('mouseup', e => actual.push(e));
  button.addEventListener('mouseout', e => actual.push(e));
  button.addEventListener('mouseleave', e => actual.push(e));
  button.addEventListener('touchstart', e => actual.push(e));
  button.addEventListener('touchend', e => actual.push(e));

  if (eventSender) {
    eventSender.mouseMoveTo(0, 0);
    eventSender.mouseMoveTo(10, 10);
    eventSender.mouseDown();
    eventSender.mouseUp();
    eventSender.mouseMoveTo(60, 60);

    eventSender.clearTouchPoints();
    eventSender.addTouchPoint(10, 10);
    eventSender.touchStart();
    eventSender.releaseTouchPoint(0);
    eventSender.touchEnd();
  }

  assert_event_array_equivalent(actual, expected);
  this.done();
}, 'Rerouting mouse/touch event test');

async_test(function() {
  context.rect(1, 1, 50, 50);
  context.fill();
  context.addHitRegion({ control: button });

  var expected = [
    { type: 'mouseover', target: button, region: null },
    { type: 'mouseenter', target: button, region: null },
    { type: 'mousemove', target: button, region: null },
    { type: 'mousemove', target: button, region: null },
    { type: 'mousedown', target: button, region: null },
    { type: 'mouseup', target: button, region: null },
    { type: 'mouseout', target: button, region: null },
    { type: 'mouseleave', target: button, region: null },
    { type: 'touchstart', target: button, region: null },
    { type: 'touchend', target: button, region: null },
  ];
  var actual = [];

  button.addEventListener('mouseover', e => actual.push(e));
  button.addEventListener('mouseenter', e => actual.push(e));
  button.addEventListener('mousemove', e => actual.push(e));
  button.addEventListener('mousedown', e => actual.push(e));
  button.addEventListener('mouseup', e => actual.push(e));
  button.addEventListener('mouseout', e => actual.push(e));
  button.addEventListener('mouseleave', e => actual.push(e));
  button.addEventListener('touchstart', e => actual.push(e));
  button.addEventListener('touchend', e => actual.push(e));

  if (eventSender) {
    eventSender.mouseMoveTo(0, 0);
    eventSender.mouseMoveTo(10, 10);
    eventSender.mouseDown();
    eventSender.mouseUp();
    eventSender.mouseMoveTo(60, 60);

    eventSender.clearTouchPoints();
    eventSender.addTouchPoint(10, 10);
    eventSender.touchStart();
    eventSender.releaseTouchPoint(0);
    eventSender.touchEnd();
  }

  assert_event_array_equivalent(actual, expected);
  this.done();
}, 'Rerouting mouse/touch event test but the id of hit region is unset.');

async_test(function() {
  context.clearRect(0, 0, 400, 400);
  context.rect(0, 0, 50, 50);
  context.fill();
  context.addHitRegion({ id: 'button', control: button });
  context.beginPath();
  context.rect(50, 0, 50, 50);
  context.fill();
  context.addHitRegion({ id: 'button2', control: button2 });

  var expected = [
    { type: 'mousemove', target: button, region: 'button' },
    { type: 'mousemove', target: button2, region: 'button2' },
    { type: 'touchmove', target: button, region: 'button' },
    { type: 'touchmove', target: button, region: 'button' },
  ];
  var actual = [];

  button.addEventListener('mousemove', e => actual.push(e));
  button2.addEventListener('mousemove', e => actual.push(e));
  button.addEventListener('touchmove', e => actual.push(e));
  button2.addEventListener('touchmove', () => assert_unreached());

  if (eventSender) {
    eventSender.mouseMoveTo(10, 10);
    eventSender.mouseMoveTo(60, 10);

    eventSender.clearTouchPoints();
    eventSender.addTouchPoint(10, 10);
    eventSender.touchStart();
    eventSender.updateTouchPoint(0, 11, 11);
    eventSender.touchMove();
    eventSender.updateTouchPoint(0, 60, 10);
    eventSender.touchMove();
    eventSender.releaseTouchPoint(0);
    eventSender.touchEnd();
  }

  assert_event_array_equivalent(actual, expected);
  this.done();
}, 'Touch events are defined to have "implicit capture".');

async_test(function() {
  var tmp_canvas = document.createElement('canvas');

  var without_initializer = new MouseEvent('click');
  assert_equals(without_initializer.region, null);

  var default_value = new MouseEvent('click', {});
  assert_equals(default_value.region, null);

  var set_null = new MouseEvent('click', { region: null });
  assert_equals(set_null.region, null);

  var set_region = new MouseEvent('click', { region: 'test' });
  assert_equals(set_region.region, 'test');

  var called = [];
  tmp_canvas.addEventListener('click', e => { tmp_canvas.remove(); called.push(e.region) });
  tmp_canvas.addEventListener('click', e => { tmp_canvas.remove(); called.push(e.region) });

  tmp_canvas.dispatchEvent(set_null);
  tmp_canvas.dispatchEvent(set_region);
  assert_array_equals(called, [ null, null, 'test', 'test' ]);
  this.done();
}, 'MouseEventInit.');

async_test(function() {
  var tmp_canvas = document.createElement('canvas');

  var touch1 = new Touch({
      identifier: 0,
      target: tmp_canvas
  });
  var touch2 = new Touch({
      identifier: 0,
      target: tmp_canvas,
      region: null
  });
  var touch3 = new Touch({
      identifier: 0,
      target: tmp_canvas,
      region: 'touch'
  });

  var touch_event = new TouchEvent('touchstart', {
    touches: [touch1, touch2, touch3],
    targetTouches: [touch1, touch3]
  });

  assert_equals(touch_event.touches.length, 3);
  assert_equals(touch_event.touches[0].region, null);
  assert_equals(touch_event.touches[1].region, null);
  assert_equals(touch_event.touches[2].region, 'touch');
  assert_equals(touch_event.targetTouches.length, 2);
  assert_equals(touch_event.targetTouches[0].region, null);
  assert_equals(touch_event.targetTouches[1].region, 'touch');

  var called = [];
  tmp_canvas.addEventListener('touchstart', function(e) {
    tmp_canvas.remove();
    called.push(e.touches[0].region);
    called.push(e.touches[1].region);
    called.push(e.touches[2].region);
  });

  tmp_canvas.addEventListener('touchstart', function(e) {
    tmp_canvas.remove();
    called.push(e.touches[0].region);
    called.push(e.touches[1].region);
    called.push(e.touches[2].region);
  });

  tmp_canvas.dispatchEvent(touch_event);
  assert_array_equals(called, [ null, null, 'touch', null, null, 'touch' ]);
  this.done();
}, 'TouchEventInit.');

</script>
