JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.2.2
[ckeditor.git] / _source / core / dom / range.js
index 127f7aa..5a05ee1 100644 (file)
@@ -1240,7 +1240,7 @@ CKEDITOR.dom.range = function( document )
                 *  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
@@ -1315,14 +1315,14 @@ CKEDITOR.dom.range = function( document )
                                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
@@ -1382,6 +1382,11 @@ CKEDITOR.dom.range = function( document )
                        // 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
@@ -1408,6 +1413,11 @@ CKEDITOR.dom.range = function( document )
                        // 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