- return node.type == CKEDITOR.NODE_ELEMENT && node.is( 'li' );\r
- }),\r
- rangeStart = range.startContainer,\r
- indentWholeList = firstListItem.equals( rangeStart ) || firstListItem.contains( rangeStart );\r
-\r
- // Indent the entire list if cursor is inside the first list item. (#3893)\r
- if ( !( indentWholeList && indentElement.call( this, editor, nearestListBlock ) ) )\r
- indentList.call( this, editor, range, nearestListBlock );\r
+ range.setStartAt( selectedNode, CKEDITOR.POSITION_AFTER_START );\r
+ range.setEndAt( selectedNode, CKEDITOR.POSITION_BEFORE_END );\r
+ nearestListBlock = selectedNode;\r
+ }\r
+ }\r
+\r
+ // Avoid selection anchors under list root.\r
+ // <ul>[<li>...</li>]</ul> => <ul><li>[...]</li></ul>\r
+ if ( nearestListBlock && range.startContainer.type == CKEDITOR.NODE_ELEMENT\r
+ && range.startContainer.getName() in listNodeNames )\r
+ {\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+ walker.evaluator = isListItem;\r
+ range.startContainer = walker.next();\r
+ }\r
+\r
+ if ( nearestListBlock && range.endContainer.type == CKEDITOR.NODE_ELEMENT\r
+ && range.endContainer.getName() in listNodeNames )\r
+ {\r
+ walker = new CKEDITOR.dom.walker( range );\r
+ walker.evaluator = isListItem;\r
+ range.endContainer = walker.previous();\r
+ }\r
+\r
+ if ( nearestListBlock )\r
+ {\r
+ var firstListItem = nearestListBlock.getFirst( isListItem ),\r
+ hasMultipleItems = !!firstListItem.getNext( isListItem ),\r
+ rangeStart = range.startContainer,\r
+ indentWholeList = firstListItem.equals( rangeStart ) || firstListItem.contains( rangeStart );\r
+\r
+ // Indent the entire list if cursor is inside the first list item. (#3893)\r
+ // Only do that for indenting or when using indent classes or when there is something to outdent. (#6141)\r
+ if ( !( indentWholeList &&\r
+ ( self.name == 'indent' || self.useIndentClasses || parseInt( nearestListBlock.getStyle( getIndentCssProperty( nearestListBlock ) ), 10 ) ) &&\r
+ indentElement( nearestListBlock, !hasMultipleItems && firstListItem.getDirection() ) ) )\r
+ indentList( nearestListBlock );\r
+ }\r
+ else\r
+ indentBlock();\r