%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
<!DOCTYPE html> <meta charset=utf-8> <title>File constructor: endings option</title> <link rel=help href="https://w3c.github.io/FileAPI/#file-constructor"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script> // Windows platforms use CRLF as the native line ending. All others use LF. const crlf = navigator.platform.startsWith('Win'); const native_ending = crlf ? '\r\n' : '\n'; function readBlobAsPromise(blob) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsText(blob); reader.onload = e => resolve(reader.result); reader.onerror = e => reject(reader.error); }); } [ 'transparent', 'native' ].forEach(value => test(t => { assert_class_string(new File([], "name", {endings: value}), 'File', `Constructor should allow "${value}" endings`); }, `Valid "endings" value: ${JSON.stringify(value)}`)); [ null, '', 'invalidEnumValue', 'Transparent', 'NATIVE', 0, {} ].forEach(value => test(t => { assert_throws_js(TypeError, () => new File([], "name", {endings: value}), 'File constructor should throw'); }, `Invalid "endings" value: ${JSON.stringify(value)}`)); test(t => { const test_error = {name: 'test'}; assert_throws_exactly( test_error, () => new File([], "name", { get endings() { throw test_error; }}), 'File constructor should propagate exceptions from "endings" property'); }, 'Exception propagation from options'); test(t => { let got = false; new File([], "name", { get endings() { got = true; } }); assert_true(got, 'The "endings" property was accessed during construction.'); }, 'The "endings" options property is used'); [ {name: 'LF', input: '\n', native: native_ending}, {name: 'CR', input: '\r', native: native_ending}, {name: 'CRLF', input: '\r\n', native: native_ending}, {name: 'CRCR', input: '\r\r', native: native_ending.repeat(2)}, {name: 'LFCR', input: '\n\r', native: native_ending.repeat(2)}, {name: 'LFLF', input: '\n\n', native: native_ending.repeat(2)}, {name: 'CRCRLF', input: '\r\r\n', native: native_ending.repeat(2)}, {name: 'CRLFLF', input: '\r\n\n', native: native_ending.repeat(2)}, {name: 'CRLFCR', input: '\r\n\r\n', native: native_ending.repeat(2)}, {name: 'CRLFCRLF', input: '\r\n\r\n', native: native_ending.repeat(2)}, {name: 'LFCRLFCR', input: '\n\r\n\r', native: native_ending.repeat(3)}, ].forEach(testCase => { promise_test(async t => { const file = new File([testCase.input], "name"); assert_equals( await readBlobAsPromise(file), testCase.input, 'Newlines should not change with endings unspecified'); }, `Input ${testCase.name} with endings unspecified`); promise_test(async t => { const file = new File([testCase.input], "name", {endings: 'transparent'}); assert_equals( await readBlobAsPromise(file), testCase.input, 'Newlines should not change with endings "transparent"'); }, `Input ${testCase.name} with endings 'transparent'`); promise_test(async t => { const file = new File([testCase.input], "name", {endings: 'native'}); assert_equals( await readBlobAsPromise(file), testCase.native, 'Newlines should match the platform with endings "native"'); }, `Input ${testCase.name} with endings 'native'`); }); promise_test(async t => { const file = new File(['\r', '\n'], "name", {endings: 'native'}); const expected = native_ending.repeat(2); assert_equals( await readBlobAsPromise(file), expected, 'CR/LF in adjacent strings should be converted to two platform newlines'); }, `CR/LF in adjacent input strings`); </script>