<!DOCTYPE html>
<html>
<body>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script type="text/javascript">
var test = async_test("Test response of XMLHttpRequest with responseType set to 'json' for various readyState.");

test.step(function()
{
    var xhr = new XMLHttpRequest;

    xhr.responseType = "json";
    assert_equals(xhr.responseType, "json", "xhr.responseType");

    assert_equals(xhr.readyState, xhr.UNSENT, "xhr.readyState");
    assert_equals(xhr.response, null, "xhr.response");

    var seenStates = [];

    xhr.onreadystatechange = test.step_func(function() {
        seenStates.push(xhr.readyState);

        switch (xhr.readyState) {
        case xhr.UNSENT:
            assert_unreached('Unexpected readyState: UNSENT');
            return;

        case xhr.OPENED:
            assert_equals(xhr.response, null, "xhr.response");
            return;

        case xhr.HEADERS_RECEIVED:
            assert_equals(xhr.response, null, "xhr.response");
            return;

        case xhr.LOADING:
            assert_equals(xhr.response, null, "xhr.response");
            return;

        case xhr.DONE:
            assert_equals(xhr.status, 200, "xhr.status");
            assert_equals(JSON.stringify(xhr.response),
                          '["a","b",2,{"3":3}]',
                          "Stringify result of xhr.response");

            // Check that we saw all states.
            assert_array_equals(seenStates,
                                [xhr.OPENED, xhr.HEADERS_RECEIVED, xhr.LOADING, xhr.DONE]);

            test.done();
            return;

        default:
            assert_unreached('Unexpected readyState: ' + xhr.readyState)
            return;
        }
    });

    xhr.open('GET', 'resources/test.json', true);
    xhr.send();
});
</script>
</body>
</html>
