<html>
<head>
    <script src="../resources/cross-frame-access.js"></script>
    <script>
        if (window.testRunner) {
            testRunner.dumpAsText();
            testRunner.dumpChildFramesAsText();
            testRunner.waitUntilDone();
        }

        function loaded() {
            var firstURL = "data:text/html,<html>"
                + "<head>"
                +     "<scr" + "ipt>"
                +         "function fireSentinel() {"
                +             "if (window.testRunner)"
                +                 "testRunner.globalFlag = true;"
                +         "}"
                +     "</scr" + "ipt>"
                + "</head>"
                + "<body onload=\"fireSentinel();\">"
                +     "<p>Inner iframe.</p>"
                +     "<p id='accessMe'>Pass: Cross frame access from a sibling data: URL was denied.</p>"
                + "</body>"
                + "</html>";

            var iframe = document.getElementById("firstSubFrame");
            iframe.src = firstURL;

            var secondURL = "data:text/html,<html>"
                + "<head>"
                +     "<scr" + "ipt>"
                +         "function loaded() {"
                +             "if (window.testRunner) {"
                +                 "setTimeout(waitForFlag, 1);"
                +                 "function waitForFlag() {"
                +                     "if (!testRunner.globalFlag) {"
                +                         "setTimeout(waitForFlag, 1);"
                +                         "return;"
                +                     "}"
                +                     "performTest();"
                +                 "}"
                +             "} else {"
                +                 "document.getElementById('console').innerHTML = 'Click the button when all the subframes have finished loading.';"
                +             "}"
                +         "}"
                +         "function performTest() {"
                +             "try {"
                +                 "parent.frames['firstSubFrame'].document.getElementById('accessMe').innerHTML = 'FAIL: Cross frame access from a sibling data: URL was allowed.';"
                +             "} catch (e) {"
                +                 "console.log(e);"
                +             "}"
                +             "if (window.testRunner)"
                +                 "testRunner.notifyDone();"
                +         "}"
                +     "</scr" + "ipt>"
                + "</head>"
                + "<body onload=\"loaded();\">"
                +     "<p>Inner iframe.</p>"
                +     "<button onclick='performTest();'>Test</button>"
                +     "<pre id='console'></pre>"
                + "</body>"
                + "</html>";

            iframe = document.getElementById("secondSubFrame");
            iframe.src = secondURL;
        }
    </script>
</head>
<body onload="loaded();">
    <p>This tests that a data: URL subframe can't access a sibling data: URL subframe.</p>
    <iframe id="firstSubFrame" name="firstSubFrame"></iframe>
    <iframe id="secondSubFrame" name="secondSubFrame"></iframe>
</body>
</html>
