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
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebNetscapePluginEventHandlerCocoa::drawRect(CGContextRef context, 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);
540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    event.data.draw.context = context;
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.draw.x = rect.origin.x;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.draw.y = rect.origin.y;
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.draw.width = rect.size.width;
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.draw.height = rect.size.height;
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RetainPtr<CGContextRef> protect(context);
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendEvent(&event);
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseDown(NSEvent *event)
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendMouseEvent(event, NPCocoaEventMouseDown);
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseDragged(NSEvent *event)
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendMouseEvent(event, NPCocoaEventMouseDragged);
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseEntered(NSEvent *event)
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendMouseEvent(event, NPCocoaEventMouseEntered);
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseExited(NSEvent *event)
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendMouseEvent(event, NPCocoaEventMouseExited);
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseMoved(NSEvent *event)
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendMouseEvent(event, NPCocoaEventMouseMoved);
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseUp(NSEvent *event)
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendMouseEvent(event, NPCocoaEventMouseUp);
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNetscapePluginEventHandlerCocoa::scrollWheel(NSEvent* event)
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return sendMouseEvent(event, NPCocoaEventScrollWheel);
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNetscapePluginEventHandlerCocoa::sendMouseEvent(NSEvent *nsEvent, NPCocoaEventType type)
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPCocoaEvent event;
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSPoint point = [m_pluginView convertPoint:[nsEvent locationInWindow] fromView:nil];
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int clickCount;
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (type == NPCocoaEventMouseEntered || type == NPCocoaEventMouseExited || type == NPCocoaEventScrollWheel)
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        clickCount = 0;
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        clickCount = [nsEvent clickCount];
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initializeEvent(&event, type);
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.modifierFlags = [nsEvent modifierFlags];
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.buttonNumber = [nsEvent buttonNumber];
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.clickCount = clickCount;
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.pluginX = point.x;
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.pluginY = point.y;
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.deltaX = [nsEvent deltaX];
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.deltaY = [nsEvent deltaY];
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.mouse.deltaZ = [nsEvent deltaZ];
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return sendEvent(&event);
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::keyDown(NSEvent *event)
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool retval = sendKeyEvent(event, NPCocoaEventKeyDown);
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
129563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#ifndef __LP64__
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the plug-in did not handle the event, pass it on to the Input Manager.
131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (retval)
132563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        WKSendKeyEventToTSM(event);
133563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#else
134563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    UNUSED_PARAM(retval);
135563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::keyUp(NSEvent *event)
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendKeyEvent(event, NPCocoaEventKeyUp);
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::flagsChanged(NSEvent *nsEvent)
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPCocoaEvent event;
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initializeEvent(&event, NPCocoaEventFlagsChanged);
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.modifierFlags = [nsEvent modifierFlags];
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.keyCode = [nsEvent keyCode];
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.isARepeat = false;
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.characters = 0;
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.charactersIgnoringModifiers = 0;
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendEvent(&event);
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebNetscapePluginEventHandlerCocoa::syntheticKeyDownWithCommandModifier(int keyCode, char character)
1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    char nullTerminatedString[] = { character, '\0' };
1600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RetainPtr<NSString> characters(AdoptNS, [[NSString alloc] initWithUTF8String:nullTerminatedString]);
1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NPCocoaEvent event;
1640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    initializeEvent(&event, NPCocoaEventKeyDown);
1650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    event.data.key.modifierFlags = NSCommandKeyMask;
1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    event.data.key.keyCode = keyCode;
1670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    event.data.key.isARepeat = false;
1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    event.data.key.characters = (NPNSString *)characters.get();
1690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    event.data.key.charactersIgnoringModifiers = (NPNSString *)characters.get();
1700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    sendEvent(&event);
1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNetscapePluginEventHandlerCocoa::sendKeyEvent(NSEvent* nsEvent, NPCocoaEventType type)
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPCocoaEvent event;
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initializeEvent(&event, type);
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.modifierFlags = [nsEvent modifierFlags];
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.keyCode = [nsEvent keyCode];
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.isARepeat = [nsEvent isARepeat];
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.characters = (NPNSString *)[nsEvent characters];
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.key.charactersIgnoringModifiers = (NPNSString *)[nsEvent charactersIgnoringModifiers];
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return sendEvent(&event);
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::windowFocusChanged(bool hasFocus)
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPCocoaEvent event;
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initializeEvent(&event, NPCocoaEventWindowFocusChanged);
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.focus.hasFocus = hasFocus;
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendEvent(&event);
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::focusChanged(bool hasFocus)
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPCocoaEvent event;
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initializeEvent(&event, NPCocoaEventFocusChanged);
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    event.data.focus.hasFocus = hasFocus;
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sendEvent(&event);
206563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
207563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (hasFocus)
208563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        installKeyEventHandler();
209563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    else
210563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        removeKeyEventHandler();
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid* WebNetscapePluginEventHandlerCocoa::platformWindow(NSWindow* window)
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return window;
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNetscapePluginEventHandlerCocoa::sendEvent(NPCocoaEvent* event)
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (event->type) {
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPCocoaEventMouseDown:
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPCocoaEventMouseUp:
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPCocoaEventMouseDragged:
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPCocoaEventKeyDown:
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPCocoaEventKeyUp:
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPCocoaEventFlagsChanged:
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPCocoaEventScrollWheel:
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_currentEventIsUserGesture = true;
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_currentEventIsUserGesture = false;
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool result = [m_pluginView sendEvent:event isDrawRect:event->type == NPCocoaEventDrawRect];
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_currentEventIsUserGesture = false;
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
240563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#ifndef __LP64__
241563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
242563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid WebNetscapePluginEventHandlerCocoa::installKeyEventHandler()
243563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
244563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    static const EventTypeSpec TSMEvents[] =
245563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    {
246563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent }
247563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    };
248563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!m_keyEventHandler)
250563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        InstallEventHandler(GetWindowEventTarget((WindowRef)[[m_pluginView window] windowRef]),
251563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                            NewEventHandlerUPP(TSMEventHandler),
252563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                            GetEventTypeCount(TSMEvents),
253563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                            TSMEvents,
254563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                            this,
255563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                            &m_keyEventHandler);
256563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
257563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
258563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid WebNetscapePluginEventHandlerCocoa::removeKeyEventHandler()
259563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
260563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (m_keyEventHandler) {
261563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        RemoveEventHandler(m_keyEventHandler);
262563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        m_keyEventHandler = 0;
263563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
264563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
265563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
266563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkOSStatus WebNetscapePluginEventHandlerCocoa::TSMEventHandler(EventHandlerCallRef inHandlerRef, EventRef event, void* eventHandler)
267563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
268563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return static_cast<WebNetscapePluginEventHandlerCocoa*>(eventHandler)->handleTSMEvent(event);
269563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
270563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
271563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkOSStatus WebNetscapePluginEventHandlerCocoa::handleTSMEvent(EventRef eventRef)
272563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
273563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(GetEventKind(eventRef) == kEventTextInputUnicodeForKeyEvent);
274563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
275563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Get the text buffer size.
276563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ByteCount size;
277563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    OSStatus result = GetEventParameter(eventRef, kEventParamTextInputSendText, typeUnicodeText, 0, 0, &size, 0);
278563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (result != noErr)
279563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return result;
280563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
281563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    unsigned length = size / sizeof(UniChar);
282563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    Vector<UniChar, 16> characters(length);
283563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
284563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Now get the actual text.
285563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    result = GetEventParameter(eventRef, kEventParamTextInputSendText, typeUnicodeText, 0, size, 0, characters.data());
286563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (result != noErr)
287563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return result;
288563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
289563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    RetainPtr<CFStringRef> text(AdoptCF, CFStringCreateWithCharacters(0, characters.data(), length));
290563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
291563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    NPCocoaEvent event;
292563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
293563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    initializeEvent(&event, NPCocoaEventTextInput);
294563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    event.data.text.text = (NPNSString*)text.get();
295563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
296563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    sendEvent(&event);
297563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
298563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return noErr;
299563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
300563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
301563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif // __LP64__
302563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(NETSCAPE_PLUGIN_API)
304