922.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /**
  2. * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. /* global document */
  6. import { setData as setViewData, getData as getViewData } from '../../src/dev-utils/view';
  7. import ViewDocument from '../../src/view/document';
  8. import { unwrap, insert } from '../../src/view/writer';
  9. import ViewAttributeElement from '../../src/view/attributeelement';
  10. import ViewPosition from '../../src/view/position';
  11. import normalizeHtml from '@ckeditor/ckeditor5-utils/tests/_utils/normalizehtml';
  12. describe( 'Bug ckeditor5-engine#922', () => {
  13. let viewDoc, viewRoot, domRoot;
  14. beforeEach( () => {
  15. viewDoc = new ViewDocument();
  16. domRoot = document.createElement( 'div' );
  17. document.body.appendChild( domRoot );
  18. viewRoot = viewDoc.createRoot( domRoot );
  19. } );
  20. it( 'should properly render unwrapped attributes #1', () => {
  21. setViewData( viewDoc,
  22. '<container:p>' +
  23. '[<attribute:italic>' +
  24. '<attribute:strong>f</attribute:strong>' +
  25. '</attribute:italic>]' +
  26. '<attribute:strong>oo</attribute:strong>' +
  27. '</container:p>'
  28. );
  29. // Render it to DOM to create initial DOM <-> view mappings.
  30. viewDoc.render();
  31. // Unwrap italic attribute element.
  32. unwrap( viewDoc.selection.getFirstRange(), new ViewAttributeElement( 'italic' ) );
  33. expect( getViewData( viewDoc ) ).to.equal( '<p>[<strong>foo</strong>]</p>' );
  34. // Re-render changes in view to DOM.
  35. viewDoc.render();
  36. // Check if DOM is rendered correctly.
  37. expect( normalizeHtml( domRoot.innerHTML ) ).to.equal( '<p><strong>foo</strong></p>' );
  38. } );
  39. it( 'should properly render unwrapped attributes #2', () => {
  40. setViewData( viewDoc,
  41. '<container:p>' +
  42. '[<attribute:italic>' +
  43. '<attribute:strong>foo</attribute:strong>' +
  44. '</attribute:italic>]' +
  45. '</container:p>' );
  46. // Render it to DOM to create initial DOM <-> view mappings.
  47. viewDoc.render();
  48. // Unwrap italic attribute element and change text inside.
  49. unwrap( viewDoc.selection.getFirstRange(), new ViewAttributeElement( 'italic' ) );
  50. viewRoot.getChild( 0 ).getChild( 0 ).getChild( 0 ).data = 'bar';
  51. expect( getViewData( viewDoc ) ).to.equal( '<p>[<strong>bar</strong>]</p>' );
  52. // Re-render changes in view to DOM.
  53. viewDoc.render();
  54. // Check if DOM is rendered correctly.
  55. expect( normalizeHtml( domRoot.innerHTML ) ).to.equal( '<p><strong>bar</strong></p>' );
  56. } );
  57. it( 'should properly render if text is changed and element is inserted into same node #1', () => {
  58. setViewData( viewDoc,
  59. '<container:p>foo</container:p>'
  60. );
  61. // Render it to DOM to create initial DOM <-> view mappings.
  62. viewDoc.render();
  63. // Change text and insert new element into paragraph.
  64. const textNode = viewRoot.getChild( 0 ).getChild( 0 );
  65. textNode.data = 'foobar';
  66. insert( ViewPosition.createAfter( textNode ), new ViewAttributeElement( 'img' ) );
  67. expect( getViewData( viewDoc ) ).to.equal( '<p>foobar<img></img></p>' );
  68. // Re-render changes in view to DOM.
  69. viewDoc.render();
  70. // Check if DOM is rendered correctly.
  71. expect( normalizeHtml( domRoot.innerHTML ) ).to.equal( '<p>foobar<img></img></p>' );
  72. } );
  73. it( 'should properly render if text is changed and element is inserted into same node #2', () => {
  74. setViewData( viewDoc,
  75. '<container:p>foo</container:p>'
  76. );
  77. // Render it to DOM to create initial DOM <-> view mappings.
  78. viewDoc.render();
  79. // Change text and insert new element into paragraph.
  80. const textNode = viewRoot.getChild( 0 ).getChild( 0 );
  81. textNode.data = 'foobar';
  82. insert( ViewPosition.createBefore( textNode ), new ViewAttributeElement( 'img' ) );
  83. expect( getViewData( viewDoc ) ).to.equal( '<p><img></img>foobar</p>' );
  84. // Re-render changes in view to DOM.
  85. viewDoc.render();
  86. // Check if DOM is rendered correctly.
  87. expect( normalizeHtml( domRoot.innerHTML ) ).to.equal( '<p><img></img>foobar</p>' );
  88. } );
  89. } );