Index: /CKEditor/trunk/_source/core/dom/range.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/range.js	(revision 7624)
+++ /CKEditor/trunk/_source/core/dom/range.js	(revision 7625)
@@ -348,7 +348,8 @@
 	// Creates the appropriate node evaluator for the dom walker used inside
 	// check(Start|End)OfBlock.
-	function getCheckStartEndBlockEvalFunction( isStart )
+	function getCheckStartEndBlockEvalFunction()
 	{
 		var skipBogus = false,
+			whitespaces = CKEDITOR.dom.walker.whitespaces(),
 			bookmarkEvaluator = CKEDITOR.dom.walker.bookmark( true ),
 			isBogus = CKEDITOR.dom.walker.bogus();
@@ -356,6 +357,6 @@
 		return function( node )
 		{
-			// First ignore bookmark nodes.
-			if ( bookmarkEvaluator( node ) )
+			// First skip empty nodes.
+			if ( bookmarkEvaluator( node ) || whitespaces( node ) )
 				return true;
 
@@ -389,6 +390,13 @@
 	function elementBoundaryEval( checkStart )
 	{
+		var whitespaces = CKEDITOR.dom.walker.whitespaces(),
+			bookmark = CKEDITOR.dom.walker.bookmark( 1 );
+
 		return function( node )
 		{
+			// First skip empty nodes.
+			if ( bookmark( node ) || whitespaces( node ) )
+				return true;
+
 			// Tolerant bogus br when checking at the end of block.
 			// Reject any text node unless it's being bookmark
@@ -396,7 +404,6 @@
 			// Reject any element unless it's being invisible empty. (#3883)
 			return !checkStart && isBogus( node ) ||
-					( node.type == CKEDITOR.NODE_TEXT ?
-				   	   !CKEDITOR.tools.trim( node.getText() ) || !!node.getParent().data( 'cke-bookmark' )
-				   	   : node.getName() in CKEDITOR.dtd.$removeEmpty );
+						 node.type == CKEDITOR.NODE_ELEMENT &&
+						 node.getName() in CKEDITOR.dtd.$removeEmpty;
 		};
 	}
@@ -1842,5 +1849,5 @@
 
 			var walker = new CKEDITOR.dom.walker( walkerRange );
-			walker.evaluator = getCheckStartEndBlockEvalFunction( true );
+			walker.evaluator = getCheckStartEndBlockEvalFunction();
 
 			return walker.checkBackward();
Index: /CKEditor/trunk/_source/core/dom/walker.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/walker.js	(revision 7624)
+++ /CKEditor/trunk/_source/core/dom/walker.js	(revision 7625)
@@ -414,6 +414,12 @@
 		return function( node )
 		{
-			var isWhitespace = node && ( node.type == CKEDITOR.NODE_TEXT )
-							&& !CKEDITOR.tools.trim( node.getText() );
+			var isWhitespace;
+			if ( node && node.type == CKEDITOR.NODE_TEXT )
+			{
+				// whitespace, as well as the text cursor filler node we used in Webkit. (#9384)
+				isWhitespace = !CKEDITOR.tools.trim( node.getText() ) ||
+					CKEDITOR.env.webkit && node.getText() == '\u200b';
+			}
+
 			return !! ( isReject ^ isWhitespace );
 		};
@@ -448,4 +454,8 @@
 
 			return !! ( isReject ^ invisible );
+				invisible = !node.$.offsetHeight;
+			}
+
+			return !! ( isReject ^ invisible );
 		};
 	};
