Browse Source

Delete editor.element after destroying creator, so it's able to read the element.

Piotrek Koszuliński 10 years ago
parent
commit
a025a635d7

+ 7 - 5
packages/ckeditor5-engine/src/editor.js

@@ -141,11 +141,13 @@ export default class Editor {
 
 		this.fire( 'destroy' );
 
-		delete this.element;
-
-		return Promise.resolve().then( () => {
-			return that._creator && that._creator.destroy();
-		} );
+		return Promise.resolve()
+			.then( () => {
+				return that._creator && that._creator.destroy();
+			} )
+			.then( () => {
+				delete this.element;
+			} );
 	}
 }
 

+ 29 - 0
packages/ckeditor5-engine/tests/editor/creator.js

@@ -61,6 +61,17 @@ before( () => {
 			}
 		};
 	} );
+
+	amdUtils.define( 'creator-destroy-order', [ 'core/creator' ], ( Creator ) => {
+		return class extends Creator {
+			create() {}
+
+			destroy() {
+				editor._elementInsideCreatorDestroy = this.editor.element;
+				editor._destroyOrder.push( 'creator' );
+			}
+		};
+	} );
 } );
 
 afterEach( () => {
@@ -171,4 +182,22 @@ describe( 'destroy', () => {
 				expect( err ).to.have.property( 'message', 'Catch me - destroy.' );
 			} );
 	} );
+
+	it( 'should do things in the correct order', () => {
+		return initEditor( {
+				creator: 'creator-destroy-order'
+			} )
+			.then( () => {
+				editor._destroyOrder = [];
+				editor.on( 'destroy', () => {
+					editor._destroyOrder.push( 'event' );
+				} );
+
+				return editor.destroy();
+			} )
+			.then( () => {
+				expect( editor._elementInsideCreatorDestroy ).to.not.be.undefined;
+				expect( editor._destroyOrder ).to.deep.equal( [ 'event', 'creator' ] );
+			} );
+	} );
 } );