<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Blob and File reference URL Test(1)</title>
    <link rel=help href="http://dev.w3.org/2006/webapi/FileAPI/#convenienceAPI">
    <link rel=author title="Breezewish" href="mailto:me@breeswish.org">
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
</head>
<body>
    <form name="upload">
        <input type="file" id="fileChooser">
    </form>

    <div>
        <p>Test steps:</p>
        <ol>
            <li>Download the <a href="support/file_test1.js">file</a>.</li>
            <li>Select the file in the file inputbox to run the test.</li>
        </ol>
    </div>

    <div id="log"></div>

    <script>

        var fileChooser = document.querySelector('#fileChooser');

        setup({explicit_done: true});
        setup({explicit_timeout: true});

        //Run the test when user selects a file

        on_event(fileChooser, 'change', function() {

            var testCount = 10000;

            test(function() {

                var list = [], file = fileChooser.files[0];

                for (var i = 0; i <= testCount; i++) {
                    list.push(window.URL.createObjectURL(file));
                }

                list.sort();

                for (var i = 0; i < testCount; i++) {
                    assert_not_equals(list[i], list[i+1], 'generated Blob URL should be unique');
                }

            }, 'Check whether generated Blob/File URL is unique (Notice: only generate for ' + testCount + ' times)');


            async_test(function(t) {

                var url = URL.createObjectURL(fileChooser.files[0]);
                var expected_file_content = "var test_result = 'test1_OK';";

                var xhr = new XMLHttpRequest();
                xhr.open('GET', url, true);
                xhr.onreadystatechange = t.step_func(function() {
                    switch (xhr.readyState) {
                    case xhr.DONE:
                        assert_equals(xhr.status, 200, 'status code should be 200');
                        assert_equals(xhr.responseText, expected_file_content);
                        t.done();
                        return;
                    }
                });

                xhr.send();

            }, 'Check whether Blob/File URL could be used in XHR requests and could get expected data');

            async_test(function(t) {

                var url = URL.createObjectURL(fileChooser.files[0]);
                var expected_run_result = "test1_OK";

                //expected file content:
                //   var test_result = 'test1_OK';

                var e = document.createElement('script');
                e.setAttribute('type', 'text/javascript');
                e.setAttribute('src', url);
                e.onload = t.step_func_done(function() {
                    assert_equals(test_result, expected_run_result);
                });

                document.body.appendChild(e);

            }, 'Check whether Blob/File URL could be used in tags src like <script>');

            async_test(function(t) {

                var url = URL.createObjectURL(fileChooser.files[0]);
                URL.revokeObjectURL(url);

                var xhr = new XMLHttpRequest();
                xhr.open('GET', url, true);
                xhr.onreadystatechange = t.step_func(function() {
                    switch (xhr.readyState) {
                    case xhr.DONE:
                        assert_equals(xhr.status, 500, 'status code should be 500 if Blob URI is revoked.');
                        t.done();
                        return;
                    }
                });

                xhr.send();

            }, 'Check whether revokeObjectURL works well');

            done();

        });

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