import { Pipeline } from '@ephox/agar'; import { LegacyUnit, TinyLoader } from '@ephox/mcagar'; import Env from 'tinymce/core/api/Env'; import HtmlUtils from '../../module/test/HtmlUtils'; import Theme from 'tinymce/themes/modern/Theme'; import { UnitTest } from '@ephox/bedrock'; UnitTest.asynctest('browser.tinymce.util.QuirksWekbitTest', function () { const success = arguments[arguments.length - 2]; const failure = arguments[arguments.length - 1]; const suite = LegacyUnit.createSuite(); Theme(); suite.test('Delete from beginning of P into H1', function (editor) { editor.getBody().innerHTML = '

a

b

'; LegacyUnit.setSelection(editor, 'p', 0); editor.execCommand('Delete'); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '

ab

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'H1'); }); suite.test('Delete between empty paragraphs', function (editor) { editor.getBody().innerHTML = '

a



b

'; LegacyUnit.setSelection(editor, 'p:last', 0); editor.execCommand('Delete'); LegacyUnit.equal(HtmlUtils.normalizeHtml(HtmlUtils.cleanHtml(editor.getBody().innerHTML)), '

a


b

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'P'); }); suite.test('Delete range from middle of H1 to middle of span in P', function (editor) { editor.getBody().innerHTML = '

ab

bcd

'; LegacyUnit.setSelection(editor, 'h1', 1, 'span', 1); editor.execCommand('Delete'); LegacyUnit.equal( HtmlUtils.normalizeHtml(HtmlUtils.cleanHtml(editor.getBody().innerHTML)), '

ad

' ); LegacyUnit.equal(editor.selection.getStart().nodeName, 'H1'); }); suite.test('Delete from beginning of P with style span inside into H1 with inline block', function (editor) { editor.getBody().innerHTML = '

a

bc

'; LegacyUnit.setSelection(editor, 'p', 0); editor.execCommand('Delete'); LegacyUnit.equal(editor.getContent(), '

abc

'); LegacyUnit.equal(editor.selection.getNode().nodeName, 'H1'); }); suite.test('Delete from beginning of P with style span inside into H1', function (editor) { editor.getBody().innerHTML = '

a

bc

'; LegacyUnit.setSelection(editor, 'p', 0); editor.execCommand('Delete'); LegacyUnit.equal(editor.getContent(), '

abc

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'H1'); }); suite.test('Delete from beginning of P into H1 with contentEditable:false', function (editor) { editor.getBody().innerHTML = '

a

bc

'; LegacyUnit.setSelection(editor, 'p', 0); editor.execCommand('Delete'); LegacyUnit.equal(editor.getContent(), '

a

bc

'); LegacyUnit.equal(editor.selection.getNode().nodeName, 'P'); }); suite.test('Delete from beginning of P with style span inside into H1 with trailing BR', function (editor) { editor.getBody().innerHTML = '

a

bc

'; LegacyUnit.setSelection(editor, 'p', 0); editor.execCommand('Delete'); LegacyUnit.equal(editor.getContent(), '

abc

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'H1'); }); suite.test('Delete from empty P with style span inside into H1', function (editor) { editor.getBody().innerHTML = '

a

b

'; LegacyUnit.setSelection(editor, 'span', 0); editor.execCommand('Delete'); LegacyUnit.equal(editor.getContent(), '

ab

'); LegacyUnit.equal(editor.selection.getNode().nodeName, 'H1'); }); suite.test('Delete from beginning of P with span style to H1', function (editor) { editor.getBody().innerHTML = '

a

b

'; LegacyUnit.setSelection(editor, 'span', 0); editor.execCommand('Delete'); LegacyUnit.equal(editor.getContent(), '

ab

'); LegacyUnit.equal(editor.selection.getNode().nodeName, 'H1'); }); suite.test('Delete from beginning of P with BR line to H1', function (editor) { editor.getBody().innerHTML = '

a

b
c

'; LegacyUnit.setSelection(editor, 'p', 0); editor.execCommand('Delete'); LegacyUnit.equal(HtmlUtils.normalizeHtml(HtmlUtils.cleanHtml(editor.getBody().innerHTML)), '

ab
c

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'H1'); }); suite.test('Delete from after image to paragraph', function (editor) { editor.getBody().innerHTML = '

a

'; const rng = editor.dom.createRng(); rng.setStartAfter(editor.dom.select('img')[0]); rng.setEndAfter(editor.dom.select('img')[0]); editor.selection.setRng(rng); editor.execCommand('Delete'); LegacyUnit.equal(HtmlUtils.normalizeHtml(HtmlUtils.cleanHtml(editor.getBody().innerHTML)), '

a


'); LegacyUnit.equal(editor.selection.getNode().nodeName, 'P'); }); suite.test('ForwardDelete from end of H1 to P with style span', function (editor) { editor.getBody().innerHTML = '

a

b

'; LegacyUnit.setSelection(editor, 'h1', 1); editor.execCommand('ForwardDelete'); LegacyUnit.equal(editor.getContent(), '

ab

'); LegacyUnit.equal(editor.selection.getNode().nodeName, 'H1'); }); suite.test('ForwardDelete from end of H1 with trailing BR to P with style span', function (editor) { editor.getBody().innerHTML = '

a

b

'; LegacyUnit.setSelection(editor, 'h1', 1); editor.execCommand('ForwardDelete'); LegacyUnit.equal(editor.getContent(), '

ab

'); LegacyUnit.equal(editor.selection.getNode().nodeName, 'H1'); }); suite.test('ForwardDelete from end of H1 with two trailing BR:s to P with style span', function (editor) { editor.getBody().innerHTML = '

a

b

'; LegacyUnit.setSelection(editor, 'h1', 1); editor.execCommand('ForwardDelete'); LegacyUnit.equal(editor.getContent(), '

a

b

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'H1'); }); suite.test('ForwardDelete from end of H1 to P with style and inline block element', function (editor) { editor.getBody().innerHTML = '

a

b

'; LegacyUnit.setSelection(editor, 'h1', 1); editor.execCommand('ForwardDelete'); LegacyUnit.equal(editor.getContent(), '

ab

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'H1'); }); suite.test('ForwardDelete from end of H1 with BR line to P', function (editor) { editor.getBody().innerHTML = '

a
b

c

'; const rng = editor.selection.getRng(); rng.setStart(editor.$('h1')[0].lastChild, 1); rng.setEnd(editor.$('h1')[0].lastChild, 1); editor.selection.setRng(rng); editor.execCommand('ForwardDelete'); LegacyUnit.equal(HtmlUtils.normalizeHtml(HtmlUtils.cleanHtml(editor.getBody().innerHTML)), '

a
bc

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'H1'); }); suite.test('ForwardDelete from end of H1 into P', function (editor) { editor.getBody().innerHTML = '

a

b

'; LegacyUnit.setSelection(editor, 'h1', 1); editor.execCommand('ForwardDelete'); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '

ab

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'H1'); }); suite.test('ForwardDelete from end of H1 into P with contentEditable:false', function (editor) { editor.getBody().innerHTML = '

a

b

'; LegacyUnit.setSelection(editor, 'h1', 1); editor.execCommand('ForwardDelete'); LegacyUnit.equal(editor.getContent(), '

a

b

'); }); suite.test('ForwardDelete from end of H1 into P with style span inside', function (editor) { editor.getBody().innerHTML = '

a

bc

'; LegacyUnit.setSelection(editor, 'h1', 1); editor.execCommand('ForwardDelete'); LegacyUnit.equal(editor.getContent(), '

abc

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'H1'); }); suite.test('Backspace key from beginning of P into H1', function (editor) { editor.getBody().innerHTML = '

a

b

'; LegacyUnit.setSelection(editor, 'p', 0); editor.fire('keydown', { keyCode: 8, shiftKey: false, ctrlKey: false, altKey: false, metaKey: false }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '

ab

'); LegacyUnit.equal(editor.selection.getNode().nodeName, 'H1'); }); suite.test('Delete key from end of H1 into P', function (editor) { editor.getBody().innerHTML = '

a

b

'; LegacyUnit.setSelection(editor, 'h1', 1); editor.fire('keydown', { keyCode: 46, shiftKey: false, ctrlKey: false, altKey: false, metaKey: false }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '

ab

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'H1'); }); /* // These used to be supported in the Quirks branch however not sure if // we need to deal with this very uncommon operations. If we do we need // to re-introduce them in the new Backspace/Delete logic suite.test('Backspace previous word', function (editor) { editor.getBody().innerHTML = '

abc 123

'; LegacyUnit.setSelection(editor, 'p', 7); editor.fire("keydown", { keyCode: 8, ctrlKey: true }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '

abc 

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'P'); }); suite.test('Backspace previous line', function (editor) { editor.getBody().innerHTML = '

abc 123

'; LegacyUnit.setSelection(editor, 'p', 7); editor.fire("keydown", { keyCode: 8, metaKey: true }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '


'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'BR'); }); suite.test('Delete next word', function (editor) { editor.getBody().innerHTML = '

abc 123

'; LegacyUnit.setSelection(editor, 'p', 0); editor.fire("keydown", { keyCode: 46, ctrlKey: true }); // Remove nbsp since very old WebKit has an slight issue LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML).replace(' ', ''), '

123

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'P'); }); suite.test('Delete next line', function (editor) { editor.getBody().innerHTML = '

abc 123

'; LegacyUnit.setSelection(editor, 'p', 0); editor.fire("keydown", { keyCode: 46, metaKey: true }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '


'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'BR'); }); suite.test('Type over bold text in fully selected block and keep bold', function (editor) { editor.getBody().innerHTML = '

x

y

'; LegacyUnit.setSelection(editor, 'b', 0, 'b', 1); editor.fire("keypress", { keyCode: 65, charCode: 65 }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '

a

y

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'B'); }); suite.test('Type over partial bold text and keep bold', function (editor) { editor.getBody().innerHTML = '

xy

'; LegacyUnit.setSelection(editor, 'b', 0, 'b', 1); editor.fire("keypress", { keyCode: 65, charCode: 65 }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '

ay

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'B'); }); suite.test('Type over bold text wrapped inside other formats', function (editor) { editor.getBody().innerHTML = '

123

'; LegacyUnit.setSelection(editor, 'b', 0, 'b', 1); editor.fire("keypress", { keyCode: 65, charCode: 65 }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '

1a3

'); LegacyUnit.equal(editor.selection.getStart().nodeName, 'B'); }); suite.test('Delete last character in formats', function (editor) { editor.getBody().innerHTML = '

b

'; LegacyUnit.setSelection(editor, 'i', 1); editor.fire("keydown", { keyCode: 8 }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '


'); LegacyUnit.equal(editor.selection.getStart(true).nodeName, 'I'); }); suite.test('ForwardDelete last character in formats', function (editor) { editor.getBody().innerHTML = '

b

'; LegacyUnit.setSelection(editor, 'i', 0); editor.fire("keydown", { keyCode: 46 }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '


'); LegacyUnit.equal(editor.selection.getStart(true).nodeName, 'I'); }); suite.test('Delete in empty in formats text block', function (editor) { var rng; editor.getBody().innerHTML = '

a



'; rng = editor.dom.createRng(); rng.setStartBefore(editor.$('br:last')[0]); rng.setEndBefore(editor.$('br:last')[0]); editor.selection.setRng(rng); editor.fire("keydown", { keyCode: 8 }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '

a


'); LegacyUnit.equal(editor.selection.getStart(true).nodeName, 'I'); }); suite.test('ForwardDelete in empty formats text block', function (editor) { var rng; editor.getBody().innerHTML = '

a



'; rng = editor.dom.createRng(); rng.setStartBefore(editor.$('br:first')[0]); rng.setEndBefore(editor.$('br:first')[0]); editor.selection.setRng(rng); editor.fire("keydown", { keyCode: 46 }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '

a


'); LegacyUnit.equal(editor.selection.getStart(true).nodeName, 'I'); }); suite.test('Type over all contents', function (editor) { editor.getBody().innerHTML = '

abc

'; LegacyUnit.setSelection(editor, 'p', 0, 'p', 3); editor.fire('keypress', { charCode: 97 }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '

a

'); LegacyUnit.equal(editor.selection.getRng().startContainer.data, 'a'); LegacyUnit.equal(editor.selection.getRng().startOffset, 1); }); */ suite.test('ForwardDelete all contents', function (editor) { editor.getBody().innerHTML = '

abc

'; LegacyUnit.setSelection(editor, 'p', 0, 'p', 3); editor.fire('keydown', { keyCode: 46 }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '


'); LegacyUnit.equal(editor.selection.getStart(true).nodeName, 'P'); }); suite.test('Delete all contents', function (editor) { editor.getBody().innerHTML = '

abc

'; LegacyUnit.setSelection(editor, 'p', 0, 'p', 3); editor.fire('keydown', { keyCode: 8 }); LegacyUnit.equal(HtmlUtils.cleanHtml(editor.getBody().innerHTML), '


'); LegacyUnit.equal(editor.selection.getStart(true).nodeName, 'P'); }); TinyLoader.setup(function (editor, onSuccess, onFailure) { const steps = Env.webkit ? suite.toSteps(editor) : []; Pipeline.async({}, steps, onSuccess, onFailure); }, { add_unload_trigger: false, indent: false, disable_nodechange: true, skin_url: '/project/js/tinymce/skins/lightgray' }, success, failure); });