Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 4524)
+++ /CKEditor/trunk/CHANGES.html	(revision 4525)
@@ -72,4 +72,5 @@
 		<li><a href="http://dev.fckeditor.net/ticket/4196">#4196</a> : Fixed 'Remove Numbered/Bulleted List' on nested list doesn't work well on nested list.</li>
 		<li><a href="http://dev.fckeditor.net/ticket/4200">#4200</a> : Fixed unable to insert 'password' type filed with attributes.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4530">#4530</a> : Fixed context menu couldn't open in Opera.</li>
 	<h3>
 		CKEditor 3.0.1</h3>
Index: /CKEditor/trunk/_source/plugins/contextmenu/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/contextmenu/plugin.js	(revision 4524)
+++ /CKEditor/trunk/_source/plugins/contextmenu/plugin.js	(revision 4525)
@@ -129,4 +129,51 @@
 		addTarget : function( element )
 		{
+			// Opera doesn't support 'contextmenu' event, we have duo approaches employed here:
+			// 1. Inherit the 'button override' hack we introduced in v2 (#4530), while this require the Opera browser
+			//  option 'Allow script to detect context menu/right click events' to be always turned on.
+			// 2. Considering the fact that ctrl/meta key is not been occupied
+			//  for multiple range selecting (like Gecko), we use this key
+			//  combination as a fallback for triggering context-menu. (#4530)
+			if ( CKEDITOR.env.opera )
+			{
+				var contextMenuOverrideButton;
+				element.on( 'mousedown', function( evt )
+				{
+					evt = evt.data;
+					if( evt.$.button != 2 )
+					{
+						if ( evt.getKeystroke() == CKEDITOR.CTRL + 1 )
+							element.fire( 'contextmenu', evt );
+						return;
+					}
+
+					var target = evt.getTarget();
+
+					if( !contextMenuOverrideButton )
+					{
+						var ownerDoc =  target.getDocument();
+						contextMenuOverrideButton = ownerDoc.createElement( 'input' ) ;
+						contextMenuOverrideButton.$.type = 'button' ;
+						ownerDoc.getBody().append( contextMenuOverrideButton ) ;
+					}
+
+					contextMenuOverrideButton.setAttribute( 'style', 'position:absolute;top:' + ( evt.$.clientY - 2 ) +
+						'px;left:' + ( evt.$.clientX - 2 ) +
+						'px;width:5px;height:5px;opacity:0.01' );
+
+				} );
+
+				element.on( 'mouseup', function ( evt )
+				{
+					if ( contextMenuOverrideButton )
+					{
+						contextMenuOverrideButton.remove();
+						contextMenuOverrideButton = undefined;
+						// Simulate 'contextmenu' event.
+						element.fire( 'contextmenu', evt.data );
+					}
+				} );
+			}
+
 			element.on( 'contextmenu', function( event )
 				{
@@ -162,18 +209,2 @@
 });
 
-// Fix the "contextmenu" event for DOM elements.
-// We may do this if we identify browsers that don't support the context meny
-// event on element directly. Leaving here for reference.
-//if ( <specific browsers> )
-//{
-//	CKEDITOR.dom.element.prototype.on = CKEDITOR.tools.override( CKEDITOR.dom.element.prototype.on, function( originalOn )
-//		{
-//			return function( eventName )
-//				{
-//					if ( eventName != 'contextmenu' )
-//						return originalOn.apply( this, arguments );
-//
-//					// TODO : Implement the fix.
-//				};
-//		});
-//}
