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
// 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
}\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
// 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
{\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
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