- var noUnlock = true;\r
- menu.hide();\r
-\r
- if ( CKEDITOR.env.ie )\r
- menu.onEscape();\r
-\r
- if ( item.onClick )\r
- item.onClick();\r
- else if ( item.command )\r
- editor.execCommand( item.command );\r
-\r
- noUnlock = false;\r
- }, this );\r
-\r
- menu.onEscape = function()\r
- {\r
- editor.focus();\r
-\r
- if ( CKEDITOR.env.ie )\r
- editor.getSelection().unlock( true );\r
- };\r
- }\r
-\r
- var listeners = this._.listeners,\r
- includedItems = [];\r
+ // Opera doesn't support 'contextmenu' event, we have duo approaches employed here:\r
+ // 1. Inherit the 'button override' hack we introduced in v2 (#4530), while this require the Opera browser\r
+ // option 'Allow script to detect context menu/right click events' to be always turned on.\r
+ // 2. Considering the fact that ctrl/meta key is not been occupied\r
+ // for multiple range selecting (like Gecko), we use this key\r
+ // combination as a fallback for triggering context-menu. (#4530)\r
+ if ( CKEDITOR.env.opera && !( 'oncontextmenu' in document.body ))\r
+ {\r
+ var contextMenuOverrideButton;\r
+ element.on( 'mousedown', function( evt )\r
+ {\r
+ evt = evt.data;\r
+ if ( evt.$.button != 2 )\r
+ {\r
+ if ( evt.getKeystroke() == CKEDITOR.CTRL + 1 )\r
+ element.fire( 'contextmenu', evt );\r
+ return;\r
+ }\r
+\r
+ if ( nativeContextMenuOnCtrl\r
+ && ( CKEDITOR.env.mac ? evt.$.metaKey : evt.$.ctrlKey ) )\r
+ return;\r
+\r
+ var target = evt.getTarget();\r
+\r
+ if ( !contextMenuOverrideButton )\r
+ {\r
+ var ownerDoc = target.getDocument();\r
+ contextMenuOverrideButton = ownerDoc.createElement( 'input' ) ;\r
+ contextMenuOverrideButton.$.type = 'button' ;\r
+ ownerDoc.getBody().append( contextMenuOverrideButton ) ;\r
+ }\r
+\r
+ contextMenuOverrideButton.setAttribute( 'style', 'position:absolute;top:' + ( evt.$.clientY - 2 ) +\r
+ 'px;left:' + ( evt.$.clientX - 2 ) +\r
+ 'px;width:5px;height:5px;opacity:0.01' );\r
+\r
+ } );\r
+\r
+ element.on( 'mouseup', function ( evt )\r
+ {\r
+ if ( contextMenuOverrideButton )\r
+ {\r
+ contextMenuOverrideButton.remove();\r
+ contextMenuOverrideButton = undefined;\r
+ // Simulate 'contextmenu' event.\r
+ element.fire( 'contextmenu', evt.data );\r
+ }\r
+ } );\r
+ }\r