<!doctype html>
<html>
  <head>
      <title>FileReader States</title>
      <link rel=help href="http://dev.w3.org/2006/webapi/FileAPI/#dfn-filereader">
      <link rel=author title="Lenient" href="mailto:lenient315@gmail.com">
      <script src="/resources/testharness.js"></script>
      <script src="/resources/testharnessreport.js"></script>
  </head>
  <body>
    <div id="log"></div>
    <script>
        test(function() {
             assert_true("FileReader" in window, "window should have a FileReader property.");
        }, "FileReader interface object");

        test(function(){
            var fileReader = new FileReader();
            assert_true(fileReader instanceof FileReader);
        }, "no-argument FileReader constructor");

        var t_abort = async_test("FileReader States -- abort");
        t_abort.step(function(){
            var fileReader = new FileReader();
            assert_equals(fileReader.readyState, 0);
            assert_equals(fileReader.readyState, FileReader.EMPTY);

            var blob = new Blob();
            fileReader.readAsArrayBuffer(blob);
            assert_equals(fileReader.readyState, 1);
            assert_equals(fileReader.readyState, FileReader.LOADING);

            fileReader.onabort = this.step_func(function(e) {
                assert_equals(fileReader.readyState, 2);
                assert_equals(fileReader.readyState, FileReader.DONE);
                t_abort.done();
            });
            fileReader.abort();
            fileReader.onabort = this.unreached_func("abort event should fire sync")
        });

        var t_event = async_test("FileReader States -- events");
        t_event.step(function(){
            var fileReader = new FileReader();

            var blob = new Blob();
            fileReader.readAsArrayBuffer(blob);

            fileReader.onloadstart = this.step_func(function(e) {
                assert_equals(fileReader.readyState, 1);
                assert_equals(fileReader.readyState, FileReader.LOADING);
            });

            fileReader.onprogress = this.step_func(function(e) {
                assert_equals(fileReader.readyState, 1);
                assert_equals(fileReader.readyState, FileReader.LOADING);
            });

            fileReader.onloadend = this.step_func(function(e) {
                assert_equals(fileReader.readyState, 2);
                assert_equals(fileReader.readyState, FileReader.DONE);
                t_event.done();
            });
        });
    </script>
  </body>
</html>
