| <!DOCTYPE html> |
| <meta charset=utf-8> |
| <title>Blob constructor: endings option</title> |
| <link rel=help href="https://w3c.github.io/FileAPI/#constructorBlob"> |
| <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 Blob([], {endings: value}), 'Blob', |
| `Constructor should allow "${value}" endings`); |
| }, `Valid "endings" value: ${JSON.stringify(value)}`)); |
| |
| [ |
| null, |
| '', |
| 'invalidEnumValue', |
| 'Transparent', |
| 'NATIVE', |
| 0, |
| {} |
| ].forEach(value => test(t => { |
| assert_throws(new TypeError(), () => new Blob([], {endings: value}), |
| 'Blob constructor should throw'); |
| }, `Invalid "endings" value: ${JSON.stringify(value)}`)); |
| |
| test(t => { |
| const test_error = {name: 'test'}; |
| assert_throws( |
| test_error, |
| () => new Blob([], { get endings() { throw test_error; }}), |
| 'Blob constructor should propagate exceptions from "endings" property'); |
| }, 'Exception propagation from options'); |
| |
| test(t => { |
| let got = false; |
| new Blob([], { 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 blob = new Blob([testCase.input]); |
| assert_equals( |
| await readBlobAsPromise(blob), testCase.input, |
| 'Newlines should not change with endings unspecified'); |
| }, `Input ${testCase.name} with endings unspecified`); |
| |
| promise_test(async t => { |
| const blob = new Blob([testCase.input], {endings: 'transparent'}); |
| assert_equals( |
| await readBlobAsPromise(blob), testCase.input, |
| 'Newlines should not change with endings "transparent"'); |
| }, `Input ${testCase.name} with endings 'transparent'`); |
| |
| promise_test(async t => { |
| const blob = new Blob([testCase.input], {endings: 'native'}); |
| assert_equals( |
| await readBlobAsPromise(blob), testCase.native, |
| 'Newlines should match the platform with endings "native"'); |
| }, `Input ${testCase.name} with endings 'native'`); |
| }); |
| |
| promise_test(async t => { |
| const blob = new Blob(['\r', '\n'], {endings: 'native'}); |
| const expected = native_ending.repeat(2); |
| assert_equals( |
| await readBlobAsPromise(blob), expected, |
| 'CR/LF in adjacent strings should be converted to two platform newlines'); |
| }, `CR/LF in adjacent input strings`); |
| |
| </script> |