Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 7392)
+++ /CKEditor/trunk/CHANGES.html	(revision 7393)
@@ -64,4 +64,5 @@
 		<li><a href="http://dev.ckeditor.com/ticket/8014">#8014</a> : Autogrow now stretches to fit the content when switching editor modes.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/8249">#8249</a> : Fix inconsistent behavior when backspace key at the start of list item.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/8617">#8617</a> : Fix selection disturbed after inline style is opened.</li>
 	</ul>
 	<h3>
Index: /CKEditor/trunk/_source/plugins/selection/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/selection/plugin.js	(revision 7392)
+++ /CKEditor/trunk/_source/plugins/selection/plugin.js	(revision 7393)
@@ -163,9 +163,52 @@
 		if ( fillingChar )
 		{
+			var bm,
+			sel = doc.getSelection().getNative(),
+			// Be error proof.
+			range = sel && sel.type != 'None' && sel.getRangeAt( 0 );
+
+			// Text selection position might get mangled by
+			// subsequent dom modification, save it now for restoring. (#8617)
+			if ( fillingChar.getLength() > 1
+				 && range && range.intersectsNode( fillingChar.$ ) )
+			{
+				bm = [ sel.anchorOffset, sel.focusOffset ];
+
+				// Anticipate the offset change brought by the removed char.
+				var startAffected = sel.anchorNode == fillingChar.$ && sel.anchorOffset > 0,
+					endAffected = sel.focusNode == fillingChar.$ && sel.focusOffset > 0;
+				startAffected && bm[ 0 ]--;
+				endAffected && bm[ 1 ]--;
+
+				// Revert the bookmark order on reverse selection.
+				isReversedSelection( sel ) && bm.unshift( bm.pop() );
+			}
+
 			// We can't simply remove the filling node because the user
 			// will actually enlarge it when typing, so we just remove the
 			// invisible char from it.
 			fillingChar.setText( fillingChar.getText().replace( /\u200B/g, '' ) );
-			fillingChar = 0;
+
+			// Restore the bookmark.
+			if ( bm )
+			{
+				var rng = sel.getRangeAt( 0 );
+				rng.setStart( rng.startContainer, bm[ 0 ] );
+				rng.setEnd( rng.startContainer, bm[ 1 ] );
+				sel.removeAllRanges();
+				sel.addRange( rng );
+			}
+		}
+	}
+
+	function isReversedSelection( sel )
+	{
+		if ( !sel.isCollapsed )
+		{
+			var range = sel.getRangeAt( 0 );
+			// Potentially alter an reversed selection range.
+			range.setStart( sel.anchorNode, sel.anchorOffset );
+			range.setEnd( sel.focusNode, sel.focusOffset );
+			return range.collapsed;
 		}
 	}
@@ -181,18 +224,4 @@
 				editor.on( 'selectionChange', function() { checkFillingChar( editor.document ); } );
 				editor.on( 'beforeSetMode', function() { removeFillingChar( editor.document ); } );
-				editor.on( 'key', function( e )
-					{
-						// Remove the filling char before some keys get
-						// executed, so they'll not get blocked by it.
-						switch ( e.data.keyCode )
-						{
-							case 13 :	// ENTER
-							case CKEDITOR.SHIFT + 13 :	// SHIFT-ENTER
-							case 37 :	// LEFT-ARROW
-							case 39 :	// RIGHT-ARROW
-							case 8 :	// BACKSPACE
-								removeFillingChar( editor.document );
-						}
-					}, null, null, 10 );
 
 				var fillingCharBefore,
@@ -518,4 +547,29 @@
 						doc.on( 'keyup', checkSelectionChangeTimeout, editor );
 						doc.on( 'selectionchange', checkSelectionChangeTimeout, editor );
+					}
+
+					if ( CKEDITOR.env.webkit )
+					{
+						doc.on( 'keydown', function( evt )
+						{
+							var key = evt.data.getKey();
+							// Remove the filling char before some keys get
+							// executed, so they'll not get blocked by it.
+							switch ( key )
+							{
+								case 13 :	// ENTER
+								case 33 :	// PAGEUP
+								case 34 :	// PAGEDOWN
+								case 35 :	// HOME
+								case 36 :	// END
+								case 37 :	// LEFT-ARROW
+								case 39 :	// RIGHT-ARROW
+								case 8 :	// BACKSPACE
+								case 45 :	// INS
+								case 46 :	// DEl
+									removeFillingChar( editor.document );
+							}
+
+						}, null, null, 10 );
 					}
 				});
