diff --git a/src/view/renderer.js b/src/view/renderer.js index 05af38295..a16adc5a2 100644 --- a/src/view/renderer.js +++ b/src/view/renderer.js @@ -256,7 +256,7 @@ export default class Renderer { const actualDomChildren = this.domConverter.mapViewToDom( viewElement ).childNodes; const expectedDomChildren = Array.from( - this.domConverter.viewChildrenToDom( viewElement, domElement.ownerDocument ) + this.domConverter.viewChildrenToDom( viewElement, domElement.ownerDocument, { withChildren: false } ) ); const diff = this._diffNodeLists( actualDomChildren, expectedDomChildren ); const actions = this._findReplaceActions( diff, actualDomChildren, expectedDomChildren ); diff --git a/tests/view/renderer.js b/tests/view/renderer.js index 7e6600138..d9fdbf668 100644 --- a/tests/view/renderer.js +++ b/tests/view/renderer.js @@ -1683,6 +1683,36 @@ describe( 'Renderer', () => { ); } ); + // #1451 + it( 'should correctly render changed children even if direct parent is not marked to sync', () => { + const inputView = + '' + + 'Foo' + + 'Bar' + + ''; + + const view = parse( inputView ); + + viewRoot._appendChild( view ); + + renderer.markToSync( 'children', viewRoot ); + renderer.render(); + + expect( domRoot.innerHTML ).to.equal( '' ); + + const viewLi = view.getChild( 0 ); + const viewLiIndented = view._removeChildren( 1, 1 ); // Array with one element. + viewLiIndented[ 0 ]._appendChild( parse( 'Baz' ) ); + const viewUl = new ViewContainerElement( 'ul', null, viewLiIndented ); + viewLi._appendChild( viewUl ); + + renderer.markToSync( 'children', view ); + renderer.markToSync( 'children', viewLi ); + renderer.render(); + + expect( domRoot.innerHTML ).to.equal( '' ); + } ); + describe( 'fake selection', () => { beforeEach( () => { const { view: viewP, selection: newSelection } = parse(