From 00a78af98eaacbf582233956777263185685d886 Mon Sep 17 00:00:00 2001 From: Antoine Guenet Date: Tue, 19 Feb 2019 10:53:55 +0000 Subject: [PATCH] [FIX] web_editor: stop removing empty block after deleting its contents Deleting all the contents of a block node replaced it with a blank paragraph node. To restore v12 behavior, it should only do that when pressing backspace in an already empty block, which is now what it does. --- .../static/src/js/wysiwyg/plugin/keyboard.js | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/addons/web_editor/static/src/js/wysiwyg/plugin/keyboard.js b/addons/web_editor/static/src/js/wysiwyg/plugin/keyboard.js index 3db30752277..0cb451c100d 100644 --- a/addons/web_editor/static/src/js/wysiwyg/plugin/keyboard.js +++ b/addons/web_editor/static/src/js/wysiwyg/plugin/keyboard.js @@ -42,7 +42,6 @@ var KeyboardPlugin = AbstractPlugin.extend({ range = direction === 'prev' ? this._insertInvisibleCharAfterSingleBR(range) : range; range = this._rerangeOutOfBR(range, direction); range = this._cleanRangeAfterDeletion(range); - range = this._replaceEmptyParentWithEmptyP(range); return range; }, /** @@ -219,8 +218,15 @@ var KeyboardPlugin = AbstractPlugin.extend({ * @returns {Boolean} true if case handled */ _handleDeletion: function (direction) { - var didDeleteNodes = this.context.invoke('HelperPlugin.deleteSelection') var range = this.context.invoke('editor.createRange'); + range = direction === 'prev' && this._replaceEmptyParentWithEmptyP(range); + if (range) { + range = this._afterDeletion(range, direction); + range.select(); + return true; + } + var didDeleteNodes = this.context.invoke('HelperPlugin.deleteSelection'); + range = this.context.invoke('editor.createRange'); var wasOnStartOfBR = direction === 'prev' && !range.so && range.sc.tagName === 'BR'; this._removeNextEmptyUnbreakable(range.sc); @@ -837,23 +843,27 @@ var KeyboardPlugin = AbstractPlugin.extend({ * * @private * @param {Object} range - * @returns {Object} range + * @returns {Object|undefined} range */ _replaceEmptyParentWithEmptyP: function (range) { - if (range.sc === this.editable || range.sc.parentNode === this.editable) { - return range; + var node = range.sc.childElementCount === 1 && range.sc.firstChild.tagName === 'BR' ? range.sc.firstChild : range.sc; + if (node === this.editable || !node.parentNode || node.parentNode === this.editable) { + return; } - var node = dom.isVoid(range.sc) && range.sc.parentNode ? range.sc.parentNode : range.sc; - var parentOnlyHasNode = node.parentNode && this.context.invoke('HelperPlugin.onlyContains', node.parentNode, node); - if (dom.isEmpty(node) && node.tagName !== 'LI' && parentOnlyHasNode) { + if ( + dom.isEmpty(node) && + this.context.invoke('HelperPlugin.onlyContains', node.parentNode, node) && + ['LI', 'P'].indexOf(node.parentNode.tagName) === -1 + ) { var emptyP = this.document.createElement('p'); var br = this.document.createElement('br'); $(emptyP).append(br); - $(node).before(emptyP).remove(); + $(node.parentNode).before(emptyP).remove(); range.sc = range.ec = br; range.so = range.eo = 0; + return range.collapse(true); } - return range; + return; }, /** * Replace all leading space from a text node with one non-breakable space.