From 94a2e14fbba2df03ac5bf69d775e0fdf6f3749b1 Mon Sep 17 00:00:00 2001 From: Marta Motyczynska Date: Tue, 19 Nov 2024 15:58:25 +0100 Subject: [PATCH] Fix removing attributes from DOM element. --- packages/ckeditor5-engine/src/view/renderer.ts | 4 +++- packages/ckeditor5-engine/tests/view/renderer.js | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/ckeditor5-engine/src/view/renderer.ts b/packages/ckeditor5-engine/src/view/renderer.ts index e37264fecd7..180ec72042c 100644 --- a/packages/ckeditor5-engine/src/view/renderer.ts +++ b/packages/ckeditor5-engine/src/view/renderer.ts @@ -590,7 +590,9 @@ export default class Renderer extends /* #__PURE__ */ ObservableMixin() { // Note: It is important to first remove DOM attributes and then set new ones, because some view attributes may be renamed // as they are set on DOM (due to unsafe attributes handling). If we set the view attribute first, and then remove // non-existing DOM attributes, then we would remove the attribute that we just set. - for ( const domAttr of ( domElement as DomElement ).attributes ) { + // + // Note: The domElement.attributes is a live collection, so we need to convert it to an array to avoid issues. + for ( const domAttr of Array.from( ( domElement as DomElement ).attributes ) ) { const key = domAttr.name; // All other attributes not present in the DOM should be removed. diff --git a/packages/ckeditor5-engine/tests/view/renderer.js b/packages/ckeditor5-engine/tests/view/renderer.js index 985c0ad9e8e..d172b94545b 100644 --- a/packages/ckeditor5-engine/tests/view/renderer.js +++ b/packages/ckeditor5-engine/tests/view/renderer.js @@ -189,6 +189,19 @@ describe( 'Renderer', () => { expect( renderer.markedAttributes.size ).to.equal( 0 ); } ); + it( 'should remove all attributes', () => { + domRoot.setAttribute( 'style', 'border:1px solid red' ); + domRoot.setAttribute( 'class', 'bar' ); + + renderer.markToSync( 'attributes', viewRoot ); + renderer.render(); + + expect( domRoot.getAttribute( 'class' ) ).to.be.not.ok; + expect( domRoot.getAttribute( 'style' ) ).to.be.not.ok; + + expect( renderer.markedAttributes.size ).to.equal( 0 ); + } ); + it( 'should add children', () => { viewRoot._appendChild( new ViewText( viewDocument, 'foo' ) );