Chromium Code Reviews| Index: LayoutTests/fast/files/file-constructor.html |
| diff --git a/LayoutTests/fast/files/file-constructor.html b/LayoutTests/fast/files/file-constructor.html |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8540ff3f38da1dca4c4fb5a7c440b4e737ccc02e |
| --- /dev/null |
| +++ b/LayoutTests/fast/files/file-constructor.html |
| @@ -0,0 +1,120 @@ |
| +<!DOCTYPE html> |
| + |
| +<script src="../../resources/js-test.js"></script> |
| +<script> |
| +description("Test the File constructor."); |
| + |
| +// Test the diffrent 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: Constructor requires at least two arguments'"); |
| + |
| +// Test valid file names. |
| +shouldBeTrue("(new File([], null)) instanceof window.File"); |
| +shouldBeTrue("(new File([], 1)) instanceof window.File"); |
| +shouldBeTrue("(new File([], document)) instanceof window.File"); |
| + |
| +// Test invalid blob parts |
| +shouldThrow("new File('hello', 'world.html')", "'TypeError: First argument of the constructor is not of type Array'"); |
| +shouldThrow("new File(0, 'world.html')", "'TypeError: First argument of the constructor is not of type Array'"); |
| + |
| +// Test valid blob 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", "'[object Object]'"); |
| +shouldBe("(new File([], document)).name", "'[object HTMLDocument]'"); |
| +shouldBe("(new File([], toStringingObj)).name", "'A string'"); |
| +shouldThrow("(new File([], throwingObj)).name", "'Error'"); |
| + |
|
Inactive
2013/11/07 14:27:44
Could you please add a check to make sure File.len
pwnall-personal
2013/11/08 07:36:41
Done.
|
| +// 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: The endings property must be either \"transparent\" or \"native\"'"); |
| +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: type must consist of ASCII characters'"); |
| + |
| +// Test various non-object literals being used as property bags. |
| +shouldThrow("(new File([], 'world.html', null)) instanceof window.File", "'TypeError: Third argument of the constructor is not of type Object'"); |
| +shouldThrow("(new File([], 'world.html', undefined)) instanceof window.File", "'TypeError: Third argument of the constructor is not of type Object'"); |
| +shouldThrow("(new File([], 'world.html', 123)) instanceof window.File", "'TypeError: Third argument of the constructor is not of type Object'"); |
| +shouldThrow("(new File([], 'world.html', 123.4)) instanceof window.File", "'TypeError: Third argument of the constructor is not of type Object'"); |
| +shouldThrow("(new File([], 'world.html', true)) instanceof window.File", "'TypeError: Third argument of the constructor is not of type Object'"); |
| +shouldThrow("(new File([], 'world.html', 'abc')) instanceof window.File", "'TypeError: Third argument of the constructor is not of type 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 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"); |
| +</script> |