Index: /CKEditor/branches/features/pasting/_source/plugins/pastefromword/plugin.js
===================================================================
--- /CKEditor/branches/features/pasting/_source/plugins/pastefromword/plugin.js	(revision 4276)
+++ /CKEditor/branches/features/pasting/_source/plugins/pastefromword/plugin.js	(revision 4277)
@@ -264,9 +264,10 @@
 		getRules : function( editor )
 		{
-			var falsyFilter = this.filters.falsyFilter,
-				stylesFilter = this.filters.stylesFilter,
-				elementMigrateFilter = this.filters.elementMigrateFilter,
+			var filters = this.filters,
+				falsyFilter = filters.falsyFilter,
+				stylesFilter = filters.stylesFilter,
+				elementMigrateFilter = filters.elementMigrateFilter,
 				styleMigrateFilter = CKEDITOR.tools.bind( this.filters.styleMigrateFilter, this.filters ),
-				bogusAttrFilter = this.filters.bogusAttrFilter,
+				bogusAttrFilter = filters.bogusAttrFilter,
 				createListBulletMarker = this.utils.createListBulletMarker,
 				isListBulletIndicator = this.utils.isListBulletIndicator,
@@ -281,5 +282,5 @@
 				[
 					// Remove script, meta and link elements.
-					[ /meta|link|script|style/, '' ]
+					[ /meta|link|script/, '' ]
 				],
 
@@ -289,4 +290,10 @@
 					{
 						var tagName = element.name || '';
+
+						// Resolve inline css style for Firefox.
+						var applyStyleFilter;
+						if( CKEDITOR.env.gecko && ( applyStyleFilter = filters.applyStyleFilter ) )
+							applyStyleFilter( element );
+
 
 						// Processing headings.
@@ -410,5 +417,60 @@
 						}
 					},
-
+					// We would like drop any style sheet, but Firefox conclude
+					// certain styles in it, so we're required to change them into
+					// inline ones.
+					'style' : function( element )
+					{
+						if( CKEDITOR.env.gecko && !filters.applyStyleFilter )
+						{
+							var styleDefSection = element.onlyChild().value.match( /\/\* Style Definitions \*\/([\s\S]*?)\/\*/ ),
+								styleDefText = styleDefSection && styleDefSection[ 1 ],
+								rules = {};
+
+							if( styleDefText )
+							{
+								styleDefText.replace(/[\n\r]/g,'') // remove line-breaks.
+											// Extract selectors and rules.
+											.replace( /(.+?)\s*\{(.+?)\}/g,
+								function( rule, selectors, styleBlock )
+								{
+									selectors = selectors.split( ',' );
+									var length = selectors.length,
+										selector;
+									for ( var i = 0; i < length; i++ )
+									{
+										CKEDITOR.tools.trim( selectors[ i ] )
+													  .replace( /^(\w+?)(\.[\w-]+)?$/g,
+										function( match, tagName, className )
+										{
+											tagName = tagName || '*';
+											className = className.substring( 1, className.length );
+											if( !rules[ tagName ] )
+												rules[ tagName ] = {};
+											if( className )
+												rules[ tagName ][ className ] = styleBlock;
+											else
+												rules[ tagName ] = styleBlock;
+										} );
+									}
+								} );
+
+								filters.applyStyleFilter = function( element )
+								{
+									var name = rules[ '*' ] ? '*' : element.name,
+										className = element.attributes && element.attributes[ 'class' ],
+										style;
+									if( name in rules )
+									{
+										style = rules[ name ];
+										if( typeof style == 'object' )
+											style = style[ className ];
+										style && element.addStyle( style );
+									}
+								};
+							}
+						}
+						return false;
+					},
 					'p' : function( element )
 					{
@@ -446,6 +508,4 @@
 					},
 
-					'div' : elementMigrateFilter( config[ 'format_' + ( config.enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) ] ),
-					
 					// Deprecates <font> in favor of stylish <span>.
 					'font' : function( element )
@@ -473,19 +533,27 @@
 							var attrs = element.attributes,
 								styleText = '';
-							if( attrs.color )
+							if ( attrs.color )
+							{
 								styleText += 'color:' + attrs.color + ';';
-							if( attrs.face )
+								delete attrs.color;
+							}
+							if ( attrs.face )
+							{
 								styleText += 'font-family:' + attrs.face + ';';
+								delete attrs.face;
+							}
 							// TODO: Mapping size in ranges of xx-small,
 							// x-small, small, medium, large, x-large, xx-large.
-							if( attrs.size )
+							if ( attrs.size )
+							{
 								styleText += 'font-size:' +
-								            ( attrs.size > 3 ? 'larger'
-										      : ( attrs.size < 3 ? 'smaller' : 'medium' ) )+ ';';
-
-							if( styleText )
-								element.attributes = { 'style' : styleText };
+								             ( attrs.size > 3 ? 'large'
+										             : ( attrs.size < 3 ? 'small' : 'medium' ) ) + ';';
+								delete attrs.size;
+							}
 
 							element.name = 'span';
+							element.addStyle( styleText );
+
 						}
 					},
@@ -525,7 +593,5 @@
 									[
 										[ /^font-family$/, null, styleMigrateFilter( config[ 'font_style' ], 'family' ) ],
-										// TODO: Convert 'pt' length unit into 'px'.
 										[ /^font-size$/, null, styleMigrateFilter( config[ 'fontSize_style' ], 'size' ) ],
-										// TODO: Convert 'rgb' and 'descriptive' color into 'hexadecimal'. 
 										[ /^color$/, null, styleMigrateFilter( config[ 'colorButton_foreStyle' ], 'color' ) ],
 										[ /^background-color$/, null, styleMigrateFilter( config[ 'colorButton_backStyle' ], 'color' ) ]
@@ -546,4 +612,12 @@
 							element.attributes.src = href;
 						element.name = 'img';
+					},
+					// Editor doesn't support anchor with content currently(#3582),
+					// drop such anchors.
+					'a' : function( element )
+					{
+						var attrs = element.attributes;
+						if( attrs && !attrs.href && attrs.name )
+							delete element.name;
 					}
 				},
@@ -710,5 +784,5 @@
 			addingStyleText += name + ':' + value + ';';
 		// raw style text form.
-		else
+		else if( name )
 			addingStyleText += name;
 
