blob: 05c83b3b23fadc3903d2993d612529b83d732955 [file] [log] [blame]
<!DOCTYPE html>
<body>
<p>When the contents of an iframe have focus, the activeElement in the parent document should be the iframe element.</p>
<input id="input-0">
<iframe id="frame-1"></iframe>
<iframe id="frame-2"></iframe>
<pre id="out"></pre>
<script>
var doc0 = document;
var input0 = doc0.getElementById('input-0');
var iframe1 = doc0.getElementById('frame-1');
var doc1 = iframe1.contentDocument;
var input1 = doc1.body.appendChild(doc1.createElement('input'));
var iframe2 = doc0.getElementById('frame-2');
var doc2 = iframe2.contentDocument;
var input2 = doc2.body.appendChild(doc2.createElement('input'));
var iframe3 = doc1.body.appendChild(doc1.createElement('iframe'));
var doc3 = iframe3.contentDocument;
var input3 = doc3.body.appendChild(doc3.createElement('input'));
var iframe4 = doc2.body.appendChild(doc2.createElement('iframe'));
var doc4 = iframe4.contentDocument;
var input4 = doc4.body.appendChild(doc4.createElement('input'));
// Set up IDs for logging.
for (var i = 0; i < 5; i++) {
window['doc' + i].body.id = 'body-' + i;
if (i > 0)
window['iframe' + i].id = 'iframe-' + i;
window['input' + i].id = 'input-' + i;
}
function describe(obj)
{
if (obj === document)
return 'top';
if (obj.defaultView && obj.defaultView.frameElement)
return describe(obj.defaultView.frameElement);
return describe(obj.ownerDocument) + '/' + obj.id;
}
function print(s)
{
document.getElementById('out').textContent += s + '\n';
}
function assertActiveElement(doc, expected)
{
if (doc.activeElement === expected)
print('PASS: ' + describe(doc) + ' document.activeElement is ' + describe(doc.activeElement));
else
print('FAIL: ' + describe(doc) + ' document.activeElement is ' + describe(doc.activeElement) + ' but expected ' + describe(expected));
}
function setFocus(node, shouldFocusWindow)
{
print('\nFocusing ' + describe(node) + (shouldFocusWindow ? ' after focusing its window' : ''));
if (shouldFocusWindow)
node.ownerDocument.defaultView.focus();
node.focus();
}
function test(shouldFocusWindow)
{
setFocus(input0, shouldFocusWindow);
assertActiveElement(doc0, input0);
assertActiveElement(doc1, doc1.body);
assertActiveElement(doc2, doc2.body);
assertActiveElement(doc3, doc3.body);
assertActiveElement(doc4, doc4.body);
setFocus(input1, shouldFocusWindow);
assertActiveElement(doc0, iframe1);
assertActiveElement(doc1, input1);
assertActiveElement(doc2, doc2.body);
assertActiveElement(doc3, doc3.body);
assertActiveElement(doc4, doc4.body);
setFocus(input2, shouldFocusWindow);
assertActiveElement(doc0, iframe2);
assertActiveElement(doc1, doc1.body);
assertActiveElement(doc2, input2);
assertActiveElement(doc3, doc3.body);
assertActiveElement(doc4, doc4.body);
setFocus(input3, shouldFocusWindow);
assertActiveElement(doc0, iframe1);
assertActiveElement(doc1, iframe3);
assertActiveElement(doc2, doc2.body);
assertActiveElement(doc3, input3);
assertActiveElement(doc4, doc4.body);
setFocus(input4, shouldFocusWindow);
assertActiveElement(doc0, iframe2);
assertActiveElement(doc1, doc1.body);
assertActiveElement(doc2, iframe4);
assertActiveElement(doc3, doc3.body);
assertActiveElement(doc4, input4);
}
if (window.testRunner)
testRunner.dumpAsText();
// Test focusing elements directly.
test(false);
// Test focusing elements after focusing their windows first.
test(true);
</script>
</body>