Skip to content
This repository was archived by the owner on Jun 26, 2020. It is now read-only.

Commit ec56ab8

Browse files
authored
Merge pull request #99 from ckeditor/t/ckeditor5/1985
Other: Add `ImageLoader.data` property for already read file to allow synchronous access to file data.
2 parents c9f9eac + 94128d7 commit ec56ab8

File tree

4 files changed

+73
-4
lines changed

4 files changed

+73
-4
lines changed

src/filereader.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ export default class FileReader {
3030
*/
3131
this._reader = reader;
3232

33+
this._data = undefined;
34+
3335
/**
3436
* Number of bytes loaded.
3537
*
@@ -53,6 +55,16 @@ export default class FileReader {
5355
return this._reader.error;
5456
}
5557

58+
/**
59+
* Holds the data of an already loaded file. The file must be first loaded
60+
* by using {@link module:upload/filereader~FileReader#read `read()`}.
61+
*
62+
* @type {File|undefined}
63+
*/
64+
get data() {
65+
return this._data;
66+
}
67+
5668
/**
5769
* Reads the provided file.
5870
*
@@ -66,7 +78,11 @@ export default class FileReader {
6678

6779
return new Promise( ( resolve, reject ) => {
6880
reader.onload = () => {
69-
resolve( reader.result );
81+
const result = reader.result;
82+
83+
this._data = result;
84+
85+
resolve( result );
7086
};
7187

7288
reader.onerror = () => {

src/filerepository.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,16 @@ class FileLoader {
400400
}
401401
}
402402

403+
/**
404+
* Returns the file data. To read its data, you need for first load the file
405+
* by using the {@link module:upload/filerepository~FileLoader#read `read()`} method.
406+
*
407+
* @type {File|undefined}
408+
*/
409+
get data() {
410+
return this._reader.data;
411+
}
412+
403413
/**
404414
* Reads file using {@link module:upload/filereader~FileReader}.
405415
*
@@ -521,7 +531,6 @@ class FileLoader {
521531
this._filePromiseWrapper = undefined;
522532
this._reader = undefined;
523533
this._adapter = undefined;
524-
this.data = undefined;
525534
this.uploadResponse = undefined;
526535
}
527536

tests/filereader.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,24 @@ describe( 'FileReader', () => {
3737
expect( reader.loaded ).to.equal( 55 );
3838
} );
3939

40-
describe( 'read', () => {
40+
describe( 'data', () => {
41+
it( 'should be undefined if file was not loaded', () => {
42+
expect( reader.data ).to.be.undefined;
43+
} );
44+
45+
it( 'should equal to loaded file data', () => {
46+
const promise = reader.read( fileMock )
47+
.then( () => {
48+
expect( reader.data ).to.equal( 'File contents.' );
49+
} );
50+
51+
nativeReaderMock.mockSuccess( 'File contents.' );
52+
53+
return promise;
54+
} );
55+
} );
56+
57+
describe( 'read()', () => {
4158
it( 'should return a promise', () => {
4259
expect( reader.read( fileMock ) ).to.be.instanceOf( Promise );
4360
} );
@@ -81,7 +98,7 @@ describe( 'FileReader', () => {
8198
} );
8299
} );
83100

84-
describe( 'abort', () => {
101+
describe( 'abort()', () => {
85102
it( 'should allow to abort reading', () => {
86103
const promise = reader.read( fileMock )
87104
.then( () => {

tests/filerepository.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,33 @@ describe( 'FileRepository', () => {
452452
} );
453453
} );
454454

455+
describe( 'data getter', () => {
456+
it( 'should be undefined if no file loaded', () => {
457+
expect( loader.data ).to.be.undefined;
458+
} );
459+
460+
it( 'should return promise which resolves to a file', () => {
461+
let resolveFile = null;
462+
463+
const filePromise = new Promise( resolve => {
464+
resolveFile = resolve;
465+
} );
466+
467+
const loader = fileRepository.createLoader( filePromise );
468+
469+
const promise = loader.read()
470+
.then( () => {
471+
expect( loader.data ).to.equal( 'result data' );
472+
} );
473+
474+
resolveFile( createNativeFileMock() );
475+
476+
loader.file.then( () => nativeReaderMock.mockSuccess( 'result data' ) );
477+
478+
return promise;
479+
} );
480+
} );
481+
455482
describe( 'read()', () => {
456483
it( 'should throw error when status is different than idle', () => {
457484
loader.status = 'uploading';

0 commit comments

Comments
 (0)