Spaces:
Runtime error
Runtime error
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 | |
} | |