WebCore:
[WebKit-https.git] / WebKit / mac / Plugins / WebNetscapePluginEventHandlerCocoa.mm
1 /*
2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #if ENABLE(NETSCAPE_PLUGIN_API)
27
28 #import "WebNetscapePluginEventHandlerCocoa.h"
29
30 #import "WebBaseNetscapePluginViewInternal.h"
31
32 WebNetscapePluginEventHandlerCocoa::WebNetscapePluginEventHandlerCocoa(WebBaseNetscapePluginView* pluginView)
33     : WebNetscapePluginEventHandler(pluginView)
34 {
35 }
36
37 static inline void initializeEvent(NPCocoaEvent* event, NPCocoaEventType type)
38 {
39     event->type = type;
40     event->version = 0;
41 }
42
43 void WebNetscapePluginEventHandlerCocoa::drawRect(const NSRect& rect)
44 {
45     NPCocoaEvent event;
46     
47     initializeEvent(&event, NPCocoaEventDrawRect);
48     event.data.draw.x = rect.origin.x;
49     event.data.draw.y = rect.origin.y;
50     event.data.draw.width = rect.size.width;
51     event.data.draw.height = rect.size.height;
52     
53     sendEvent(&event);
54 }
55
56 void WebNetscapePluginEventHandlerCocoa::mouseDown(NSEvent *event)
57 {
58     sendMouseEvent(event, NPCocoaEventMouseDown);
59 }
60
61 void WebNetscapePluginEventHandlerCocoa::mouseDragged(NSEvent *event)
62 {
63     sendMouseEvent(event, NPCocoaEventMouseDragged);
64 }
65
66 void WebNetscapePluginEventHandlerCocoa::mouseEntered(NSEvent *event)
67 {
68     sendMouseEvent(event, NPCocoaEventMouseEntered);
69 }
70
71 void WebNetscapePluginEventHandlerCocoa::mouseExited(NSEvent *event)
72 {
73     sendMouseEvent(event, NPCocoaEventMouseExited);
74 }
75
76 void WebNetscapePluginEventHandlerCocoa::mouseMoved(NSEvent *event)
77 {
78     sendMouseEvent(event, NPCocoaEventMouseMoved);
79 }
80
81 void WebNetscapePluginEventHandlerCocoa::mouseUp(NSEvent *event)
82 {
83     sendMouseEvent(event, NPCocoaEventMouseUp);
84 }
85
86 bool WebNetscapePluginEventHandlerCocoa::scrollWheel(NSEvent* event)
87 {
88     return sendMouseEvent(event, NPCocoaEventScrollWheel);
89 }
90
91 bool WebNetscapePluginEventHandlerCocoa::sendMouseEvent(NSEvent *nsEvent, NPCocoaEventType type)
92 {
93     NPCocoaEvent event;
94     
95     NSPoint point = [m_pluginView convertPoint:[nsEvent locationInWindow] fromView:nil];
96     
97     int clickCount;
98     if (type == NPCocoaEventMouseEntered || type == NPCocoaEventMouseExited || type == NPCocoaEventScrollWheel)
99         clickCount = 0;
100     else
101         clickCount = [nsEvent clickCount];
102     
103     initializeEvent(&event, type);
104     event.data.mouse.modifierFlags = [nsEvent modifierFlags];
105     event.data.mouse.buttonNumber = [nsEvent buttonNumber];
106     event.data.mouse.clickCount = clickCount;
107     event.data.mouse.pluginX = point.x;
108     event.data.mouse.pluginY = point.y;
109     event.data.mouse.deltaX = [nsEvent deltaX];
110     event.data.mouse.deltaY = [nsEvent deltaY];
111     event.data.mouse.deltaZ = [nsEvent deltaZ];
112     
113     return sendEvent(&event);
114 }
115
116 void WebNetscapePluginEventHandlerCocoa::keyDown(NSEvent *event)
117 {
118     bool retval = sendKeyEvent(event, NPCocoaEventKeyDown);
119     
120     // If the plug-in did not handle the event, pass it on to the Input Manager.
121     if (!retval)
122         [m_pluginView interpretKeyEvents:[NSArray arrayWithObject:event]];
123 }
124
125 void WebNetscapePluginEventHandlerCocoa::keyUp(NSEvent *event)
126 {
127     sendKeyEvent(event, NPCocoaEventKeyUp);
128 }
129
130 void WebNetscapePluginEventHandlerCocoa::flagsChanged(NSEvent *nsEvent)
131 {
132     NPCocoaEvent event;
133         
134     initializeEvent(&event, NPCocoaEventFlagsChanged);
135     event.data.key.modifierFlags = [nsEvent modifierFlags];
136     event.data.key.keyCode = [nsEvent keyCode];
137     event.data.key.isARepeat = false;
138     event.data.key.characters = 0;
139     event.data.key.charactersIgnoringModifiers = 0;
140     
141     sendEvent(&event);
142 }
143
144 bool WebNetscapePluginEventHandlerCocoa::sendKeyEvent(NSEvent* nsEvent, NPCocoaEventType type)
145 {
146     NPCocoaEvent event;
147
148     initializeEvent(&event, type);
149     event.data.key.modifierFlags = [nsEvent modifierFlags];
150     event.data.key.keyCode = [nsEvent keyCode];
151     event.data.key.isARepeat = [nsEvent isARepeat];
152     event.data.key.characters = (NPNSString *)[nsEvent characters];
153     event.data.key.charactersIgnoringModifiers = (NPNSString *)[nsEvent charactersIgnoringModifiers];
154      
155     return sendEvent(&event);
156 }
157
158 void WebNetscapePluginEventHandlerCocoa::windowFocusChanged(bool hasFocus)
159 {
160     NPCocoaEvent event;
161     
162     initializeEvent(&event, NPCocoaEventWindowFocusChanged);
163     event.data.focus.hasFocus = hasFocus;
164     
165     sendEvent(&event);
166 }
167
168 void WebNetscapePluginEventHandlerCocoa::focusChanged(bool hasFocus)
169 {
170     NPCocoaEvent event;
171
172     initializeEvent(&event, NPCocoaEventFocusChanged);
173     event.data.focus.hasFocus = hasFocus;
174     
175     sendEvent(&event);
176 }
177
178 void* WebNetscapePluginEventHandlerCocoa::platformWindow(NSWindow* window)
179 {
180     return window;
181 }
182
183 bool WebNetscapePluginEventHandlerCocoa::sendEvent(NPCocoaEvent* event)
184 {
185     switch (event->type) {
186         case NPCocoaEventMouseDown:
187         case NPCocoaEventMouseUp:
188         case NPCocoaEventMouseDragged:
189         case NPCocoaEventKeyDown:
190         case NPCocoaEventKeyUp:
191         case NPCocoaEventFlagsChanged:
192         case NPCocoaEventScrollWheel:
193             m_currentEventIsUserGesture = true;
194             break;
195         default:
196             m_currentEventIsUserGesture = false;
197     }
198             
199     bool result = [m_pluginView sendEvent:event isDrawRect:event->type == NPCocoaEventDrawRect];
200     
201     m_currentEventIsUserGesture = false;
202     return result;
203 }
204
205 #endif // ENABLE(NETSCAPE_PLUGIN_API)