blob: 2ba71ae261349a10a862e4ab23be2554a2fdb6e2 [file] [log] [blame]
<!DOCTYPE html>
<body>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../forms/resources/common.js"></script>
<div id="log"></div>
<div id="container"></div>
<script>
if (!window.eventSender)
document.body.textContent = 'This test requires window.eventSender.';
test(function() {
var container = document.querySelector('#container');
container.innerHTML = '<input id=prev><div style="height:200px;"><span>text</span></div><input id=next>';
hoverOverElement(container.querySelector('span'));
eventSender.mouseDown();
eventSender.keyDown('\t');
assert_equals(document.activeElement.id, 'next');
eventSender.mouseUp();
hoverOverElement(container.querySelector('div'));
eventSender.mouseDown();
eventSender.keyDown('\t', ['shiftKey']);
assert_equals(document.activeElement.id, 'prev');
eventSender.mouseUp();
container.innerHTML = '<span style="font-size:60px;"><input id=prev>Text Text<input id=next></span>';
hoverOverElement(container.querySelector('span'));
eventSender.mouseDown();
eventSender.keyDown('\t');
assert_equals(document.activeElement.id, 'next');
eventSender.mouseUp();
hoverOverElement(container.querySelector('span'));
eventSender.mouseDown();
eventSender.keyDown('\t', ['shiftKey']);
assert_equals(document.activeElement.id, 'prev');
eventSender.mouseUp();
}, 'Mouse press should update sequential focus navigation starting point.');
test(function() {
var container = document.querySelector('#container');
container.innerHTML = '<a href="#fragment"></a><input id=prev><a name="fragment"></a><input id=next>';
container.querySelector('a').click();
eventSender.keyDown('\t');
assert_equals(document.activeElement.id, 'next');
}, 'Fragment navigation should update sequential focus navigation starting point.');
test(function() {
var container = document.querySelector('#container');
container.innerHTML = '<input id=prev><input id=start><input id=next>';
container.querySelector('#start').focus();
container.querySelector('#start').blur();
eventSender.keyDown('\t');
assert_equals(document.activeElement.id, 'next');
}, 'Focusing an element should update sequential focus navigation starting point.');
test(function() {
var container = document.querySelector('#container');
container.innerHTML = '<input id=prev><input id=start><input id=next>';
container.querySelector('#start').focus();
container.querySelector('#start').remove();
eventSender.keyDown('\t');
assert_equals(document.activeElement.id, 'next');
container.innerHTML = '<input id=prev><input id=start><input id=next>';
container.querySelector('#start').focus();
container.querySelector('#start').remove();
eventSender.keyDown('\t', ['shiftKey']);
assert_equals(document.activeElement.id, 'prev');
}, 'After removing a focused element from the documen tree, sequential focus navigation should start at a place where the focused element was.');
test(function() {
const container = document.querySelector('#container');
container.innerHTML = '<input id="before"><div></div><input id="after">';
const host = container.querySelector('div');
const shadowRoot = host.attachShadow({mode:'closed'});
let buttonInShadow = document.createElement('button');
shadowRoot.appendChild(buttonInShadow);
buttonInShadow.focus();
assert_equals(shadowRoot.activeElement, buttonInShadow);
buttonInShadow.remove();
eventSender.keyDown('\t');
assert_equals(document.activeElement.id, 'after', 'Forward');
buttonInShadow = document.createElement('button');
shadowRoot.appendChild(buttonInShadow);
buttonInShadow.focus();
assert_equals(shadowRoot.activeElement, buttonInShadow);
buttonInShadow.remove();
eventSender.keyDown('\t', ['shiftKey']);
assert_equals(document.activeElement.id, 'before', 'Backward');
}, 'Disconnecting a focused element in a shadow tree');
test(function() {
const container = document.querySelector('#container');
container.innerHTML = '<input id="before"><div></div><input id="after">';
let host = container.querySelector('div');
let shadowRoot = host.attachShadow({mode:'closed'});
let buttonInShadow = document.createElement('button');
shadowRoot.appendChild(buttonInShadow);
buttonInShadow.focus();
assert_equals(shadowRoot.activeElement, buttonInShadow);
host.remove();
eventSender.keyDown('\t');
assert_equals(document.activeElement.id, 'after', 'Forward');
container.insertBefore(host, container.lastChild);
buttonInShadow.focus();
assert_equals(shadowRoot.activeElement, buttonInShadow);
host.remove();
eventSender.keyDown('\t', ['shiftKey']);
assert_equals(document.activeElement.id, 'before', 'Backward');
}, 'Disconnecting a shadow tree including a focused element');
test(function() {
// crbug.com/897403
const container = document.querySelector('#container');
container.innerHTML = '<input id="before"><span><div></div><div></div></span><input id="after">';
let host = container.querySelector('div');
let hostParent = host.parentNode;
let shadowRoot = host.attachShadow({mode:'closed'});
let buttonInShadow = document.createElement('button');
shadowRoot.appendChild(buttonInShadow);
buttonInShadow.focus();
assert_equals(shadowRoot.activeElement, buttonInShadow);
hostParent.innerHTML = '';
eventSender.keyDown('\t');
assert_equals(document.activeElement.id, 'after', 'Forward');
}, 'Disconnecting a shadow tree including a focused element 2');
test(function() {
var container = document.querySelector('#container');
container.innerHTML = '<input id="i1"><input id="i2"><input id="i3">';
container.querySelector('#i3').click();
container.querySelector('#i1').scrollIntoView();
eventSender.keyDown('\t');
assert_equals(document.activeElement.id, 'i2');
}, 'Element.scrollIntoView() should update sequential focus navigation starting point.');
test(function() {
var container = document.querySelector('#container');
container.innerHTML = '<span>Lorem</span><span tabindex="0" id="ipsum">ipsum</span><span>dolor</span><span tabindex="0" id="sit">sit</span><span>amet</span>';
testRunner.findString("dolor", []);
eventSender.keyDown('\t');
assert_equals(document.activeElement.id, 'sit');
testRunner.findString("Lorem", []);
eventSender.keyDown('\t');
assert_equals(document.activeElement.id, 'ipsum');
testRunner.findString("amet", []);
eventSender.keyDown('\t', ['shiftKey']);
assert_equals(document.activeElement.id, 'sit');
}, 'Find text should update sequential focus navigation starting point.');
var t = async_test('Cross-frame sequential focus navigation should clear per-document starting point.');
t.step(() => {
var container = document.querySelector('#container');
container.innerHTML = '<iframe tabindex=0 srcdoc="<input id=inner1><input id=inner2>"></iframe><input id=outer1>';
var iframe = container.firstChild;
document.querySelector('#outer1').addEventListener('focus', () => { iframe.focus() }, false);
iframe.addEventListener('load', t.step_func(() => {
var inner2 = iframe.contentDocument.querySelector('#inner2');
inner2.focus();
eventSender.keyDown('\t');
eventSender.keyDown('\t', ['shiftKey']);
assert_equals(iframe.contentDocument.activeElement, inner2);
t.done();
}), false);
});
</script>
</body>