Skip to content
This repository was archived by the owner on Jun 26, 2020. It is now read-only.

Commit 6619a1f

Browse files
author
Piotr Jasiun
authored
Merge pull request #1567 from ckeditor/t/1560-b
Fix: Marked reused element attributes to be rendered if replacing element was also marked. Closes #1560. Closes #1561.
2 parents ebae0c3 + e79458b commit 6619a1f

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

src/view/renderer.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,9 @@ export default class Renderer {
306306
// It may also happen that 'newViewChild' mapping is not present since its parent mapping
307307
// was already removed (the 'domConverter.unbindDomElement()' method also unbinds children
308308
// mappings) so we also check for '!newViewChild'.
309-
if ( !newViewChild || newViewChild && !newViewChild.isSimilar( viewElement ) ) {
309+
// Also check if new element ('newViewChild') was marked to have its attributes rerenderd,
310+
// if so, marked reused view element too (#1560).
311+
if ( !newViewChild || newViewChild && !newViewChild.isSimilar( viewElement ) || this.markedAttributes.has( newViewChild ) ) {
310312
this.markedAttributes.add( viewElement );
311313
}
312314

tests/view/renderer.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import DocumentSelection from '../../src/view/documentselection';
1717
import DomConverter from '../../src/view/domconverter';
1818
import Renderer from '../../src/view/renderer';
1919
import DocumentFragment from '../../src/view/documentfragment';
20+
import DowncastWriter from '../../src/view/downcastwriter';
2021
import CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';
2122
import { parse, setData as setViewData, getData as getViewData } from '../../src/dev-utils/view';
2223
import { INLINE_FILLER, INLINE_FILLER_LENGTH, isBlockFiller, BR_FILLER } from '../../src/view/filler';
@@ -3038,6 +3039,68 @@ describe( 'Renderer', () => {
30383039
expect( domRoot.innerHTML ).to.equal( '<p><a href="#href">Foo<i>Bar</i></a></p>' );
30393040
} );
30403041
} );
3042+
3043+
// #1560
3044+
describe( 'attributes manipulation on replaced element', () => {
3045+
it( 'should rerender element if it was removed after having its attributes removed (attribute)', () => {
3046+
const writer = new DowncastWriter();
3047+
3048+
// 1. Setup initial view/DOM.
3049+
viewRoot._appendChild( parse( '<container:p>1</container:p>' ) );
3050+
3051+
const viewP = viewRoot.getChild( 0 );
3052+
3053+
writer.setAttribute( 'data-placeholder', 'Body', viewP );
3054+
3055+
renderer.markToSync( 'children', viewRoot );
3056+
renderer.render();
3057+
3058+
expect( domRoot.innerHTML ).to.equal( '<p data-placeholder="Body">1</p>' );
3059+
3060+
// 2. Modify view.
3061+
writer.removeAttribute( 'data-placeholder', viewP );
3062+
3063+
viewRoot._removeChildren( 0, viewRoot.childCount );
3064+
3065+
viewRoot._appendChild( parse( '<container:p>1</container:p><container:p>2</container:p>' ) );
3066+
3067+
renderer.markToSync( 'attributes', viewP );
3068+
renderer.markToSync( 'children', viewRoot );
3069+
renderer.render();
3070+
3071+
expect( domRoot.innerHTML ).to.equal( '<p>1</p><p>2</p>' );
3072+
} );
3073+
3074+
it( 'should rerender element if it was removed after having its attributes removed (classes)', () => {
3075+
const writer = new DowncastWriter();
3076+
3077+
// 1. Setup initial view/DOM.
3078+
viewRoot._appendChild( parse( '<container:h1>h1</container:h1><container:p>p</container:p>' ) );
3079+
3080+
const viewP = viewRoot.getChild( 1 );
3081+
3082+
writer.addClass( [ 'cke-test1', 'cke-test2' ], viewP );
3083+
3084+
renderer.markToSync( 'children', viewRoot );
3085+
renderer.render();
3086+
3087+
expect( domRoot.innerHTML ).to.equal( '<h1>h1</h1><p class="cke-test1 cke-test2">p</p>' );
3088+
3089+
// 2. Modify view.
3090+
writer.removeClass( 'cke-test2', viewP );
3091+
3092+
viewRoot._removeChildren( 0, viewRoot.childCount );
3093+
3094+
viewRoot._appendChild( parse( '<container:h1>h1</container:h1>' +
3095+
'<container:p class="cke-test1">p</container:p><container:p>p2</container:p>' ) );
3096+
3097+
renderer.markToSync( 'attributes', viewP );
3098+
renderer.markToSync( 'children', viewRoot );
3099+
renderer.render();
3100+
3101+
expect( domRoot.innerHTML ).to.equal( '<h1>h1</h1><p class="cke-test1">p</p><p>p2</p>' );
3102+
} );
3103+
} );
30413104
} );
30423105

30433106
describe( '#922', () => {

0 commit comments

Comments
 (0)