Index: /CKEditor/branches/features/aria/_source/plugins/accessibility/plugin.js
===================================================================
--- /CKEditor/branches/features/aria/_source/plugins/accessibility/plugin.js	(revision 4938)
+++ /CKEditor/branches/features/aria/_source/plugins/accessibility/plugin.js	(revision 4939)
@@ -14,15 +14,14 @@
 	// List of in-use ARIA roles and states. 
 	var roles = [ 'role' ],
+		 // List of roles that role type should not be announced.
+		 silentRoles = { 'region' : 1 },
 		 states = [ 'label', 'labelledby', 'describedby', 'multiline' ],
 		 length = Math.max( roles.length, states.length );
-
 
 	function lookupARIASupport( role, tagName )
 	{
 		return {
-			// Only Firefox3 support the "dialog" role.
 			'dialog' :	 env.gecko && CKEDITOR.env.version >= 10900,
-			// IE doesn't support editing iframe as region.
-			'region' : env.gecko || ( env.ie && tagName != 'iframe' )
+			'region' : env.gecko && CKEDITOR.env.version >= 10900
 		}[ role ];
 	}
@@ -31,7 +30,6 @@
 	 *  Bring degradeable substitution to standard ARIA widgets.  
 	 * @param element
-	 * @param isOffline
 	 */
-	function degradeARIA( element, isOffline )
+	function degradeARIA( element, editor )
 	{
 		// Save the interested ARIA attributes first.
@@ -47,5 +45,5 @@
 			 labelText = element.getAttribute( 'aria-label' ) || ( attrValue = element.getAttribute( 'aria-labelledby' ) ) && doc.getById( attrValue ).getText() || '',
 			 descriptionText = ( attrValue = element.getAttribute( 'aria-describedby' ) ) && doc.getById( attrValue ).getText() || '',
-			 legend = [ labelText, role, descriptionText ].join( ' ' );
+			 allInOne = [ labelText, role in silentRoles ? '' : role, descriptionText ].join( ' ' );
 
 		// Remove all ARIA attributes on the widget that could
@@ -57,23 +55,30 @@
 		}
 
-		// Translate by wrapping with a form field legend that contains all ARIA
-		// attributes which leads to be announced by ATs.
-		var fieldset = CKEDITOR.dom.element.createFromHtml(
-				'<fieldset class="cke_voicelabel_invisible">' +
-					'<legend class="cke_voicelabel_invisible">' +
-						CKEDITOR.tools.htmlEncode( legend ) +
-					'</legend>' +
-				'</fieldset>', doc );
+		// Translate 'dialog' role by wrapping all containing form fields with a legend that composed of all ARIA
+		// attributes of the dialog which leads to be announced by ATs.
+		if( role == 'dialog' )
+		{
+			var fieldset = CKEDITOR.dom.element.createFromHtml(
+					'<fieldset class="cke_voicelabel_invisible">' +
+						'<legend class="cke_voicelabel_invisible">' +
+							CKEDITOR.tools.htmlEncode( allInOne ) +
+						'</legend>' +
+					'</fieldset>', doc );
 
-		if( !isOffline )
-		{
 			var parent;
 			while( ( parent = element.getParent() ) && !parent.getDtd()[ fieldset.getName() ] )
 				element = parent;
 			fieldset.insertBefore( element );
+			fieldset.append( element );
+			return fieldset;
 		}
-
-		fieldset.append( element );
-		return fieldset;
+		// The only reliable substitution of aria-label on an iframe
+		// is to use the content window title of that frame.
+		else if ( element.is( 'iframe' ) )
+		{
+			// We can only occupy the title when editor is not in full-page mode.
+			!editor.config.fullPage &&
+				( element.$.contentWindow.document.title = allInOne );
+		}
 	}
 
@@ -84,8 +89,5 @@
 			editor.on( 'ariaWidget', function( evt )
 			{
-				var data = evt.data,
-					widget = data.element,
-					 widgetIsOffline = !data.replace;
-				data.element = degradeARIA( widget, widgetIsOffline );
+				degradeARIA( evt.data, editor );
 			} );
 		}
Index: /CKEditor/branches/features/aria/_source/plugins/dialog/plugin.js
===================================================================
--- /CKEditor/branches/features/aria/_source/plugins/dialog/plugin.js	(revision 4938)
+++ /CKEditor/branches/features/aria/_source/plugins/dialog/plugin.js	(revision 4939)
@@ -152,5 +152,5 @@
 		CKEDITOR.tools.setTimeout( function()
 		{
-			editor.fire( 'ariaWidget', { element : this.parts.contents, replace : true } );
+			editor.fire( 'ariaWidget', this.parts.contents );
 		}, 0, this );
 		
Index: /CKEditor/branches/features/aria/_source/plugins/wysiwygarea/plugin.js
===================================================================
--- /CKEditor/branches/features/aria/_source/plugins/wysiwygarea/plugin.js	(revision 4938)
+++ /CKEditor/branches/features/aria/_source/plugins/wysiwygarea/plugin.js	(revision 4939)
@@ -275,4 +275,5 @@
 								'})())"' : '' ) +
   							' tabIndex="-1"' +
+  							' title=" wysiwgy mode"' +
   							' allowTransparency="true"' +
 							' role="region"' +
@@ -297,5 +298,5 @@
 						} );
 
-						mainElement.append( editor.fire( 'ariaWidget', { element : iframe } ).element );
+						mainElement.append( iframe );
 					};
 
@@ -312,6 +313,7 @@
 						if ( frameLoaded )
 							return;
-
 						frameLoaded = 1;
+
+						editor.fire( 'ariaWidget', iframe );
 
 						var domDocument = domWindow.document,
@@ -612,8 +614,9 @@
 										config.docType +
 										'<html dir="' + config.contentsLangDirection + '">' +
+										'<title>' + frameLabel + '</title>' +
 										'<head>' +
 											baseTag +
 											headExtra +
-										'</head>' +
+										'</head>' +	
 										'<body' + ( config.bodyId ? ' id="' + config.bodyId + '"' : '' ) +
 												  ( config.bodyClass ? ' class="' + config.bodyClass + '"' : '' ) +
