<!doctype html>
<html>
  <head>
    <title>Pointer Event: Boundary event sequence at implicit capture release</title>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
    <link rel="author" title="Google" href="http://www.google.com "/>
    <meta name="assert" content="When a captured pointer is implicitly released after a click, the boundary events should follow the lostpointercapture event."/>
    <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script src="/resources/testdriver.js"></script>
    <script src="/resources/testdriver-actions.js"></script>
    <script src="/resources/testdriver-vendor.js"></script>
    <script type="text/javascript" src="pointerevent_support.js"></script>
    <script type="text/javascript">
      var detected_pointertypes = {};
      var event_log = [];
      var start_logging = false;

      function resetTestState() {
        detected_eventTypes = {};
        event_log = [];
        start_logging = false;
      }

      function run() {
        var test_pointer_event = setup_pointerevent_test("Event sequence at implicit release on click", ["mouse"]);

        var target = document.getElementById("target");
        var capture_target = document.getElementById("capture-target");

        All_Pointer_Events.forEach(function(eventName) {
          on_event(target, eventName, function (event) {
            detected_pointertypes[event.pointerType] = true;

            if (event.type == "pointerdown") {
              capture_target.setPointerCapture(event.pointerId);
              start_logging = true;
            } else if (start_logging) {
              event_log.push(event.type + '@' + event.target.id);
            }
          });

          on_event(capture_target, eventName, function (event) {
            detected_pointertypes[event.pointerType] = true;
            event_log.push(event.type + '@' + event.target.id);
            if (event.type == 'lostpointercapture') {
              step_timeout(function() {
                test_pointer_event.step(function () {
                  var expected_events = "pointerup, lostpointercapture, pointerout, pointerleave";
                  assert_equals(event_log.join(", "), "pointerout@target, pointerleave@target, pointerover@capture-target, pointerenter@capture-target, gotpointercapture@capture-target, pointerup@capture-target, lostpointercapture@capture-target, pointerout@capture-target, pointerleave@capture-target, pointerover@target, pointerenter@target");
                });
                test_pointer_event.done();
              }, 200);
            }
          });
        });

        // Inject mouse inputs.
        new test_driver.Actions()
          .pointerMove(0, 0, {origin: target})
          .pointerDown()
          .pointerUp()
          .send();
      }
    </script>
    <style>
      #target {
        margin: 20px;
        background-color: black;
      }
    </style>
  </head>
  <body onload="run()">
    <h1>Pointer Event: Boundary event sequence at implicit capture release</h1>
    <h2 id="pointerTypeDescription"></h2>
    <h4>
      When a captured pointer is implicitly released after a click, the boundary events should follow the lostpointercapture event.
    </h4>
    <ol>
      <li>Click on the black box with mouse and do not move the mouse after or during the click.</li>
    </ol>
    <div id="capture-target"></div>
    <div id="target"></div>
    <div id="complete-notice">
      <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
      <p>The following events were logged: <span id="event-log"></span>.</p>
    </div>
    <div id="log"></div>
  </body>
</html>
