view-selection-to-model-converters.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /**
  2. * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. /* bender-tags: conversion */
  6. 'use strict';
  7. import ViewDocument from '/ckeditor5/engine/view/document.js';
  8. import ViewSelection from '/ckeditor5/engine/view/selection.js';
  9. import ViewRange from '/ckeditor5/engine/view/range.js';
  10. import ModelDocument from '/ckeditor5/engine/model/document.js';
  11. import Mapper from '/ckeditor5/engine/conversion/mapper.js';
  12. import { convertSelectionChange } from '/ckeditor5/engine/conversion/view-selection-to-model-converters.js';
  13. import { setData as modelSetData, getData as modelGetData } from '/tests/engine/_utils/model.js';
  14. import { setData as viewSetData } from '/tests/engine/_utils/view.js';
  15. describe( 'convertSelectionChange', () => {
  16. let model, view, mapper, convertSelection, modelRoot, viewRoot;
  17. beforeEach( () => {
  18. model = new ModelDocument();
  19. modelRoot = model.createRoot();
  20. model.schema.registerItem( 'paragraph', '$block' );
  21. modelSetData( model, '<paragraph>foo</paragraph><paragraph>bar</paragraph>' );
  22. view = new ViewDocument();
  23. viewRoot = view.createRoot( 'div' );
  24. viewSetData( view, '<p>foo</p><p>bar</p>' );
  25. mapper = new Mapper();
  26. mapper.bindElements( modelRoot, viewRoot );
  27. mapper.bindElements( modelRoot.getChild( 0 ), viewRoot.getChild( 0 ) );
  28. mapper.bindElements( modelRoot.getChild( 1 ), viewRoot.getChild( 1 ) );
  29. convertSelection = convertSelectionChange( model, mapper );
  30. } );
  31. it( 'should convert collapsed selection', () => {
  32. const viewSelection = new ViewSelection();
  33. viewSelection.addRange( ViewRange.createFromParentsAndOffsets(
  34. viewRoot.getChild( 0 ).getChild( 0 ), 1, viewRoot.getChild( 0 ).getChild( 0 ), 1 ) );
  35. convertSelection( null, { newSelection: viewSelection } );
  36. expect( modelGetData( model ) ).to.equals( '<paragraph>f<selection />oo</paragraph><paragraph>bar</paragraph>' );
  37. } );
  38. it( 'should convert multi ranges selection', () => {
  39. const viewSelection = new ViewSelection();
  40. viewSelection.addRange( ViewRange.createFromParentsAndOffsets(
  41. viewRoot.getChild( 0 ).getChild( 0 ), 1, viewRoot.getChild( 0 ).getChild( 0 ), 2 ) );
  42. viewSelection.addRange( ViewRange.createFromParentsAndOffsets(
  43. viewRoot.getChild( 1 ).getChild( 0 ), 1, viewRoot.getChild( 1 ).getChild( 0 ), 2 ) );
  44. convertSelection( null, { newSelection: viewSelection } );
  45. // Too bad getData shows only the first range.
  46. expect( modelGetData( model ) ).to.equals(
  47. '<paragraph>f<selection>o</selection>o</paragraph><paragraph>bar</paragraph>' );
  48. const ranges = Array.from( model.selection.getRanges() );
  49. expect( ranges.length ).to.equals( 2 );
  50. expect( ranges[ 0 ].start.parent ).to.equals( modelRoot.getChild( 0 ) );
  51. expect( ranges[ 0 ].start.offset ).to.equals( 1 );
  52. expect( ranges[ 0 ].end.parent ).to.equals( modelRoot.getChild( 0 ) );
  53. expect( ranges[ 0 ].end.offset ).to.equals( 2 );
  54. expect( ranges[ 1 ].start.parent ).to.equals( modelRoot.getChild( 1 ) );
  55. expect( ranges[ 1 ].start.offset ).to.equals( 1 );
  56. expect( ranges[ 1 ].end.parent ).to.equals( modelRoot.getChild( 1 ) );
  57. expect( ranges[ 1 ].end.offset ).to.equals( 2 );
  58. } );
  59. it( 'should convert revers selection', () => {
  60. const viewSelection = new ViewSelection();
  61. viewSelection.addRange( ViewRange.createFromParentsAndOffsets(
  62. viewRoot.getChild( 0 ).getChild( 0 ), 1, viewRoot.getChild( 0 ).getChild( 0 ), 2 ), true );
  63. convertSelection( null, { newSelection: viewSelection } );
  64. // Too bad getData shows only the first range.
  65. expect( modelGetData( model ) ).to.equals(
  66. '<paragraph>f<selection backward>o</selection>o</paragraph><paragraph>bar</paragraph>' );
  67. } );
  68. } );