Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions packages/react-native/Libraries/Blob/FileReader.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ class FileReader extends EventTarget {
);
}

this._setReadyState(LOADING);

NativeFileReaderModule.readAsDataURL(blob.data).then(
(text: string) => {
if (this._aborted) {
Expand Down Expand Up @@ -111,6 +113,8 @@ class FileReader extends EventTarget {
);
}

this._setReadyState(LOADING);

NativeFileReaderModule.readAsDataURL(blob.data).then(
(text: string) => {
if (this._aborted) {
Expand Down Expand Up @@ -138,6 +142,8 @@ class FileReader extends EventTarget {
);
}

this._setReadyState(LOADING);

NativeFileReaderModule.readAsText(blob.data, encoding).then(
(text: string) => {
if (this._aborted) {
Expand Down
25 changes: 25 additions & 0 deletions packages/react-native/Libraries/Blob/__tests__/FileReader-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,31 @@ describe('FileReader', function () {
expect(e.target?.result).toBe('data:text/plain;base64,NDI=');
});

it('should be in the LOADING state while a read is in progress', () => {
const reader = new FileReader();
expect(reader.readyState).toBe(FileReader.EMPTY);
reader.readAsText(new Blob());
// The native read resolves on a later microtask, so the reader should
// report LOADING synchronously after the read starts.
expect(reader.readyState).toBe(FileReader.LOADING);
});

it('should dispatch abort and loadend when aborted during a read', () => {
const reader = new FileReader();
let aborted = false;
let loadended = false;
reader.onabort = () => {
aborted = true;
};
reader.onloadend = () => {
loadended = true;
};
reader.readAsText(new Blob());
reader.abort();
expect(aborted).toBe(true);
expect(loadended).toBe(true);
});

it('should read blob as ArrayBuffer', async () => {
const e = await new Promise<Event>((resolve, reject) => {
const reader = new FileReader();
Expand Down
Loading