<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<div id="target">Target</div>
<div id="description">Test user gesture behavior during touch events.</div>

<script>

var cancelEvent = false;
var openedPopup = undefined;
function handler(e) {
    if (openedPopup !== undefined)
        assert_unreached("Handler invoked multiple times");

    var w = window.open("about:blank", "_blank");
    if (w) {
        w.close();
        openedPopup = true;
    } else {
        openedPopup = false;
    }

    if (cancelEvent)
        e.preventDefault;
}

var target = document.getElementById('target');

function testPopupOnEventDuring(eventType, expectPopup, operation) {
    openedPopup = undefined;
    target.addEventListener(eventType, handler);

    operation();

    assert_not_equals(openedPopup, undefined,
                      eventType + ' handler was not invoked');
    assert_equals(openedPopup, expectPopup);

    target.removeEventListener(eventType, handler);
}

if (window.testRunner) {
    testRunner.setCanOpenWindows();
    testRunner.setPopupBlockingEnabled(true);
}


var rect = target.getBoundingClientRect();
var targetX = rect.left + rect.width / 2;
var targetY = rect.top + rect.height / 2;

test(() => {
  cancelEvent = false;
  eventSender.addTouchPoint(targetX, targetY);
  testPopupOnEventDuring('touchstart', false, function() { eventSender.touchStart(); });
  eventSender.updateTouchPoint(0, targetX + 10, targetY);
  testPopupOnEventDuring('touchmove', false, function() { eventSender.touchMove(); });
  eventSender.notifyStartOfTouchScroll();
  eventSender.releaseTouchPoint(0);
  testPopupOnEventDuring('touchend', false, function() { eventSender.touchEnd(); });
}, "During a scroll, no touch events are user gestures");


test(() => {
cancelEvent = true;
eventSender.addTouchPoint(targetX, targetY);
testPopupOnEventDuring('touchstart', false, function() { eventSender.touchStart(); });
eventSender.updateTouchPoint(0, targetX + 10, targetY);
testPopupOnEventDuring('touchmove', false, function() { eventSender.touchMove(); });
eventSender.releaseTouchPoint(0);
testPopupOnEventDuring('touchend', true, function() { eventSender.touchEnd(); });
}, "During a drag that isn't a scroll, only touchend is a user gesture");

</script>
