<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script type="text/javascript" src="pointerevent_support.js"></script>
<style>
iframe {
  width: 300px;
  height: 300px;
  top: 100px;
  left: 100px;
  border: 0;
  position: absolute;
  background: green;
}
#outerFrame {
  width: 500px;
  height: 500px;
  background: blue;
}
body {
  touch-action:none;
}
</style>
<body id="outerFrame body" onload="run()">
<div id='outerFrame'>
<iframe id='innerFrameElement' src="resources/pointerevent_pointercapture-iframe.html"></iframe>
</div>
</body>
<script>
var receivedEventList = [];
var start_logging = false;
function handleEvent(event) {
  if (event.type == 'pointerdown') {
    start_logging = true;
    if (document.setPointerCaptureOnPointerDown) {
      event.target.setPointerCapture(event.pointerId);
    }
  }

  if (event.type == "pointermove") {
    if (document.releasePointerCaptureOnFirstMove && event.target.hasPointerCapture(event.pointerId))
        event.target.releasePointerCapture(event.pointerId);
  }
  if (start_logging)
    receivedEventList.push(event.target.id + ' received ' + event.type);
};

document.testEventList = ['pointerup', 'pointerdown', 'pointermove', 'gotpointercapture', 'lostpointercapture'];
document.testEventList.forEach(function(eventName) {
  document.getElementById('outerFrame').addEventListener(eventName, handleEvent);
});

function Reset() {
  document.setPointerCaptureOnPointerDown = false;
  document.releasePointerCaptureOnFirstMove = false;
  receivedEventList = [];
  start_logging = false;
}

function run() {
    ALL_POINTERS.forEach(function(pointerType) {
        promise_test (async() => {
            Reset();
            document.setPointerCaptureOnPointerDown = true;
            expectedEventList = ["innerFrame received pointerdown",
                                 "innerFrame received gotpointercapture",
                                 "innerFrame received pointermove",
                                 "innerFrame received pointermove",
                                 "innerFrame received pointerup",
                                 "innerFrame received lostpointercapture"];
            var pointerId = pointerType + "Pointer1";
            await new test_driver.Actions()
                                 .addPointer(pointerId, pointerType)
                                 .pointerMove(200, 200)
                                 .pointerDown()
                                 .pointerMove(150, 150)
                                 .pointerMove(50, 50)
                                 .pointerUp()
                                 .send();
            assert_array_equals(receivedEventList, expectedEventList, "Received events: " + receivedEventList);
            document.setPointerCaptureOnPointerDown = false;
        }, "Test " + pointerType + "pointer capture in same-origin frame: Pointer down at inner frame and set pointer capture.");

        promise_test (async() => {
            Reset();
            document.setPointerCaptureOnPointerDown = true;
            expectedEventList = ["outerFrame received pointerdown",
                                 "outerFrame received gotpointercapture",
                                 "outerFrame received pointermove",
                                 "outerFrame received pointerup",
                                 "outerFrame received lostpointercapture"];
            var pointerId = pointerType + "Pointer1";
            await new test_driver.Actions()
                                 .addPointer(pointerId, pointerType)
                                 .pointerMove(25, 25)
                                 .pointerDown()
                                 .pointerMove(200, 200)
                                 .pointerUp()
                                 .send();
            assert_array_equals(receivedEventList, expectedEventList, "Received events: " + receivedEventList);
            document.setPointerCaptureOnPointerDown = false;
        }, "Test " + pointerType + "pointer capture in same-origin frame: Pointer down at outer frame body and set pointer capture.");


        promise_test (async() => {
            Reset();
            document.setPointerCaptureOnPointerDown = true;
            document.releasePointerCaptureOnFirstMove = true;
            // Mouse event has the frame capture, so after pointer capture released, events are
            // dispatched to innerFrameDocument.
            expectedEventList = ["innerFrame received pointerdown",
                                 "innerFrame received gotpointercapture",
                                 "innerFrame received pointermove",
                                 "innerFrame received lostpointercapture",
                                 (pointerType == "touch" ? "outerFrame": "innerFrameDocument") + " received pointermove",
                                 (pointerType == "touch" ? "outerFrame": "innerFrameDocument") + " received pointerup",];
            var pointerId = pointerType + "Pointer1";
            await new test_driver.Actions()
                                 .addPointer(pointerId, pointerType)
                                 .pointerMove(200, 200)
                                 .pointerDown()
                                 .pointerMove(150, 150)
                                 .pointerMove(50, 50)
                                 .pointerUp()
                                 .send();
            assert_array_equals(receivedEventList, expectedEventList, "Received events: " + receivedEventList);
            document.releasePointerCaptureOnFirstMove = false;
            document.setPointerCaptureOnPointerDown = false;
        }, "Test " + pointerType + "pointer capture in same-origin frame: Pointerdown with set capture at inner frame, then release on next pointermove.");


        promise_test (async() => {
            Reset();
            document.setPointerCaptureOnPointerDown = true;
            document.releasePointerCaptureOnFirstMove = true;
            expectedEventList = ["outerFrame received pointerdown",
                                 "outerFrame received gotpointercapture",
                                 "outerFrame received pointermove",
                                 "outerFrame received lostpointercapture",
                                 "innerFrame received pointermove",
                                 "innerFrame received pointerup"];
            var pointerId = pointerType + "Pointer1";
            await new test_driver.Actions()
                                 .addPointer(pointerId, pointerType)
                                 .pointerMove(50, 50)
                                 .pointerDown()
                                 .pointerMove(200, 200)
                                 .pointerMove(250, 250)
                                 .pointerUp()
                                 .send();
            assert_array_equals(receivedEventList, expectedEventList, "Received events: " + receivedEventList);
            document.releasePointerCaptureOnFirstMove = false;
            document.setPointerCaptureOnPointerDown = false;
        }, "Test " + pointerType + "pointer capture in same-origin frame: Pointerdown with set capture at outer frame, then release on next pointermove.");
    });
}
</script>

