summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/xhr/responsetype.any.js
blob: 444c3e3d169a0a2680bd0501b8859b7ca97b4250 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// META: title=XMLHttpRequest.responseType

/**
 * Author: Mathias Bynens <http://mathiasbynens.be/>
 * Author: Ms2ger <mailto:Ms2ger@gmail.com>
 *
 * Spec: <https://xhr.spec.whatwg.org/#the-responsetype-attribute>
 */
test(function() {
  var xhr = new XMLHttpRequest();
  assert_equals(xhr.responseType, '');
}, 'Initial value of responseType');

var types = ['', 'json', 'document', 'arraybuffer', 'blob', 'text', "nosuchtype"];

function isIgnoredType(type) {
  if (type == "nosuchtype") {
    return true;
  }

  if (type != "document") {
    return false;
  }

  // "document" is ignored only on workers.
  return GLOBAL.isWorker();
}

function expectedType(type) {
  if (!isIgnoredType(type)) {
    return type;
  }

  return "";
}

types.forEach(function(type) {
  test(function() {
    var xhr = new XMLHttpRequest();
    xhr.responseType = type;
    assert_equals(xhr.responseType, expectedType(type));
  }, 'Set responseType to ' + format_value(type) + ' when readyState is UNSENT.');

  test(function() {
    var xhr = new XMLHttpRequest();
    xhr.open('get', '/');
    xhr.responseType = type;
    assert_equals(xhr.responseType, expectedType(type));
  }, 'Set responseType to ' + format_value(type) + ' when readyState is OPENED.');

  async_test(function() {
    var xhr = new XMLHttpRequest();
    xhr.open('get', '/');
    xhr.onreadystatechange = this.step_func(function() {
      if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
        xhr.responseType = type;
        assert_equals(xhr.responseType, expectedType(type));
        this.done();
      }
    });
    xhr.send();
  }, 'Set responseType to ' + format_value(type) + ' when readyState is HEADERS_RECEIVED.');

  async_test(function() {
    var xhr = new XMLHttpRequest();
    xhr.open('get', '/');
    xhr.onreadystatechange = this.step_func(function() {
      if (xhr.readyState === XMLHttpRequest.LOADING) {
        if (isIgnoredType(type)) {
          xhr.responseType = type;
        } else {
          assert_throws_dom("InvalidStateError", function() {
            xhr.responseType = type;
          });
        }
        assert_equals(xhr.responseType, "");
        this.done();
      }
    });
    xhr.send();
  }, 'Set responseType to ' + format_value(type) + ' when readyState is LOADING.');

  async_test(function() {
    var xhr = new XMLHttpRequest();
    xhr.open('get', '/');
    xhr.onreadystatechange = this.step_func(function() {
      if (xhr.readyState === XMLHttpRequest.DONE) {
        var text = xhr.responseText;
        assert_not_equals(text, "");
        if (isIgnoredType(type)) {
          xhr.responseType = type;
        } else {
          assert_throws_dom("InvalidStateError", function() {
            xhr.responseType = type;
          });
        }
        assert_equals(xhr.responseType, "");
        assert_equals(xhr.responseText, text);
        this.done();
      }
    });
    xhr.send();
  }, 'Set responseType to ' + format_value(type) + ' when readyState is DONE.');

  // Note: the case of setting responseType first, and then calling synchronous
  // open(), is tested in open-method-responsetype-set-sync.htm.
  test(function() {
    var xhr = new XMLHttpRequest();
    xhr.open('get', '/', false);
    if (GLOBAL.isWorker() || isIgnoredType(type)) {
      // Setting responseType on workers is valid even for a sync XHR.
      xhr.responseType = type;
      assert_equals(xhr.responseType, expectedType(type));
    } else {
      assert_throws_dom("InvalidAccessError", function() {
        xhr.responseType = type;
      });
    }
  }, 'Set responseType to ' + format_value(type) + ' when readyState is OPENED and the sync flag is set.');

  test(function() {
    var xhr = new XMLHttpRequest();
    xhr.open('get', '/', false);
    xhr.send();
    assert_equals(xhr.readyState, XMLHttpRequest.DONE);
    if (isIgnoredType(type)) {
      xhr.responseType = type;
    } else {
      assert_throws_dom("InvalidStateError", function() {
        xhr.responseType = type;
      });
    }
    assert_equals(xhr.responseType, "");
  }, 'Set responseType to ' + format_value(type) + ' when readyState is DONE and the sync flag is set.');
});