cf2f598269a7db341560b7939dc3e2d67a0d1960
[WebKit-https.git] / LayoutTests / fast / files / script-tests / blob-constructor.js
1 description("Test the Blob constructor.");
2
3 // Test the diffrent ways you can construct a Blob.
4 shouldBeTrue("(new Blob()) instanceof window.Blob");
5 shouldBeTrue("(new Blob([])) instanceof window.Blob");
6 shouldBeTrue("(new Blob(['hello'])) instanceof window.Blob");
7 shouldBeTrue("(new Blob(['hello'], {})) instanceof window.Blob");
8 shouldBeTrue("(new Blob(['hello'], {type:'text/html'})) instanceof window.Blob");
9 shouldBeTrue("(new Blob(['hello'], {type:'text/html', endings:'native'})) instanceof window.Blob");
10 shouldBeTrue("(new Blob(['hello'], {type:'text/html', endings:'transparent'})) instanceof window.Blob");
11
12 // Test invalid blob parts
13 shouldThrow("new Blob('hello')", "'TypeError: First argument of the constructor is not of type Array'");
14 shouldThrow("new Blob(0)", "'TypeError: First argument of the constructor is not of type Array'");
15
16 // Test valid blob parts.
17 shouldBeTrue("(new Blob([])) instanceof window.Blob");
18 shouldBeTrue("(new Blob(['stringPrimitive'])) instanceof window.Blob");
19 shouldBeTrue("(new Blob([String('stringObject')])) instanceof window.Blob");
20 shouldBeTrue("(new Blob([new Blob])) instanceof window.Blob");
21 shouldBeTrue("(new Blob([new Blob([new Blob])])) instanceof window.Blob");
22
23 // Test some conversions to string in the parts array.
24 shouldBe("(new Blob([12])).size", "2");
25 shouldBe("(new Blob([[]])).size", "0");         // [].toString() is the empty string
26 shouldBe("(new Blob([{}])).size", "15");;       // {}.toString() is the string "[object Object]"
27 shouldBe("(new Blob([document])).size", "21");  // document.toString() is the string "[object HTMLDocument]"
28
29 var toStringingObj = { toString: function() { return "A string"; } };
30 shouldBe("(new Blob([toStringingObj])).size", "8");
31
32 var throwingObj = { toString: function() { throw "Error"; } };
33 shouldThrow("new Blob([throwingObj])", "'Error'");
34
35 // Test some invalid property bags
36 shouldBeTrue("(new Blob([], {unknownKey:'value'})) instanceof window.Blob");    // Ignore invalid keys
37 shouldThrow("new Blob([], {endings:'illegalValue'})", "'TypeError: The endings property must be either \"transparent\" or \"native\"'");
38 shouldThrow("new Blob([], {endings:throwingObj})", "'Error'");
39 shouldThrow("new Blob([], {type:throwingObj})", "'Error'");
40
41 // Test that order of property bag evaluation is lexigraphical
42 var throwingObj1 = { toString: function() { throw "Error 1"; } };
43 var throwingObj2 = { toString: function() { throw "Error 2"; } };
44 shouldThrow("new Blob([], {endings:throwingObj1, type:throwingObj2})", "'Error 1'");
45 shouldThrow("new Blob([], {type:throwingObj2, endings:throwingObj1})", "'Error 1'");
46 shouldThrow("new Blob([], {type:throwingObj2, endings:'illegal'})", "'TypeError: The endings property must be either \"transparent\" or \"native\"'");
47
48 // Test various non-object literals being used as property bags
49 shouldThrow("(new Blob([], null)) instanceof window.Blob", "'TypeError: Second argument of the constructor is not of type Object'");
50 shouldThrow("(new Blob([], undefined)) instanceof window.Blob", "'TypeError: Second argument of the constructor is not of type Object'");
51 shouldThrow("(new Blob([], 123)) instanceof window.Blob", "'TypeError: Second argument of the constructor is not of type Object'");
52 shouldThrow("(new Blob([], 123.4)) instanceof window.Blob", "'TypeError: Second argument of the constructor is not of type Object'");
53 shouldThrow("(new Blob([], true)) instanceof window.Blob", "'TypeError: Second argument of the constructor is not of type Object'");
54 shouldThrow("(new Blob([], 'abc')) instanceof window.Blob", "'TypeError: Second argument of the constructor is not of type Object'");
55 shouldBeTrue("(new Blob([], [])) instanceof window.Blob");
56 shouldBeTrue("(new Blob([], /abc/)) instanceof window.Blob");
57 shouldBeTrue("(new Blob([], function () {})) instanceof window.Blob");
58
59 // Test that the type/size is correctly added to the Blob
60 shouldBe("(new Blob([], {type:'text/html'})).type", "'text/html'");
61 shouldBe("(new Blob([], {type:'text/html'})).size", "0");
62 shouldBe("(new Blob([], {type:'text/plain;charset=UTF-8'})).type", "'text/plain;charset=utf-8'");
63
64 // Test that Blob types are correctly normalized.
65 shouldBe("(new Blob([], {type:'TeXt/pLaIn'})).type", "'text/plain'");
66 shouldBe("(new Blob([], {type:'text\\rplain'})).type", "''");
67 shouldBe("(new Blob([], {type:'text\\nplain'})).type", "''");
68 shouldBe("(new Blob([], {type:'hello\u00EE'})).type", "''");
69 shouldBe("(new Blob([], {type:'\\0'})).type", "''");
70
71 // Odds and ends
72 shouldBe("window.Blob.length", "0");
73
74 // Test ArrayBufferView Parameters
75 shouldBe("new Blob([new DataView(new ArrayBuffer(100))]).size", "100");
76 shouldBe("new Blob([new Uint8Array(100)]).size", "100");
77 shouldBe("new Blob([new Uint8ClampedArray(100)]).size", "100");
78 shouldBe("new Blob([new Uint16Array(100)]).size", "200");
79 shouldBe("new Blob([new Uint32Array(100)]).size", "400");
80 shouldBe("new Blob([new Int8Array(100)]).size", "100");
81 shouldBe("new Blob([new Int16Array(100)]).size", "200");
82 shouldBe("new Blob([new Int32Array(100)]).size", "400");
83 shouldBe("new Blob([new Float32Array(100)]).size", "400");
84 shouldBe("new Blob([new Float64Array(100)]).size", "800");
85 shouldBe("new Blob([new Float64Array(100), new Int32Array(100), new Uint8Array(100), new DataView(new ArrayBuffer(100))]).size", "1400");
86 shouldBe("new Blob([new Blob([new Int32Array(100)]), new Uint8Array(100), new Float32Array(100), new DataView(new ArrayBuffer(100))]).size", "1000");
87
88 // Test ArrayBuffer Parameters
89 shouldBe("new Blob([(new DataView(new ArrayBuffer(100))).buffer]).size", "100");
90 shouldBe("new Blob([(new Uint8Array(100)).buffer]).size", "100");
91 shouldBe("new Blob([(new Uint8ClampedArray(100)).buffer]).size", "100");
92 shouldBe("new Blob([(new Uint16Array(100)).buffer]).size", "200");
93 shouldBe("new Blob([(new Uint32Array(100)).buffer]).size", "400");
94 shouldBe("new Blob([(new Int8Array(100)).buffer]).size", "100");
95 shouldBe("new Blob([(new Int16Array(100)).buffer]).size", "200");
96 shouldBe("new Blob([(new Int32Array(100)).buffer]).size", "400");
97 shouldBe("new Blob([(new Float32Array(100)).buffer]).size", "400");
98 shouldBe("new Blob([(new Float64Array(100)).buffer]).size", "800");
99 shouldBe("new Blob([(new Float64Array(100)).buffer, (new Int32Array(100)).buffer, (new Uint8Array(100)).buffer, (new DataView(new ArrayBuffer(100))).buffer]).size", "1400");
100 shouldBe("new Blob([new Blob([(new Int32Array(100)).buffer]), (new Uint8Array(100)).buffer, (new Float32Array(100)).buffer, (new DataView(new ArrayBuffer(100))).buffer]).size", "1000");