import { LegacyUnit } from '@ephox/mcagar'; import { Pipeline } from '@ephox/agar'; import Env from 'tinymce/core/api/Env'; import { FakeCaret, isFakeCaretTarget } from 'tinymce/core/caret/FakeCaret'; import $ from 'tinymce/core/api/dom/DomQuery'; import Zwsp from 'tinymce/core/text/Zwsp'; import CaretAsserts from '../../module/test/CaretAsserts'; import ViewBlock from '../../module/test/ViewBlock'; import { UnitTest } from '@ephox/bedrock'; import { Element } from '@ephox/sugar'; import { isFakeCaretTableBrowser } from 'tinymce/core/keyboard/TableNavigation'; import { Fun } from '@ephox/katamari'; UnitTest.asynctest('browser.tinymce.core.caret.FakeCaretTest', function () { const success = arguments[arguments.length - 2]; const failure = arguments[arguments.length - 1]; const suite = LegacyUnit.createSuite(); const viewBlock = ViewBlock(); let fakeCaret; if (!Env.ceFalse) { return; } const getRoot = function () { return viewBlock.get(); }; const setup = function () { fakeCaret = FakeCaret(getRoot(), isBlock, Fun.constant(true)); }; const teardown = function () { fakeCaret.destroy(); }; const isBlock = function (node) { return node.nodeName === 'DIV'; }; suite.test('show/hide (before, block)', function () { let rng, $fakeCaretElm; $(getRoot()).html('
a
'); rng = fakeCaret.show(true, $('div', getRoot())[0]); $fakeCaretElm = $(getRoot()).children(); LegacyUnit.equal($fakeCaretElm[0].nodeName, 'P'); LegacyUnit.equal($fakeCaretElm.attr('data-mce-caret'), 'before'); CaretAsserts.assertRange(rng, CaretAsserts.createRange($fakeCaretElm[0], 0, $fakeCaretElm[0], 0)); fakeCaret.hide(); LegacyUnit.equal($('*[data-mce-caret]', getRoot()).length, 0); }); suite.test('show/hide (before, block)', function () { let rng, $fakeCaretElm; $(getRoot()).html('
a
'); rng = fakeCaret.show(false, $('div', getRoot())[0]); $fakeCaretElm = $(getRoot()).children(); LegacyUnit.equal($fakeCaretElm[1].nodeName, 'P'); LegacyUnit.equal($fakeCaretElm.eq(1).attr('data-mce-caret'), 'after'); CaretAsserts.assertRange(rng, CaretAsserts.createRange($fakeCaretElm[1], 0, $fakeCaretElm[1], 0)); fakeCaret.hide(); LegacyUnit.equal($('*[data-mce-caret]', getRoot()).length, 0); }); suite.test('show/hide (before, inline)', function () { let rng, $fakeCaretText; $(getRoot()).html('a'); rng = fakeCaret.show(true, $('span', getRoot())[0]); $fakeCaretText = $(getRoot()).contents(); LegacyUnit.equal($fakeCaretText[0].nodeName, '#text'); LegacyUnit.equal($fakeCaretText[0].data, Zwsp.ZWSP); CaretAsserts.assertRange(rng, CaretAsserts.createRange($fakeCaretText[0], 1)); fakeCaret.hide(); LegacyUnit.equal($(getRoot()).contents()[0].nodeName, 'SPAN'); }); suite.test('show/hide (after, inline)', function () { let rng, $fakeCaretText; $(getRoot()).html('a'); rng = fakeCaret.show(false, $('span', getRoot())[0]); $fakeCaretText = $(getRoot()).contents(); LegacyUnit.equal($fakeCaretText[1].nodeName, '#text'); LegacyUnit.equal($fakeCaretText[1].data, Zwsp.ZWSP); CaretAsserts.assertRange(rng, CaretAsserts.createRange($fakeCaretText[1], 1)); fakeCaret.hide(); LegacyUnit.equal($(getRoot()).contents()[0].nodeName, 'SPAN'); }); suite.test('getCss', function () { LegacyUnit.equal(fakeCaret.getCss().length > 10, true); }); suite.test('show before TD', function () { let rng; getRoot().innerHTML = '
x
'; rng = fakeCaret.show(false, $('td', getRoot())[0]); LegacyUnit.equal(true, rng === null, 'Should be null since TD is not a valid caret target'); }); suite.test('show before TH', function () { let rng; getRoot().innerHTML = '
x
'; rng = fakeCaret.show(false, $('th', getRoot())[0]); LegacyUnit.equal(true, rng === null, 'Should be null since TH is not a valid caret target'); }); suite.test('isFakeCaretTarget', function () { LegacyUnit.equal(false, isFakeCaretTarget(Element.fromHtml('

').dom()), 'Should not need a fake caret'); LegacyUnit.equal(true, isFakeCaretTarget(Element.fromHtml('

').dom()), 'Should always need a fake caret'); LegacyUnit.equal(isFakeCaretTableBrowser(), isFakeCaretTarget(Element.fromHtml('
').dom()), 'Should on some browsers need a fake caret'); }); viewBlock.attach(); setup(); Pipeline.async({}, suite.toSteps({}), function () { viewBlock.detach(); teardown(); success(); }, failure); });