<!DOCTYPE html>
<html>
<body>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>

<iframe id="testIframe" sandbox="allow-scripts allow-same-origin" style="display:none">
</iframe>

<script>
    var test = async_test("Test subframes receive orientation change events");

    var orientations = [
        'portrait-primary',
        'portrait-secondary',
        'landscape-primary',
        'landscape-secondary'
    ];

    var currentIndex = 0;  // Default orientation for testRunner is 'portrait-primary'.
    var eventsReceived = 0;

    function getNextIndex() {
        return (currentIndex + 1) % orientations.length;
    }

    function changeOrientation() {
        testRunner.setMockScreenOrientation(orientations[getNextIndex()]);
        currentIndex = getNextIndex();
    }

    window.onmessage = test.step_func(function (ev) {
        assert_equals(ev.data, orientations[currentIndex], "subframe receives orientation change event");
        ++eventsReceived;
        if (eventsReceived < 4)
            changeOrientation()
        else
            test.done();
    });

    var testIframe = document.getElementById("testIframe");
    testIframe.src = "resources/iframe-listen-orientation-change.html";
    testIframe.onload = changeOrientation;
</script>
</body>
</html>
