| 'use strict' |
| |
| const { |
| staticPropertyDescriptors, |
| readOperation, |
| fireAProgressEvent |
| } = require('./util') |
| const { |
| kState, |
| kError, |
| kResult, |
| kEvents, |
| kAborted |
| } = require('./symbols') |
| const { webidl } = require('../fetch/webidl') |
| const { kEnumerableProperty } = require('../core/util') |
| |
| class FileReader extends EventTarget { |
| constructor () { |
| super() |
| |
| this[kState] = 'empty' |
| this[kResult] = null |
| this[kError] = null |
| this[kEvents] = { |
| loadend: null, |
| error: null, |
| abort: null, |
| load: null, |
| progress: null, |
| loadstart: null |
| } |
| } |
| |
| /** |
| * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer |
| * @param {import('buffer').Blob} blob |
| */ |
| readAsArrayBuffer (blob) { |
| webidl.brandCheck(this, FileReader) |
| |
| webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsArrayBuffer' }) |
| |
| blob = webidl.converters.Blob(blob, { strict: false }) |
| |
| // The readAsArrayBuffer(blob) method, when invoked, |
| // must initiate a read operation for blob with ArrayBuffer. |
| readOperation(this, blob, 'ArrayBuffer') |
| } |
| |
| /** |
| * @see https://w3c.github.io/FileAPI/#readAsBinaryString |
| * @param {import('buffer').Blob} blob |
| */ |
| readAsBinaryString (blob) { |
| webidl.brandCheck(this, FileReader) |
| |
| webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsBinaryString' }) |
| |
| blob = webidl.converters.Blob(blob, { strict: false }) |
| |
| // The readAsBinaryString(blob) method, when invoked, |
| // must initiate a read operation for blob with BinaryString. |
| readOperation(this, blob, 'BinaryString') |
| } |
| |
| /** |
| * @see https://w3c.github.io/FileAPI/#readAsDataText |
| * @param {import('buffer').Blob} blob |
| * @param {string?} encoding |
| */ |
| readAsText (blob, encoding = undefined) { |
| webidl.brandCheck(this, FileReader) |
| |
| webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsText' }) |
| |
| blob = webidl.converters.Blob(blob, { strict: false }) |
| |
| if (encoding !== undefined) { |
| encoding = webidl.converters.DOMString(encoding) |
| } |
| |
| // The readAsText(blob, encoding) method, when invoked, |
| // must initiate a read operation for blob with Text and encoding. |
| readOperation(this, blob, 'Text', encoding) |
| } |
| |
| /** |
| * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL |
| * @param {import('buffer').Blob} blob |
| */ |
| readAsDataURL (blob) { |
| webidl.brandCheck(this, FileReader) |
| |
| webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsDataURL' }) |
| |
| blob = webidl.converters.Blob(blob, { strict: false }) |
| |
| // The readAsDataURL(blob) method, when invoked, must |
| // initiate a read operation for blob with DataURL. |
| readOperation(this, blob, 'DataURL') |
| } |
| |
| /** |
| * @see https://w3c.github.io/FileAPI/#dfn-abort |
| */ |
| abort () { |
| // 1. If this's state is "empty" or if this's state is |
| // "done" set this's result to null and terminate |
| // this algorithm. |
| if (this[kState] === 'empty' || this[kState] === 'done') { |
| this[kResult] = null |
| return |
| } |
| |
| // 2. If this's state is "loading" set this's state to |
| // "done" and set this's result to null. |
| if (this[kState] === 'loading') { |
| this[kState] = 'done' |
| this[kResult] = null |
| } |
| |
| // 3. If there are any tasks from this on the file reading |
| // task source in an affiliated task queue, then remove |
| // those tasks from that task queue. |
| this[kAborted] = true |
| |
| // 4. Terminate the algorithm for the read method being processed. |
| // TODO |
| |
| // 5. Fire a progress event called abort at this. |
| fireAProgressEvent('abort', this) |
| |
| // 6. If this's state is not "loading", fire a progress |
| // event called loadend at this. |
| if (this[kState] !== 'loading') { |
| fireAProgressEvent('loadend', this) |
| } |
| } |
| |
| /** |
| * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate |
| */ |
| get readyState () { |
| webidl.brandCheck(this, FileReader) |
| |
| switch (this[kState]) { |
| case 'empty': return this.EMPTY |
| case 'loading': return this.LOADING |
| case 'done': return this.DONE |
| } |
| } |
| |
| /** |
| * @see https://w3c.github.io/FileAPI/#dom-filereader-result |
| */ |
| get result () { |
| webidl.brandCheck(this, FileReader) |
| |
| // The result attribute’s getter, when invoked, must return |
| // this's result. |
| return this[kResult] |
| } |
| |
| /** |
| * @see https://w3c.github.io/FileAPI/#dom-filereader-error |
| */ |
| get error () { |
| webidl.brandCheck(this, FileReader) |
| |
| // The error attribute’s getter, when invoked, must return |
| // this's error. |
| return this[kError] |
| } |
| |
| get onloadend () { |
| webidl.brandCheck(this, FileReader) |
| |
| return this[kEvents].loadend |
| } |
| |
| set onloadend (fn) { |
| webidl.brandCheck(this, FileReader) |
| |
| if (this[kEvents].loadend) { |
| this.removeEventListener('loadend', this[kEvents].loadend) |
| } |
| |
| if (typeof fn === 'function') { |
| this[kEvents].loadend = fn |
| this.addEventListener('loadend', fn) |
| } else { |
| this[kEvents].loadend = null |
| } |
| } |
| |
| get onerror () { |
| webidl.brandCheck(this, FileReader) |
| |
| return this[kEvents].error |
| } |
| |
| set onerror (fn) { |
| webidl.brandCheck(this, FileReader) |
| |
| if (this[kEvents].error) { |
| this.removeEventListener('error', this[kEvents].error) |
| } |
| |
| if (typeof fn === 'function') { |
| this[kEvents].error = fn |
| this.addEventListener('error', fn) |
| } else { |
| this[kEvents].error = null |
| } |
| } |
| |
| get onloadstart () { |
| webidl.brandCheck(this, FileReader) |
| |
| return this[kEvents].loadstart |
| } |
| |
| set onloadstart (fn) { |
| webidl.brandCheck(this, FileReader) |
| |
| if (this[kEvents].loadstart) { |
| this.removeEventListener('loadstart', this[kEvents].loadstart) |
| } |
| |
| if (typeof fn === 'function') { |
| this[kEvents].loadstart = fn |
| this.addEventListener('loadstart', fn) |
| } else { |
| this[kEvents].loadstart = null |
| } |
| } |
| |
| get onprogress () { |
| webidl.brandCheck(this, FileReader) |
| |
| return this[kEvents].progress |
| } |
| |
| set onprogress (fn) { |
| webidl.brandCheck(this, FileReader) |
| |
| if (this[kEvents].progress) { |
| this.removeEventListener('progress', this[kEvents].progress) |
| } |
| |
| if (typeof fn === 'function') { |
| this[kEvents].progress = fn |
| this.addEventListener('progress', fn) |
| } else { |
| this[kEvents].progress = null |
| } |
| } |
| |
| get onload () { |
| webidl.brandCheck(this, FileReader) |
| |
| return this[kEvents].load |
| } |
| |
| set onload (fn) { |
| webidl.brandCheck(this, FileReader) |
| |
| if (this[kEvents].load) { |
| this.removeEventListener('load', this[kEvents].load) |
| } |
| |
| if (typeof fn === 'function') { |
| this[kEvents].load = fn |
| this.addEventListener('load', fn) |
| } else { |
| this[kEvents].load = null |
| } |
| } |
| |
| get onabort () { |
| webidl.brandCheck(this, FileReader) |
| |
| return this[kEvents].abort |
| } |
| |
| set onabort (fn) { |
| webidl.brandCheck(this, FileReader) |
| |
| if (this[kEvents].abort) { |
| this.removeEventListener('abort', this[kEvents].abort) |
| } |
| |
| if (typeof fn === 'function') { |
| this[kEvents].abort = fn |
| this.addEventListener('abort', fn) |
| } else { |
| this[kEvents].abort = null |
| } |
| } |
| } |
| |
| // https://w3c.github.io/FileAPI/#dom-filereader-empty |
| FileReader.EMPTY = FileReader.prototype.EMPTY = 0 |
| // https://w3c.github.io/FileAPI/#dom-filereader-loading |
| FileReader.LOADING = FileReader.prototype.LOADING = 1 |
| // https://w3c.github.io/FileAPI/#dom-filereader-done |
| FileReader.DONE = FileReader.prototype.DONE = 2 |
| |
| Object.defineProperties(FileReader.prototype, { |
| EMPTY: staticPropertyDescriptors, |
| LOADING: staticPropertyDescriptors, |
| DONE: staticPropertyDescriptors, |
| readAsArrayBuffer: kEnumerableProperty, |
| readAsBinaryString: kEnumerableProperty, |
| readAsText: kEnumerableProperty, |
| readAsDataURL: kEnumerableProperty, |
| abort: kEnumerableProperty, |
| readyState: kEnumerableProperty, |
| result: kEnumerableProperty, |
| error: kEnumerableProperty, |
| onloadstart: kEnumerableProperty, |
| onprogress: kEnumerableProperty, |
| onload: kEnumerableProperty, |
| onabort: kEnumerableProperty, |
| onerror: kEnumerableProperty, |
| onloadend: kEnumerableProperty, |
| [Symbol.toStringTag]: { |
| value: 'FileReader', |
| writable: false, |
| enumerable: false, |
| configurable: true |
| } |
| }) |
| |
| Object.defineProperties(FileReader, { |
| EMPTY: staticPropertyDescriptors, |
| LOADING: staticPropertyDescriptors, |
| DONE: staticPropertyDescriptors |
| }) |
| |
| module.exports = { |
| FileReader |
| } |