* always anchor beside text nodes or innermost element.\r
* @param {Number} mode ( CKEDITOR.SHRINK_ELEMENT | CKEDITOR.SHRINK_TEXT ) The shrinking mode.\r
*/\r
- shrink : function( mode )\r
+ shrink : function( mode, selectContents )\r
{\r
// Unable to shrink a collapsed range.\r
if ( !this.collapsed )\r
if ( moveStart )\r
{\r
var textStart = walker[ mode == CKEDITOR.SHRINK_ELEMENT ? 'lastForward' : 'next']();\r
- textStart && this.setStartBefore( textStart );\r
+ textStart && this.setStartAt( textStart, selectContents ? CKEDITOR.POSITION_AFTER_START : CKEDITOR.POSITION_BEFORE_START );\r
}\r
\r
if ( moveEnd )\r
{\r
walker.reset();\r
var textEnd = walker[ mode == CKEDITOR.SHRINK_ELEMENT ? 'lastBackward' : 'previous']();\r
- textEnd && this.setEndAfter( textEnd );\r
+ textEnd && this.setEndAt( textEnd, selectContents ? CKEDITOR.POSITION_BEFORE_END : CKEDITOR.POSITION_AFTER_END );\r
}\r
\r
return !!( moveStart || moveEnd );\r
// we will not need this check for our use of this class so we can\r
// ignore it for now.\r
\r
+ // Fixing invalid range start inside dtd empty elements.\r
+ if( startNode.type == CKEDITOR.NODE_ELEMENT\r
+ && CKEDITOR.dtd.$empty[ startNode.getName() ] )\r
+ startNode = startNode.getParent(), startOffset = startNode.getIndex();\r
+\r
this.startContainer = startNode;\r
this.startOffset = startOffset;\r
\r
// will not need this check for our use of this class so we can ignore\r
// it for now.\r
\r
+ // Fixing invalid range end inside dtd empty elements.\r
+ if( endNode.type == CKEDITOR.NODE_ELEMENT\r
+ && CKEDITOR.dtd.$empty[ endNode.getName() ] )\r
+ endNode = endNode.getParent(), endOffset = endNode.getIndex() + 1;\r
+\r
this.endContainer = endNode;\r
this.endOffset = endOffset;\r
\r