<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>

<div id="description"></div>
<div id="console"></div>

<script>
description("Tests aborting XMLHttpRequest 'arraybuffer' loading with the .responseType and .response attributes.");

var xhr = 0;

function abort() {
    testPassed("abort() was called.");

    // For aborted 'arraybuffer' the .response should not yet exist.
    if (!xhr.response)
        testPassed("'arraybuffer' .response does not exist after aborted load.");
    else
        testFailed("'arraybuffer' .response should not exist after aborted load.");

    xhr = null;
    finishJSTest();
}

function load() {
    testFailed("onload() should not be called since loading was aborted.");

    xhr = null;
    finishJSTest();
}

function runTest() {
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    xhr = new XMLHttpRequest();
    xhr.onload = load;
    xhr.onabort = abort;
    xhr.open("GET", "../../http/tests/resources/balls-of-the-orient.aif", true);
        
    try {
        if ("responseType" in xhr)
            testPassed("responseType property exists.");

        if ("response" in xhr)
            testPassed("response property exists.");

        // Make sure we can set responseType to "arraybuffer" before send() is called.
        try {
            xhr.responseType = "arraybuffer";
            if (xhr.responseType == "arraybuffer")
                testPassed("xhr.responseType has been correctly set to 'arraybuffer'.");
        } catch(e) {
            testFailed("unable to set xhr.responseType to 'arraybuffer' " + e + ".");
        }
    } catch(e) {
        testFailed("Caught exception " + e + ".");
    }

    xhr.send(null);
    xhr.abort();
    window.jsTestIsAsync = true;
}

runTest();

</script>

<script src="../../resources/js-test-post.js"></script>

</body>
</html>
