import { Assertions } from '@ephox/agar'; import { context, describe, it } from '@ephox/bedrock-client'; import { Arr } from '@ephox/katamari'; import { Hierarchy, Html, Insert, SugarElement } from '@ephox/sugar'; import * as FragmentReader from 'tinymce/core/selection/FragmentReader'; import * as ViewBlock from '../../module/test/ViewBlock'; describe('browser.tinymce.core.selection.FragmentReaderTest', () => { const viewBlock = ViewBlock.bddSetup(); const setHtml = viewBlock.update; const readFragment = (startPath: number[], startOffset: number, endPath: number[], endOffset: number) => { const sc = Hierarchy.follow(SugarElement.fromDom(viewBlock.get()), startPath).getOrDie(); const ec = Hierarchy.follow(SugarElement.fromDom(viewBlock.get()), endPath).getOrDie(); const rng = document.createRange(); rng.setStart(sc.dom, startOffset); rng.setEnd(ec.dom, endOffset); return FragmentReader.read(SugarElement.fromDom(viewBlock.get()), [ rng ]); }; const readFragmentCells = (paths: number[][]) => { const ranges = Arr.map(paths, (path) => { const container = Hierarchy.follow(SugarElement.fromDom(viewBlock.get()), path).getOrDie(); const rng = document.createRange(); rng.selectNode(container.dom); return rng; }); return FragmentReader.read(SugarElement.fromDom(viewBlock.get()), ranges); }; const getFragmentHtml = (fragment: SugarElement) => { const elm = SugarElement.fromTag('div'); Insert.append(elm, fragment); return Html.get(elm); }; const assertFragmentHtml = (fragment: SugarElement, expectedHtml: string) => { const actualHtml = getFragmentHtml(fragment); Assertions.assertHtml('Should be expected fragment html', expectedHtml, actualHtml); }; context('Fragments on inline elements', () => { it('Get fragment from collapsed range', () => { setHtml('

abc

'); const frag = readFragment([ 0, 0, 0 ], 1, [ 0, 0, 0 ], 1); assertFragmentHtml(frag, ''); }); it('Get fragment from partially selected text', () => { setHtml('

abc

'); const frag = readFragment([ 0, 0, 0 ], 1, [ 0, 0, 0 ], 2); assertFragmentHtml(frag, 'b'); }); it('Get fragment from partially selected inline element', () => { setHtml('

ab

'); const frag = readFragment([ 0, 0, 0 ], 0, [ 0, 0, 1, 0 ], 1); assertFragmentHtml(frag, 'ab'); }); it('Get fragment on text only inside inline element', () => { setHtml('

a

'); const frag = readFragment([ 0, 0, 0 ], 0, [ 0, 0, 0 ], 1); assertFragmentHtml(frag, 'a'); }); it('Get fragment on text only inside inline elements', () => { setHtml('

a

'); const frag = readFragment([ 0, 0, 0, 0, 0 ], 0, [ 0, 0, 0, 0, 0 ], 1); assertFragmentHtml(frag, 'a'); }); it('Get fragment indexed element within inline element', () => { setHtml('

'); const frag = readFragment([ 0, 0 ], 0, [ 0, 0 ], 1); assertFragmentHtml(frag, ''); }); }); context('Fragments on headers', () => { it('Get fragment from partially selected text inside h1', () => { setHtml('

abc

'); const frag = readFragment([ 0, 0, 0 ], 1, [ 0, 0, 0 ], 2); assertFragmentHtml(frag, '

b

'); }); it('Get fragment text selection inside h1', () => { setHtml('

a

'); const frag = readFragment([ 0, 0 ], 0, [ 0, 0 ], 1); assertFragmentHtml(frag, '

a

'); }); it('Get fragment text selection inside h2', () => { setHtml('

a

'); const frag = readFragment([ 0, 0 ], 0, [ 0, 0 ], 1); assertFragmentHtml(frag, '

a

'); }); it('Get fragment from text selection inside inline element inside h1', () => { setHtml('

a

'); const frag = readFragment([ 0, 0, 0 ], 0, [ 0, 0, 0 ], 1); assertFragmentHtml(frag, '

a

'); }); it('Get fragment from text inside a bunch of inline elements inside a h1', () => { setHtml('

b

'); const frag = readFragment([ 0, 0, 0, 0, 0 ], 0, [ 0, 0, 0, 0, 0 ], 1); assertFragmentHtml(frag, '

b

'); }); }); context('Fragments on li', () => { it('Get fragment from fully selected li contents text in ul', () => { setHtml(''); const frag = readFragment([ 0, 0, 0 ], 0, [ 0, 0, 0 ], 1); assertFragmentHtml(frag, ''); }); it('Get fragment from fully selected li contents text in ol', () => { setHtml('
  1. a
'); const frag = readFragment([ 0, 0, 0 ], 0, [ 0, 0, 0 ], 1); assertFragmentHtml(frag, '
  1. a
'); }); it('Get fragment from fully selected li contents text in ul with list style', () => { setHtml(''); const frag = readFragment([ 0, 0, 0 ], 0, [ 0, 0, 0 ], 1); assertFragmentHtml(frag, ''); }); it('Get fragment from fully selected li contents text in ol with list style', () => { setHtml('
  1. a
'); const frag = readFragment([ 0, 0, 0 ], 0, [ 0, 0, 0 ], 1); assertFragmentHtml(frag, '
  1. a
'); }); it('Get fragment from fully selected li contents text in ul in ol', () => { setHtml('
    • a
'); const frag = readFragment([ 0, 0, 0, 0 ], 0, [ 0, 0, 0, 0 ], 1); assertFragmentHtml(frag, ''); }); it('Get fragment from fully selected li mixed contents in ol', () => { setHtml('
  1. ab
'); const frag = readFragment([ 0, 0, 0 ], 0, [ 0, 0, 1, 0 ], 1); assertFragmentHtml(frag, '
  1. ab
'); }); it('Get fragment from fully selected li mixed contents in ul', () => { setHtml(''); const frag = readFragment([ 0, 0, 0, 0 ], 0, [ 0, 0, 1, 0 ], 1); assertFragmentHtml(frag, ''); }); it('Get fragment from fully selected li contents with siblings', () => { setHtml(''); const frag = readFragment([ 0, 1, 0 ], 0, [ 0, 1, 0 ], 1); assertFragmentHtml(frag, ''); }); it('Get fragment from partially selected li contents (start)', () => { setHtml(''); const frag = readFragment([ 0, 0, 0 ], 0, [ 0, 0, 0 ], 2); assertFragmentHtml(frag, 'ab'); }); it('Get fragment from partially selected li contents (middle)', () => { setHtml(''); const frag = readFragment([ 0, 0, 0 ], 1, [ 0, 0, 0 ], 2); assertFragmentHtml(frag, 'b'); }); it('Get fragment from partially selected li contents (end)', () => { setHtml(''); const frag = readFragment([ 0, 0, 0 ], 1, [ 0, 0, 0 ], 3); assertFragmentHtml(frag, 'bc'); }); it('Get fragment from fully selected li contents text in ul with trailing br', () => { setHtml(''); const frag = readFragment([ 0, 0, 0 ], 0, [ 0, 0, 0 ], 1); assertFragmentHtml(frag, ''); }); it('Get fragment from fully selected inline element contents text in ul with trailing br', () => { setHtml(''); const frag = readFragment([ 0, 0, 0, 0 ], 0, [ 0, 0, 0, 0 ], 1); assertFragmentHtml(frag, ''); }); it('Get fragment from two partially selected li:s', () => { setHtml('
  1. ab
  2. cd
'); const frag = readFragment([ 0, 0, 0 ], 1, [ 0, 1, 0 ], 1); assertFragmentHtml(frag, '
  1. b
  2. c
'); }); it('Get fragment from two partially selected li:s in nested structure', () => { setHtml('
  1. ab
    1. cd
'); const frag = readFragment([ 0, 0, 0 ], 1, [ 0, 0, 1, 0, 0 ], 1); assertFragmentHtml(frag, '
  1. b
    1. c
'); }); }); context('Fragments from tables', () => { it('Get table fragment from table 2x2 with selection (1,1)-(1,2)', () => { setHtml('
AB
CD
'); const frag = readFragment([ 0 ], 0, [ 0 ], 1); assertFragmentHtml(frag, '
A
C
'); }); it('Get table fragment from table 2x2 with selection (1,1)-(2,1)', () => { setHtml('
AB
CD
'); const frag = readFragment([ 0 ], 0, [ 0 ], 1); assertFragmentHtml(frag, '
AB
'); }); it('Get table fragment from table 2x2 with multi range selection (1,1)-(2,2)', () => { setHtml('
AB
CD
'); const frag = readFragmentCells([[ 0, 0, 0, 0 ], [ 0, 0, 1, 1 ]]); assertFragmentHtml(frag, '
AB
CD
'); }); it('Get table fragment from table 2x2 with multi range selection (2,1)-(2,2)', () => { setHtml('
AB
CD
'); const frag = readFragmentCells([[ 0, 0, 0, 1 ], [ 0, 0, 1, 1 ]]); assertFragmentHtml(frag, '
B
D
'); }); }); });