<!DOCTYPE html>
<html>
<body>
    <pre id="console"></pre>
    <iframe id="aFrame"></iframe>
    <script>
        function log(msg)
        {
            document.getElementById('console').appendChild(document.createTextNode(msg + '\n'));
        }
    
        if (window.testRunner) {
            testRunner.dumpAsText();
            testRunner.waitUntilDone();
        }

        var targetWindow = frames[0];
        if (!targetWindow.document)
            log("FAIL: targetWindow started with no document, we won't know if the test passed or failed.");

        var selection = targetWindow.getSelection();

        var iframe = document.getElementById('aFrame');
        targetWindow.location = "http://localhost:8000/security/resources/foreign-domain-iframe-for-selection-test.html";

        setTimeout(test, 1);

        setTimeout(function() {
            log("FAIL: Tested timed-out.");
            if (window.testRunner)
                testRunner.notifyDone();
        }, 5000);

        function test() {
            try {
                if (targetWindow.document) {
                    setTimeout(test, 1);
                    return;
                }
            } catch (e) {
                log("PASS: Exception thrown trying to get cross-domain document: " + e);
            }

            try {
                var newDoc = selection.anchorNode.ownerDocument;
                if (newDoc.baseURI == "http://localhost:8000/security/resources/foreign-domain-iframe-for-selection-test.html")
                    log("FAIL: Cross-site access allowed.");
            } catch (e) {
                log("PASS: Cross-site access denied.");
            }
            if (window.testRunner)
                testRunner.notifyDone();
        }
    </script>
</body>
</html>
