diff --git a/src/wp-includes/js/tinymce/plugins/lists/plugin.js b/src/wp-includes/js/tinymce/plugins/lists/plugin.js
index d1a1c1c3d0..8db4b354af 100644
--- a/src/wp-includes/js/tinymce/plugins/lists/plugin.js
+++ b/src/wp-includes/js/tinymce/plugins/lists/plugin.js
@@ -270,11 +270,17 @@ tinymce.PluginManager.add('lists', function(editor) {
}
}
+ var shouldMerge = function (listBlock, sibling) {
+ var targetStyle = editor.dom.getStyle(listBlock, 'list-style-type', true);
+ var style = editor.dom.getStyle(sibling, 'list-style-type', true);
+ return targetStyle === style;
+ };
+
function mergeWithAdjacentLists(listBlock) {
var sibling, node;
sibling = listBlock.nextSibling;
- if (sibling && isListNode(sibling) && sibling.nodeName == listBlock.nodeName) {
+ if (sibling && isListNode(sibling) && sibling.nodeName == listBlock.nodeName && shouldMerge(listBlock, sibling)) {
while ((node = sibling.firstChild)) {
listBlock.appendChild(node);
}
@@ -283,7 +289,7 @@ tinymce.PluginManager.add('lists', function(editor) {
}
sibling = listBlock.previousSibling;
- if (sibling && isListNode(sibling) && sibling.nodeName == listBlock.nodeName) {
+ if (sibling && isListNode(sibling) && sibling.nodeName == listBlock.nodeName && shouldMerge(listBlock, sibling)) {
while ((node = sibling.firstChild)) {
listBlock.insertBefore(node, listBlock.firstChild);
}
@@ -394,7 +400,7 @@ tinymce.PluginManager.add('lists', function(editor) {
}
function indent(li) {
- var sibling, newList;
+ var sibling, newList, listStyle;
function mergeLists(from, to) {
var node;
@@ -440,6 +446,10 @@ tinymce.PluginManager.add('lists', function(editor) {
sibling = li.previousSibling;
if (sibling && sibling.nodeName == 'LI') {
newList = dom.create(li.parentNode.nodeName);
+ listStyle = dom.getStyle(li.parentNode, 'listStyleType');
+ if (listStyle) {
+ dom.setStyle(newList, 'listStyleType', listStyle);
+ }
sibling.appendChild(newList);
newList.appendChild(li);
mergeLists(li.lastChild, newList);
@@ -505,7 +515,7 @@ tinymce.PluginManager.add('lists', function(editor) {
}
}
- function applyList(listName) {
+ function applyList(listName, detail) {
var rng = selection.getRng(true), bookmark, listItemName = 'LI';
if (dom.getContentEditable(selection.getNode()) === "false") {
@@ -600,8 +610,14 @@ tinymce.PluginManager.add('lists', function(editor) {
tinymce.each(getSelectedTextBlocks(), function(block) {
var listBlock, sibling;
+ var hasCompatibleStyle = function (sib) {
+ var sibStyle = dom.getStyle(sib, 'list-style-type');
+ var detailStyle = detail ? detail['list-style-type'] : '';
+ return sibStyle === detailStyle;
+ };
+
sibling = block.previousSibling;
- if (sibling && isListNode(sibling) && sibling.nodeName == listName) {
+ if (sibling && isListNode(sibling) && sibling.nodeName == listName && hasCompatibleStyle(sibling)) {
listBlock = sibling;
block = dom.rename(block, listItemName);
sibling.appendChild(block);
@@ -612,12 +628,17 @@ tinymce.PluginManager.add('lists', function(editor) {
block = dom.rename(block, listItemName);
}
+ updateListStyle(listBlock, detail);
mergeWithAdjacentLists(listBlock);
});
moveToBookmark(bookmark);
}
+ var updateListStyle = function (el, detail) {
+ dom.setStyle(el, 'list-style-type', detail ? detail['list-style-type'] : null);
+ };
+
function removeList() {
var bookmark = createBookmark(selection.getRng(true)), root = editor.getBody();
@@ -645,7 +666,7 @@ tinymce.PluginManager.add('lists', function(editor) {
moveToBookmark(bookmark);
}
- function toggleList(listName) {
+ function toggleList(listName, detail) {
var parentList = dom.getParent(selection.getStart(), 'OL,UL,DL');
if (isEditorBody(parentList)) {
@@ -657,11 +678,13 @@ tinymce.PluginManager.add('lists', function(editor) {
removeList(listName);
} else {
var bookmark = createBookmark(selection.getRng(true));
+ updateListStyle(parentList, detail);
mergeWithAdjacentLists(dom.rename(parentList, listName));
+
moveToBookmark(bookmark);
}
} else {
- applyList(listName);
+ applyList(listName, detail);
}
}
@@ -819,16 +842,16 @@ tinymce.PluginManager.add('lists', function(editor) {
}
});
- editor.addCommand('InsertUnorderedList', function() {
- toggleList('UL');
+ editor.addCommand('InsertUnorderedList', function(ui, detail) {
+ toggleList('UL', detail);
});
- editor.addCommand('InsertOrderedList', function() {
- toggleList('OL');
+ editor.addCommand('InsertOrderedList', function(ui, detail) {
+ toggleList('OL', detail);
});
- editor.addCommand('InsertDefinitionList', function() {
- toggleList('DL');
+ editor.addCommand('InsertDefinitionList', function(ui, detail) {
+ toggleList('DL', detail);
});
editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState('UL'));
diff --git a/src/wp-includes/js/tinymce/plugins/lists/plugin.min.js b/src/wp-includes/js/tinymce/plugins/lists/plugin.min.js
index 8ef4cf3222..b826cc1e1f 100644
--- a/src/wp-includes/js/tinymce/plugins/lists/plugin.min.js
+++ b/src/wp-includes/js/tinymce/plugins/lists/plugin.min.js
@@ -1 +1 @@
-tinymce.PluginManager.add("lists",function(a){function b(b){return a.$.contains(a.getBody(),b)}function c(a){return a&&"BR"==a.nodeName}function d(a){return a&&/^(OL|UL|DL)$/.test(a.nodeName)&&b(a)}function e(a){return a.parentNode.firstChild==a}function f(a){return a.parentNode.lastChild==a}function g(b){return b&&!!a.schema.getTextBlockElements()[b.nodeName]}function h(b){return b===a.getBody()}var i=this;a.on("init",function(){function j(a,b){var c=A.isEmpty(a);return b&&A.select("span[data-mce-type=bookmark]").length>0?!1:c}function k(a){function b(b){var d,e,f;e=a[b?"startContainer":"endContainer"],f=a[b?"startOffset":"endOffset"],1==e.nodeType&&(d=A.create("span",{"data-mce-type":"bookmark"}),e.hasChildNodes()?(f=Math.min(f,e.childNodes.length-1),b?e.insertBefore(d,e.childNodes[f]):A.insertAfter(d,e.childNodes[f])):e.appendChild(d),e=d,f=0),c[b?"startContainer":"endContainer"]=e,c[b?"startOffset":"endOffset"]=f}var c={};return b(!0),a.collapsed||b(),c}function l(a){function b(b){function c(a){for(var b=a.parentNode.firstChild,c=0;b;){if(b==a)return c;1==b.nodeType&&"bookmark"==b.getAttribute("data-mce-type")||c++,b=b.nextSibling}return-1}var d,e,f;d=f=a[b?"startContainer":"endContainer"],e=a[b?"startOffset":"endOffset"],d&&(1==d.nodeType&&(e=c(d),d=d.parentNode,A.remove(f)),a[b?"startContainer":"endContainer"]=d,a[b?"startOffset":"endOffset"]=e)}b(!0),b();var c=A.createRng();c.setStart(a.startContainer,a.startOffset),a.endContainer&&c.setEnd(a.endContainer,a.endOffset),B.setRng(c)}function m(b,c){var d,e,f,g=A.createFragment(),h=a.schema.getBlockElements();if(a.settings.forced_root_block&&(c=c||a.settings.forced_root_block),c&&(e=A.create(c),e.tagName===a.settings.forced_root_block&&A.setAttribs(e,a.settings.forced_root_block_attrs),g.appendChild(e)),b)for(;d=b.firstChild;){var i=d.nodeName;f||"SPAN"==i&&"bookmark"==d.getAttribute("data-mce-type")||(f=!0),h[i]?(g.appendChild(d),e=null):c?(e||(e=A.create(c),g.appendChild(e)),e.appendChild(d)):g.appendChild(d)}return a.settings.forced_root_block?f||tinymce.Env.ie&&!(tinymce.Env.ie>10)||e.appendChild(A.create("br",{"data-mce-bogus":"1"})):g.appendChild(A.create("br")),g}function n(){return tinymce.grep(B.getSelectedBlocks(),function(a){return/^(LI|DT|DD)$/.test(a.nodeName)})}function o(a,b,c){function d(a){tinymce.each(g,function(c){a.parentNode.insertBefore(c,b.parentNode)}),A.remove(a)}var e,f,g,h;for(g=A.select('span[data-mce-type="bookmark"]',a),c=c||m(b),e=A.createRng(),e.setStartAfter(b),e.setEndAfter(a),f=e.extractContents(),h=f.firstChild;h;h=h.firstChild)if("LI"==h.nodeName&&A.isEmpty(h)){A.remove(h);break}A.isEmpty(f)||A.insertAfter(f,a),A.insertAfter(c,a),j(b.parentNode)&&d(b.parentNode),A.remove(b),j(a)&&A.remove(a)}function p(a){var b,c;if(b=a.nextSibling,b&&d(b)&&b.nodeName==a.nodeName){for(;c=b.firstChild;)a.appendChild(c);A.remove(b)}if(b=a.previousSibling,b&&d(b)&&b.nodeName==a.nodeName){for(;c=b.firstChild;)a.insertBefore(c,a.firstChild);A.remove(b)}}function q(a){tinymce.each(tinymce.grep(A.select("ol,ul",a)),function(a){var b,c=a.parentNode;"LI"==c.nodeName&&c.firstChild==a&&(b=c.previousSibling,b&&"LI"==b.nodeName&&(b.appendChild(a),j(c)&&A.remove(c))),d(c)&&(b=c.previousSibling,b&&"LI"==b.nodeName&&b.appendChild(a))})}function r(a){function b(a){j(a)&&A.remove(a)}var c,g=a.parentNode,i=g.parentNode;return h(g)?!0:"DD"==a.nodeName?(A.rename(a,"DT"),!0):e(a)&&f(a)?("LI"==i.nodeName?(A.insertAfter(a,i),b(i),A.remove(g)):d(i)?A.remove(g,!0):(i.insertBefore(m(a),g),A.remove(g)),!0):e(a)?("LI"==i.nodeName?(A.insertAfter(a,i),a.appendChild(g),b(i)):d(i)?i.insertBefore(a,g):(i.insertBefore(m(a),g),A.remove(a)),!0):f(a)?("LI"==i.nodeName?A.insertAfter(a,i):d(i)?A.insertAfter(a,g):(A.insertAfter(m(a),g),A.remove(a)),!0):("LI"==i.nodeName?(g=i,c=m(a,"LI")):c=d(i)?m(a,"LI"):m(a),o(g,a,c),q(g.parentNode),!0)}function s(a){function b(b,c){var e;if(d(b)){for(;e=a.lastChild.firstChild;)c.appendChild(e);A.remove(b)}}var c,e;return"DT"==a.nodeName?(A.rename(a,"DD"),!0):(c=a.previousSibling,c&&d(c)?(c.appendChild(a),!0):c&&"LI"==c.nodeName&&d(c.lastChild)?(c.lastChild.appendChild(a),b(a.lastChild,c.lastChild),!0):(c=a.nextSibling,c&&d(c)?(c.insertBefore(a,c.firstChild),!0):(c=a.previousSibling,c&&"LI"==c.nodeName?(e=A.create(a.parentNode.nodeName),c.appendChild(e),e.appendChild(a),b(a.lastChild,e),!0):!1)))}function t(){var b=n();if(b.length){for(var c=k(B.getRng(!0)),d=0;d');
+ });
+
+ return true;
+ };
+
+ var createLink = function (editor, url, pasteHtml) {
+ editor.undoManager.extra(function () {
+ pasteHtml(url);
+ }, function () {
+ editor.execCommand('mceInsertLink', false, url);
+ });
+
+ return true;
+ };
+
+ var linkSelection = function (editor, html, pasteHtml) {
+ return editor.selection.isCollapsed() === false && isAbsoluteUrl(html) ? createLink(editor, html, pasteHtml) : false;
+ };
+
+ var insertImage = function (editor, html, pasteHtml) {
+ return isImageUrl(html) ? createImage(editor, html, pasteHtml) : false;
+ };
+
+ var insertContent = function (editor, html) {
+ var pasteHtml = function (html) {
+ editor.insertContent(html, {
+ merge: editor.settings.paste_merge_formats !== false,
+ paste: true
+ });
+
+ return true;
+ };
+
+ var fallback = function (editor, html) {
+ pasteHtml(html);
+ };
+
+ Tools.each([
+ linkSelection,
+ insertImage,
+ fallback
+ ], function (action) {
+ return action(editor, html, pasteHtml) !== true;
+ });
+ };
+
+ return {
+ isImageUrl: isImageUrl,
+ isAbsoluteUrl: isAbsoluteUrl,
+ insertContent: insertContent
+ };
+});
+
// Included from: js/tinymce/plugins/paste/classes/Clipboard.js
/**
@@ -276,8 +365,9 @@ define("tinymce/pasteplugin/Clipboard", [
"tinymce/dom/RangeUtils",
"tinymce/util/VK",
"tinymce/pasteplugin/Utils",
+ "tinymce/pasteplugin/SmartPaste",
"tinymce/util/Delay"
-], function(Env, RangeUtils, VK, Utils, Delay) {
+], function(Env, RangeUtils, VK, Utils, SmartPaste, Delay) {
return function(editor) {
var self = this, pasteBinElm, lastRng, keyboardPasteTimeStamp = 0, draggingInternally = false;
var pasteBinDefaultContent = '%MCEPASTEBIN%', keyboardPastePlainTextState;
@@ -311,7 +401,7 @@ define("tinymce/pasteplugin/Clipboard", [
}
if (!args.isDefaultPrevented()) {
- editor.insertContent(html, {merge: editor.settings.paste_merge_formats !== false, data: {paste: true}});
+ SmartPaste.insertContent(editor, html);
}
}
}
@@ -571,6 +661,55 @@ define("tinymce/pasteplugin/Clipboard", [
return hasContentType(content, 'text/html') || hasContentType(content, 'text/plain');
}
+ function getBase64FromUri(uri) {
+ var idx;
+
+ idx = uri.indexOf(',');
+ if (idx !== -1) {
+ return uri.substr(idx + 1);
+ }
+
+ return null;
+ }
+
+ function isValidDataUriImage(settings, imgElm) {
+ return settings.images_dataimg_filter ? settings.images_dataimg_filter(imgElm) : true;
+ }
+
+ function pasteImage(rng, reader, blob) {
+ if (rng) {
+ editor.selection.setRng(rng);
+ rng = null;
+ }
+
+ var dataUri = reader.result;
+ var base64 = getBase64FromUri(dataUri);
+
+ var img = new Image();
+ img.src = dataUri;
+
+ // TODO: Move the bulk of the cache logic to EditorUpload
+ if (isValidDataUriImage(editor.settings, img)) {
+ var blobCache = editor.editorUpload.blobCache;
+ var blobInfo, existingBlobInfo;
+
+ existingBlobInfo = blobCache.findFirst(function(cachedBlobInfo) {
+ return cachedBlobInfo.base64() === base64;
+ });
+
+ if (!existingBlobInfo) {
+ blobInfo = blobCache.create(uniqueId(), blob, base64);
+ blobCache.add(blobInfo);
+ } else {
+ blobInfo = existingBlobInfo;
+ }
+
+ pasteHtml('
');
+ } else {
+ pasteHtml('
');
+ }
+ }
+
/**
* Checks if the clipboard contains image data if it does it will take that data
* and convert it into a data url image and paste that image at the caret location.
@@ -582,33 +721,9 @@ define("tinymce/pasteplugin/Clipboard", [
function pasteImageData(e, rng) {
var dataTransfer = e.clipboardData || e.dataTransfer;
- function getBase64FromUri(uri) {
- var idx;
-
- idx = uri.indexOf(',');
- if (idx !== -1) {
- return uri.substr(idx + 1);
- }
-
- return null;
- }
-
function processItems(items) {
var i, item, reader, hadImage = false;
- function pasteImage(reader, blob) {
- if (rng) {
- editor.selection.setRng(rng);
- rng = null;
- }
-
- var blobCache = editor.editorUpload.blobCache;
- var blobInfo = blobCache.create(uniqueId(), blob, getBase64FromUri(reader.result));
- blobCache.add(blobInfo);
-
- pasteHtml('
');
- }
-
if (items) {
for (i = 0; i < items.length; i++) {
item = items[i];
@@ -617,7 +732,7 @@ define("tinymce/pasteplugin/Clipboard", [
var blob = item.getAsFile ? item.getAsFile() : item;
reader = new FileReader();
- reader.onload = pasteImage.bind(null, reader, blob);
+ reader.onload = pasteImage.bind(null, rng, reader, blob);
reader.readAsDataURL(blob);
e.preventDefault();
@@ -874,6 +989,7 @@ define("tinymce/pasteplugin/Clipboard", [
self.pasteHtml = pasteHtml;
self.pasteText = pasteText;
+ self.pasteImageData = pasteImageData;
editor.on('preInit', function() {
registerEventHandlers();
diff --git a/src/wp-includes/js/tinymce/plugins/paste/plugin.min.js b/src/wp-includes/js/tinymce/plugins/paste/plugin.min.js
index 47ead81b2a..81094c11aa 100644
--- a/src/wp-includes/js/tinymce/plugins/paste/plugin.min.js
+++ b/src/wp-includes/js/tinymce/plugins/paste/plugin.min.js
@@ -1 +1 @@
-!function(a,b){"use strict";function c(a,b){for(var c,d=[],f=0;f
/g,/
$/i])}function g(a){var b=0;return function(){return a+b++}}return{filter:d,innerText:e,trimHtml:f,createIdGenerator:g}}),d("tinymce/pasteplugin/Clipboard",["tinymce/Env","tinymce/dom/RangeUtils","tinymce/util/VK","tinymce/pasteplugin/Utils","tinymce/util/Delay"],function(a,b,c,d,e){return function(f){function g(a){var b,c=f.dom;if(b=f.fire("BeforePastePreProcess",{content:a}),b=f.fire("PastePreProcess",b),a=b.content,!b.isDefaultPrevented()){if(f.hasEventListeners("PastePostProcess")&&!b.isDefaultPrevented()){var d=c.add(f.getBody(),"div",{style:"display:none"},a);b=f.fire("PastePostProcess",{node:d}),c.remove(d),a=b.node.innerHTML}b.isDefaultPrevented()||f.insertContent(a,{merge:f.settings.paste_merge_formats!==!1,data:{paste:!0}})}}function h(a){a=f.dom.encode(a).replace(/\r\n/g,"\n");var b,c=f.dom.getParent(f.selection.getStart(),f.dom.isBlock),e=f.settings.forced_root_block;e&&(b=f.dom.createHTML(e,f.settings.forced_root_block_attrs),b=b.substr(0,b.length-3)+">"),c&&/^(PRE|DIV)$/.test(c.nodeName)||!e?a=d.filter(a,[[/\n/g,"
"]]):(a=d.filter(a,[[/\n\n/g,"
)$/,b+"$1"],[/\n/g,"
"]]),-1!=a.indexOf("
")&&(a=b+a)),g(a)}function i(){function b(a){var b,c,e,f=a.startContainer;if(b=a.getClientRects(),b.length)return b[0];if(a.collapsed&&1==f.nodeType){for(e=f.childNodes[v.startOffset];e&&3==e.nodeType&&!e.data.length;)e=e.nextSibling;if(e)return"BR"==e.tagName&&(c=d.doc.createTextNode("\ufeff"),e.parentNode.insertBefore(c,e),a=d.createRng(),a.setStartBefore(c),a.setEndAfter(c),b=a.getClientRects(),d.remove(c)),b.length?b[0]:void 0}}var c,d=f.dom,e=f.getBody(),g=f.dom.getViewPort(f.getWin()),h=g.y,i=20;if(v=f.selection.getRng(),f.inline&&(c=f.selection.getScrollContainer(),c&&c.scrollTop>0&&(h=c.scrollTop)),v.getClientRects){var j=b(v);if(j)i=h+(j.top-d.getPos(e).y);else{i=h;var k=v.startContainer;k&&(3==k.nodeType&&k.parentNode!=e&&(k=k.parentNode),1==k.nodeType&&(i=d.getPos(k,c||e).y))}}u=d.add(f.getBody(),"div",{id:"mcepastebin",contentEditable:!0,"data-mce-bogus":"all",style:"position: absolute; top: "+i+"px;width: 10px; height: 10px; overflow: hidden; opacity: 0"},A),(a.ie||a.gecko)&&d.setStyle(u,"left","rtl"==d.getStyle(e,"direction",!0)?65535:-65535),d.bind(u,"beforedeactivate focusin focusout",function(a){a.stopPropagation()}),u.focus(),f.selection.select(u,!0)}function j(){if(u){for(var a;a=f.dom.get("mcepastebin");)f.dom.remove(a),f.dom.unbind(a);v&&f.selection.setRng(v)}u=v=null}function k(){var a,b,c,d,e="";for(a=f.dom.select("div[id=mcepastebin]"),b=0;b
)$/,b+"$1"],[/\n/g,"
"]]),-1!=a.indexOf("
")&&(a=b+a)),h(a)}function j(){function b(a){var b,c,e,f=a.startContainer;if(b=a.getClientRects(),b.length)return b[0];if(a.collapsed&&1==f.nodeType){for(e=f.childNodes[z.startOffset];e&&3==e.nodeType&&!e.data.length;)e=e.nextSibling;if(e)return"BR"==e.tagName&&(c=d.doc.createTextNode("\ufeff"),e.parentNode.insertBefore(c,e),a=d.createRng(),a.setStartBefore(c),a.setEndAfter(c),b=a.getClientRects(),d.remove(c)),b.length?b[0]:void 0}}var c,d=g.dom,e=g.getBody(),f=g.dom.getViewPort(g.getWin()),h=f.y,i=20;if(z=g.selection.getRng(),g.inline&&(c=g.selection.getScrollContainer(),c&&c.scrollTop>0&&(h=c.scrollTop)),z.getClientRects){var j=b(z);if(j)i=h+(j.top-d.getPos(e).y);else{i=h;var k=z.startContainer;k&&(3==k.nodeType&&k.parentNode!=e&&(k=k.parentNode),1==k.nodeType&&(i=d.getPos(k,c||e).y))}}y=d.add(g.getBody(),"div",{id:"mcepastebin",contentEditable:!0,"data-mce-bogus":"all",style:"position: absolute; top: "+i+"px;width: 10px; height: 10px; overflow: hidden; opacity: 0"},E),(a.ie||a.gecko)&&d.setStyle(y,"left","rtl"==d.getStyle(e,"direction",!0)?65535:-65535),d.bind(y,"beforedeactivate focusin focusout",function(a){a.stopPropagation()}),y.focus(),g.selection.select(y,!0)}function k(){if(y){for(var a;a=g.dom.get("mcepastebin");)g.dom.remove(a),g.dom.unbind(a);z&&g.selection.setRng(z)}y=z=null}function l(){var a,b,c,d,e="";for(a=g.dom.select("div[id=mcepastebin]"),b=0;b')}function s(a,b){function c(c){var d,e,f,g=!1;if(c)for(d=0;d
||
+ * becomes:||
[a
]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
[\r\n]*)$/,"")}),n.load({initial:!0,format:"html"}),n.startContent=n.getContent({format:"raw"}),n.initialized=!0,n.bindPendingEventDelegates(),n.fire("init"),n.focus(!0),n.nodeChanged({initial:!0}),n.execCallback("init_instance_callback",n),n.on("compositionstart compositionend",function(e){n.composing="compositionstart"===e.type}),n.contentStyles.length>0&&(m="",P(n.contentStyles,function(e){m+=e+"\r\n"}),n.dom.addStyle(m)),P(n.contentCSS,function(e){n.loadedCSS[e]||(n.dom.loadCSS(e),n.loadedCSS[e]=!0)}),r.auto_focus&&E.setEditorTimeout(n,function(){var e;e=r.auto_focus===!0?n:n.editorManager.get(r.auto_focus),e.destroyed||e.focus()},100),s=h=p=null},focus:function(e){function t(e){return n.dom.getParent(e,function(e){return"true"===n.dom.getContentEditable(e)})}var n=this,r=n.selection,i=n.settings.content_editable,o,a,s=n.getDoc(),l=n.getBody(),c;if(!e){if(o=r.getRng(),o.item&&(a=o.item(0)),n.quirks.refreshContentEditable(),c=t(r.getNode()),n.$.contains(l,c))return c.focus(),r.normalize(),void n.editorManager.setActive(n);if(i||(w.opera||n.getBody().focus(),n.getWin().focus()),U||i){if(l.setActive)try{l.setActive()}catch(u){l.focus()}else l.focus();i&&r.normalize()}a&&a.ownerDocument==s&&(o=s.body.createControlRange(),o.addElement(a),o.select())}n.editorManager.setActive(n)},execCallback:function(e){var t=this,n=t.settings[e],r;if(n)return t.callbackLookup&&(r=t.callbackLookup[e])&&(n=r.func,r=r.scope),"string"==typeof n&&(r=n.replace(/\.\w+$/,""),r=r?F(r):0,n=F(n),t.callbackLookup=t.callbackLookup||{},t.callbackLookup[e]={func:n,scope:r}),n.apply(r||t,Array.prototype.slice.call(arguments,1))},translate:function(e){var t=this.settings.language||"en",n=this.editorManager.i18n;return e?(e=n.data[t+"."+e]||e.replace(/\{\#([^\}]+)\}/g,function(e,r){return n.data[t+"."+r]||"{#"+r+"}"}),this.editorManager.translate(e)):""},getLang:function(e,n){return this.editorManager.i18n.data[(this.settings.language||"en")+"."+e]||(n!==t?n:"{#"+e+"}")},getParam:function(e,t,n){var r=e in this.settings?this.settings[e]:t,i;return"hash"===n?(i={},"string"==typeof r?P(r.indexOf("=")>0?r.split(/[;,](?![^=;,]*(?:[;,]|$))/):r.split(","),function(e){e=e.split("="),e.length>1?i[I(e[0])]=I(e[1]):i[I(e[0])]=I(e)}):i=r,i):r},nodeChanged:function(e){this._nodeChangeDispatcher.nodeChanged(e)},addButton:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),t.text||t.icon||(t.icon=e),n.buttons=n.buttons||{},t.tooltip=t.tooltip||t.title,n.buttons[e]=t},addMenuItem:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),n.menuItems=n.menuItems||{},n.menuItems[e]=t},addContextToolbar:function(e,t){var n=this,r;n.contextToolbars=n.contextToolbars||[],"string"==typeof e&&(r=e,e=function(e){return n.dom.is(e,r)}),n.contextToolbars.push({predicate:e,items:t})},addCommand:function(e,t,n){this.editorCommands.addCommand(e,t,n)},addQueryStateHandler:function(e,t,n){this.editorCommands.addQueryStateHandler(e,t,n)},addQueryValueHandler:function(e,t,n){this.editorCommands.addQueryValueHandler(e,t,n)},addShortcut:function(e,t,n,r){this.shortcuts.add(e,t,n,r)},execCommand:function(e,t,n,r){return this.editorCommands.execCommand(e,t,n,r)},queryCommandState:function(e){return this.editorCommands.queryCommandState(e)},queryCommandValue:function(e){return this.editorCommands.queryCommandValue(e)},queryCommandSupported:function(e){return this.editorCommands.queryCommandSupported(e)},show:function(){var e=this;e.hidden&&(e.hidden=!1,e.inline?e.getBody().contentEditable=!0:(B.show(e.getContainer()),B.hide(e.id)),e.load(),e.fire("show"))},hide:function(){var e=this,t=e.getDoc();e.hidden||(W&&t&&!e.inline&&t.execCommand("SelectAll"),e.save(),e.inline?(e.getBody().contentEditable=!1,e==e.editorManager.focusedEditor&&(e.editorManager.focusedEditor=null)):(B.hide(e.getContainer()),B.setStyle(e.id,"display",e.orgDisplay)),e.hidden=!0,e.fire("hide"))},isHidden:function(){return!!this.hidden},setProgressState:function(e,t){this.fire("ProgressState",{state:e,time:t})},load:function(e){var n=this,r=n.getElement(),i;return r?(e=e||{},e.load=!0,i=n.setContent(r.value!==t?r.value:r.innerHTML,e),e.element=r,e.no_events||n.fire("LoadContent",e),e.element=r=null,i):void 0},save:function(e){var t=this,n=t.getElement(),r,i;if(n&&t.initialized)return e=e||{},e.save=!0,e.element=n,r=e.content=t.getContent(e),e.no_events||t.fire("SaveContent",e),"raw"==e.format&&t.fire("RawSaveContent",e),r=e.content,/TEXTAREA|INPUT/i.test(n.nodeName)?n.value=r:(t.inline||(n.innerHTML=r),(i=B.getParent(t.id,"form"))&&P(i.elements,function(e){return e.name==t.id?(e.value=r,!1):void 0})),e.element=n=null,e.set_dirty!==!1&&t.setDirty(!1),r},setContent:function(e,t){var n=this,r=n.getBody(),i,o;return t=t||{},t.format=t.format||"html",t.set=!0,t.content=e,t.no_events||n.fire("BeforeSetContent",t),e=t.content,0===e.length||/^\s+$/.test(e)?(o=W&&11>W?"":'
',"TABLE"==r.nodeName?e="
]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
[\r\n]*)$/,"")}),n.load({initial:!0,format:"html"}),n.startContent=n.getContent({format:"raw"}),n.initialized=!0,n.bindPendingEventDelegates(),n.fire("init"),n.focus(!0),n.nodeChanged({initial:!0}),n.execCallback("init_instance_callback",n),n.on("compositionstart compositionend",function(e){n.composing="compositionstart"===e.type}),n.contentStyles.length>0&&(m="",H(n.contentStyles,function(e){m+=e+"\r\n"}),n.dom.addStyle(m)),H(n.contentCSS,function(e){n.loadedCSS[e]||(n.dom.loadCSS(e),n.loadedCSS[e]=!0)}),r.auto_focus&&E.setEditorTimeout(n,function(){var e;e=r.auto_focus===!0?n:n.editorManager.get(r.auto_focus),e.destroyed||e.focus()},100),s=h=p=null},focus:function(e){function t(e){return n.dom.getParent(e,function(e){return"true"===n.dom.getContentEditable(e)})}var n=this,r=n.selection,i=n.settings.content_editable,o,a,s=n.getDoc(),l=n.getBody(),c;if(!e){if(o=r.getRng(),o.item&&(a=o.item(0)),n.quirks.refreshContentEditable(),c=t(r.getNode()),n.$.contains(l,c))return c.focus(),r.normalize(),void n.editorManager.setActive(n);if(i||(w.opera||n.getBody().focus(),n.getWin().focus()),W||i){if(l.setActive)try{l.setActive()}catch(u){l.focus()}else l.focus();i&&r.normalize()}a&&a.ownerDocument==s&&(o=s.body.createControlRange(),o.addElement(a),o.select())}n.editorManager.setActive(n)},execCallback:function(e){var t=this,n=t.settings[e],r;if(n)return t.callbackLookup&&(r=t.callbackLookup[e])&&(n=r.func,r=r.scope),"string"==typeof n&&(r=n.replace(/\.\w+$/,""),r=r?z(r):0,n=z(n),t.callbackLookup=t.callbackLookup||{},t.callbackLookup[e]={func:n,scope:r}),n.apply(r||t,Array.prototype.slice.call(arguments,1))},translate:function(e){var t=this.settings.language||"en",n=this.editorManager.i18n;return e?(e=n.data[t+"."+e]||e.replace(/\{\#([^\}]+)\}/g,function(e,r){return n.data[t+"."+r]||"{#"+r+"}"}),this.editorManager.translate(e)):""},getLang:function(e,n){return this.editorManager.i18n.data[(this.settings.language||"en")+"."+e]||(n!==t?n:"{#"+e+"}")},getParam:function(e,t,n){var r=e in this.settings?this.settings[e]:t,i;return"hash"===n?(i={},"string"==typeof r?H(r.indexOf("=")>0?r.split(/[;,](?![^=;,]*(?:[;,]|$))/):r.split(","),function(e){e=e.split("="),e.length>1?i[F(e[0])]=F(e[1]):i[F(e[0])]=F(e)}):i=r,i):r},nodeChanged:function(e){this._nodeChangeDispatcher.nodeChanged(e)},addButton:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),t.text||t.icon||(t.icon=e),n.buttons=n.buttons||{},t.tooltip=t.tooltip||t.title,n.buttons[e]=t},addMenuItem:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),n.menuItems=n.menuItems||{},n.menuItems[e]=t},addContextToolbar:function(e,t){var n=this,r;n.contextToolbars=n.contextToolbars||[],"string"==typeof e&&(r=e,e=function(e){return n.dom.is(e,r)}),n.contextToolbars.push({id:A.uuid("mcet"),predicate:e,items:t})},addCommand:function(e,t,n){this.editorCommands.addCommand(e,t,n)},addQueryStateHandler:function(e,t,n){this.editorCommands.addQueryStateHandler(e,t,n)},addQueryValueHandler:function(e,t,n){this.editorCommands.addQueryValueHandler(e,t,n)},addShortcut:function(e,t,n,r){this.shortcuts.add(e,t,n,r)},execCommand:function(e,t,n,r){return this.editorCommands.execCommand(e,t,n,r)},queryCommandState:function(e){return this.editorCommands.queryCommandState(e)},queryCommandValue:function(e){return this.editorCommands.queryCommandValue(e)},queryCommandSupported:function(e){return this.editorCommands.queryCommandSupported(e)},show:function(){var e=this;e.hidden&&(e.hidden=!1,e.inline?e.getBody().contentEditable=!0:(D.show(e.getContainer()),D.hide(e.id)),e.load(),e.fire("show"))},hide:function(){var e=this,t=e.getDoc();e.hidden||(V&&t&&!e.inline&&t.execCommand("SelectAll"),e.save(),e.inline?(e.getBody().contentEditable=!1,e==e.editorManager.focusedEditor&&(e.editorManager.focusedEditor=null)):(D.hide(e.getContainer()),D.setStyle(e.id,"display",e.orgDisplay)),e.hidden=!0,e.fire("hide"))},isHidden:function(){return!!this.hidden},setProgressState:function(e,t){this.fire("ProgressState",{state:e,time:t})},load:function(e){var n=this,r=n.getElement(),i;return r?(e=e||{},e.load=!0,i=n.setContent(r.value!==t?r.value:r.innerHTML,e),e.element=r,e.no_events||n.fire("LoadContent",e),e.element=r=null,i):void 0},save:function(e){var t=this,n=t.getElement(),r,i;if(n&&t.initialized)return e=e||{},e.save=!0,e.element=n,r=e.content=t.getContent(e),e.no_events||t.fire("SaveContent",e),"raw"==e.format&&t.fire("RawSaveContent",e),r=e.content,/TEXTAREA|INPUT/i.test(n.nodeName)?n.value=r:(t.inline||(n.innerHTML=r),(i=D.getParent(t.id,"form"))&&H(i.elements,function(e){return e.name==t.id?(e.value=r,!1):void 0})),e.element=n=null,e.set_dirty!==!1&&t.setDirty(!1),r},setContent:function(e,t){var n=this,r=n.getBody(),i,o;return t=t||{},t.format=t.format||"html",t.set=!0,t.content=e,t.no_events||n.fire("BeforeSetContent",t),e=t.content,0===e.length||/^\s+$/.test(e)?(o=V&&11>V?"":'
',"TABLE"==r.nodeName?e="
b
' + + 'a
'); + Utils.setSelection('p', 0); + return editor.selection.getRng(); + }; + + var waitForSelector = function (selector) { + return new Promise(function (resolve, reject) { + var check = function (time, count) { + var result = editor.dom.select(selector); + + if (result.length > 0) { + resolve(result); + } else { + if (count === 0) { + reject(); + } else { + Delay.setTimeout(function () { + check(time, count--); + }, time); + } + } + }; + + check(10, 100); + }); + }; + + var fail = function () { + ok(false, 'Failed to get image due to timeout.'); + QUnit.start(); + }; + + asyncTest('dropImages', function() { + var rng, event, clipboard = new Clipboard(editor); + + editor.settings.paste_data_images = true; + rng = setupContent(); + + event = mockEvent('drop'); + clipboard.pasteImageData(event, rng); + + waitForSelector('img').then(function () { + equal(editor.getContent(), 'a
a
a
a
abc
'); + Utils.setSelection('p', 0, 'p', 3); + editor.undoManager.add(); + + editor.execCommand('mceInsertClipboardContent', false, {content: 'http://www.site.com'}); + equal(editor.getContent(), ''); + equal(editor.undoManager.data.length, 3); + }); + + test('smart paste image url', function() { + editor.focus(); + editor.undoManager.clear(); + editor.setContent('abc
'); + Utils.setSelection('p', 1); + editor.undoManager.add(); + + editor.execCommand('mceInsertClipboardContent', false, {content: 'http://www.site.com/my.jpg'}); + equal(editor.getContent(), 'a
bc
| 1 | 2 |
| 1 | 2 | 3 |
| 4 | 5 | |
| 6 | ||
| 1 | 2 | 3 |
| 4 | 5 | |
| 6 | ||
| 1 | 2 |
| 2 | 3 |
| 1 | 2 |
| 1 | 2 |
| 2 | 3 |
| 1 | 2 |
| 1 | 2 |
| 1 | 2 |
| 2 | 3 |
| 1 | 2 |
| 2 | 3 |
| 1 | 2 |
| 2 | 3 |
| 1 | 2 |
| 1 | 2 |
| 2 | 3 |
| 1 | 2 |
| 1 | 2 |
| 1 | 2 |
| 2 | 3 |
| 1 | 2 |
| 2 | 3 |
| 1 | 2 |
| a | b |
| c | d |
| 1 | 2 |
| 1 | 2 |
| 12 |
| 12 |
| 1 | 2 |
| 3 | 4 |
| 1234 |
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |
| 1234 | |
| 5 | 6 |
| 1 | 2 |
| 3 | 4 |
| 1 | 2 |
| 3 | 4 |
| 1 | 2 |
| 3 | 4 |
| 1 | 3 | |
| 6 | ||
| 1 | ' + + '2 | ' + + '3 | ' + + '
| 4 | ' + + '5 | ' + + '|
| 6 | ' + + '||
def
'); }); -test('mceInsertContent HR at end of H1 with P sibling', function() { +test('mceInsertContent HR at end of H1 with inline elements with P sibling', function() { + editor.setContent('def
'); + Utils.setSelection('strong', 3); + editor.execCommand('mceInsertContent', false, 'def
'); +}); + +test('mceInsertContent empty block', function() { + editor.setContent('\u00a0
def
'); Utils.setSelection('h1', 3); editor.execCommand('mceInsertContent', false, '


1234
'); + editor.focus(); + Utils.setSelection('p', 2); + InsertContent.insertAtCaret(editor, 'a'); + equal(editor.getContent(), '12a34
'); + }); + + test('insertAtCaret - ul at beginning of li', function() { + editor.setContent('a123bc
'); + }); +}); diff --git a/tests/qunit/editor/tinymce/InsertList.js b/tests/qunit/editor/tinymce/InsertList.js new file mode 100644 index 0000000000..df6e38c8ca --- /dev/null +++ b/tests/qunit/editor/tinymce/InsertList.js @@ -0,0 +1,41 @@ +ModuleLoader.require([ + "tinymce/InsertList", + "tinymce/html/Node", + "tinymce/html/DomParser", + "tinymce/dom/DOMUtils" +], function(InsertList, Node, DomParser, DOMUtils) { + module("tinymce.InsertList", {}); + + var createFragment = function(html) { + var parser = new DomParser({validate: false}); + var fragment = parser.parse(html); + + return fragment; + }; + + var createDomFragment = function(html) { + return DOMUtils.DOM.createFragment(html); + }; + + test('isListFragment', function() { + equal(InsertList.isListFragment(createFragment('12
3
'); + Utils.setSelection('p:nth-child(2)', 0); + + Utils.type('\b'); + equal(editor.getContent(), '123
'); + ok(Zwsp.isZwsp(editor.selection.getRng().startContainer.data)); + equal(editor.selection.getRng().startContainer.previousSibling.nodeName, 'SPAN'); + }); + + test('delete from block to before cE=false inline', function() { + editor.setContent('1
23
'); + Utils.setSelection('p:nth-child(1)', 1); + + forwardDelete(); + equal(editor.getContent(), '123
'); + ok(Zwsp.isZwsp(editor.selection.getRng().startContainer.data)); + equal(editor.selection.getRng().startContainer.nextSibling.nodeName, 'SPAN'); + }); + + test('backspace from before cE=false block to text', function() { + editor.setContent('1
2
3
'); + editor.selection.select(editor.dom.select('p')[1]); + editor.selection.collapse(true); + assertCaretInCaretBlockContainer(); + + Utils.type('\b'); + var rng = editor.selection.getRng(); + + equal(editor.getContent(), '1
2
3
'); + equal(rng.startContainer, editor.dom.select('p')[0].firstChild); + equal(rng.startOffset, 1); + equal(rng.collapsed, true); + }); + + test('backspace from before first cE=false block', function() { + editor.setContent('1
2
'); + editor.selection.select(editor.dom.select('p')[0]); + editor.selection.collapse(true); + assertCaretInCaretBlockContainer(); + + Utils.type('\b'); + + equal(editor.getContent(), '1
2
'); + assertCaretInCaretBlockContainer(); + }); + + test('backspace from before cE=false block to after cE=false block', function() { + editor.setContent('1
2
'); + editor.selection.select(editor.dom.select('p')[1]); + editor.selection.collapse(true); + assertCaretInCaretBlockContainer(); + + Utils.type('\b'); + var rng = editor.selection.getRng(); + + equal(editor.getContent(), '1
2
'); + assertCaretInCaretBlockContainer(); + equal(rng.startContainer.parentNode.previousSibling, editor.dom.select('p')[0]); + }); + + test('delete from after cE=false block to text', function() { + editor.setContent('1
2
3
'); + editor.selection.select(editor.dom.select('p')[1]); + editor.selection.collapse(false); + assertCaretInCaretBlockContainer(); + + forwardDelete(); + var rng = editor.selection.getRng(); + + equal(editor.getContent(), '1
2
3
'); + equal(rng.startContainer, editor.dom.select('p')[2].firstChild); + equal(rng.startOffset, 0); + equal(rng.collapsed, true); + }); + + test('delete from after last cE=false block', function() { + editor.setContent('1
2
'); + editor.selection.select(editor.dom.select('p')[1]); + editor.selection.collapse(false); + assertCaretInCaretBlockContainer(); + forwardDelete(); + equal(editor.getContent(), '1
2
'); + assertCaretInCaretBlockContainer(); + }); + + test('delete from after cE=false block to before cE=false block', function() { + editor.setContent('1
2
'); + editor.selection.select(editor.dom.select('p')[0]); + rightArrow(); + assertCaretInCaretBlockContainer(); + + forwardDelete(); + var rng = editor.selection.getRng(); + + equal(editor.getContent(), '1
2
'); + assertCaretInCaretBlockContainer(); + equal(rng.startContainer.parentNode.nextSibling, editor.dom.select('p')[2]); + }); + + test('delete from block to before cE=false inline', function() { + editor.setContent('1
23
'); + Utils.setSelection('p:nth-child(1)', 1); + + forwardDelete(); + equal(editor.getContent(), '123
'); + ok(Zwsp.isZwsp(editor.selection.getRng().startContainer.data)); + equal(editor.selection.getRng().startContainer.nextSibling.nodeName, 'SPAN'); + }); + test('exit pre block (up)', exitPreTest(upArrow, 0, '\u00a0
abc')); test('exit pre block (left)', exitPreTest(leftArrow, 0, '
\u00a0
abc')); test('exit pre block (down)', exitPreTest(downArrow, 3, '
abc
\u00a0
')); test('exit pre block (right)', exitPreTest(rightArrow, 3, 'abc
\u00a0
')); + + test('click on link in cE=false', function() { + editor.setContent(''); + var evt = editor.fire('click', {target: editor.$('strong')[0]}); + + equal(evt.isDefaultPrevented(), true); + }); + + test('click next to cE=false block', function() { + editor.setContent( + '| 1 | ' + + '2 | ' +
+ '
abc
'); + editor.undoManager.add(); + + editor.undoManager.extra(function() { + Utils.setSelection('p', 1, 'p', 2); + editor.insertContent('1'); + }, function () { + Utils.setSelection('p', 1, 'p', 2); + editor.insertContent('2'); + }); + + data = editor.undoManager.data; + equal(data.length, 3); + equal(data[0].content, 'abc
'); + deepEqual(data[0].bookmark, {start: [0]}); + deepEqual(data[0].beforeBookmark, {start: [0]}); + equal(data[1].content, 'a1c
'); + deepEqual(data[1].bookmark, {start: [2, 0, 0]}); + deepEqual(data[1].beforeBookmark, {start: [2, 0, 0]}); + equal(data[2].content, 'a2c
'); + deepEqual(data[2].bookmark, {start: [2, 0, 0]}); + deepEqual(data[1].beforeBookmark, data[2].bookmark); +}); + test('Exclude internal elements', function() { var count = 0, lastLevel; diff --git a/tests/qunit/editor/tinymce/dom/Range.js b/tests/qunit/editor/tinymce/dom/Range.js index 04184e6faa..1c4edec564 100644 --- a/tests/qunit/editor/tinymce/dom/Range.js +++ b/tests/qunit/editor/tinymce/dom/Range.js @@ -1,4 +1,6 @@ -(function() { +ModuleLoader.require([ + "tinymce/dom/Range" +], function(Range) { module("tinymce.dom.Range", { setup: function() { document.getElementById('view').innerHTML = ( @@ -23,7 +25,7 @@ }); function createRng() { - return document.createRange ? document.createRange() : new tinymce.dom.Range(tinymce.DOM); + return document.createRange ? document.createRange() : new Range(tinymce.DOM); } function getHTML(co) { @@ -477,7 +479,7 @@ test("test_compareBoundaryPoints", function() { var r1 = createRng(), r2 = createRng(), START_TO_START = 0, START_TO_END = 1, END_TO_END = 2, END_TO_START = 3; - + r1.setStartBefore(document.getElementById('strong')); r1.setEndAfter(document.getElementById('strong')); r2.setStartBefore(document.getElementById('strong')); @@ -545,4 +547,4 @@ equal(rng.toString().replace(/\r\n/g, ''), "strong second em strong.barsome text"); }); } -})(); +}); diff --git a/tests/qunit/editor/tinymce/dom/Selection.js b/tests/qunit/editor/tinymce/dom/Selection.js index b7459edd3e..a5ecbc6791 100644 --- a/tests/qunit/editor/tinymce/dom/Selection.js +++ b/tests/qunit/editor/tinymce/dom/Selection.js @@ -646,6 +646,11 @@ ModuleLoader.require([ equal(rng.collapsed, true); equal(rng.startContainer.nodeType, 3); equal(rng.startContainer.data, 'b'); + + // WebKit is in some state state here, so lets restore it + rng.setStart(editor.getBody(), 0); + rng.setEnd(editor.getBody(), 0); + editor.selection.setRng(rng); }); test('normalize with contentEditable:true parent and contentEditable:false child element', function() { @@ -657,7 +662,7 @@ ModuleLoader.require([ if (Env.ie && Env.ie < 12) { // IE automatically normalizes - equal(rng.startContainer.data, 'a'); + ok(rng.startContainer.parentNode.contentEditable != 'false'); } else { equal(CaretContainer.isCaretContainer(rng.startContainer), true); } @@ -939,6 +944,26 @@ ModuleLoader.require([ equal(rng.endOffset, 0, 'endOffset offset'); }); + test('normalize after table should not move', function() { + var rng; + + if (tinymce.isOpera || tinymce.isIE) { + ok(true, "Skipped on Opera/IE since Opera doesn't let you to set the range to document and IE will steal focus."); + return; + } + + editor.setContent('a| b |
x
'; + editor.getBody().innerHTML = 'x
y
'; Utils.setSelection('b', 0, 'b', 1); editor.fire("keypress", {keyCode: 65, charCode: 65}); - equal(Utils.cleanHtml(editor.getBody().innerHTML), 'a
'); + equal(Utils.cleanHtml(editor.getBody().innerHTML), 'a
y
'); equal(editor.selection.getStart().nodeName, 'B'); }); @@ -309,6 +309,31 @@ if (tinymce.isWebKit) { equal(Utils.cleanHtml(editor.getBody().innerHTML), 'a
abc
'; + Utils.setSelection('p', 0, 'p', 3); + editor.fire('keypress', {charCode: 97}); + equal(Utils.cleanHtml(editor.getBody().innerHTML), 'a
'); + equal(editor.selection.getRng().startContainer.data, 'a'); + equal(editor.selection.getRng().startOffset, 1); + }); + + test('ForwardDelete all contents', function() { + editor.getBody().innerHTML = 'abc
'; + Utils.setSelection('p', 0, 'p', 3); + editor.fire('keydown', {keyCode: 46}); + equal(Utils.cleanHtml(editor.getBody().innerHTML), 'abc
'; + Utils.setSelection('p', 0, 'p', 3); + editor.fire('keydown', {keyCode: 8}); + equal(Utils.cleanHtml(editor.getBody().innerHTML), '