Преглед изворни кода

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.
Maciej пре 6 година
родитељ
комит
74d5937434

+ 17 - 1
packages/ckeditor5-upload/src/filereader.js

@@ -30,6 +30,8 @@ export default class FileReader {
 		 */
 		this._reader = reader;
 
+		this._data = undefined;
+
 		/**
 		 * Number of bytes loaded.
 		 *
@@ -53,6 +55,16 @@ export default class FileReader {
 		return this._reader.error;
 	}
 
+	/**
+	 * Holds the data of an already loaded file. The file must be first loaded
+	 * by using {@link module:upload/filereader~FileReader#read `read()`}.
+	 *
+	 * @type {File|undefined}
+	 */
+	get data() {
+		return this._data;
+	}
+
 	/**
 	 * Reads the provided file.
 	 *
@@ -66,7 +78,11 @@ export default class FileReader {
 
 		return new Promise( ( resolve, reject ) => {
 			reader.onload = () => {
-				resolve( reader.result );
+				const result = reader.result;
+
+				this._data = result;
+
+				resolve( result );
 			};
 
 			reader.onerror = () => {

+ 10 - 1
packages/ckeditor5-upload/src/filerepository.js

@@ -400,6 +400,16 @@ class FileLoader {
 		}
 	}
 
+	/**
+	 * Returns the file data. To read its data, you need for first load the file
+	 * by using the {@link module:upload/filerepository~FileLoader#read `read()`} method.
+	 *
+	 * @type {File|undefined}
+	 */
+	get data() {
+		return this._reader.data;
+	}
+
 	/**
 	 * Reads file using {@link module:upload/filereader~FileReader}.
 	 *
@@ -521,7 +531,6 @@ class FileLoader {
 		this._filePromiseWrapper = undefined;
 		this._reader = undefined;
 		this._adapter = undefined;
-		this.data = undefined;
 		this.uploadResponse = undefined;
 	}
 

+ 19 - 2
packages/ckeditor5-upload/tests/filereader.js

@@ -37,7 +37,24 @@ describe( 'FileReader', () => {
 		expect( reader.loaded ).to.equal( 55 );
 	} );
 
-	describe( 'read', () => {
+	describe( 'data', () => {
+		it( 'should be undefined if file was not loaded', () => {
+			expect( reader.data ).to.be.undefined;
+		} );
+
+		it( 'should equal to loaded file data', () => {
+			const promise = reader.read( fileMock )
+				.then( () => {
+					expect( reader.data ).to.equal( 'File contents.' );
+				} );
+
+			nativeReaderMock.mockSuccess( 'File contents.' );
+
+			return promise;
+		} );
+	} );
+
+	describe( 'read()', () => {
 		it( 'should return a promise', () => {
 			expect( reader.read( fileMock ) ).to.be.instanceOf( Promise );
 		} );
@@ -81,7 +98,7 @@ describe( 'FileReader', () => {
 		} );
 	} );
 
-	describe( 'abort', () => {
+	describe( 'abort()', () => {
 		it( 'should allow to abort reading', () => {
 			const promise = reader.read( fileMock )
 				.then( () => {

+ 27 - 0
packages/ckeditor5-upload/tests/filerepository.js

@@ -452,6 +452,33 @@ describe( 'FileRepository', () => {
 			} );
 		} );
 
+		describe( 'data getter', () => {
+			it( 'should be undefined if no file loaded', () => {
+				expect( loader.data ).to.be.undefined;
+			} );
+
+			it( 'should return promise which resolves to a file', () => {
+				let resolveFile = null;
+
+				const filePromise = new Promise( resolve => {
+					resolveFile = resolve;
+				} );
+
+				const loader = fileRepository.createLoader( filePromise );
+
+				const promise = loader.read()
+					.then( () => {
+						expect( loader.data ).to.equal( 'result data' );
+					} );
+
+				resolveFile( createNativeFileMock() );
+
+				loader.file.then( () => nativeReaderMock.mockSuccess( 'result data' ) );
+
+				return promise;
+			} );
+		} );
+
 		describe( 'read()', () => {
 			it( 'should throw error when status is different than idle', () => {
 				loader.status = 'uploading';