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