chromium/third_party/blink/web_tests/fast/events/selectionchange-iframe.html

<!DOCTYPE html>
<html>
<body>
<p>This tests that changing selection in an iframe does not fire selectionchange event in the parent document and vice versa.</p>
<div id="container">
<iframe id="child" src="about:blank"></iframe>
<div id="parent">WebKit rocks</div>
</div>
<ul id="console">
</ul>
<script>

var parent = document.getElementById('parent');
var child = document.getElementById('child');
var childDocument = (child.contentWindow || child.contentDocument).document;
if (!childDocument.body)
   childDocument.appendChild(document.createElement('body'));
childDocument.body.innerHTML = 'hello world';

var selectionOfParent = window.getSelection();
var selectionOfChild = child.contentDocument.getSelection();

tests = [
    {
        selector: function() {
            selectionOfParent.selectAllChildren(document.body);
            return "all of parent's document body";
            },
        expected: 'parent',
        alt_expected: null,
    },
    {
        selector: function() {
                selectionOfChild.selectAllChildren(childDocument.body);
                return "all of parent's document body";
            },
        expected: 'child',
        alt_expected: null,
    },
    {
        selector: function() {
                var range = document.createRange();
                range.setStart(parent.firstChild, 7);
                range.setEnd(parent.firstChild, 12);
                selectionOfParent.removeAllRanges();
                selectionOfParent.addRange(range);
                return '"rocks" of "WebKit rocks" in the parent';
            },
        expected: 'parent, parent',
        alt_expected: 'parent',
    },
    {
        selector: function() {
                var range = childDocument.createRange();
                range.setStart(childDocument.body.firstChild, 6);
                range.setEnd(childDocument.body.firstChild, 11);
                selectionOfChild.removeAllRanges();
                selectionOfChild.addRange(range);
                return '"world" of "hello world" in the child';
            },
        expected: 'child, child',
        alt_expected: 'child',
    }
];
var i = 0;
var selected = null;

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

var log = [];

function logger(event) {
    if (event.target == childDocument)
        log.push('child');
    else if (event.target == document)
        log.push('parent');
    else
        log.push('unknown');
}

function verify(selected, expected, alt_expected) {
    setTimeout(function () {
        var actual = log.length ? '' : 'none';
        for (var i = 0; i < log.length; i++) {
            if (actual.length)
                actual += ', ';
            actual += log[i];
        }
        var result = 'selecting ' + selected + ' fired selection change events from ' + actual;
        if (actual == expected || actual == alt_expected)
            result = 'PASS: ' + result;
        else
            result = 'FAIL: ' + result + ' but expected ' + expected + (alt_expected ? ' or ' + alt_expected : '');
        var console = document.getElementById('console');
        var listItem = document.createElement('li');
        console.appendChild(listItem);
        listItem.appendChild(document.createTextNode(result));
    }, 0);
}

// selects and verify in turn until all tests are ran
function timer() {
    if (!selected) {
        log = [];
        selected = tests[i].selector();
    } else {
        verify(selected, tests[i].expected, tests[i].alt_expected);
        selected = null;
        i++;
        if (i == tests.length) {
            if (window.testRunner)
                document.getElementById('container').style.display = 'none';
            testRunner.notifyDone();
            return;
        }
    }
    setTimeout(timer, 0);
}

document.addEventListener('selectionchange', logger, false);
childDocument.onselectionchange = logger;

timer();

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