blob: 8da24b1dd91c3a66aff4f28e4d282532d5c00c4d [file] [log] [blame]
<!DOCTYPE html>
<html>
<body>
<p>Tests for setting a negative tabindex on shadow host. Elements inside such a shadow tree should not be in the sequential navigation order.<br>
To manually test, press tab key four times. It should traverse focusable elements in the increasing numerical order.</p>
<div id="test-content">
<div id="first" tabindex="1">1. First sequentially focusable element</div>
<iframe src="about:blank">2. An iframe without a focusable element</iframe>
<iframe src="about:blank">An iframe with a focusable element should not be focused</iframe>
<iframe src="about:blank">5. An iframe without a focusable shadow host or shadow content</iframe>
<iframe src="about:blank">An iframe with a focusable shadow content should not be focused (1)</iframe>
<iframe src="about:blank">An iframe with a focusable shadow content should not be focused (2)</iframe>
</div>
<pre></pre>
<script>
var oldActiveElement = null;
function log()
{
setTimeout(function () {
var newActiveElement = document.activeElement;
if (newActiveElement instanceof HTMLIFrameElement) {
var contentDocument = newActiveElement.contentDocument;
var activeElementInsideFrame = contentDocument.activeElement;
if (activeElementInsideFrame != contentDocument.body && activeElementInsideFrame != contentDocument.documentElement /* Firefox */)
newActiveElement = activeElementInsideFrame;
}
if (newActiveElement.shadowRoot) {
var activeElementInShadow = newActiveElement.shadowRoot.activeElement;
if (activeElementInShadow)
newActiveElement = activeElementInShadow;
}
if (oldActiveElement == newActiveElement || newActiveElement == document.body)
return;
oldActiveElement = newActiveElement;
document.querySelector('pre').textContent += newActiveElement.textContent + '\n';
}, 0);
}
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
window.onload = function () {
document.onkeydown = log;
var iframes = document.querySelectorAll('iframe');
for (var i = 0; i < iframes.length; i++)
iframes[i].contentDocument.onkeydown = log;
iframes[0].contentDocument.body.innerHTML = 'Content of an iframe without a focusable element should not be focused';
iframes[1].contentDocument.body.innerHTML = `
<div tabindex="0" onfocus="top.log(this)">3. First focusable element inside an iframe</div>
<div tabindex="0" onfocus="top.log(this)">4. Second focusable element inside an iframe</div>`;
iframes[2].contentDocument.body.innerHTML = '<div>A non-focusable shadow host without a focusable content should not be focused</div>';
var host = iframes[2].contentDocument.body.querySelector('div');
var shadowRoot = host.attachShadow({mode: 'closed'});
shadowRoot.innerHTML = '<slot></slot>';
iframes[3].contentDocument.body.innerHTML = '<div></div>';
var host = iframes[3].contentDocument.querySelector('div');
var shadowRoot = host.attachShadow({mode: 'open'});
shadowRoot.innerHTML = '<div tabindex="0" onfocus="top.log(this)">6. Focusable content inside a shadow tree</div>';
iframes[4].contentDocument.body.innerHTML = '<div></div><i tabindex="1">7. A focusable element with a high tabindex</i><span></span>';
host = iframes[4].contentDocument.querySelector('div');
shadowRoot = host.attachShadow({mode: 'open'});
shadowRoot.innerHTML = '<div tabindex="0" onfocus="top.log(this)">8. Focusable content inside the first shadow tree</div>';
host = iframes[4].contentDocument.querySelector('span');
shadowRoot = host.attachShadow({mode: 'open'});
shadowRoot.innerHTML = '<div tabindex="0" onfocus="top.log(this)">9. Focusable content inside the second shadow tree</div>';
document.getElementById('first').focus();
document.onkeydown();
if (window.eventSender)
moveFocusForward(8);
}
function moveFocusForward(focusCount)
{
setTimeout(function () {
if (!focusCount)
return moveFocusBackward(8);
eventSender.keyDown('\t');
setTimeout(function () {
moveFocusForward(focusCount - 1);
}, 1);
}, 1);
}
function moveFocusBackward(focusCount)
{
setTimeout(function () {
if (!focusCount) {
document.getElementById('test-content').style.display = 'none';
testRunner.notifyDone();
return;
}
eventSender.keyDown('\t', ['shiftKey']);
setTimeout(function () {
moveFocusBackward(focusCount - 1);
}, 1);
}, 1);
}
</script>
</body>
</html>