Index: typo3/sysext/rtehtmlarea/htmlarea/htmlarea-gecko.js =================================================================== --- typo3/sysext/rtehtmlarea/htmlarea/htmlarea-gecko.js (révision 9146) +++ typo3/sysext/rtehtmlarea/htmlarea/htmlarea-gecko.js (copie de travail) @@ -508,7 +508,9 @@ var range = self._createRange(selection); var startContainer = range.startContainer; var startOffset = range.startOffset; + // If the selection is collapsed... if (self._selectionEmpty()) { + // ... and the cursor lies in a direct child of body... if (/^(body)$/i.test(startContainer.nodeName)) { var node = startContainer.childNodes[startOffset]; } else if (/^(body)$/i.test(startContainer.parentNode.nodeName)) { @@ -516,20 +518,27 @@ } else { return false; } + // ... which is a br or text node containing no non-whitespace character if (/^(br|#text)$/i.test(node.nodeName) && !/\S/.test(node.textContent)) { + // Get a meaningful previous sibling in which to reposition de cursor var previousSibling = node.previousSibling; while (previousSibling && /^(br|#text)$/i.test(previousSibling.nodeName) && !/\S/.test(previousSibling.textContent)) { previousSibling = previousSibling.previousSibling; } - HTMLArea.removeFromParent(node); - if (/^(ol|ul|dl)$/i.test(previousSibling.nodeName)) { - self.selectNodeContents(previousSibling.lastChild, false); - } else if (/^(table)$/i.test(previousSibling.nodeName)) { - self.selectNodeContents(previousSibling.rows[previousSibling.rows.length-1].cells[previousSibling.rows[previousSibling.rows.length-1].cells.length-1], false); - } else if (!/\S/.test(previousSibling.textContent) && previousSibling.firstChild) { - self.selectNode(previousSibling.firstChild, true); - } else { - self.selectNodeContents(previousSibling, false); + // If there is no meaningful previous sibling, the cursor is at the start of body + if (previousSibling) { + // Remove the node + HTMLArea.removeFromParent(node); + // Position the cursor + if (/^(ol|ul|dl)$/i.test(previousSibling.nodeName)) { + self.selectNodeContents(previousSibling.lastChild, false); + } else if (/^(table)$/i.test(previousSibling.nodeName)) { + self.selectNodeContents(previousSibling.rows[previousSibling.rows.length-1].cells[previousSibling.rows[previousSibling.rows.length-1].cells.length-1], false); + } else if (!/\S/.test(previousSibling.textContent) && previousSibling.firstChild) { + self.selectNode(previousSibling.firstChild, true); + } else { + self.selectNodeContents(previousSibling, false); + } } } }