<!DOCTYPE html>
<html>
  <head>
    <title>PointerCapture for Custome Shadow DOM</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width">
    <link rel="help" href= "https://bugs.chromium.org/p/chromium/issues/detail?id=810882">
    <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>
       class WC extends HTMLElement{
        constructor(){
          super();
          let template = document.getElementById('template-wc');
          let node = template.content.cloneNode(true) ;

          let shadowRoot = this.attachShadow({mode: 'open'});
          shadowRoot.appendChild(node);
        }
       }
       customElements.define("wc-wc", WC);
    </script>
    </head>
  <body onload="onLoad()">
    <template id="template-wc">
      <style>
          #content{
              height:50px;
              width:50px;
              background-color: magenta;
          }
      </style>
      <div id="content"></div>
    </template>
    <h4>PointerCapture by Custom Element's Shadow DOM</h4>
      The magenta box below is part of a custom element's Shadow DOM.
    <ul>
      <li> Click left mouse button inside the box and keep mouse button depressed</li>
      <li> Move the mouse</li>
      <li> There should be a message stating <em>Pointer was captured by custom element's Shadow DOM!</em></li>
      <li> Release left mouse button</li>
      <li> There should be a message stating <em>Pointer was released by custom element's Shadow DOM!</em></li>
    </ul>

    <wc-wc id="wc-wc"></wc-wc>
    <div id="log"></div>
    <script>
      function onLoad(){
        var logDiv = document.getElementById("log");
        function logMessage(message){
          var log = document.createElement("div");
          var messageNode = document.createTextNode(message);
          log.appendChild(messageNode);
          logDiv.appendChild(log);
        }
        var events = [];

        var content = document.getElementById("wc-wc")
           .shadowRoot.getElementById("content");

        content.addEventListener("pointerdown", function(e){
          content.setPointerCapture(e.pointerId);
          events.push("pointerdown@content");
        });
        content.addEventListener("gotpointercapture", function(e){
          logMessage("Pointer was captured by custom element's Shadow DOM!");
          events.push("gotpointercapture@content");
        });
        content.addEventListener("pointerup", function(e){
          content.releasePointerCapture(e.pointerId);
          events.push("pointerup@content");
        });
        content.addEventListener("lostpointercapture", function(e){
          logMessage("Pointer was released by custom element's Shadow DOM!");
          events.push("lostpointercapture@content");
          if(window.promise_test && wc_shadow_dom_test){
            wc_shadow_dom_test.step(function(){
              assert_array_equals(events, ["pointerdown@content",
                "gotpointercapture@content", "pointerup@content",
                "lostpointercapture@content"]);
              resolve_test();
            });
          }
        });

        var wc_shadow_dom_test = null;
        var resolve_test = null;
        var reject_test = null;

        function cleanup(){
          events = [];
          shadow_dom_test = null;
          resolve_test = null;
          reject_test = null;
        }
        if(window.promise_test){
          promise_test(async function(t){
            var actions_promise;
            return new Promise(async function(resolve, reject){
              wc_shadow_dom_test = t;
              resolve_test = resolve;
              reject_test = reject;
              t.add_cleanup(function(){
                cleanup();
              });
              var contentRect = content.getBoundingClientRect();
              var actions = new test_driver.Actions();
              actions_promise = actions
                .pointerMove(Math.ceil(contentRect.x), Math.ceil(contentRect.y))
                .pointerDown({button: actions.ButtonType.LEFT})
                .pointerUp({button: actions.ButtonType.LEFT})
                .send();
            }).then(async()=>{
              await actions_promise;
              t.done();
            });
          }, "PointerCapture works for custom element Shadow DOM.");
        }
      }
    </script>
  </body>
</html>
