<!doctype html>
<html>
    <head>
        <title>click event target during capture</title>
        <meta name="viewport" content="width=device-width">
        <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="pointerevent_support.js"></script>
        <script src="/resources/testdriver.js"></script>
        <script src="/resources/testdriver-actions.js"></script>
        <script src="/resources/testdriver-vendor.js"></script>
        <style>
        .box {
          margin: 10px;
        }
        #grey {
          background: grey;
        }
        #blue {
          background: blue;
        }
        #green {
          background: green;
        }
        </style>
        <script type="text/javascript">
            PhaseEnum = {
              Phase1:               "phase1",
              Phase2:               "phase2",
              Phase1WithCapturing:  "phase1withcapturing",
              Phase2WithCapturing:  "phase2withcapturing",
            }
            var phase;
            var receivedEvents;

            function resetTestState() {
              phase = PhaseEnum.Phase1;
              receivedEvents = [];
            }

            function run() {
                var test_pointerEvent = setup_pointerevent_test("click target during capture", ['mouse']);
                var grey = document.getElementById('grey');
                var blue = document.getElementById('blue');
                var green = document.getElementById('green');
                var actions_promise;

                ['gotpointercapture', 'lostpointercapture', 'pointerdown', 'pointerup', 'click'].forEach(function(eventName) {
                  [grey, blue, green].forEach(function(target) {
                    target.addEventListener(eventName, function(event) {
                      if (event.eventPhase == event.AT_TARGET) {
                        receivedEvents.push(event.type + '@' + target.id);
                        if (phase == PhaseEnum.Phase1 && target == green && event.type == 'click') {
                            test(function() {
                              assert_equals(receivedEvents.join(','), 'pointerdown@green,pointerup@green,click@green', 'An element should only receive click when it is the first common ancestor of pointerdown and pointerup targets');
                            }, "Click target when pointerup/down targeted at the same element with no capture");
                            phase = PhaseEnum.Phase2;
                            receivedEvents = [];
                        }
                        if (phase == PhaseEnum.Phase2 && target == grey && event.type == 'click') {
                            test(function() {
                              assert_equals(receivedEvents.join(','), 'pointerdown@blue,pointerup@green,click@grey', 'An element should only receive click when it is the first common ancestor of pointerdown and pointerup targets');
                            }, "Click target when pointerup/down targeted at different elements with no capture");
                            phase = PhaseEnum.Phase1WithCapturing;
                            receivedEvents = [];
                        }
                        if (target == blue && event.type == 'lostpointercapture') {
                          if (phase == PhaseEnum.Phase1WithCapturing) {
                            test_pointerEvent.step(function() {
                              assert_equals(receivedEvents.join(','), 'pointerdown@green,gotpointercapture@blue,pointerup@blue,click@grey,lostpointercapture@blue', 'An element should only receive click when it is the first common ancestor of pointerdown and pointerup targets');
                            });
                            phase = PhaseEnum.Phase2WithCapturing;
                            receivedEvents = [];
                          } else if (phase == PhaseEnum.Phase2WithCapturing) {
                            test_pointerEvent.step(function() {
                              assert_equals(receivedEvents.join(','), 'pointerdown@blue,gotpointercapture@blue,pointerup@blue,click@blue,lostpointercapture@blue', 'An element should only receive click when it is the first common ancestor of pointerdown and pointerup targets');
                            });
                            // Make sure the test finishes after all the input actions are completed.
                            actions_promise.then( () => {
                              test_pointerEvent.done();
                            });
                          }
                        }
                        if (event.type == 'pointerdown' && (target == blue || target == green)) {
                          if (phase == PhaseEnum.Phase1WithCapturing || phase == PhaseEnum.Phase2WithCapturing)
                            blue.setPointerCapture(event.pointerId);
                        }
                      }
                    });
                  });
                });

                // Inject mouse inputs.
                var actions_promise = new test_driver.Actions()
                    .pointerMove(0, 0, {origin: green})
                    .pointerDown()
                    .pointerUp()
                    .pointerMove(0, 0, {origin: blue})
                    .pointerDown()
                    .pointerMove(0, 0, {origin: green})
                    .pointerUp()
                    .pointerMove(0, 0, {origin: green})
                    .pointerDown()
                    .pointerUp()
                    .pointerMove(0, 0, {origin: blue})
                    .pointerDown()
                    .pointerMove(0, 0, {origin: green})
                    .pointerUp()
                    .send();

            }
        </script>
    </head>
    <body onload="run()">
        <h1>Pointer Event: click event during capture</h1>
        <h2 id="pointerTypeDescription"></h2>
        <h4>Test Description:
            Click event should be sent to the first common ancestor of the pointerdown and pointerup targets.
            <ol>
                 <li>Click on the green box with the left button of mouse.</li>
                 <li>Press down the left button on the blue box and drag to the green box and release the button.</li>
                 <li>Repeat the two steps above once again.</li>
            </ol>
        </h4>
        <br>
        <div>
          <div id="grey" class="box">
            <div id="green" class="box"></div>
            <div id="blue" class="box"></div>
          </div>
        </div>
    </body>
</html>
