Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 4492)
+++ /CKEditor/trunk/CHANGES.html	(revision 4493)
@@ -60,4 +60,5 @@
 		<li><a href="http://dev.fckeditor.net/ticket/4473">#4473</a> : Fixed setting rules on the same element tag name throw error.</li>
 		<li><a href="http://dev.fckeditor.net/ticket/4514">#4514</a> : Fixed press 'Back' button breaks wysiwyg editing mode.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4542">#4542</a> : Fixed unable to access buttons using tab key in Safari and Opera.</li>
 	</ul>
 	<h3>
Index: /CKEditor/trunk/_source/plugins/dialog/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/dialog/plugin.js	(revision 4492)
+++ /CKEditor/trunk/_source/plugins/dialog/plugin.js	(revision 4493)
@@ -279,4 +279,6 @@
 		}
 
+		var processed;
+
 		function focusKeydownHandler( evt )
 		{
@@ -285,6 +287,7 @@
 				return;
 
-			var keystroke = evt.data.getKeystroke(),
-				processed = false;
+			var keystroke = evt.data.getKeystroke();
+
+			processed = 0;
 			if ( keystroke == 9 || keystroke == CKEDITOR.SHIFT + 9 )
 			{
@@ -305,5 +308,5 @@
 				}
 
-				processed = true;
+				processed = 1;
 			}
 			else if ( keystroke == CKEDITOR.ALT + 121 && !me._.tabBarMode )
@@ -312,5 +315,5 @@
 				me._.tabBarMode = true;
 				me._.tabs[ me._.currentTabId ][ 0 ].focus();
-				processed = true;
+				processed = 1;
 			}
 			else if ( ( keystroke == 37 || keystroke == 39 ) && me._.tabBarMode )
@@ -320,5 +323,5 @@
 				me.selectPage( nextId );
 				me._.tabs[ nextId ][ 0 ].focus();
-				processed = true;
+				processed = 1;
 			}
 
@@ -330,8 +333,17 @@
 		}
 
+		function focusKeyPressHandler( evt )
+		{
+			processed && evt.data.preventDefault();
+		}
+
 		// Add the dialog keyboard handlers.
 		this.on( 'show', function()
 			{
 				CKEDITOR.document.on( 'keydown', focusKeydownHandler, this, null, 0 );
+				// Some browsers instead, don't cancel key events in the keydown, but in the
+				// keypress. So we must do a longer trip in those cases. (#4531)
+				if ( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.mac ) )
+					CKEDITOR.document.on( 'keypress', focusKeyPressHandler, this );
 
 				if ( CKEDITOR.env.ie6Compat )
@@ -2449,5 +2461,17 @@
 		isVisible : function()
 		{
-			return !!this.getInputElement().$.offsetHeight;
+			var element = this.getInputElement(),
+				elementWindow = element.getWindow(),
+				elementFrame,
+				isVisible = !!element.$.offsetHeight;
+
+			// Webkit and Opera report non-zero offsetHeight despite that
+			// element is inside an invisible iframe. (#4542)
+			if( isVisible && ( CKEDITOR.env.webkit || CKEDITOR.env.opera )
+				&& !elementWindow.equals( CKEDITOR.document.getWindow() )
+				&& ( elementFrame = elementWindow.$.frameElement ) )
+				isVisible = !!elementFrame.offsetHeight;
+
+			return isVisible;
 		},
 
