<!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>