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
136
137
138
139
140
141
142
143
144
145
146
|
<!DOCTYPE html>
<script src="../../resources/js-test.js"></script>
<script>
description("Test the File constructor.");
// Test the different ways you can construct a File.
shouldBeTrue("(new File([], 'world.html')) instanceof window.File");
shouldBeTrue("(new File(['hello'], 'world.html')) instanceof window.File");
shouldBeTrue("(new File(['hello'], 'world.html', {})) instanceof window.File");
shouldBeTrue("(new File(['hello'], 'world.html', {type:'text/html'})) instanceof window.File");
shouldBeTrue("(new File(['hello'], 'world.html', {type:'text/html', endings:'native'})) instanceof window.File");
shouldBeTrue("(new File(['hello'], 'world.html', {type:'text/html', endings:'transparent'})) instanceof window.File");
// Test that File inherits from File.
shouldBeTrue("(new File([], 'world.html')) instanceof window.File")
// Verify that the file name argument is required.
shouldThrow("(new File())", '"TypeError: Failed to construct \'File\': 2 arguments required, but only 0 present."');
shouldThrow("(new File([]))", '"TypeError: Failed to construct \'File\': 2 arguments required, but only 1 present."');
// Test valid file names.
shouldBeTrue("(new File([], null)) instanceof window.File");
shouldBeTrue("(new File([], 1)) instanceof window.File");
shouldBeTrue("(new File([], '')) instanceof window.File");
shouldBeTrue("(new File([], document)) instanceof window.File");
// Test invalid file parts.
shouldThrow("new File('hello', 'world.html')", '"TypeError: Failed to construct \'File\': The 1st argument is neither an array, nor does it have indexed properties."');
shouldThrow("new File(0, 'world.html')", '"TypeError: Failed to construct \'File\': The 1st argument is neither an array, nor does it have indexed properties."');
shouldThrow("new File(null, 'world.html')", '"TypeError: Failed to construct \'File\': The 1st argument is neither an array, nor does it have indexed properties."');
// Test valid file parts.
shouldBeTrue("(new File([], 'world.html')) instanceof window.File");
shouldBeTrue("(new File(['stringPrimitive'], 'world.html')) instanceof window.File");
shouldBeTrue("(new File([String('stringObject')], 'world.html')) instanceof window.File");
shouldBeTrue("(new File([new Blob], 'world.html')) instanceof window.File");
shouldBeTrue("(new File([new Blob([new Blob])], 'world.html')) instanceof window.File");
// Test File instances used as blob parts.
shouldBeTrue("(new Blob([new File([], 'world.txt')])) instanceof window.Blob");
shouldBeTrue("(new Blob([new Blob([new File([new Blob], 'world.txt')])])) instanceof window.Blob");
shouldBeTrue("(new File([new File([], 'world.txt')], 'world.html')) instanceof window.File");
shouldBeTrue("(new File([new Blob([new File([new Blob], 'world.txt')])], 'world.html')) instanceof window.File");
// Test some conversions to string in the parts array.
shouldBe("(new File([12], 'world.html')).size", "2");
shouldBe("(new File([[]], 'world.html')).size", "0"); // [].toString() is the empty string
shouldBe("(new File([{}], 'world.html')).size", "15");; // {}.toString() is the string "[object Object]"
shouldBe("(new File([document], 'world.html')).size", "21"); // document.toString() is the string "[object HTMLDocument]"
var toStringingObj = { toString: function() { return "A string"; } };
shouldBe("(new File([toStringingObj], 'world.html')).size", "8");
var throwingObj = { toString: function() { throw "Error"; } };
shouldThrow("new File([throwingObj], 'world.html')", "'Error'");
// Test some conversions to string in the file name.
shouldBe("(new File([], null)).name", "'null'");
shouldBe("(new File([], 12)).name", "'12'");
shouldBe("(new File([], '')).name", "''");
shouldBe("(new File([], {})).name", "'[object Object]'");
shouldBe("(new File([], document)).name", "'[object HTMLDocument]'");
shouldBe("(new File([], toStringingObj)).name", "'A string'");
shouldThrow("(new File([], throwingObj)).name", "'Error'");
// Test some invalid property bags.
shouldBeTrue("(new File([], 'world.html', {unknownKey:'value'})) instanceof window.File"); // Ignore invalid keys
shouldThrow("new File([], 'world.html', {endings:'illegalValue'})", "'TypeError: Failed to construct \\'File\\': The provided value \\'illegalValue\\' is not a valid enum value of type NormalizeLineEndings.'");
shouldThrow("new File([], 'world.html', {endings:throwingObj})", "'Error'");
shouldThrow("new File([], 'world.html', {type:throwingObj})", "'Error'");
shouldThrow("new File([], 'world.html', {type:'hello\u00EE'})", "'SyntaxError: Failed to construct \\'File\\': The \\'type\\' property must consist of ASCII characters.'");
// Test various non-object literals being used as property bags.
shouldBeTrue("(new File([], 'world.html', null)) instanceof window.File");
shouldBeTrue("(new File([], 'world.html', undefined)) instanceof window.File");
shouldThrow("(new File([], 'world.html', 123)) instanceof window.File", "'TypeError: Failed to construct \\'File\\': parameter 3 (\\'options\\') is not an object.'");
shouldThrow("(new File([], 'world.html', 123.4)) instanceof window.File", "'TypeError: Failed to construct \\'File\\': parameter 3 (\\'options\\') is not an object.'");
shouldThrow("(new File([], 'world.html', true)) instanceof window.File", "'TypeError: Failed to construct \\'File\\': parameter 3 (\\'options\\') is not an object.'");
shouldThrow("(new File([], 'world.html', 'abc')) instanceof window.File", "'TypeError: Failed to construct \\'File\\': parameter 3 (\\'options\\') is not an object.'");
shouldBeTrue("(new File([], 'world.html', [])) instanceof window.File");
shouldBeTrue("(new File([], 'world.html', /abc/)) instanceof window.File");
shouldBeTrue("(new File([], 'world.html', function () {})) instanceof window.File");
// Test that the name/type/size are correctly added to the File.
shouldBe("(new File([], 'world.html', {type:'text/html'})).name", "'world.html'");
shouldBe("(new File([], 'world.html', {type:'text/html'})).type", "'text/html'");
shouldBe("(new File([], 'world.html', {type:'text/html'})).size", "0");
shouldBe("(new File([], 'world.html', {type:'text/plain;charset=UTF-8'})).type", "'text/plain;charset=utf-8'");
// Test that the lastModified is correctly added to the File.
var aDate = new Date(441532800000);
shouldBe("(new File([], 'world.html', {lastModified: 441532800000})).lastModified", "441532800000");
// Unless specified, lastModified should default to now.
shouldBeNow("(new File([], 'world.html')).lastModified", 20000);
shouldBeNow("(new File([], 'world.html', {})).lastModified", 20000);
shouldBeNow("(new File([], 'world.html', {type: 'text/plain'})).lastModified", 20000);
// Test that Date instances are implicitly converted to numbers.
shouldBe("(new File([], 'world.html', {lastModified: new Date(441532800000)})).lastModified", "441532800000");
// Test the deprecated attribute lastModifiedDate.
shouldBeTrue("(new File([], 'world.html', {lastModified: 441532800000})).lastModifiedDate instanceof Date");
shouldBe("(new File([], 'world.html', {lastModified: 441532800000})).lastModifiedDate.valueOf()", "441532800000");
// Test the number of expected arguments in the File constructor.
shouldBe("window.File.length", "2");
// Test ArrayBufferView parameters.
shouldBe("new File([new DataView(new ArrayBuffer(100))], 'world.html').size", "100");
shouldBe("new File([new Uint8Array(100)], 'world.html').size", "100");
shouldBe("new File([new Uint8ClampedArray(100)], 'world.html').size", "100");
shouldBe("new File([new Uint16Array(100)], 'world.html').size", "200");
shouldBe("new File([new Uint32Array(100)], 'world.html').size", "400");
shouldBe("new File([new Int8Array(100)], 'world.html').size", "100");
shouldBe("new File([new Int16Array(100)], 'world.html').size", "200");
shouldBe("new File([new Int32Array(100)], 'world.html').size", "400");
shouldBe("new File([new Float32Array(100)], 'world.html').size", "400");
shouldBe("new File([new Float64Array(100)], 'world.html').size", "800");
shouldBe("new File([new Float64Array(100), new Int32Array(100), new Uint8Array(100), new DataView(new ArrayBuffer(100))], 'world.html').size", "1400");
shouldBe("new File([new Blob([new Int32Array(100)]), new Uint8Array(100), new Float32Array(100), new DataView(new ArrayBuffer(100))], 'world.html').size", "1000");
shouldBe("new File([new Blob([new Int32Array(100)]), new File([new Uint16Array(100)], 'world.txt'), new Uint8Array(100), new Float32Array(100), new DataView(new ArrayBuffer(100))], 'world.html').size", "1200");
// Test ArrayBuffer parameters.
shouldBe("new File([(new DataView(new ArrayBuffer(100))).buffer], 'world.html').size", "100");
shouldBe("new File([(new Uint8Array(100)).buffer], 'world.html').size", "100");
shouldBe("new File([(new Uint8ClampedArray(100)).buffer], 'world.html').size", "100");
shouldBe("new File([(new Uint16Array(100)).buffer], 'world.html').size", "200");
shouldBe("new File([(new Uint32Array(100)).buffer], 'world.html').size", "400");
shouldBe("new File([(new Int8Array(100)).buffer], 'world.html').size", "100");
shouldBe("new File([(new Int16Array(100)).buffer], 'world.html').size", "200");
shouldBe("new File([(new Int32Array(100)).buffer], 'world.html').size", "400");
shouldBe("new File([(new Float32Array(100)).buffer], 'world.html').size", "400");
shouldBe("new File([(new Float64Array(100)).buffer], 'world.html').size", "800");
shouldBe("new File([(new Float64Array(100)).buffer, (new Int32Array(100)).buffer, (new Uint8Array(100)).buffer, (new DataView(new ArrayBuffer(100))).buffer], 'world.html').size", "1400");
shouldBe("new File([new Blob([(new Int32Array(100)).buffer]), (new Uint8Array(100)).buffer, (new Float32Array(100)).buffer, (new DataView(new ArrayBuffer(100))).buffer], 'world.html').size", "1000");
shouldBe("new File([new Blob([(new Int32Array(100)).buffer]), new File([new Uint16Array(100).buffer], 'world.txt'), (new Uint8Array(100)).buffer, (new Float32Array(100)).buffer, (new DataView(new ArrayBuffer(100))).buffer], 'world.html').size", "1200");
// Test building Blobs with ArrayBuffer / ArrayBufferView parts enclosed in files.
shouldBe("new Blob([new Blob([new Int32Array(100)]), new File([new Uint16Array(100)], 'world.txt'), new Uint8Array(100), new Float32Array(100), new DataView(new ArrayBuffer(100))]).size", "1200");
shouldBe("new Blob([new Blob([(new Int32Array(100)).buffer]), new File([new Uint16Array(100).buffer], 'world.txt'), (new Uint8Array(100)).buffer, (new Float32Array(100)).buffer, (new DataView(new ArrayBuffer(100))).buffer]).size", "1200");
// Test passing blob parts in objects with indexed properties.
// (This depends on the bindings code handling of sequence<T>)
shouldBe("new File({length: 0}, 'world.txt').size", "0");
shouldBe("new File({length: 1, 0: 'string'}, 'world.txt').size", "6");
</script>
|