blob: b609ac15737da48a659206eda9fb1044e6e67c2d [file] [log] [blame]
<!DOCTYPE html>
<script src='../resources/testharness.js'></script>
<script src='../resources/testharnessreport.js'></script>
<script src='resources/shadow-dom.js'></script>
<script src='resources/focus-utils.js'></script>
<style>
div { background-color: white; }
div:focus { background-color: green; }
</style>
<body>
<div id='sandbox'></div>
</body>
<script>
'use strict';
// Test if :focus matching state of shadow host is properly handled in case of DOM mutation.
function buildTree(parent, delegatesFocus)
{
parent.innerHTML = '<div id="host"></div><div id="dest"></div>';
let host = parent.querySelector('#host');
host.attachShadow({mode: 'open', delegatesFocus: delegatesFocus});
host.shadowRoot.innerHTML = '<input id="input">';
}
let sandbox = document.getElementById('sandbox');
test(() => {
buildTree(sandbox, false);
const host = getNodeInComposedTree('host');
const input = getNodeInComposedTree('host/input');
const dest = getNodeInComposedTree('dest');
assert_background_color('host', 'rgb(255, 255, 255)');
input.focus();
assert_background_color('host', 'rgb(255, 255, 255)');
dest.appendChild(input);
assert_background_color('host', 'rgb(255, 255, 255)');
input.focus();
host.shadowRoot.appendChild(input);
assert_background_color('host', 'rgb(255, 255, 255)');
}, '(1/2) DOM mutation across shadow boundary with delegatesFocus=false');
test(() => {
buildTree(sandbox, true);
const host = getNodeInComposedTree('host');
const input = getNodeInComposedTree('host/input');
const dest = getNodeInComposedTree('dest');
assert_background_color('host', 'rgb(255, 255, 255)');
input.focus();
assert_background_color('host', 'rgb(0, 128, 0)');
dest.appendChild(input);
assert_background_color('host', 'rgb(255, 255, 255)');
input.focus();
host.shadowRoot.appendChild(input);
// appendChild() will blur the focus from input element, thus input is no longer focused.
assert_background_color('host', 'rgb(255, 255, 255)');
}, '(2/2) DOM mutation across shadow boundary with delegatesFocus=true');
</script>