Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 6372)
+++ /CKEditor/trunk/CHANGES.html	(revision 6373)
@@ -102,4 +102,5 @@
 		<li><a href="http://dev.ckeditor.com/ticket/6438">#6438</a> : [IE] Performance enhancement when typing inside an element with many child nodes.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/6970">#6970</a> : [IE] Dialog shadows were inaccurately presented.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/7041">#7041</a> : [FF] Unable to move cursor out of link at the end of block.</li>
 		<li>Updated the following language files:<ul>
 			<li><a href="http://dev.ckeditor.com/ticket/6981">#6981</a> : English (GB);</li>
Index: /CKEditor/trunk/_source/core/dom/element.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/element.js	(revision 6372)
+++ /CKEditor/trunk/_source/core/dom/element.js	(revision 6373)
@@ -255,30 +255,4 @@
 
 		/**
-		* Retrieve block element's filler node if existed.
-		*/
-		getBogus : function()
-		{
-			if ( !this.isBlockBoundary() )
-				return null;
-
-			var lastChild = this.getLast();
-
-			// Ignore empty/spaces text.
-			while ( lastChild && lastChild.type == CKEDITOR.NODE_TEXT
-					&& !CKEDITOR.tools.rtrim( lastChild.getText() ) )
-				lastChild = lastChild.getPrevious();
-
-			if ( lastChild &&
-					( CKEDITOR.env.ie && lastChild.type == CKEDITOR.NODE_TEXT
-							&& CKEDITOR.tools.trim( lastChild.getText() ).match( /^(?:&nbsp;|\xa0)$/ )
-							|| CKEDITOR.env.gecko && CKEDITOR.env.webkit && lastChild.is( 'br' ) ) )
-			{
-				return lastChild;
-			}
-
-			return null;
-		},
-
-		/**
 		 * Breaks one of the ancestor element in the element position, moving
 		 * this element between the broken parts.
Index: /CKEditor/trunk/_source/core/dom/range.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/range.js	(revision 6372)
+++ /CKEditor/trunk/_source/core/dom/range.js	(revision 6373)
@@ -1080,5 +1080,13 @@
 									endTop = enlargeable;
 								else if ( enlargeable )
-									this.setEndAfter( enlargeable );
+								{
+									var bogus = enlargeable.isBlockBoundary() && enlargeable.getBogus();
+
+									// Exclude bogus <br /> at the end of block.
+									if ( bogus )
+										this.setEndBefore( bogus );
+									else
+										this.setEndAfter( enlargeable );
+								}
 							}
 
Index: /CKEditor/trunk/_source/plugins/wysiwygarea/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/wysiwygarea/plugin.js	(revision 6372)
+++ /CKEditor/trunk/_source/plugins/wysiwygarea/plugin.js	(revision 6373)
@@ -358,5 +358,13 @@
 			enterMode = editor.config.enterMode;
 
-		CKEDITOR.env.gecko && activateEditing( editor );
+		if ( CKEDITOR.env.gecko )
+		{
+			activateEditing( editor );
+
+			// Ensure bogus br could help to move cursor (out of styles) to the end of block. (#7041)
+			var pathBlock = path.block || path.blockLimit;
+			if ( pathBlock && !pathBlock.getBogus() )
+				pathBlock.appendBogus();
+		}
 
 		// When enterMode set to block, we'll establing new paragraph only if we're
