import { after, afterEach, before, describe, it } from '@ephox/bedrock-client';
import { Remove, Selectors } from '@ephox/sugar';
import { assert } from 'chai';
import 'tinymce';
import DOMUtils from 'tinymce/core/api/dom/DOMUtils';
import Editor from 'tinymce/core/api/Editor';
import EditorManager from 'tinymce/core/api/EditorManager';
import PluginManager from 'tinymce/core/api/PluginManager';
import Tools from 'tinymce/core/api/util/Tools';
import * as ViewBlock from '../module/test/ViewBlock';
describe('browser.tinymce.core.EditorManagerTest', () => {
const viewBlock = ViewBlock.bddSetup();
before(() => {
EditorManager._setBaseUrl('/project/tinymce/js/tinymce');
});
after(() => {
EditorManager.remove();
});
afterEach((done) => {
setTimeout(() => {
EditorManager.remove();
done();
}, 0);
});
it('get', (done) => {
viewBlock.update('');
EditorManager.init({
selector: 'textarea.tinymce',
init_instance_callback: (editor1) => {
assert.lengthOf(EditorManager.get(), 1);
assert.equal(EditorManager.get(0), EditorManager.activeEditor);
assert.isNull(EditorManager.get(1));
assert.isNull(EditorManager.get('noid'));
assert.isNull(EditorManager.get(undefined as any));
assert.equal(EditorManager.get()[0], EditorManager.activeEditor);
assert.equal(EditorManager.get((EditorManager.activeEditor as Editor).id), EditorManager.activeEditor);
assert.notEqual(EditorManager.get(), EditorManager.get());
// Trigger save
let saveCount = 0;
editor1.on('SaveContent', () => {
saveCount++;
});
EditorManager.triggerSave();
assert.equal(saveCount, 1);
// Re-init on same id
EditorManager.init({
selector: '#' + (EditorManager.activeEditor as Editor).id,
});
assert.lengthOf(EditorManager.get(), 1);
done();
}
});
});
it('addI18n/translate', () => {
EditorManager.addI18n('en', {
from: 'to'
});
assert.equal(EditorManager.translate('from'), 'to');
});
it('Do not reload language pack if it was already loaded or registered manually.', (done) => {
const langCode = 'mce_lang';
const langUrl = 'http://example.com/language/' + langCode + '.js';
EditorManager.addI18n(langCode, {
from: 'to'
});
viewBlock.update('');
EditorManager.init({
selector: 'textarea',
language: langCode,
language_url: langUrl,
init_instance_callback: (_ed) => {
const scripts = Tools.grep(document.getElementsByTagName('script'), (script) => {
return script.src === langUrl;
});
assert.equal(scripts.length, 0);
done();
}
});
});
it('Externally destroyed editor', (done) => {
viewBlock.update('');
EditorManager.init({
selector: 'textarea',
init_instance_callback: (editor1) => {
setTimeout(() => {
// Destroy the editor by setting innerHTML common ajax pattern
viewBlock.update('');
// We need to remove the sink since it's added to the body
Selectors.one('.tox-silver-sink').each(Remove.remove);
// Re-init the editor will have the same id
EditorManager.init({
selector: 'textarea',
skin_url: '/project/tinymce/js/tinymce/skins/ui/oxide',
content_css: '/project/tinymce/js/tinymce/skins/content/default',
init_instance_callback: (editor2) => {
assert.lengthOf(EditorManager.get(), 1);
assert.equal(editor1.id, editor2.id);
assert.isTrue(editor1.destroyed, 'First editor instance should be destroyed');
done();
}
});
}, 0);
}
});
});
it('overrideDefaults', () => {
const oldBaseURI = EditorManager.baseURI;
const oldBaseUrl = EditorManager.baseURL;
const oldSuffix = EditorManager.suffix;
EditorManager.overrideDefaults({
test: 42,
base_url: 'http://www.EditorManager.com/base/',
suffix: 'x',
external_plugins: {
plugina: '//domain/plugina.js',
pluginb: '//domain/pluginb.js'
},
plugin_base_urls: {
testplugin: 'http://custom.ephox.com/dir/testplugin'
}
});
const editor = new Editor('ed1', {}, EditorManager);
editor.options.register('test', { processor: 'number' });
assert.strictEqual(EditorManager.baseURI.path, '/base');
assert.strictEqual(EditorManager.baseURL, 'http://www.EditorManager.com/base');
assert.strictEqual(EditorManager.suffix, 'x');
assert.strictEqual(editor.options.get('test'), 42);
assert.strictEqual(PluginManager.urls.testplugin, 'http://custom.ephox.com/dir/testplugin');
assert.deepEqual(new Editor('ed2', {
base_url: '/project/tinymce/js/tinymce',
external_plugins: {
plugina: '//domain/plugina2.js',
pluginc: '//domain/pluginc.js'
},
plugin_base_urls: {
testplugin: 'http://custom.ephox.com/dir/testplugin'
}
}, EditorManager).options.get('external_plugins'), {
plugina: '//domain/plugina2.js',
pluginb: '//domain/pluginb.js',
pluginc: '//domain/pluginc.js'
});
assert.deepEqual(new Editor('ed3', {
base_url: '/project/tinymce/js/tinymce'
}, EditorManager).options.get('external_plugins'), {
plugina: '//domain/plugina.js',
pluginb: '//domain/pluginb.js'
});
EditorManager.baseURI = oldBaseURI;
EditorManager.baseURL = oldBaseUrl;
EditorManager.suffix = oldSuffix;
EditorManager.overrideDefaults({});
});
it('Init inline editor on invalid targets', () => {
const invalidNames = (
'area base basefont br col frame hr img input isindex link meta param embed source wbr track ' +
'colgroup option tbody tfoot thead tr script noscript style textarea video audio iframe object menu'
);
Tools.each(invalidNames.split(' '), (invalidName) => {
const elm = DOMUtils.DOM.add(document.body, invalidName, { class: 'targetEditor' }, null);
EditorManager.init({
selector: invalidName + '.targetEditor',
inline: true
});
assert.strictEqual(EditorManager.get().length, 0, 'Should not have created an editor');
DOMUtils.DOM.remove(elm);
});
});
});