8
0
Эх сурвалжийг харах

Fixed bug when try to map element that is removed from DOM.

Oskar Wróbel 7 жил өмнө
parent
commit
f844ccbfc2

+ 5 - 0
packages/ckeditor5-image/src/image/imageloadobserver.js

@@ -55,6 +55,11 @@ export default class ImageLoadObserver extends DomEventObserver {
 
 				const domNode = this.view.domConverter.mapViewToDom( node );
 
+				// If there is no `domNode` it means that it was removed from the DOM in the meanwhile.
+				if ( !domNode ) {
+					return;
+				}
+
 				for ( const domElement of domNode.querySelectorAll( 'img' ) ) {
 					if ( !this._observedElements.has( domElement ) ) {
 						this._domEmitter.listenTo( domElement, 'load', ( evt, domEvt ) => this.onDomEvent( domEvt ) );

+ 16 - 0
packages/ckeditor5-image/tests/image/imageloadobserver.js

@@ -81,6 +81,22 @@ describe( 'ClickObserver', () => {
 		sinon.assert.neverCalledWith( mapSpy, viewDiv );
 	} );
 
+	it( 'should not throw when synced child was removed in the meanwhile', () => {
+		let viewDiv;
+
+		const mapSpy = sinon.spy( view.domConverter, 'mapViewToDom' );
+
+		view.change( writer => {
+			viewDiv = writer.createContainerElement( 'div' );
+			viewRoot.fire( 'change:children', viewDiv );
+		} );
+
+		expect( () => {
+			view._renderer.render();
+			sinon.assert.calledWith( mapSpy, viewDiv );
+		} ).to.not.throw();
+	} );
+
 	it( 'should call `layoutChanged` along with `imageLoaded` event', () => {
 		const layoutChangedSpy = sinon.spy();
 		const imageLoadedSpy = sinon.spy();