<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test-pre.js"></script>
</head>
<body>
<script>

window.jsTestIsAsync = true;
var mutations;
var div, subDiv;

function testBasic() {
    var observer;

    function start() {
        debug('Testing basic aspects of cross-document observation.');

        mutations = null;
        div = document.createElement('div');
        observer = new MutationObserver(function(mutations) {
            window.mutations = mutations;
        });

        observer.observe(div, {attributes: true});
        var newDoc = document.implementation.createDocument('', '', null);
        newDoc.appendChild(div);
        div.id = 'foo';
        setTimeout(finish, 0);
    }

    function finish() {
        shouldBe('mutations.length', '1');
        shouldBe('mutations[0].type', '"attributes"');
        shouldBe('mutations[0].target', 'div');
        shouldBe('mutations[0].attributeName', '"id"');
        shouldBe('mutations[0].attributeNamespace', 'null');
        observer.disconnect();
        debug('');
        runNextTest();
    }

    start();
}

function testSubtree() {
    var observer;

    function start() {
        debug('Testing that subtree observation works after node is moved.');

        mutations = null;
        div = document.createElement('div');
        subDiv = div.appendChild(document.createElement('div'));
        observer = new MutationObserver(function(mutations) {
            window.mutations = mutations;
        });

        observer.observe(div, {attributes: true, subtree: true});
        var newDoc = document.implementation.createDocument('', '', null);
        newDoc.appendChild(div);
        subDiv.id = 'foo';
        setTimeout(finish, 0);
    }

    function finish() {
        shouldBe('mutations.length', '1');
        shouldBe('mutations[0].type', '"attributes"');
        shouldBe('mutations[0].target', 'subDiv');
        shouldBe('mutations[0].attributeName', '"id"');
        shouldBe('mutations[0].attributeNamespace', 'null');
        observer.disconnect();
        debug('');
        runNextTest();
    }

    start();
}

var tests = [testBasic, testSubtree];
var testIndex = 0;

function runNextTest() {
    if (testIndex < tests.length)
        tests[testIndex++]();
    else
        finishJSTest();
}

description('Test that MutationObservers move correctly across documents');

runNextTest();

</script>
<script src="../../../resources/js-test-post.js"></script>
</body>
</html>
