import { before, describe, it } from '@ephox/bedrock-client';
import { Fun } from '@ephox/katamari';
import { Attribute, Remove, Truncate } from '@ephox/sugar';
import { McEditor, TinyDom } from '@ephox/wrap-mcagar';
import { assert } from 'chai';
import Editor from 'tinymce/core/api/Editor';
import { RawEditorOptions } from 'tinymce/core/api/OptionTypes';
import VisualBlocksPlugin from 'tinymce/plugins/visualblocks/Plugin';
describe('browser.tinymce.core.EditorCleanupTest', () => {
before(() => {
VisualBlocksPlugin();
});
const assertPageLinkPresence = (url: string, exists: boolean): void => {
const links = document.head.querySelectorAll(`link[href="${url}"]`);
assert.equal(links.length > 0, exists, `Should have link with url="${url}"`);
};
const testCleanup = (comment: string, settings: RawEditorOptions, html: string = '
', fn: (editor: Editor) => void = Fun.noop) => {
it(comment, async () => {
// spin the editor up and down, getting a reference to its target element in between
const editor = await McEditor.pFromHtml(html, { base_url: '/project/tinymce/js/tinymce', ...settings });
const element = TinyDom.targetElement(editor);
// Run any additional chains
fn(editor);
editor.remove();
// first, remove the id of the element, as that's inserted from McEditor.cFromHtml and is out of our control
Attribute.remove(element, 'id');
// assert that the html of the element is correct
assert.equal(Truncate.getHtml(element), html, comment + ' all properties on the element should be cleaned up');
// remove the element
Remove.remove(element);
});
};
testCleanup('TINY-4001: Inline editor should clean up attributes', { inline: true });
testCleanup('TINY-4001: Iframe editor should clean up attributes', {});
testCleanup('TINY-4001: Editor should replace existing attributes on teardown: classname', {}, '');
testCleanup('TINY-4001: Editor should replace existing attributes on teardown: absolute', {}, '');
testCleanup('TINY-4001: Editor should replace existing attributes on teardown: data', {}, '');
testCleanup('TINY-4001: Editor should replace existing attributes on teardown: textarea', {}, '');
testCleanup('TINY-4001: Editor should clean up placeholder 1', { placeholder: 'Some text' });
testCleanup('TINY-4001: Editor should clean up placeholder 2', { placeholder: 'Some text' }, '');
testCleanup('TINY-4001: Visual blocks plugin should not leave classes on target', { plugins: 'visualblocks' });
testCleanup(
'TINY-3926: Styles loaded via StyleSheetLoader or editor.dom.loadCss() are cleaned up',
{ inline: true },
'',
(editor) => {
editor.dom.loadCSS('/project/tinymce/js/tinymce/skins/ui/dark/skin.css');
});
// Loaded via StyleSheetLoader
assertPageLinkPresence('/project/tinymce/js/tinymce/skins/ui/content/default/content.inline.css', false);
assertPageLinkPresence('/project/tinymce/js/tinymce/skins/ui/oxide/skin.css', false);
// Loaded via DOMUtils as per above
assertPageLinkPresence('/project/tinymce/js/tinymce/skins/ui/dark/skin.css', false);
});