/** * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved. * For licensing, see LICENSE.md. */ /* global document */ import { setData as setViewData, getData as getViewData } from '../../src/dev-utils/view'; import ViewDocument from '../../src/view/document'; import { unwrap, insert } from '../../src/view/writer'; import ViewAttributeElement from '../../src/view/attributeelement'; import ViewPosition from '../../src/view/position'; import normalizeHtml from '@ckeditor/ckeditor5-utils/tests/_utils/normalizehtml'; describe( 'Bug ckeditor5-engine#922', () => { let viewDoc, viewRoot, domRoot; beforeEach( () => { viewDoc = new ViewDocument(); domRoot = document.createElement( 'div' ); document.body.appendChild( domRoot ); viewRoot = viewDoc.createRoot( domRoot ); } ); it( 'should properly render unwrapped attributes #1', () => { setViewData( viewDoc, '' + '[' + 'f' + ']' + 'oo' + '' ); // Render it to DOM to create initial DOM <-> view mappings. viewDoc.render(); // Unwrap italic attribute element. unwrap( viewDoc.selection.getFirstRange(), new ViewAttributeElement( 'italic' ) ); expect( getViewData( viewDoc ) ).to.equal( '

[foo]

' ); // Re-render changes in view to DOM. viewDoc.render(); // Check if DOM is rendered correctly. expect( normalizeHtml( domRoot.innerHTML ) ).to.equal( '

foo

' ); } ); it( 'should properly render unwrapped attributes #2', () => { setViewData( viewDoc, '' + '[' + 'foo' + ']' + '' ); // Render it to DOM to create initial DOM <-> view mappings. viewDoc.render(); // Unwrap italic attribute element and change text inside. unwrap( viewDoc.selection.getFirstRange(), new ViewAttributeElement( 'italic' ) ); viewRoot.getChild( 0 ).getChild( 0 ).getChild( 0 ).data = 'bar'; expect( getViewData( viewDoc ) ).to.equal( '

[bar]

' ); // Re-render changes in view to DOM. viewDoc.render(); // Check if DOM is rendered correctly. expect( normalizeHtml( domRoot.innerHTML ) ).to.equal( '

bar

' ); } ); it( 'should properly render if text is changed and element is inserted into same node #1', () => { setViewData( viewDoc, 'foo' ); // Render it to DOM to create initial DOM <-> view mappings. viewDoc.render(); // Change text and insert new element into paragraph. const textNode = viewRoot.getChild( 0 ).getChild( 0 ); textNode.data = 'foobar'; insert( ViewPosition.createAfter( textNode ), new ViewAttributeElement( 'img' ) ); expect( getViewData( viewDoc ) ).to.equal( '

foobar

' ); // Re-render changes in view to DOM. viewDoc.render(); // Check if DOM is rendered correctly. expect( normalizeHtml( domRoot.innerHTML ) ).to.equal( '

foobar

' ); } ); it( 'should properly render if text is changed and element is inserted into same node #2', () => { setViewData( viewDoc, 'foo' ); // Render it to DOM to create initial DOM <-> view mappings. viewDoc.render(); // Change text and insert new element into paragraph. const textNode = viewRoot.getChild( 0 ).getChild( 0 ); textNode.data = 'foobar'; insert( ViewPosition.createBefore( textNode ), new ViewAttributeElement( 'img' ) ); expect( getViewData( viewDoc ) ).to.equal( '

foobar

' ); // Re-render changes in view to DOM. viewDoc.render(); // Check if DOM is rendered correctly. expect( normalizeHtml( domRoot.innerHTML ) ).to.equal( '

foobar

' ); } ); } );