chromium/third_party/blink/web_tests/fast/dom/MutationObserver/cross-document.html

<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test.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>
</body>
</html>