<!DOCTYPE html>
<html>
<body onload="adopt()">
<p>This tests adopting a parent iframe (i.e. the iframe contains the document into which iframe is adopted). WebKit should not hang and should throw a hierarchy request exception.</p>
<div>Adopting parent frame: <span id="child"></span></div>
<div>Adopting grandparent frame: <span id="grandchild"></span></div>
<script>

if (window.testRunner)
    testRunner.dumpAsText();

function createFrame(id, parent) {
    var iframe = document.createElement('iframe');
    if (parent)
        parent.contentDocument.body.appendChild(iframe);
    else
        document.body.appendChild(iframe);
    iframe.contentDocument.body.appendChild(iframe.contentDocument.createTextNode(id));    
    iframe.contentDocument.body.appendChild(iframe.contentDocument.createElement('br'));
    iframe.style.width = '70%';
    iframe.style.height = '40%';
    return iframe;
}

var parent = createFrame('parent');
var child = createFrame('child', parent);
var grandchild = createFrame('grandchild', child);

function log(id, message) {
    document.getElementById(id).innerHTML = message;
}

function testChild(id, action) {
    try {
        action();
    } catch(error) {
        if (error.name == 'HierarchyRequestError')
            log(id, 'PASS');
        else
            log(id, 'FAIL: got ' + error.name + ' but expected HierarchyRequestError');
        return;
    }
    log(id, 'FAIL: no exceptions thrown but expected HierarchyRequestError');
}

function adopt() {
    testChild('child', function () { child.contentDocument.adoptNode(parent); });
    testChild('grandchild', function () { grandchild.contentDocument.adoptNode(parent); });
}

</script>
</body>
</html>
