JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.2.2
[ckeditor.git] / _source / plugins / selection / plugin.js
index 9a85a84..04be631 100644 (file)
@@ -209,7 +209,8 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                                        if ( saveEnabled )\r
                                                        {\r
                                                                var doc = editor.document,\r
-                                                                       sel = doc && doc.$.selection;\r
+                                                                       sel = editor.getSelection(),\r
+                                                                       nativeSel = sel && sel.getNative();\r
 \r
                                                                // There is a very specific case, when clicking\r
                                                                // inside a text selection. In that case, the\r
@@ -219,7 +220,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                                                // range at the very start of the document. In\r
                                                                // such situation we have to test the range, to\r
                                                                // be sure it's valid.\r
-                                                               if ( testIt && sel && sel.type == 'None' )\r
+                                                               if ( testIt && nativeSel && nativeSel.type == 'None' )\r
                                                                {\r
                                                                        // The "InsertImage" command can be used to\r
                                                                        // test whether the selection is good or not.\r
@@ -232,7 +233,16 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                                                        }\r
                                                                }\r
 \r
-                                                               savedRange = sel && sel.createRange();\r
+                                                               // Avoid saving selection from within text input. (#5747)\r
+                                                               var parentTag;\r
+                                                               if ( nativeSel.type == 'Text'\r
+                                                                       && ( parentTag = nativeSel.createRange().parentElement().nodeName.toLowerCase() )\r
+                                                                       && parentTag in { input: 1, textarea : 1 } )\r
+                                                               {\r
+                                                                       return;\r
+                                                               }\r
+\r
+                                                               savedRange = nativeSel && sel.getRanges()[ 0 ];\r
 \r
                                                                checkSelectionChangeTimeout.call( editor );\r
                                                        }\r
@@ -752,16 +762,21 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                // node of the range.\r
                                function()\r
                                {\r
-                                       var range  = self.getRanges()[ 0 ];\r
-                                       range.shrink( CKEDITOR.SHRINK_ELEMENT );\r
-\r
-                                       var enclosed;\r
-                                       if ( range.startContainer.equals( range.endContainer )\r
-                                               && ( range.endOffset - range.startOffset ) == 1\r
-                                               && styleObjectElements[ ( enclosed = range.startContainer.getChild( range.startOffset ) ).getName() ] )\r
+                                       var range  = self.getRanges()[ 0 ],\r
+                                               enclosed,\r
+                                               selected;\r
+\r
+                                       // Check first any enclosed element, e.g. <ul>[<li><a href="#">item</a></li>]</ul>\r
+                                       for ( var i = 2; i && !( ( enclosed = range.getEnclosedNode() )\r
+                                               && ( enclosed.type == CKEDITOR.NODE_ELEMENT )\r
+                                               && styleObjectElements[ enclosed.getName() ]\r
+                                               && ( selected = enclosed ) ); i-- )\r
                                        {\r
-                                               return enclosed.$;\r
+                                               // Then check any deep wrapped element, e.g. [<b><i><img /></i></b>]\r
+                                               range.shrink( CKEDITOR.SHRINK_ELEMENT );\r
                                        }\r
+\r
+                                       return  selected.$;\r
                                });\r
 \r
                        return cache.selectedElement = ( node ? new CKEDITOR.dom.element( node ) : null );\r
@@ -1009,6 +1024,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
 {\r
 var notWhitespaces = CKEDITOR.dom.walker.whitespaces( true );\r
 var fillerTextRegex = /\ufeff|\u00a0/;\r
+var nonCells = { table:1,tbody:1,tr:1 };\r
 \r
 CKEDITOR.dom.range.prototype.select =\r
        CKEDITOR.env.ie ?\r
@@ -1019,6 +1035,14 @@ CKEDITOR.dom.range.prototype.select =
                        var isStartMarkerAlone;\r
                        var dummySpan;\r
 \r
+                       // IE doesn't support selecting the entire table row/cell, move the selection into cells, e.g.\r
+                       // <table><tbody><tr>[<td>cell</b></td>... => <table><tbody><tr><td>[cell</td>...\r
+                       if ( this.startContainer.type == CKEDITOR.NODE_ELEMENT && this.startContainer.getName() in nonCells\r
+                               || this.endContainer.type == CKEDITOR.NODE_ELEMENT && this.endContainer.getName() in nonCells )\r
+                       {\r
+                               this.shrink( CKEDITOR.NODE_ELEMENT, true );\r
+                       }\r
+\r
                        var bookmark = this.createBookmark();\r
 \r
                        // Create marker tags for the start and end boundaries.\r