Parcourir la source

Added warning when using FileRepository without defining an adapter.

Piotrek Koszuliński il y a 8 ans
Parent
commit
999f099e3a

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

@@ -26,7 +26,8 @@ import uid from '@ckeditor/ckeditor5-utils/src/uid.js';
  * (sending the file and handling server's response). You can use one of the existing plugins introducing upload adapters
  * (e.g. {@link module:easy-image/cloudservicesuploadadapter~CloudServicesUploadAdapter} or
  * {@link module:adapter-ckfinder/uploadadapter~CKFinderUploadAdapter}) or write your own one
- * (which boils down to setting the {@link ~FileRepository#createAdapter} factory function).
+ * (which boils down to setting the {@link ~FileRepository#createAdapter} factory function – see
+ * {@link ~Adapter `Adapter` interface} documentation).
  *
  * Then, you can use {@link ~FileRepository#createLoader `createLoader()`} and the returned {@link ~FileLoader} instance to
  * load and upload files.
@@ -98,6 +99,43 @@ export default class FileRepository extends Plugin {
 		} );
 	}
 
+	afterInit() {
+		if ( !this.createAdapter ) {
+			/**
+			 * You need to enable an upload adapter in order to be able to upload files.
+			 *
+			 * This warning shows up when {@link module:upload/filerepository~FileRepository} is being used
+			 * without {@link #createAdapter definining an upload adapter}.
+			 *
+			 * If you see this warning when using one of the {@glink builds/index CKEditor 5 Builds}
+			 * it means that you did not configure any of the upload adapters available by default in those builds.
+			 * See:
+			 *
+			 * * {@link module:core/editor/editorconfig~EditorConfig#cloudServices `config.cloudServices`} for
+			 * Easy Image with Cloud Services integration,
+			 * * {@link module:core/editor/editorconfig~EditorConfig#ckfinder `config.ckfinder`} for CKFinder
+			 * file upload integration.
+			 *
+			 * If you do not need file upload functionality at all and you use one of the builds, you can disable the built-in
+			 * upload adapters to hide this warning:
+			 *
+			 *		ClassicEditor
+			 *			.create( document.querySelector( '#editor' ), {
+			 * 				removePlugins: [ 'EasyImage', 'CKFinderUploadAdapter' ]
+			 *			} )
+			 *			.then( ... )
+			 *			.catch( ... );
+			 *
+			 * If you wish to implement your own upload adapter refer to the {@link ~Adapter `Adapter` interface} documentation.
+			 *
+			 * @error filerepository-no-adapter
+			 */
+			log.warn( 'filerepository-no-adapter: Upload adapter is not defined.' );
+
+			return null;
+		}
+	}
+
 	/**
 	 * Returns the loader associated with specified file.
 	 *
@@ -126,15 +164,7 @@ export default class FileRepository extends Plugin {
 	 */
 	createLoader( file ) {
 		if ( !this.createAdapter ) {
-			/**
-			 * Upload adapter was not defined. Please define it before creating a loader.
-			 *
-			 * This error is thrown when {@link module:upload/filerepository~FileRepository} is being used
-			 * without {@link #createAdapter definining an upload adapter}.
-			 *
-			 * @error filerepository-no-adapter
-			 */
-			log.error( 'filerepository-no-adapter: Upload adapter was not defined.' );
+			log.error( 'filerepository-no-adapter: Upload adapter is not defined.' );
 
 			return null;
 		}

+ 9 - 0
packages/ckeditor5-upload/tests/_utils/mocks.js

@@ -3,6 +3,8 @@
  * For licensing, see LICENSE.md.
  */
 
+import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
+
 /**
  * Returns object that mocks native File object.
  */
@@ -117,3 +119,10 @@ export class NativeFileReaderMock {
 	}
 }
 
+export class UploadAdapterPluginMock extends Plugin {
+	init() {
+		const fileRepository = this.editor.plugins.get( 'FileRepository' );
+
+		fileRepository.createAdapter = () => {};
+	}
+}

+ 43 - 10
packages/ckeditor5-upload/tests/filerepository.js

@@ -6,7 +6,10 @@
 /* globals window */
 
 import VirtualTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor';
+
+import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
 import FileRepository from '../src/filerepository';
+
 import Collection from '@ckeditor/ckeditor5-utils/src/collection';
 import { createNativeFileMock, AdapterMock, NativeFileReaderMock } from './_utils/mocks';
 import log from '@ckeditor/ckeditor5-utils/src/log';
@@ -15,21 +18,28 @@ import FileReader from '../src/filereader';
 
 describe( 'FileRepository', () => {
 	let editor, fileRepository, adapterMock;
+
 	testUtils.createSinonSandbox();
 
+	class UploadAdapterPluginMock extends Plugin {
+		init() {
+			fileRepository = this.editor.plugins.get( 'FileRepository' );
+
+			fileRepository.createAdapter = loader => {
+				adapterMock = new AdapterMock( loader );
+
+				return adapterMock;
+			};
+		}
+	}
+
 	beforeEach( () => {
 		return VirtualTestEditor
 			.create( {
-				plugins: [ FileRepository ]
+				plugins: [ FileRepository, UploadAdapterPluginMock ]
 			} )
 			.then( newEditor => {
 				editor = newEditor;
-				fileRepository = editor.plugins.get( 'FileRepository' );
-				fileRepository.createAdapter = loader => {
-					adapterMock = new AdapterMock( loader );
-
-					return adapterMock;
-				};
 			} );
 	} );
 
@@ -81,16 +91,39 @@ describe( 'FileRepository', () => {
 		} );
 	} );
 
+	describe( 'afterInit()', () => {
+		it( 'logs a warning if no adapter was defined', () => {
+			const stub = testUtils.sinon.stub( log, 'warn' );
+
+			return VirtualTestEditor
+				.create()
+				.then( editor => {
+					const fileRepository = new FileRepository( editor );
+
+					fileRepository.init();
+					fileRepository.afterInit();
+
+					sinon.assert.calledOnce( stub );
+					sinon.assert.calledWithExactly(
+						stub,
+						'filerepository-no-adapter: Upload adapter is not defined.'
+					);
+				} );
+		} );
+	} );
+
 	describe( 'createLoader()', () => {
-		it( 'should show error if adapter is not present', () => {
+		it( 'should return null if adapter is not present', () => {
 			const stub = testUtils.sinon.stub( log, 'error' );
+
 			fileRepository.createAdapter = undefined;
-			fileRepository.createLoader( createNativeFileMock() );
+
+			expect( fileRepository.createLoader( createNativeFileMock() ) ).to.be.null;
 
 			sinon.assert.calledOnce( stub );
 			sinon.assert.calledWithExactly(
 				stub,
-				'filerepository-no-adapter: Upload adapter was not defined.'
+				'filerepository-no-adapter: Upload adapter is not defined.'
 			);
 		} );
 

+ 11 - 3
packages/ckeditor5-upload/tests/imageupload.js

@@ -11,22 +11,30 @@ import ImageUpload from '../src/imageupload';
 import ImageUploadProgress from '../src/imageuploadprogress';
 import ImageUploadButton from '../src/imageuploadbutton';
 
+import { UploadAdapterPluginMock } from './_utils/mocks';
+
 describe( 'ImageUpload', () => {
-	let editor;
+	let editor, editorElement;
 
 	beforeEach( () => {
-		const editorElement = document.createElement( 'div' );
+		editorElement = document.createElement( 'div' );
 		document.body.appendChild( editorElement );
 
 		return ClassicEditor
 			.create( editorElement, {
-				plugins: [ Image, ImageUpload ]
+				plugins: [ Image, ImageUpload, UploadAdapterPluginMock ]
 			} )
 			.then( newEditor => {
 				editor = newEditor;
 			} );
 	} );
 
+	afterEach( () => {
+		editorElement.remove();
+
+		return editor.destroy();
+	} );
+
 	it( 'should include ImageUploadProgress', () => {
 		expect( editor.plugins.get( ImageUploadProgress ) ).to.be.instanceOf( ImageUploadProgress );
 	} );

+ 11 - 6
packages/ckeditor5-upload/tests/imageuploadbutton.js

@@ -7,6 +7,7 @@
 
 import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor';
 
+import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
 import Image from '@ckeditor/ckeditor5-image/src/image';
 import FileDialogButtonView from '../src/ui/filedialogbuttonview';
 import FileRepository from '../src/filerepository';
@@ -21,23 +22,27 @@ import { setData as setModelData, getData as getModelData } from '@ckeditor/cked
 describe( 'ImageUploadButton', () => {
 	let editor, doc, editorElement, fileRepository;
 
+	class UploadAdapterPluginMock extends Plugin {
+		init() {
+			fileRepository = this.editor.plugins.get( FileRepository );
+			fileRepository.createAdapter = loader => {
+				return new AdapterMock( loader );
+			};
+		}
+	}
+
 	beforeEach( () => {
 		editorElement = document.createElement( 'div' );
 		document.body.appendChild( editorElement );
 
 		return ClassicEditor
 			.create( editorElement, {
-				plugins: [ Paragraph, Image, ImageUploadButton, FileRepository ]
+				plugins: [ Paragraph, Image, ImageUploadButton, FileRepository, UploadAdapterPluginMock ]
 			} )
 			.then( newEditor => {
 				editor = newEditor;
 				doc = editor.document;
 
-				fileRepository = editor.plugins.get( FileRepository );
-				fileRepository.createAdapter = loader => {
-					return new AdapterMock( loader );
-				};
-
 				// Hide all notifications (prevent alert() calls).
 				const notification = editor.plugins.get( Notification );
 				notification.on( 'show', evt => evt.stop() );

+ 14 - 5
packages/ckeditor5-upload/tests/imageuploadcommand.js

@@ -4,8 +4,12 @@
  */
 
 import VirtualTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor';
+
+import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
+
 import ImageUploadCommand from '../src/imageuploadcommand';
 import FileRepository from '../src/filerepository';
+
 import { createNativeFileMock, AdapterMock } from './_utils/mocks';
 import { setData as setModelData, getData as getModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
 import Image from '@ckeditor/ckeditor5-image/src/image/imageengine';
@@ -16,18 +20,23 @@ import ModelPosition from '@ckeditor/ckeditor5-engine/src/model/position';
 describe( 'ImageUploadCommand', () => {
 	let editor, command, doc, fileRepository;
 
+	class UploadAdapterPluginMock extends Plugin {
+		init() {
+			fileRepository = this.editor.plugins.get( FileRepository );
+			fileRepository.createAdapter = loader => {
+				return new AdapterMock( loader );
+			};
+		}
+	}
+
 	beforeEach( () => {
 		return VirtualTestEditor
 			.create( {
-				plugins: [ FileRepository, Image, Paragraph ]
+				plugins: [ FileRepository, Image, Paragraph, UploadAdapterPluginMock ]
 			} )
 			.then( newEditor => {
 				editor = newEditor;
 				command = new ImageUploadCommand( editor );
-				fileRepository = editor.plugins.get( FileRepository );
-				fileRepository.createAdapter = loader => {
-					return new AdapterMock( loader );
-				};
 
 				doc = editor.document;
 

+ 16 - 9
packages/ckeditor5-upload/tests/imageuploadengine.js

@@ -6,6 +6,8 @@
 /* globals window, setTimeout */
 
 import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor';
+
+import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
 import ImageEngine from '@ckeditor/ckeditor5-image/src/image/imageengine';
 import ImageUploadEngine from '../src/imageuploadengine';
 import ImageUploadCommand from '../src/imageuploadcommand';
@@ -28,8 +30,21 @@ describe( 'ImageUploadEngine', () => {
 	// eslint-disable-next-line max-len
 	const base64Sample = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=';
 	let editor, doc, fileRepository, viewDocument, nativeReaderMock, loader, adapterMock;
+
 	testUtils.createSinonSandbox();
 
+	class UploadAdapterPluginMock extends Plugin {
+		init() {
+			fileRepository = this.editor.plugins.get( FileRepository );
+			fileRepository.createAdapter = newLoader => {
+				loader = newLoader;
+				adapterMock = new AdapterMock( loader );
+
+				return adapterMock;
+			};
+		}
+	}
+
 	beforeEach( () => {
 		testUtils.sinon.stub( window, 'FileReader' ).callsFake( () => {
 			nativeReaderMock = new NativeFileReaderMock();
@@ -39,20 +54,12 @@ describe( 'ImageUploadEngine', () => {
 
 		return ClassicTestEditor
 			.create( {
-				plugins: [ ImageEngine, ImageUploadEngine, Paragraph, UndoEngine ]
+				plugins: [ ImageEngine, ImageUploadEngine, Paragraph, UndoEngine, UploadAdapterPluginMock ]
 			} )
 			.then( newEditor => {
 				editor = newEditor;
 				doc = editor.document;
 				viewDocument = editor.editing.view;
-
-				fileRepository = editor.plugins.get( FileRepository );
-				fileRepository.createAdapter = newLoader => {
-					loader = newLoader;
-					adapterMock = new AdapterMock( loader );
-
-					return adapterMock;
-				};
 			} );
 	} );
 

+ 18 - 1
packages/ckeditor5-upload/tests/imageuploadprogress.js

@@ -6,11 +6,14 @@
 /* globals window */
 
 import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor';
+
+import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
 import ImageEngine from '@ckeditor/ckeditor5-image/src/image/imageengine';
 import ImageUploadEngine from '../src/imageuploadengine';
 import ImageUploadProgress from '../src/imageuploadprogress';
 import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
 import FileRepository from '../src/filerepository';
+
 import { AdapterMock, createNativeFileMock, NativeFileReaderMock } from './_utils/mocks';
 import { setData as setModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
 import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
@@ -20,9 +23,23 @@ import svgPlaceholder from '../theme/icons/image_placeholder.svg';
 
 describe( 'ImageUploadProgress', () => {
 	const imagePlaceholder = encodeURIComponent( svgPlaceholder );
+
 	// eslint-disable-next-line max-len
 	const base64Sample = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=';
 	let editor, document, fileRepository, viewDocument, nativeReaderMock, loader, adapterMock;
+
+	class UploadAdapterPluginMock extends Plugin {
+		init() {
+			fileRepository = this.editor.plugins.get( FileRepository );
+			fileRepository.createAdapter = newLoader => {
+				loader = newLoader;
+				adapterMock = new AdapterMock( loader );
+
+				return adapterMock;
+			};
+		}
+	}
+
 	testUtils.createSinonSandbox();
 
 	beforeEach( () => {
@@ -34,7 +51,7 @@ describe( 'ImageUploadProgress', () => {
 
 		return ClassicTestEditor
 			.create( {
-				plugins: [ ImageEngine, Paragraph, ImageUploadProgress ]
+				plugins: [ ImageEngine, Paragraph, ImageUploadProgress, UploadAdapterPluginMock ]
 			} )
 			.then( newEditor => {
 				editor = newEditor;