: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
start: function (name, attrs, empty) {
if (name === 'script' || name === 'noscript' || name === 'svg') {
for (var i = attrs.length - 1; i >= 0; i--) {
var attrName = attrs[i].name;
if (attrName.indexOf('on') === 0) {
delete attrs.map[attrName];
if (attrName === 'style') {
attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name);
writer.start(name, attrs, empty);
}, global$6({})).parse(html);
return writer.getContent();
var Sanitize = { sanitize: sanitize };
var createPlaceholderNode = function (editor, node) {
placeHolder = new global$8('img', 1);
placeHolder.shortEnded = true;
retainAttributesAndInnerHtml(editor, node, placeHolder);
'width': node.attr('width') || '300',
'height': node.attr('height') || (name === 'audio' ? '30' : '150'),
'style': node.attr('style'),
'src': global$1.transparentSrc,
'class': 'mce-object mce-object-' + name
var createPreviewIframeNode = function (editor, node) {
previewWrapper = new global$8('span', 1);
'contentEditable': 'false',
'style': node.attr('style'),
'class': 'mce-preview-object mce-object-' + name
retainAttributesAndInnerHtml(editor, node, previewWrapper);
previewNode = new global$8(name, 1);
allowfullscreen: node.attr('allowfullscreen'),
style: node.attr('style'),
class: node.attr('class'),
width: node.attr('width'),
height: node.attr('height'),
shimNode = new global$8('span', 1);
shimNode.attr('class', 'mce-shim');
previewWrapper.append(previewNode);
previewWrapper.append(shimNode);
var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) {
attribs = sourceNode.attributes;
attrName = attribs[ai].name;
attrValue = attribs[ai].value;
if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') {
if (attrName === 'data' || attrName === 'src') {
attrValue = editor.convertURL(attrValue, attrName);
targetNode.attr('data-mce-p-' + attrName, attrValue);
innerHtml = sourceNode.firstChild && sourceNode.firstChild.value;
targetNode.attr('data-mce-html', escape(Sanitize.sanitize(editor, innerHtml)));
targetNode.firstChild = null;
var isWithinEphoxEmbed = function (node) {
while (node = node.parent) {
if (node.attr('data-ephox-embed-iri')) {
var placeHolderConverter = function (editor) {
return function (nodes) {
if (node.parent.attr('data-mce-object')) {
if (node.name === 'script') {
videoScript = VideoScript.getVideoScriptMatch(Settings.getScripts(editor), node.attr('src'));
node.attr('width', videoScript.width.toString());
if (videoScript.height) {
node.attr('height', videoScript.height.toString());
if (node.name === 'iframe' && Settings.hasLiveEmbeds(editor) && global$1.ceFalse) {
if (!isWithinEphoxEmbed(node)) {
node.replace(createPreviewIframeNode(editor, node));
if (!isWithinEphoxEmbed(node)) {
node.replace(createPlaceholderNode(editor, node));
createPreviewIframeNode: createPreviewIframeNode,
createPlaceholderNode: createPlaceholderNode,
placeHolderConverter: placeHolderConverter
var setup = function (editor) {
editor.on('preInit', function () {
var specialElements = editor.schema.getSpecialElements();
global$2.each('video audio iframe object'.split(' '), function (name) {
specialElements[name] = new RegExp('</' + name + '[^>]*>', 'gi');
var boolAttrs = editor.schema.getBoolAttrs();
global$2.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) {
editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', Nodes.placeHolderConverter(editor));
editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) {
realElmName = node.attr(name);
realElm = new global$8(realElmName, 1);
if (realElmName !== 'audio' && realElmName !== 'script') {
className = node.attr('class');
if (className && className.indexOf('mce-preview-object') !== -1) {
width: node.firstChild.attr('width'),
height: node.firstChild.attr('height')
width: node.attr('width'),
height: node.attr('height')
realElm.attr({ style: node.attr('style') });
attribs = node.attributes;
var attrName = attribs[ai].name;
if (attrName.indexOf('data-mce-p-') === 0) {
realElm.attr(attrName.substr(11), attribs[ai].value);
if (realElmName === 'script') {
realElm.attr('type', 'text/javascript');
innerHtml = node.attr('data-mce-html');
innerNode = new global$8('#text', 3);
innerNode.value = Sanitize.sanitize(editor, unescape(innerHtml));
realElm.append(innerNode);
editor.on('setContent', function () {
editor.$('span.mce-preview-object').each(function (index, elm) {
var $elm = editor.$(elm);
if ($elm.find('span.mce-shim', elm).length === 0) {
$elm.append('<span class="mce-shim"></span>');
var FilterContent = { setup: setup };
var setup$1 = function (editor) {
editor.on('ResolveName', function (e) {
if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) {
var ResolveName = { setup: setup$1 };
var setup$2 = function (editor) {
editor.on('click keyup', function () {
var selectedNode = editor.selection.getNode();
if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) {
if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) {
selectedNode.setAttribute('data-mce-selected', '2');
editor.on('ObjectSelected', function (e) {
var objectType = e.target.getAttribute('data-mce-object');
if (objectType === 'audio' || objectType === 'script') {
editor.on('objectResized', function (e) {
if (target.getAttribute('data-mce-object')) {
html = target.getAttribute('data-mce-html');
target.setAttribute('data-mce-html', escape(UpdateHtml.updateHtml(html, {
var Selection = { setup: setup$2 };
var register$1 = function (editor) {
editor.addButton('media', {
tooltip: 'Insert/edit media',
'div[data-ephox-embed-iri]'
editor.addMenuItem('media', {
var Buttons = { register: register$1 };
global.add('media', function (editor) {
Commands.register(editor);
Buttons.register(editor);
ResolveName.setup(editor);
FilterContent.setup(editor);