@@ -17,6 +17,7 @@ import DocumentSelection from '../../src/view/documentselection';
1717import DomConverter from '../../src/view/domconverter' ;
1818import Renderer from '../../src/view/renderer' ;
1919import DocumentFragment from '../../src/view/documentfragment' ;
20+ import DowncastWriter from '../../src/view/downcastwriter' ;
2021import CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror' ;
2122import { parse , setData as setViewData , getData as getViewData } from '../../src/dev-utils/view' ;
2223import { 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