Commit aa1a9633 authored by andersca@apple.com's avatar andersca@apple.com

2009-04-17 Anders Carlsson <andersca@apple.com>

        Reviewed by Dan Bernstein.

        <rdar://problem/6714488>
        REGRESSION (Safari 3-4): Edit menu commands (cut/copy/paste/select all) do not work on Flash content
        
        * Plugins/Hosted/NetscapePluginInstanceProxy.h:
        * Plugins/Hosted/NetscapePluginInstanceProxy.mm:
        (WebKit::NetscapePluginInstanceProxy::syntheticKeyDownWithCommandModifier):
        Send a keyDown event to the plug-in host.
        
        * Plugins/Hosted/WebHostedNetscapePluginView.mm:
        (-[WebHostedNetscapePluginView sendModifierEventWithKeyCode:character:]):
        Call the plug-in instance proxy.
        
        * Plugins/WebBaseNetscapePluginView.mm:
        (-[WebBaseNetscapePluginView sendModifierEventWithKeyCode:character:]):
        Add this. Subclasses are required to override it.
        
        (-[WebBaseNetscapePluginView cut:]):
        (-[WebBaseNetscapePluginView copy:]):
        (-[WebBaseNetscapePluginView paste:]):
        (-[WebBaseNetscapePluginView selectAll:]):
        Call sendModifierEventWithKeyCode.
        
        * Plugins/WebNetscapePluginEventHandler.h:
        Add syntheticKeyDownWithCommandModifier.
        
        * Plugins/WebNetscapePluginEventHandlerCarbon.h:
        * Plugins/WebNetscapePluginEventHandlerCarbon.mm:
        (WebNetscapePluginEventHandlerCarbon::syntheticKeyDownWithCommandModifier):
        Send the synthetic event.
        
        * Plugins/WebNetscapePluginEventHandlerCocoa.h:
        * Plugins/WebNetscapePluginEventHandlerCocoa.mm:
        (WebNetscapePluginEventHandlerCocoa::syntheticKeyDownWithCommandModifier):
        Send the synthetic event.
        
        * Plugins/WebNetscapePluginView.mm:
        (-[WebNetscapePluginView sendModifierEventWithKeyCode:character:]):
        Call the event handler.



git-svn-id: svn://svn.chromium.org/blink/trunk@42632 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 33755800
2009-04-17 Anders Carlsson <andersca@apple.com>
Reviewed by Dan Bernstein.
<rdar://problem/6714488>
REGRESSION (Safari 3-4): Edit menu commands (cut/copy/paste/select all) do not work on Flash content
* Plugins/Hosted/NetscapePluginInstanceProxy.h:
* Plugins/Hosted/NetscapePluginInstanceProxy.mm:
(WebKit::NetscapePluginInstanceProxy::syntheticKeyDownWithCommandModifier):
Send a keyDown event to the plug-in host.
* Plugins/Hosted/WebHostedNetscapePluginView.mm:
(-[WebHostedNetscapePluginView sendModifierEventWithKeyCode:character:]):
Call the plug-in instance proxy.
* Plugins/WebBaseNetscapePluginView.mm:
(-[WebBaseNetscapePluginView sendModifierEventWithKeyCode:character:]):
Add this. Subclasses are required to override it.
(-[WebBaseNetscapePluginView cut:]):
(-[WebBaseNetscapePluginView copy:]):
(-[WebBaseNetscapePluginView paste:]):
(-[WebBaseNetscapePluginView selectAll:]):
Call sendModifierEventWithKeyCode.
* Plugins/WebNetscapePluginEventHandler.h:
Add syntheticKeyDownWithCommandModifier.
* Plugins/WebNetscapePluginEventHandlerCarbon.h:
* Plugins/WebNetscapePluginEventHandlerCarbon.mm:
(WebNetscapePluginEventHandlerCarbon::syntheticKeyDownWithCommandModifier):
Send the synthetic event.
* Plugins/WebNetscapePluginEventHandlerCocoa.h:
* Plugins/WebNetscapePluginEventHandlerCocoa.mm:
(WebNetscapePluginEventHandlerCocoa::syntheticKeyDownWithCommandModifier):
Send the synthetic event.
* Plugins/WebNetscapePluginView.mm:
(-[WebNetscapePluginView sendModifierEventWithKeyCode:character:]):
Call the event handler.
2009-04-17 David Kilzer <ddkilzer@apple.com> 2009-04-17 David Kilzer <ddkilzer@apple.com>
Simplify FEATURE_DEFINES definition Simplify FEATURE_DEFINES definition
......
...@@ -97,6 +97,7 @@ public: ...@@ -97,6 +97,7 @@ public:
void keyEvent(NSView *pluginView, NSEvent *, NPCocoaEventType); void keyEvent(NSView *pluginView, NSEvent *, NPCocoaEventType);
void insertText(NSString *); void insertText(NSString *);
bool wheelEvent(NSView *pluginView, NSEvent *); bool wheelEvent(NSView *pluginView, NSEvent *);
void syntheticKeyDownWithCommandModifier(int keyCode, char character);
void print(CGContextRef, unsigned width, unsigned height); void print(CGContextRef, unsigned width, unsigned height);
......
...@@ -287,6 +287,18 @@ void NetscapePluginInstanceProxy::keyEvent(NSView *pluginView, NSEvent *event, N ...@@ -287,6 +287,18 @@ void NetscapePluginInstanceProxy::keyEvent(NSView *pluginView, NSEvent *event, N
[event isARepeat], [event keyCode]); [event isARepeat], [event keyCode]);
} }
void NetscapePluginInstanceProxy::syntheticKeyDownWithCommandModifier(int keyCode, char character)
{
NSData *charactersData = [NSData dataWithBytes:&character length:1];
_WKPHPluginInstanceKeyboardEvent(m_pluginHostProxy->port(), m_pluginID,
[NSDate timeIntervalSinceReferenceDate],
NPCocoaEventKeyDown, NSCommandKeyMask,
const_cast<char*>(reinterpret_cast<const char*>([charactersData bytes])), [charactersData length],
const_cast<char*>(reinterpret_cast<const char*>([charactersData bytes])), [charactersData length],
false, keyCode);
}
void NetscapePluginInstanceProxy::insertText(NSString *text) void NetscapePluginInstanceProxy::insertText(NSString *text)
{ {
NSData *textData = [text dataUsingEncoding:NSUTF8StringEncoding]; NSData *textData = [text dataUsingEncoding:NSUTF8StringEncoding];
......
...@@ -294,6 +294,12 @@ extern "C" { ...@@ -294,6 +294,12 @@ extern "C" {
_proxy->keyEvent(self, event, NPCocoaEventKeyUp); _proxy->keyEvent(self, event, NPCocoaEventKeyUp);
} }
- (void)sendModifierEventWithKeyCode:(int)keyCode character:(char)character
{
if (_isStarted && _proxy)
_proxy->syntheticKeyDownWithCommandModifier(keyCode, character);
}
- (void)pluginHostDied - (void)pluginHostDied
{ {
_pluginHostDied = YES; _pluginHostDied = YES;
......
...@@ -203,6 +203,11 @@ using namespace WebCore; ...@@ -203,6 +203,11 @@ using namespace WebCore;
ASSERT_NOT_REACHED(); ASSERT_NOT_REACHED();
} }
- (void)sendModifierEventWithKeyCode:(int)keyCode character:(char)character
{
ASSERT_NOT_REACHED();
}
- (void)removeTrackingRect - (void)removeTrackingRect
{ {
if (_trackingTag) { if (_trackingTag) {
...@@ -606,26 +611,24 @@ using namespace WebCore; ...@@ -606,26 +611,24 @@ using namespace WebCore;
return _element.get(); return _element.get();
} }
// We want to treat these as regular keyboard events.
- (void)cut:(id)sender - (void)cut:(id)sender
{ {
[self keyDown:[NSApp currentEvent]]; [self sendModifierEventWithKeyCode:7 character:'x'];
} }
- (void)copy:(id)sender - (void)copy:(id)sender
{ {
[self keyDown:[NSApp currentEvent]]; [self sendModifierEventWithKeyCode:8 character:'c'];
} }
- (void)paste:(id)sender - (void)paste:(id)sender
{ {
[self keyDown:[NSApp currentEvent]]; [self sendModifierEventWithKeyCode:9 character:'v'];
} }
- (void)selectAll:(id)sender - (void)selectAll:(id)sender
{ {
[self keyDown:[NSApp currentEvent]]; [self sendModifierEventWithKeyCode:0 character:'a'];
} }
// AppKit doesn't call mouseDown or mouseUp on right-click. Simulate control-click // AppKit doesn't call mouseDown or mouseUp on right-click. Simulate control-click
......
...@@ -53,6 +53,7 @@ public: ...@@ -53,6 +53,7 @@ public:
virtual void keyDown(NSEvent*) = 0; virtual void keyDown(NSEvent*) = 0;
virtual void keyUp(NSEvent*) = 0; virtual void keyUp(NSEvent*) = 0;
virtual void flagsChanged(NSEvent*) = 0; virtual void flagsChanged(NSEvent*) = 0;
virtual void syntheticKeyDownWithCommandModifier(int keyCode, char character) = 0;
virtual void focusChanged(bool hasFocus) = 0; virtual void focusChanged(bool hasFocus) = 0;
virtual void windowFocusChanged(bool hasFocus) = 0; virtual void windowFocusChanged(bool hasFocus) = 0;
......
...@@ -50,7 +50,8 @@ public: ...@@ -50,7 +50,8 @@ public:
virtual void keyDown(NSEvent*); virtual void keyDown(NSEvent*);
virtual void keyUp(NSEvent*); virtual void keyUp(NSEvent*);
virtual void flagsChanged(NSEvent*); virtual void flagsChanged(NSEvent*);
virtual void syntheticKeyDownWithCommandModifier(int keyCode, char character);
virtual void windowFocusChanged(bool hasFocus); virtual void windowFocusChanged(bool hasFocus);
virtual void focusChanged(bool hasFocus); virtual void focusChanged(bool hasFocus);
......
...@@ -209,6 +209,17 @@ void WebNetscapePluginEventHandlerCarbon::keyDown(NSEvent *theEvent) ...@@ -209,6 +209,17 @@ void WebNetscapePluginEventHandlerCarbon::keyDown(NSEvent *theEvent)
WKSendKeyEventToTSM(theEvent); WKSendKeyEventToTSM(theEvent);
} }
void WebNetscapePluginEventHandlerCarbon::syntheticKeyDownWithCommandModifier(int keyCode, char character)
{
EventRecord event;
getCarbonEvent(&event);
event.what = ::keyDown;
event.modifiers |= cmdKey;
event.message = keyCode << 8 | character;
sendEvent(&event);
}
static UInt32 keyMessageForEvent(NSEvent *event) static UInt32 keyMessageForEvent(NSEvent *event)
{ {
NSData *data = [[event characters] dataUsingEncoding:CFStringConvertEncodingToNSStringEncoding(CFStringGetSystemEncoding())]; NSData *data = [[event characters] dataUsingEncoding:CFStringConvertEncodingToNSStringEncoding(CFStringGetSystemEncoding())];
......
...@@ -48,7 +48,8 @@ public: ...@@ -48,7 +48,8 @@ public:
virtual void keyDown(NSEvent*); virtual void keyDown(NSEvent*);
virtual void keyUp(NSEvent*); virtual void keyUp(NSEvent*);
virtual void flagsChanged(NSEvent*); virtual void flagsChanged(NSEvent*);
virtual void syntheticKeyDownWithCommandModifier(int keyCode, char character);
virtual void windowFocusChanged(bool hasFocus); virtual void windowFocusChanged(bool hasFocus);
virtual void focusChanged(bool hasFocus); virtual void focusChanged(bool hasFocus);
......
...@@ -151,6 +151,23 @@ void WebNetscapePluginEventHandlerCocoa::flagsChanged(NSEvent *nsEvent) ...@@ -151,6 +151,23 @@ void WebNetscapePluginEventHandlerCocoa::flagsChanged(NSEvent *nsEvent)
sendEvent(&event); sendEvent(&event);
} }
void WebNetscapePluginEventHandlerCocoa::syntheticKeyDownWithCommandModifier(int keyCode, char character)
{
char nullTerminatedString[] = { character, '\0' };
RetainPtr<NSString> characters(AdoptNS, [[NSString alloc] initWithUTF8String:nullTerminatedString]);
NPCocoaEvent event;
initializeEvent(&event, NPCocoaEventKeyDown);
event.data.key.modifierFlags = NSCommandKeyMask;
event.data.key.keyCode = keyCode;
event.data.key.isARepeat = false;
event.data.key.characters = (NPNSString *)characters.get();
event.data.key.charactersIgnoringModifiers = (NPNSString *)characters.get();
sendEvent(&event);
}
bool WebNetscapePluginEventHandlerCocoa::sendKeyEvent(NSEvent* nsEvent, NPCocoaEventType type) bool WebNetscapePluginEventHandlerCocoa::sendKeyEvent(NSEvent* nsEvent, NPCocoaEventType type)
{ {
NPCocoaEvent event; NPCocoaEvent event;
......
...@@ -825,6 +825,14 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr) ...@@ -825,6 +825,14 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
_eventHandler->flagsChanged(theEvent); _eventHandler->flagsChanged(theEvent);
} }
- (void)sendModifierEventWithKeyCode:(int)keyCode character:(char)character
{
if (!_isStarted)
return;
_eventHandler->syntheticKeyDownWithCommandModifier(keyCode, character);
}
#pragma mark WEB_NETSCAPE_PLUGIN #pragma mark WEB_NETSCAPE_PLUGIN
- (BOOL)isNewWindowEqualToOldWindow - (BOOL)isNewWindowEqualToOldWindow
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment