WebNetscapePluginEventHandlerCocoa.mm revision 563af33bc48281d19dce701398dbb88cb54fd7ec
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Apple Inc. All Rights Reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(NETSCAPE_PLUGIN_API)
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNetscapePluginEventHandlerCocoa.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import "WebKitSystemInterface.h"
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import "WebNetscapePluginView.h"
32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <wtf/UnusedParam.h>
33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <wtf/Vector.h>
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectWebNetscapePluginEventHandlerCocoa::WebNetscapePluginEventHandlerCocoa(WebNetscapePluginView* pluginView)
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : WebNetscapePluginEventHandler(pluginView)
37563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#ifndef __LP64__
38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    , m_keyEventHandler(0)
39563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void initializeEvent(NPCocoaEvent* event, NPCocoaEventType type)
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event->type = type;
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event->version = 0;
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::drawRect(const NSRect& rect)
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPCocoaEvent event;
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initializeEvent(&event, NPCocoaEventDrawRect);
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.draw.x = rect.origin.x;
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.draw.y = rect.origin.y;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.draw.width = rect.size.width;
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.draw.height = rect.size.height;
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendEvent(&event);
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseDown(NSEvent *event)
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendMouseEvent(event, NPCocoaEventMouseDown);
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseDragged(NSEvent *event)
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendMouseEvent(event, NPCocoaEventMouseDragged);
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseEntered(NSEvent *event)
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendMouseEvent(event, NPCocoaEventMouseEntered);
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseExited(NSEvent *event)
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendMouseEvent(event, NPCocoaEventMouseExited);
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseMoved(NSEvent *event)
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendMouseEvent(event, NPCocoaEventMouseMoved);
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseUp(NSEvent *event)
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendMouseEvent(event, NPCocoaEventMouseUp);
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNetscapePluginEventHandlerCocoa::scrollWheel(NSEvent* event)
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return sendMouseEvent(event, NPCocoaEventScrollWheel);
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNetscapePluginEventHandlerCocoa::sendMouseEvent(NSEvent *nsEvent, NPCocoaEventType type)
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPCocoaEvent event;
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSPoint point = [m_pluginView convertPoint:[nsEvent locationInWindow] fromView:nil];
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int clickCount;
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (type == NPCocoaEventMouseEntered || type == NPCocoaEventMouseExited || type == NPCocoaEventScrollWheel)
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        clickCount = 0;
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        clickCount = [nsEvent clickCount];
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initializeEvent(&event, type);
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.modifierFlags = [nsEvent modifierFlags];
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.buttonNumber = [nsEvent buttonNumber];
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.clickCount = clickCount;
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.pluginX = point.x;
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.pluginY = point.y;
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.deltaX = [nsEvent deltaX];
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.deltaY = [nsEvent deltaY];
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.deltaZ = [nsEvent deltaZ];
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return sendEvent(&event);
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::keyDown(NSEvent *event)
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool retval = sendKeyEvent(event, NPCocoaEventKeyDown);
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
126563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#ifndef __LP64__
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the plug-in did not handle the event, pass it on to the Input Manager.
128563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (retval)
129563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        WKSendKeyEventToTSM(event);
130563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#else
131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    UNUSED_PARAM(retval);
132563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::keyUp(NSEvent *event)
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendKeyEvent(event, NPCocoaEventKeyUp);
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::flagsChanged(NSEvent *nsEvent)
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPCocoaEvent event;
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initializeEvent(&event, NPCocoaEventFlagsChanged);
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.modifierFlags = [nsEvent modifierFlags];
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.keyCode = [nsEvent keyCode];
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.isARepeat = false;
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.characters = 0;
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.charactersIgnoringModifiers = 0;
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendEvent(&event);
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNetscapePluginEventHandlerCocoa::sendKeyEvent(NSEvent* nsEvent, NPCocoaEventType type)
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPCocoaEvent event;
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initializeEvent(&event, type);
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.modifierFlags = [nsEvent modifierFlags];
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.keyCode = [nsEvent keyCode];
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.isARepeat = [nsEvent isARepeat];
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.characters = (NPNSString *)[nsEvent characters];
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.charactersIgnoringModifiers = (NPNSString *)[nsEvent charactersIgnoringModifiers];
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return sendEvent(&event);
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::windowFocusChanged(bool hasFocus)
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPCocoaEvent event;
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initializeEvent(&event, NPCocoaEventWindowFocusChanged);
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.focus.hasFocus = hasFocus;
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendEvent(&event);
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::focusChanged(bool hasFocus)
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPCocoaEvent event;
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initializeEvent(&event, NPCocoaEventFocusChanged);
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.focus.hasFocus = hasFocus;
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendEvent(&event);
186563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
187563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (hasFocus)
188563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        installKeyEventHandler();
189563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    else
190563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        removeKeyEventHandler();
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid* WebNetscapePluginEventHandlerCocoa::platformWindow(NSWindow* window)
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return window;
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNetscapePluginEventHandlerCocoa::sendEvent(NPCocoaEvent* event)
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (event->type) {
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPCocoaEventMouseDown:
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPCocoaEventMouseUp:
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPCocoaEventMouseDragged:
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPCocoaEventKeyDown:
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPCocoaEventKeyUp:
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPCocoaEventFlagsChanged:
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPCocoaEventScrollWheel:
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_currentEventIsUserGesture = true;
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_currentEventIsUserGesture = false;
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool result = [m_pluginView sendEvent:event isDrawRect:event->type == NPCocoaEventDrawRect];
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_currentEventIsUserGesture = false;
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
220563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#ifndef __LP64__
221563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
222563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid WebNetscapePluginEventHandlerCocoa::installKeyEventHandler()
223563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
224563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    static const EventTypeSpec TSMEvents[] =
225563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    {
226563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent }
227563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    };
228563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
229563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!m_keyEventHandler)
230563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        InstallEventHandler(GetWindowEventTarget((WindowRef)[[m_pluginView window] windowRef]),
231563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                            NewEventHandlerUPP(TSMEventHandler),
232563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                            GetEventTypeCount(TSMEvents),
233563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                            TSMEvents,
234563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                            this,
235563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                            &m_keyEventHandler);
236563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
237563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
238563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid WebNetscapePluginEventHandlerCocoa::removeKeyEventHandler()
239563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
240563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (m_keyEventHandler) {
241563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        RemoveEventHandler(m_keyEventHandler);
242563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        m_keyEventHandler = 0;
243563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
244563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
245563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
246563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkOSStatus WebNetscapePluginEventHandlerCocoa::TSMEventHandler(EventHandlerCallRef inHandlerRef, EventRef event, void* eventHandler)
247563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
248563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return static_cast<WebNetscapePluginEventHandlerCocoa*>(eventHandler)->handleTSMEvent(event);
249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
250563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
251563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkOSStatus WebNetscapePluginEventHandlerCocoa::handleTSMEvent(EventRef eventRef)
252563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
253563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(GetEventKind(eventRef) == kEventTextInputUnicodeForKeyEvent);
254563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
255563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Get the text buffer size.
256563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ByteCount size;
257563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    OSStatus result = GetEventParameter(eventRef, kEventParamTextInputSendText, typeUnicodeText, 0, 0, &size, 0);
258563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (result != noErr)
259563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return result;
260563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
261563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    unsigned length = size / sizeof(UniChar);
262563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    Vector<UniChar, 16> characters(length);
263563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
264563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Now get the actual text.
265563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    result = GetEventParameter(eventRef, kEventParamTextInputSendText, typeUnicodeText, 0, size, 0, characters.data());
266563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (result != noErr)
267563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return result;
268563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
269563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    RetainPtr<CFStringRef> text(AdoptCF, CFStringCreateWithCharacters(0, characters.data(), length));
270563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
271563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    NPCocoaEvent event;
272563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
273563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    initializeEvent(&event, NPCocoaEventTextInput);
274563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    event.data.text.text = (NPNSString*)text.get();
275563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
276563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    sendEvent(&event);
277563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
278563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return noErr;
279563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
280563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
281563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif // __LP64__
282563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(NETSCAPE_PLUGIN_API)
284