diff --git a/core/dom/range.js b/core/dom/range.js index 81ec9e529e0..74555eccb25 100644 --- a/core/dom/range.js +++ b/core/dom/range.js @@ -178,6 +178,7 @@ CKEDITOR.dom.range = function( root ) { range.optimizeBookmark(); + var isDelete = action === 0; var isExtract = action == 1; var isClone = action == 2; var doClone = isClone || isExtract; @@ -387,6 +388,11 @@ CKEDITOR.dom.range = function( root ) { function consume( node, newParent, toStart, forceClone ) { var nextSibling = toStart ? node.getPrevious() : node.getNext(); + // We do not clone if we are only deleting, so do nothing. + if ( forceClone && isDelete ) { + return nextSibling; + } + // If cloning, just clone it. if ( isClone || forceClone ) { newParent.append( node.clone( true ), toStart ); diff --git a/tests/core/dom/range/clonecontents.js b/tests/core/dom/range/clonecontents.js index bf1a8a35819..9f56b37e96b 100644 --- a/tests/core/dom/range/clonecontents.js +++ b/tests/core/dom/range/clonecontents.js @@ -475,6 +475,21 @@ var clone = range.cloneContents(); assert.isInnerHtmlMatching( '

foo

', clone.getHtml() ); + }, + + 'test cloneContents - empty container, non-empty container': function() { + var root = doc.createElement( 'div' ), + range = new CKEDITOR.dom.range( doc ); + + root.setHtml( '


' ); + doc.getBody().append( root ); + + range.setStart( root.findOne( 'h1' ), 0 ); //

[

+ range.setEnd( root.findOne( 'h2' ), 0 ); //

]

+ + var clone = range.cloneContents(); + + assert.isInnerHtmlMatching( '

', clone.getHtml() ); } } ); } )(); \ No newline at end of file diff --git a/tests/core/dom/range/deletecontents.js b/tests/core/dom/range/deletecontents.js index a6c0a3e1a2a..dd79a71143f 100644 --- a/tests/core/dom/range/deletecontents.js +++ b/tests/core/dom/range/deletecontents.js @@ -146,7 +146,7 @@ assert.isTrue( range.collapsed, 'range.collapsed' ); }, - 'test extractContents - mergeThen': function() { + 'test deleteContents - mergeThen': function() { var root = doc.createElement( 'div' ), range = new CKEDITOR.dom.range( doc ); @@ -161,7 +161,7 @@ assert.isInnerHtmlMatching( '

f[]r

', bender.tools.range.getWithHtml( root, range ) ); }, - 'test extractContents - mergeThen (nothing to merge)': function() { + 'test deleteContents - mergeThen (nothing to merge)': function() { var root = doc.createElement( 'div' ), range = new CKEDITOR.dom.range( doc ); @@ -174,6 +174,36 @@ range.deleteContents( true ); assert.isInnerHtmlMatching( '

f[]r

', bender.tools.range.getWithHtml( root, range ) ); + }, + + 'test deleteContents - empty containers': function() { + var root = doc.createElement( 'div' ), + range = new CKEDITOR.dom.range( doc ); + + root.setHtml( 'x

foo

y' ); + doc.getBody().append( root ); + + range.setStart( root.findOne( 'h1' ), 0 ); //

[

+ range.setEnd( root.findOne( 'h2' ), 0 ); //

]

+ + range.deleteContents(); + + assert.isInnerHtmlMatching( 'x

[]

y', bender.tools.range.getWithHtml( root, range ) ); + }, + + 'test deleteContents - empty container, non-empty container': function() { + var root = doc.createElement( 'div' ), + range = new CKEDITOR.dom.range( doc ); + + root.setHtml( '


' ); + doc.getBody().append( root ); + + range.setStart( root.findOne( 'h1' ), 0 ); //

[

+ range.setEnd( root.findOne( 'h2' ), 0 ); //

]

+ + range.deleteContents(); + + assert.isInnerHtmlMatching( '

[]


', bender.tools.range.getWithHtml( root, range ) ); } }; diff --git a/tests/core/dom/range/extractcontents.js b/tests/core/dom/range/extractcontents.js index fa92e7bb225..686eb421b79 100644 --- a/tests/core/dom/range/extractcontents.js +++ b/tests/core/dom/range/extractcontents.js @@ -329,6 +329,22 @@ // We would lost empty inline elements so we add "*". assert.isInnerHtmlMatching( '*

foo

*', clone.getHtml().replace( /<\/b>/g, '*' ) ); assert.isInnerHtmlMatching( 'x[]ay', bender.tools.range.getWithHtml( root, range ).replace( /<\/b>/g, '*' ) ); + }, + + 'test extractContents - empty container, non-empty container': function() { + var root = doc.createElement( 'div' ), + range = new CKEDITOR.dom.range( doc ); + + root.setHtml( '


' ); + doc.getBody().append( root ); + + range.setStart( root.findOne( 'h1' ), 0 ); //

[

+ range.setEnd( root.findOne( 'h2' ), 0 ); //

]

+ + var clone = range.extractContents(); + + assert.isInnerHtmlMatching( '

', clone.getHtml() ); + assert.isInnerHtmlMatching( '

[]


', bender.tools.range.getWithHtml( root, range ) ); } };