Procházet zdrojové kódy

Restored required part of the code and make CC: 100%.

Kamil Piechaczek před 5 roky
rodič
revize
685a43eca5

+ 6 - 0
packages/ckeditor5-upload/src/filerepository.js

@@ -440,6 +440,12 @@ class FileLoader {
 		return this.file
 			.then( file => this._reader.read( file ) )
 			.then( data => {
+				// Edge case: reader was aborted after file was read - double check for proper status.
+				// It can happen when image was deleted during its upload.
+				if ( this.status !== 'reading' ) {
+					throw this.status;
+				}
+
 				this.status = 'idle';
 
 				return data;

+ 39 - 1
packages/ckeditor5-upload/tests/filerepository.js

@@ -9,15 +9,22 @@ import VirtualTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtest
 
 import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
 import PendingActions from '@ckeditor/ckeditor5-core/src/pendingactions';
+import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
+import ImageEditing from '@ckeditor/ckeditor5-image/src/image/imageediting';
+import ImageUploadEditing from '@ckeditor/ckeditor5-image/src/imageupload/imageuploadediting';
 import FileRepository from '../src/filerepository';
 
 import Collection from '@ckeditor/ckeditor5-utils/src/collection';
 import { createNativeFileMock, UploadAdapterMock, NativeFileReaderMock } from './_utils/mocks';
 import FileReader from '../src/filereader';
+import { setData as setModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
 
 describe( 'FileRepository', () => {
 	let editor, fileRepository, adapterMock;
 
+	// eslint-disable-next-line max-len
+	const base64Sample = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=';
+
 	class UploadAdapterPluginMock extends Plugin {
 		init() {
 			fileRepository = this.editor.plugins.get( 'FileRepository' );
@@ -33,7 +40,7 @@ describe( 'FileRepository', () => {
 	beforeEach( () => {
 		return VirtualTestEditor
 			.create( {
-				plugins: [ FileRepository, UploadAdapterPluginMock ]
+				plugins: [ FileRepository, UploadAdapterPluginMock, Paragraph, ImageEditing, ImageUploadEditing ]
 			} )
 			.then( newEditor => {
 				editor = newEditor;
@@ -582,6 +589,37 @@ describe( 'FileRepository', () => {
 
 				return promise;
 			} );
+
+			it( 'should abort upload if image is removed', () => {
+				const model = editor.model;
+				const doc = model.document;
+
+				fileRepository.createUploadAdapter = newLoader => {
+					loader = newLoader;
+
+					return new UploadAdapterMock( loader );
+				};
+
+				const file = createNativeFileMock();
+				setModelData( model, '<paragraph>{}foo bar</paragraph>' );
+				editor.execute( 'imageUpload', { file } );
+
+				const abortSpy = sinon.spy( loader, 'abort' );
+
+				expect( loader.status ).to.equal( 'reading' );
+
+				return loader.file.then( () => {
+					nativeReaderMock.mockSuccess( base64Sample );
+
+					const image = doc.getRoot().getChild( 0 );
+					model.change( writer => {
+						writer.remove( image );
+					} );
+
+					expect( loader.status ).to.equal( 'aborted' );
+					sinon.assert.calledOnce( abortSpy );
+				} );
+			} );
 		} );
 
 		describe( 'upload()', () => {