- var testRange = new CKEDITOR.dom.range( range.document );\r
- testRange.moveToPosition( this._.lastNode, CKEDITOR.POSITION_AFTER_END );\r
- if ( testRange.checkEndOfBlock() )\r
+ var walker = new CKEDITOR.dom.walker( range.clone() ),\r
+ ignoreBookmarkTextEvaluator = CKEDITOR.dom.walker.bookmark( true, true );\r
+ // Avoid anchor inside bookmark inner text.\r
+ walker.evaluator = ignoreBookmarkTextEvaluator;\r
+ this._.nextNode = walker.next();\r
+ // TODO: It's better to have walker.reset() used here.\r
+ walker = new CKEDITOR.dom.walker( range.clone() );\r
+ walker.evaluator = ignoreBookmarkTextEvaluator;\r
+ var lastNode = walker.previous();\r
+ this._.lastNode = lastNode.getNextSourceNode( true );\r
+\r
+ // We may have an empty text node at the end of block due to [3770].\r
+ // If that node is the lastNode, it would cause our logic to leak to the\r
+ // next block.(#3887)\r
+ if ( this._.lastNode &&\r
+ this._.lastNode.type == CKEDITOR.NODE_TEXT &&\r
+ !CKEDITOR.tools.trim( this._.lastNode.getText() ) &&\r
+ this._.lastNode.getParent().isBlockBoundary() )\r