<!DOCTYPE html>
<html>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<meta name='flags' content='interact'>
<meta name="timeout" content="long">
<p>Switch the page to background, then switch back in a minute.</p>
<iframe src='about:blank'></iframe>
<script>

var eventVisibleTest = async_test("Test that a change event is fired when the page is visible.");
var noEventHiddenTest = async_test("Test that change event is not fired when the page is not visible.");
var orientationUnchangeHiddenTest = async_test("Test that screen.orientation keeps returning the same orientation when the page is not visible.");
var orientationUpdateVisibleTest = async_test("Test that screen.orientation is updated once the page is visible again.");
var frameEventsTest = async_test("Test that the iframe got as many events as the main frame.");

var orientationChangeContinuation = null;
var orientationChangeEventListenerCalls = 0;
var orientationChangeEventListenerCallsForFrame = 0;

screen.orientation.addEventListener('change', function() {
    orientationChangeEventListenerCalls++;
    if (orientationChangeEventContinuation) {
        setTimeout(orientationChangeEventContinuation);
        orientationChangeEventContinuation = null;
    }
});

window.frames[0].screen.orientation.addEventListener('change', function() {
    orientationChangeEventListenerCallsForFrame++;
});

document.addEventListener("visibilitychange", function () {
    if(document.hidden)
        runNoEventHiddenTest();
    else
        runOrientationUpdateVisibleTest();
});

function runEventVisibleTest() {
    eventVisibleTest.step(function() {
        assert_false(document.hidden);
    });

    screen.orientation.lock("landscape-primary").then(function() {}, function() {});

    orientationChangeEventContinuation = function() {
        eventVisibleTest.step(function() {
            assert_equals(orientationChangeEventListenerCalls, 1);
            assert_equals(screen.orientation.type, "landscape-primary");
        });
        eventVisibleTest.done();

    };
}

function runNoEventHiddenTest() {

    noEventHiddenTest.step(function() {
        assert_true(document.hidden);
    });

    screen.orientation.lock("portrait-primary").then(function() {}, function() {});

    noEventHiddenTest.step(function() {
        assert_equals(orientationChangeEventListenerCalls, 1);
    });
    noEventHiddenTest.done();

    runOrientationUnchangeHiddenTest();
}

function runOrientationUnchangeHiddenTest() {
    orientationUnchangeHiddenTest.step(function() {
        assert_equals(screen.orientation.type, "landscape-primary");
    });
    orientationUnchangeHiddenTest.done();

}

function runOrientationUpdateVisibleTest() {

    orientationChangeEventContinuation = function() {
        orientationUpdateVisibleTest.step(function() {
            assert_false(document.hidden);
            // A change event should have been fired.
            assert_equals(orientationChangeEventListenerCalls, 2);
            // Should keep returning the start returning the orientation value.
            assert_equals(screen.orientation.type, "portrait-primary");
        });

        orientationUpdateVisibleTest.done();

        runFrameEventsTest();
    };
}

function runFrameEventsTest() {
    frameEventsTest.step(function() {
        assert_equals(orientationChangeEventListenerCallsForFrame, orientationChangeEventListenerCalls);
    });
    frameEventsTest.done();
}

runEventVisibleTest();

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