NetscapePluginMac.mm revision 81bc750723a18f21cd17d1b173cd2a4dda9cea6e
165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "config.h"
272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "NetscapePlugin.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "PluginController.h"
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "WebEvent.h"
312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import <WebCore/GraphicsContext.h>
322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import <Carbon/Carbon.h>
332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import <WebKitSystemInterface.h>
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const double nullEventIntervalActive = 0.02;
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const double nullEventIntervalNotActive = 0.25;
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic unsigned buttonStateFromLastMouseEvent;
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPError NetscapePlugin::setDrawingModel(NPDrawingModel drawingModel)
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // The drawing model can only be set from NPP_New.
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_inNPPNew)
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NPERR_GENERIC_ERROR;
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (drawingModel) {
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_QUICKDRAW
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPDrawingModelQuickDraw:
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPDrawingModelCoreGraphics:
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPDrawingModelCoreAnimation:
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_drawingModel = drawingModel;
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return NPERR_GENERIC_ERROR;
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return NPERR_NO_ERROR;
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPError NetscapePlugin::setEventModel(NPEventModel eventModel)
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // The event model can only be set from NPP_New.
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_inNPPNew)
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NPERR_GENERIC_ERROR;
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (eventModel) {
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon:
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa:
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_eventModel = eventModel;
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return NPERR_GENERIC_ERROR;
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return NPERR_NO_ERROR;
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic double flipScreenYCoordinate(double y)
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return [[[NSScreen screens] objectAtIndex:0] frame].size.height - y;
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPBool NetscapePlugin::convertPoint(double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double& destX, double& destY, NPCoordinateSpace destSpace)
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (sourceSpace == destSpace) {
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destX = sourceX;
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destY = sourceY;
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    double sourceXInScreenSpace;
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    double sourceYInScreenSpace;
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    FloatPoint sourceInScreenSpace;
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (sourceSpace) {
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpacePlugin:
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        sourceXInScreenSpace = sourceX + m_windowFrameInScreenCoordinates.x() + m_viewFrameInWindowCoordinates.x() + m_npWindow.x;
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        sourceYInScreenSpace = m_windowFrameInScreenCoordinates.y() + m_viewFrameInWindowCoordinates.y() + m_viewFrameInWindowCoordinates.height() - (sourceY + m_npWindow.y);
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpaceWindow:
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        sourceXInScreenSpace = sourceX + m_windowFrameInScreenCoordinates.x();
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        sourceYInScreenSpace = sourceY + m_windowFrameInScreenCoordinates.y();
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpaceFlippedWindow:
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        sourceXInScreenSpace = sourceX + m_windowFrameInScreenCoordinates.x();
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        sourceYInScreenSpace = m_windowFrameInScreenCoordinates.y() + m_windowFrameInScreenCoordinates.height() - sourceY;
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpaceScreen:
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        sourceXInScreenSpace = sourceX;
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        sourceYInScreenSpace = sourceY;
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpaceFlippedScreen:
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        sourceXInScreenSpace = sourceX;
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        sourceYInScreenSpace = flipScreenYCoordinate(sourceY);
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Now convert back.
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (destSpace) {
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpacePlugin:
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destX = sourceXInScreenSpace - (m_windowFrameInScreenCoordinates.x() + m_viewFrameInWindowCoordinates.x() + m_npWindow.x);
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destY = m_windowFrameInScreenCoordinates.y() + m_viewFrameInWindowCoordinates.y() + m_viewFrameInWindowCoordinates.height() - (sourceYInScreenSpace + m_npWindow.y);
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpaceWindow:
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destX = sourceXInScreenSpace - m_windowFrameInScreenCoordinates.x();
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destY = sourceYInScreenSpace - m_windowFrameInScreenCoordinates.y();
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpaceFlippedWindow:
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destX = sourceXInScreenSpace - m_windowFrameInScreenCoordinates.x();
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destY = sourceYInScreenSpace - m_windowFrameInScreenCoordinates.y();
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destY = m_windowFrameInScreenCoordinates.height() - destY;
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpaceScreen:
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destX = sourceXInScreenSpace;
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destY = sourceYInScreenSpace;
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpaceFlippedScreen:
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destX = sourceXInScreenSpace;
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destY = flipScreenYCoordinate(sourceYInScreenSpace);
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
161ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
162ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochNPError NetscapePlugin::popUpContextMenu(NPMenu* npMenu)
163ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
164ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!m_currentMouseEvent)
165ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return NPERR_GENERIC_ERROR;
166ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
167ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    double screenX, screenY;
168ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!convertPoint(m_currentMouseEvent->data.mouse.pluginX, m_currentMouseEvent->data.mouse.pluginY, NPCoordinateSpacePlugin, screenX, screenY, NPCoordinateSpaceScreen))
169ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        ASSERT_NOT_REACHED();
170ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
171ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WKPopupContextMenu(reinterpret_cast<NSMenu *>(npMenu), NSMakePoint(screenX, screenY));
172ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return NPERR_NO_ERROR;
173ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
174ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1752fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockmach_port_t NetscapePlugin::compositingRenderServerPort()
1762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return m_pluginController->compositingRenderServerPort();
1782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtypedef HashMap<WindowRef, NetscapePlugin*> WindowMap;
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic WindowMap& windowMap()
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DEFINE_STATIC_LOCAL(WindowMap, windowMap, ());
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return windowMap;
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePlugin::platformPostInitialize()
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_drawingModel == static_cast<NPDrawingModel>(-1)) {
19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_QUICKDRAW
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Default to QuickDraw if the plugin did not specify a drawing model.
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_drawingModel = NPDrawingModelQuickDraw;
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#else
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // QuickDraw is not available, so we can't default to it. Instead, default to CoreGraphics.
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_drawingModel = NPDrawingModelCoreGraphics;
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_eventModel == static_cast<NPEventModel>(-1)) {
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // If the plug-in did not specify a drawing model we default to Carbon when it is available.
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_eventModel = NPEventModelCarbon;
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#else
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_eventModel = NPEventModelCocoa;
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // NP_NO_CARBON
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !defined(NP_NO_CARBON) && !defined(NP_NO_QUICKDRAW)
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // The CA drawing model does not work with the Carbon event model.
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_drawingModel == NPDrawingModelCoreAnimation && m_eventModel == NPEventModelCarbon)
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // The Cocoa event model does not work with the QuickDraw drawing model.
21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_eventModel == NPEventModelCocoa && m_drawingModel == NPDrawingModelQuickDraw)
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_QUICKDRAW
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Right now we don't support the QuickDraw drawing model at all
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_drawingModel == NPDrawingModelQuickDraw)
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_drawingModel == NPDrawingModelCoreAnimation) {
22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        void* value = 0;
23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Get the Core Animation layer.
23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (NPP_GetValue(NPPVpluginCoreAnimationLayer, &value) == NPERR_NO_ERROR && value) {
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT(!m_pluginLayer);
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_pluginLayer = reinterpret_cast<CALayer *>(value);
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_eventModel == NPEventModelCarbon) {
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Initialize the fake Carbon window.
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ::Rect bounds = { 0, 0, 0, 0 };
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CreateNewWindow(kDocumentWindowClass, kWindowNoTitleBarAttribute, &bounds, reinterpret_cast<WindowRef*>(&m_npCGContext.window));
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(m_npCGContext.window);
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // FIXME: Disable the backing store.
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_npWindow.window = &m_npCGContext;
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(!windowMap().contains(windowRef()));
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        windowMap().set(windowRef(), this);
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Start the null event timer.
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // FIXME: Throttle null events when the plug-in isn't visible on screen.
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_nullEventTimer.startRepeating(nullEventIntervalActive);
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::platformDestroy()
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_eventModel == NPEventModelCarbon) {
26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (WindowRef window = windowRef()) {
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // Destroy the fake Carbon window.
26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            DisposeWindow(window);
26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT(windowMap().contains(window));
26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            windowMap().remove(window);
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Stop the null event timer.
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_nullEventTimer.stop();
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePlugin::platformInvalidate(const IntRect&)
27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::platformGeometryDidChange()
28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic inline NPCocoaEvent initializeEvent(NPCocoaEventType type)
28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPCocoaEvent event;
29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.type = type;
29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.version = 0;
29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return event;
29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNetscapePlugin* NetscapePlugin::netscapePluginFromWindow(WindowRef windowRef)
29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return windowMap().get(windowRef);
30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWindowRef NetscapePlugin::windowRef() const
30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_eventModel == NPEventModelCarbon);
30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return reinterpret_cast<WindowRef>(m_npCGContext.window);
30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochunsigned NetscapePlugin::buttonState()
31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return buttonStateFromLastMouseEvent;
31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
31465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic inline EventRecord initializeEventRecord(EventKind eventKind)
31665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    EventRecord eventRecord;
31865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    eventRecord.what = eventKind;
32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    eventRecord.message = 0;
32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    eventRecord.when = TickCount();
32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    eventRecord.where = Point();
32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    eventRecord.modifiers = 0;
32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return eventRecord;
32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
32765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic bool anyMouseButtonIsDown(const WebEvent& event)
32965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.type() == WebEvent::MouseDown)
33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.type() == WebEvent::MouseMove && static_cast<const WebMouseEvent&>(event).button() != WebMouseEvent::NoButton)
33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic bool rightMouseButtonIsDown(const WebEvent& event)
34065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.type() == WebEvent::MouseDown && static_cast<const WebMouseEvent&>(event).button() == WebMouseEvent::RightButton)
34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
34365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.type() == WebEvent::MouseMove && static_cast<const WebMouseEvent&>(event).button() == WebMouseEvent::RightButton)
34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
34865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
34965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic EventModifiers modifiersForEvent(const WebEvent& event)
35165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
35265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    EventModifiers modifiers = 0;
35365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We only want to set the btnState if a mouse button is _not_ down.
35565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!anyMouseButtonIsDown(event))
35665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= btnState;
35765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.metaKey())
35965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= cmdKey;
36065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
36165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.shiftKey())
36265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= shiftKey;
36365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
36465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.altKey())
36565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= optionKey;
36665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
36765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Set controlKey if the control key is down or the right mouse button is down.
36865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.controlKey() || rightMouseButtonIsDown(event))
36965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= controlKey;
37065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return modifiers;
37265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
37365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid NetscapePlugin::platformPaint(GraphicsContext* context, const IntRect& dirtyRect, bool isSnapshot)
37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CGContextRef platformContext = context->platformContext();
37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Translate the context so that the origin is at the top left corner of the plug-in view.
38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    context->translate(m_frameRect.x(), m_frameRect.y());
38265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa: {
38565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // Don't send draw events when we're using the Core Animation drawing model.
38681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!isSnapshot && m_drawingModel == NPDrawingModelCoreAnimation)
38765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                return;
38865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPCocoaEvent event = initializeEvent(NPCocoaEventDrawRect);
39065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
39165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.draw.context = platformContext;
39265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.draw.x = dirtyRect.x() - m_frameRect.x();
39365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.draw.y = dirtyRect.y() - m_frameRect.y();
39465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.draw.width = dirtyRect.width();
39565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.draw.height = dirtyRect.height();
39665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
39765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPP_HandleEvent(&event);
39865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
39965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
40065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
40165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
40265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon: {
40365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            if (platformContext != m_npCGContext.context) {
40465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                m_npCGContext.context = platformContext;
40565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                callSetWindow();
40665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            }
40765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
40865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            EventRecord event = initializeEventRecord(updateEvt);
40965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.message = reinterpret_cast<unsigned long>(windowRef());
41065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
41165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPP_HandleEvent(&event);
41265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
41365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
41465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
41565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
41665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
41765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
41865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
41965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
42065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
42165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic uint32_t modifierFlags(const WebEvent& event)
42265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
42365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint32_t modifiers = 0;
42465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
42565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.shiftKey())
42665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= NSShiftKeyMask;
42765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.controlKey())
42865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= NSControlKeyMask;
42965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.altKey())
43065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= NSAlternateKeyMask;
43165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.metaKey())
43265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= NSCommandKeyMask;
43365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
43465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return modifiers;
43565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
43665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
43765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic int32_t buttonNumber(WebMouseEvent::Button button)
43865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
43965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (button) {
44065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebMouseEvent::NoButton:
44165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebMouseEvent::LeftButton:
44265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
44365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebMouseEvent::RightButton:
44465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 1;
44565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebMouseEvent::MiddleButton:
44665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 2;
44765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
44865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
44965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_NOT_REACHED();
45065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return -1;
45165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
45265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
45365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void fillInCocoaEventFromMouseEvent(NPCocoaEvent& event, const WebMouseEvent& mouseEvent, const WebCore::IntPoint& pluginLocation)
45465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
45565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.modifierFlags = modifierFlags(mouseEvent);
45665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.pluginX = mouseEvent.position().x() - pluginLocation.x();
45765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.pluginY = mouseEvent.position().y() - pluginLocation.y();
45865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.buttonNumber = buttonNumber(mouseEvent.button());
45965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.clickCount = mouseEvent.clickCount();
46065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.deltaX = mouseEvent.deltaX();
46165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.deltaY = mouseEvent.deltaY();
46265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.deltaZ = mouseEvent.deltaZ();
46365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
46465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
46565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic NPCocoaEvent initializeMouseEvent(const WebMouseEvent& mouseEvent, const WebCore::IntPoint& pluginLocation)
46665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
46765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPCocoaEventType eventType;
46865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
46965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (mouseEvent.type()) {
47065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebEvent::MouseDown:
47165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        eventType = NPCocoaEventMouseDown;
47265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
47365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebEvent::MouseUp:
47465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        eventType = NPCocoaEventMouseUp;
47565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
47665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebEvent::MouseMove:
47765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (mouseEvent.button() == WebMouseEvent::NoButton)
47865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            eventType = NPCocoaEventMouseMoved;
47965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
48065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            eventType = NPCocoaEventMouseDragged;
48165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
48265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
48365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT_NOT_REACHED();
48465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NPCocoaEvent();
48565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
48665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
48765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPCocoaEvent event = initializeEvent(eventType);
48865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    fillInCocoaEventFromMouseEvent(event, mouseEvent, pluginLocation);
48965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return event;
49065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
49165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
49265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePlugin::platformHandleMouseEvent(const WebMouseEvent& mouseEvent)
49365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
49465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
49565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa: {
49665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPCocoaEvent event = initializeMouseEvent(mouseEvent, m_frameRect.location());
497ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
498ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            NPCocoaEvent* previousMouseEvent = m_currentMouseEvent;
499ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            m_currentMouseEvent = &event;
500ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
501ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            // Protect against NPP_HandleEvent causing the plug-in to be destroyed, since we
502ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            // access m_currentMouseEvent afterwards.
503ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            RefPtr<NetscapePlugin> protect(this);
504ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
505ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            bool returnValue = NPP_HandleEvent(&event);
506ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
507ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            m_currentMouseEvent = previousMouseEvent;
508ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
509ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            return returnValue;
51065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
51165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
51265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
51365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon: {
51465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            EventKind eventKind = nullEvent;
51565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
51665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            switch (mouseEvent.type()) {
51765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            case WebEvent::MouseDown:
51865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                eventKind = mouseDown;
51965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                buttonStateFromLastMouseEvent |= (1 << buttonNumber(mouseEvent.button()));
52065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                break;
52165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            case WebEvent::MouseUp:
52265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                eventKind = mouseUp;
52365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                buttonStateFromLastMouseEvent &= ~(1 << buttonNumber(mouseEvent.button()));
52465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                break;
52565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            case WebEvent::MouseMove:
52665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                eventKind = nullEvent;
52765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                break;
52865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            default:
52965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                ASSERT_NOT_REACHED();
53065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            }
53165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
53265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            EventRecord event = initializeEventRecord(eventKind);
53365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.modifiers = modifiersForEvent(mouseEvent);
53465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.where.h = mouseEvent.globalPosition().x();
53565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.where.v = mouseEvent.globalPosition().y();
53665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
53765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return NPP_HandleEvent(&event);
53865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
53965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
54065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
54165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
54265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
54365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
54465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
54565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
54665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
54765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
54865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePlugin::platformHandleWheelEvent(const WebWheelEvent& wheelEvent)
54965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
55065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
55165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa: {
55265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPCocoaEvent event = initializeEvent(NPCocoaEventScrollWheel);
55365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
55465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.modifierFlags = modifierFlags(wheelEvent);
55565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.pluginX = wheelEvent.position().x() - m_frameRect.x();
55665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.pluginY = wheelEvent.position().y() - m_frameRect.y();
55765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.buttonNumber = 0;
55865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.clickCount = 0;
55965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.deltaX = wheelEvent.delta().width();
56065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.deltaY = wheelEvent.delta().height();
56165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.deltaZ = 0;
56265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return NPP_HandleEvent(&event);
56365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
56465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
56565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
56665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon:
56765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // Carbon doesn't have wheel events.
56865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
56965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
57065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
57165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
57265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
57365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
57465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
57565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
57665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
57765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
57865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePlugin::platformHandleMouseEnterEvent(const WebMouseEvent& mouseEvent)
57965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
58065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
58165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa: {
58265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPCocoaEvent event = initializeEvent(NPCocoaEventMouseEntered);
58365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
58465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            fillInCocoaEventFromMouseEvent(event, mouseEvent, m_frameRect.location());
58565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return NPP_HandleEvent(&event);
58665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
58765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
58865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
58965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon: {
59065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            EventRecord eventRecord = initializeEventRecord(NPEventType_AdjustCursorEvent);
59165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            eventRecord.modifiers = modifiersForEvent(mouseEvent);
59265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
59365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return NPP_HandleEvent(&eventRecord);
59465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
59565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
59665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
59765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
59865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
59965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
60065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
60165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
60265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
60365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
60465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePlugin::platformHandleMouseLeaveEvent(const WebMouseEvent& mouseEvent)
60565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
60665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
60765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa: {
60865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPCocoaEvent event = initializeEvent(NPCocoaEventMouseExited);
60965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
61065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            fillInCocoaEventFromMouseEvent(event, mouseEvent, m_frameRect.location());
61165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return NPP_HandleEvent(&event);
61265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
61365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
61465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
61565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon: {
61665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            EventRecord eventRecord = initializeEventRecord(NPEventType_AdjustCursorEvent);
61765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            eventRecord.modifiers = modifiersForEvent(mouseEvent);
61865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
61965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return NPP_HandleEvent(&eventRecord);
62065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
62165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
62265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
62365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
62465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
62565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
62665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
62765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
62865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
62965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
63065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic unsigned modifierFlags(const WebKeyboardEvent& keyboardEvent)
63165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
63265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned modifierFlags = 0;
63365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
63465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (keyboardEvent.shiftKey())
63565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifierFlags |= NSShiftKeyMask;
63665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (keyboardEvent.controlKey())
63765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifierFlags |= NSControlKeyMask;
63865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (keyboardEvent.altKey())
63965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifierFlags |= NSAlternateKeyMask;
64065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (keyboardEvent.metaKey())
64165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifierFlags |= NSCommandKeyMask;
64265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return modifierFlags;
64465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
64565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic NPCocoaEvent initializeKeyboardEvent(const WebKeyboardEvent& keyboardEvent)
64765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
64865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPCocoaEventType eventType;
64965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
65065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (keyboardEvent.type()) {
65165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case WebEvent::KeyDown:
65265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            eventType = NPCocoaEventKeyDown;
65365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
65465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case WebEvent::KeyUp:
65565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            eventType = NPCocoaEventKeyUp;
65665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
65765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
65865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
65965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return NPCocoaEvent();
66065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
66165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
66265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPCocoaEvent event = initializeEvent(eventType);
66365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.key.modifierFlags = modifierFlags(keyboardEvent);
66465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.key.characters = reinterpret_cast<NPNSString*>(static_cast<NSString*>(keyboardEvent.text()));
66565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.key.charactersIgnoringModifiers = reinterpret_cast<NPNSString*>(static_cast<NSString*>(keyboardEvent.unmodifiedText()));
66665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.key.isARepeat = keyboardEvent.isAutoRepeat();
66765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.key.keyCode = keyboardEvent.nativeVirtualKeyCode();
66865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
66965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return event;
67065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
67165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
67265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePlugin::platformHandleKeyboardEvent(const WebKeyboardEvent& keyboardEvent)
67365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
67465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool handled = false;
67565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
67665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
67765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPEventModelCocoa: {
67865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NPCocoaEvent event = initializeKeyboardEvent(keyboardEvent);
67965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        handled = NPP_HandleEvent(&event);
68065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
68165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
68265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
68365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
68465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPEventModelCarbon: {
68565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        EventKind eventKind = nullEvent;
68665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
68765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        switch (keyboardEvent.type()) {
68865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case WebEvent::KeyDown:
68965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            eventKind = keyboardEvent.isAutoRepeat() ? autoKey : keyDown;
69065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
69165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case WebEvent::KeyUp:
69265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            eventKind = keyUp;
69365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
69465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
69565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
69665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
69765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
69865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        EventRecord event = initializeEventRecord(eventKind);
69965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        event.modifiers = modifiersForEvent(keyboardEvent);
70065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        event.message = keyboardEvent.nativeVirtualKeyCode() << 8 | keyboardEvent.macCharCode();
70165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        handled = NPP_HandleEvent(&event);
70265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
70365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
70465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
70565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
70665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
70765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT_NOT_REACHED();
70865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
70965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
71065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Most plug-ins simply return true for all keyboard events, even those that aren't handled.
71165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This leads to bugs such as <rdar://problem/8740926>. We work around this by returning false
71265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // if the keyboard event has the command modifier pressed.
71365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (keyboardEvent.metaKey())
71465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
71565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
71665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return handled;
71765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
71865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
71965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::platformSetFocus(bool hasFocus)
72065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
72165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginHasFocus = hasFocus;
72265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginController->setComplexTextInputEnabled(m_pluginHasFocus && m_windowHasFocus);
72365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
72465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
72565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa: {
72665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPCocoaEvent event = initializeEvent(NPCocoaEventFocusChanged);
72765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
72865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.focus.hasFocus = hasFocus;
72965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPP_HandleEvent(&event);
73065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
73165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
73265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
73365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
73465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon: {
73565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            EventRecord event = initializeEventRecord(hasFocus ? NPEventType_GetFocusEvent : NPEventType_LoseFocusEvent);
73665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
73765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPP_HandleEvent(&event);
73865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
73965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
74065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
74165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
74265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
74365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
74465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
74565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
74665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
74765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::windowFocusChanged(bool hasFocus)
74865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
74965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_windowHasFocus = hasFocus;
75065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginController->setComplexTextInputEnabled(m_pluginHasFocus && m_windowHasFocus);
75165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
75265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
75365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa: {
75465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPCocoaEvent event = initializeEvent(NPCocoaEventWindowFocusChanged);
75565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
75665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.focus.hasFocus = hasFocus;
75765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPP_HandleEvent(&event);
75865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
75965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
76065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
76165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
76265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon: {
76365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            HiliteWindow(windowRef(), hasFocus);
76465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            if (hasFocus)
76565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                SetUserFocusWindow(windowRef());
76665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
76765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            EventRecord event = initializeEventRecord(activateEvt);
76865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.message = reinterpret_cast<unsigned long>(windowRef());
76965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            if (hasFocus)
77065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                event.modifiers |= activeFlag;
77165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
77265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPP_HandleEvent(&event);
77365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
77465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
77565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
77665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
77765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
77865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
77965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
78065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
78165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
78265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
78365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic Rect computeFakeWindowBoundsRect(const WebCore::IntRect& windowFrameInScreenCoordinates, const WebCore::IntRect& viewFrameInWindowCoordinates)
78465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
78565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Carbon global coordinates has the origin set at the top left corner of the main viewing screen, so we want to flip the y coordinate.
78665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CGFloat maxY = NSMaxY([[[NSScreen screens] objectAtIndex:0] frame]);
78765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int flippedWindowFrameYCoordinate = maxY - windowFrameInScreenCoordinates.maxY();
7892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int flippedViewFrameYCoordinate = windowFrameInScreenCoordinates.height() - viewFrameInWindowCoordinates.maxY();
79065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
79165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Rect bounds;
79265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
79365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bounds.top = flippedWindowFrameYCoordinate + flippedViewFrameYCoordinate;
79465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bounds.left = windowFrameInScreenCoordinates.x();
79565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bounds.right = bounds.left + viewFrameInWindowCoordinates.width();
79665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bounds.bottom = bounds.top + viewFrameInWindowCoordinates.height();
79765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
79865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return bounds;
79965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
80065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
80165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
80265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::windowAndViewFramesChanged(const IntRect& windowFrameInScreenCoordinates, const IntRect& viewFrameInWindowCoordinates)
80365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
80465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_windowFrameInScreenCoordinates = windowFrameInScreenCoordinates;
80565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_viewFrameInWindowCoordinates = viewFrameInWindowCoordinates;
80665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
80765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
80865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa:
80965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // Nothing to do.
81065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
81165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
81265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
81365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon: {
81465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            Rect bounds = computeFakeWindowBoundsRect(windowFrameInScreenCoordinates, viewFrameInWindowCoordinates);
81565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
81665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ::SetWindowBounds(windowRef(), kWindowStructureRgn, &bounds);
81765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
81865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
81965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
82065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
82165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
82265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
82365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
82465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
82565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
82665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::windowVisibilityChanged(bool)
82765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
82865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: Implement.
82965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
83065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
83165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochuint64_t NetscapePlugin::pluginComplexTextInputIdentifier() const
83265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
83381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Just return a dummy value; this is only called for in-process plug-ins, which we don't support on Mac.
83481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return static_cast<uint64_t>(reinterpret_cast<uintptr_t>(this));
83565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
83665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
83765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
83865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
83965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic bool convertStringToKeyCodes(const String& string, ScriptCode scriptCode, Vector<UInt8>& keyCodes)
84065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
84165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Create the mapping.
84265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    UnicodeMapping mapping;
84365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
84465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (GetTextEncodingFromScriptInfo(scriptCode, kTextLanguageDontCare, kTextRegionDontCare, &mapping.otherEncoding) != noErr)
84565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
84665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
84765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    mapping.unicodeEncoding = CreateTextEncoding(kTextEncodingUnicodeDefault, kTextEncodingDefaultVariant, kTextEncodingDefaultFormat);
84865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    mapping.mappingVersion = kUnicodeUseLatestMapping;
84965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
85065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Create the converter
85165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    UnicodeToTextInfo textInfo;
85265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
85365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (CreateUnicodeToTextInfo(&mapping, &textInfo) != noErr)
85465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
85565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
85665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ByteCount inputLength = string.length() * sizeof(UniChar);
85765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ByteCount inputRead;
85865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ByteCount outputLength;
85965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ByteCount maxOutputLength = string.length() * sizeof(UniChar);
86065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
86165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<UInt8> outputData(maxOutputLength);
86265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OSStatus status = ConvertFromUnicodeToText(textInfo, inputLength, string.characters(), kNilOptions, 0, 0, 0, 0, maxOutputLength, &inputRead, &outputLength, outputData.data());
86365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
86465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DisposeUnicodeToTextInfo(&textInfo);
86565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
86665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (status != noErr)
86765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
86865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
86965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    outputData.swap(keyCodes);
87065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
87165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
87265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
87365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
87465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::sendComplexTextInput(const String& textInput)
87565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
87665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
87765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPEventModelCocoa: {
87865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NPCocoaEvent event = initializeEvent(NPCocoaEventTextInput);
87965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        event.data.text.text = reinterpret_cast<NPNSString*>(static_cast<NSString*>(textInput));
88065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NPP_HandleEvent(&event);
88165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
88265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
88365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
88465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPEventModelCarbon: {
88565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ScriptCode scriptCode = WKGetScriptCodeFromCurrentKeyboardInputSource();
88665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        Vector<UInt8> keyCodes;
88765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
88865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!convertStringToKeyCodes(textInput, scriptCode, keyCodes))
88965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
89065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
89165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Set the script code as the keyboard script. Normally Carbon does this whenever the input source changes.
89265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // However, this is only done for the process that has the keyboard focus. We cheat and do it here instead.
89365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        SetScriptManagerVariable(smKeyScript, scriptCode);
89465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
89565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        EventRecord event = initializeEventRecord(keyDown);
89665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        event.modifiers = 0;
89765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
89865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        for (size_t i = 0; i < keyCodes.size(); i++) {
89965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.message = keyCodes[i];
90065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPP_HandleEvent(&event);
90165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
90265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
90365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
90465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
90565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
90665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT_NOT_REACHED();
90765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
90865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
90965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
91065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPlatformLayer* NetscapePlugin::pluginLayer()
91165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
91265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return static_cast<PlatformLayer*>(m_pluginLayer.get());
91365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
91465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
91565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
91665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::nullEventTimerFired()
91765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
91865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    EventRecord event = initializeEventRecord(nullEvent);
91965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
92065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.message = 0;
92165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CGPoint mousePosition;
92265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HIGetMousePosition(kHICoordSpaceScreenPixel, 0, &mousePosition);
92365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.where.h = mousePosition.x;
92465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.where.v = mousePosition.y;
92565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
92665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.modifiers = GetCurrentKeyModifiers();
92765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!Button())
92865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        event.modifiers |= btnState;
92965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
93065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPP_HandleEvent(&event);
93165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
93265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
93365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
93465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
935