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);
1272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        break;
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Now convert back.
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (destSpace) {
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpacePlugin:
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destX = sourceXInScreenSpace - (m_windowFrameInScreenCoordinates.x() + m_viewFrameInWindowCoordinates.x() + m_npWindow.x);
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destY = m_windowFrameInScreenCoordinates.y() + m_viewFrameInWindowCoordinates.y() + m_viewFrameInWindowCoordinates.height() - (sourceYInScreenSpace + m_npWindow.y);
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpaceWindow:
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destX = sourceXInScreenSpace - m_windowFrameInScreenCoordinates.x();
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destY = sourceYInScreenSpace - m_windowFrameInScreenCoordinates.y();
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpaceFlippedWindow:
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destX = sourceXInScreenSpace - m_windowFrameInScreenCoordinates.x();
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destY = sourceYInScreenSpace - m_windowFrameInScreenCoordinates.y();
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destY = m_windowFrameInScreenCoordinates.height() - destY;
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpaceScreen:
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destX = sourceXInScreenSpace;
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destY = sourceYInScreenSpace;
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPCoordinateSpaceFlippedScreen:
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destX = sourceXInScreenSpace;
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        destY = flipScreenYCoordinate(sourceYInScreenSpace);
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
162ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
163ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochNPError NetscapePlugin::popUpContextMenu(NPMenu* npMenu)
164ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
165ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!m_currentMouseEvent)
166ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return NPERR_GENERIC_ERROR;
167ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
168ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    double screenX, screenY;
169ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!convertPoint(m_currentMouseEvent->data.mouse.pluginX, m_currentMouseEvent->data.mouse.pluginY, NPCoordinateSpacePlugin, screenX, screenY, NPCoordinateSpaceScreen))
170ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        ASSERT_NOT_REACHED();
171ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
172ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WKPopupContextMenu(reinterpret_cast<NSMenu *>(npMenu), NSMakePoint(screenX, screenY));
173ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return NPERR_NO_ERROR;
174ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
175ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1762fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockmach_port_t NetscapePlugin::compositingRenderServerPort()
1772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return m_pluginController->compositingRenderServerPort();
1792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtypedef HashMap<WindowRef, NetscapePlugin*> WindowMap;
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic WindowMap& windowMap()
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DEFINE_STATIC_LOCAL(WindowMap, windowMap, ());
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return windowMap;
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePlugin::platformPostInitialize()
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_drawingModel == static_cast<NPDrawingModel>(-1)) {
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_QUICKDRAW
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Default to QuickDraw if the plugin did not specify a drawing model.
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_drawingModel = NPDrawingModelQuickDraw;
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#else
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // QuickDraw is not available, so we can't default to it. Instead, default to CoreGraphics.
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_drawingModel = NPDrawingModelCoreGraphics;
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_eventModel == static_cast<NPEventModel>(-1)) {
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // If the plug-in did not specify a drawing model we default to Carbon when it is available.
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_eventModel = NPEventModelCarbon;
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#else
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_eventModel = NPEventModelCocoa;
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // NP_NO_CARBON
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !defined(NP_NO_CARBON) && !defined(NP_NO_QUICKDRAW)
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // The CA drawing model does not work with the Carbon event model.
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_drawingModel == NPDrawingModelCoreAnimation && m_eventModel == NPEventModelCarbon)
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // The Cocoa event model does not work with the QuickDraw drawing model.
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_eventModel == NPEventModelCocoa && m_drawingModel == NPDrawingModelQuickDraw)
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_QUICKDRAW
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Right now we don't support the QuickDraw drawing model at all
2252bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_drawingModel == NPDrawingModelQuickDraw &&
2262bde8e466a4451c7319e3a072d118917957d6554Steve Block        !m_pluginModule->pluginQuirks().contains(PluginQuirks::AllowHalfBakedQuickDrawSupport))
22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_drawingModel == NPDrawingModelCoreAnimation) {
23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        void* value = 0;
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Get the Core Animation layer.
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (NPP_GetValue(NPPVpluginCoreAnimationLayer, &value) == NPERR_NO_ERROR && value) {
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT(!m_pluginLayer);
2352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_pluginLayer = reinterpret_cast<CALayer *>(value);
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_eventModel == NPEventModelCarbon) {
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Initialize the fake Carbon window.
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ::Rect bounds = { 0, 0, 0, 0 };
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CreateNewWindow(kDocumentWindowClass, kWindowNoTitleBarAttribute, &bounds, reinterpret_cast<WindowRef*>(&m_npCGContext.window));
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(m_npCGContext.window);
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // FIXME: Disable the backing store.
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_npWindow.window = &m_npCGContext;
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(!windowMap().contains(windowRef()));
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        windowMap().set(windowRef(), this);
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Start the null event timer.
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // FIXME: Throttle null events when the plug-in isn't visible on screen.
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_nullEventTimer.startRepeating(nullEventIntervalActive);
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::platformDestroy()
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_eventModel == NPEventModelCarbon) {
26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (WindowRef window = windowRef()) {
26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // Destroy the fake Carbon window.
26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            DisposeWindow(window);
26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT(windowMap().contains(window));
27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            windowMap().remove(window);
27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Stop the null event timer.
27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_nullEventTimer.stop();
27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePlugin::platformInvalidate(const IntRect&)
28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
2822bde8e466a4451c7319e3a072d118917957d6554Steve Block    // NPN_InvalidateRect is just a no-op in the Core Animation drawing model.
2832bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_drawingModel == NPDrawingModelCoreAnimation)
2842bde8e466a4451c7319e3a072d118917957d6554Steve Block        return true;
2852bde8e466a4451c7319e3a072d118917957d6554Steve Block
28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::platformGeometryDidChange()
29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic inline NPCocoaEvent initializeEvent(NPCocoaEventType type)
29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPCocoaEvent event;
29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.type = type;
29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.version = 0;
29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return event;
30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNetscapePlugin* NetscapePlugin::netscapePluginFromWindow(WindowRef windowRef)
30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return windowMap().get(windowRef);
30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWindowRef NetscapePlugin::windowRef() const
31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_eventModel == NPEventModelCarbon);
31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return reinterpret_cast<WindowRef>(m_npCGContext.window);
31465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
31565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochunsigned NetscapePlugin::buttonState()
31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
31865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return buttonStateFromLastMouseEvent;
31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic inline EventRecord initializeEventRecord(EventKind eventKind)
32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    EventRecord eventRecord;
32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    eventRecord.what = eventKind;
32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    eventRecord.message = 0;
32765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    eventRecord.when = TickCount();
32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    eventRecord.where = Point();
32965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    eventRecord.modifiers = 0;
33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return eventRecord;
33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic bool anyMouseButtonIsDown(const WebEvent& event)
33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.type() == WebEvent::MouseDown)
33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.type() == WebEvent::MouseMove && static_cast<const WebMouseEvent&>(event).button() != WebMouseEvent::NoButton)
34065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
34365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic bool rightMouseButtonIsDown(const WebEvent& event)
34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.type() == WebEvent::MouseDown && static_cast<const WebMouseEvent&>(event).button() == WebMouseEvent::RightButton)
34865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
34965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.type() == WebEvent::MouseMove && static_cast<const WebMouseEvent&>(event).button() == WebMouseEvent::RightButton)
35165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
35265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
35465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
35565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic EventModifiers modifiersForEvent(const WebEvent& event)
35765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
35865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    EventModifiers modifiers = 0;
35965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
36065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We only want to set the btnState if a mouse button is _not_ down.
36165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!anyMouseButtonIsDown(event))
36265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= btnState;
36365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
36465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.metaKey())
36565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= cmdKey;
36665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
36765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.shiftKey())
36865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= shiftKey;
36965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.altKey())
37165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= optionKey;
37265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Set controlKey if the control key is down or the right mouse button is down.
37465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.controlKey() || rightMouseButtonIsDown(event))
37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= controlKey;
37665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return modifiers;
37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid NetscapePlugin::platformPaint(GraphicsContext* context, const IntRect& dirtyRect, bool isSnapshot)
38365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CGContextRef platformContext = context->platformContext();
38565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Translate the context so that the origin is at the top left corner of the plug-in view.
38765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    context->translate(m_frameRect.x(), m_frameRect.y());
38865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
39065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa: {
39165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // Don't send draw events when we're using the Core Animation drawing model.
39281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!isSnapshot && m_drawingModel == NPDrawingModelCoreAnimation)
39365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                return;
39465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
39565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPCocoaEvent event = initializeEvent(NPCocoaEventDrawRect);
39665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
39765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.draw.context = platformContext;
39865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.draw.x = dirtyRect.x() - m_frameRect.x();
39965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.draw.y = dirtyRect.y() - m_frameRect.y();
40065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.draw.width = dirtyRect.width();
40165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.draw.height = dirtyRect.height();
40265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
40365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPP_HandleEvent(&event);
40465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
40565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
40665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
40765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
40865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon: {
40965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            if (platformContext != m_npCGContext.context) {
41065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                m_npCGContext.context = platformContext;
41165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                callSetWindow();
41265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            }
41365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
41465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            EventRecord event = initializeEventRecord(updateEvt);
41565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.message = reinterpret_cast<unsigned long>(windowRef());
41665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
41765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPP_HandleEvent(&event);
41865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
41965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
42065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
42165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
42265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
42365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
42465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
42565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
42665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
42765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic uint32_t modifierFlags(const WebEvent& event)
42865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
42965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint32_t modifiers = 0;
43065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
43165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.shiftKey())
43265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= NSShiftKeyMask;
43365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.controlKey())
43465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= NSControlKeyMask;
43565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.altKey())
43665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= NSAlternateKeyMask;
43765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (event.metaKey())
43865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifiers |= NSCommandKeyMask;
43965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
44065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return modifiers;
44165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
44265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
44365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic int32_t buttonNumber(WebMouseEvent::Button button)
44465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
44565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (button) {
44665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebMouseEvent::NoButton:
44765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebMouseEvent::LeftButton:
44865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
44965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebMouseEvent::RightButton:
45065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 1;
45165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebMouseEvent::MiddleButton:
45265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 2;
45365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
45465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
45565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_NOT_REACHED();
45665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return -1;
45765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
45865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
45965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void fillInCocoaEventFromMouseEvent(NPCocoaEvent& event, const WebMouseEvent& mouseEvent, const WebCore::IntPoint& pluginLocation)
46065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
46165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.modifierFlags = modifierFlags(mouseEvent);
46265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.pluginX = mouseEvent.position().x() - pluginLocation.x();
46365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.pluginY = mouseEvent.position().y() - pluginLocation.y();
46465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.buttonNumber = buttonNumber(mouseEvent.button());
46565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.clickCount = mouseEvent.clickCount();
46665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.deltaX = mouseEvent.deltaX();
46765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.deltaY = mouseEvent.deltaY();
46865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.mouse.deltaZ = mouseEvent.deltaZ();
46965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
47065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
47165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic NPCocoaEvent initializeMouseEvent(const WebMouseEvent& mouseEvent, const WebCore::IntPoint& pluginLocation)
47265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
47365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPCocoaEventType eventType;
47465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
47565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (mouseEvent.type()) {
47665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebEvent::MouseDown:
47765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        eventType = NPCocoaEventMouseDown;
47865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
47965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebEvent::MouseUp:
48065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        eventType = NPCocoaEventMouseUp;
48165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
48265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WebEvent::MouseMove:
48365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (mouseEvent.button() == WebMouseEvent::NoButton)
48465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            eventType = NPCocoaEventMouseMoved;
48565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        else
48665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            eventType = NPCocoaEventMouseDragged;
48765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
48865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
48965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT_NOT_REACHED();
49065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NPCocoaEvent();
49165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
49265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
49365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPCocoaEvent event = initializeEvent(eventType);
49465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    fillInCocoaEventFromMouseEvent(event, mouseEvent, pluginLocation);
49565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return event;
49665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
49765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
49865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePlugin::platformHandleMouseEvent(const WebMouseEvent& mouseEvent)
49965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
50065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
50165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa: {
50265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPCocoaEvent event = initializeMouseEvent(mouseEvent, m_frameRect.location());
503ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
504ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            NPCocoaEvent* previousMouseEvent = m_currentMouseEvent;
505ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            m_currentMouseEvent = &event;
506ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
507ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            // Protect against NPP_HandleEvent causing the plug-in to be destroyed, since we
508ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            // access m_currentMouseEvent afterwards.
509ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            RefPtr<NetscapePlugin> protect(this);
510ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
5112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            NPP_HandleEvent(&event);
512ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
513ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            m_currentMouseEvent = previousMouseEvent;
514ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
5152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            // Some plug-ins return false even if the mouse event has been handled.
5162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            // This leads to bugs such as <rdar://problem/9167611>. Work around this
5172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            // by always returning true.
5182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return true;
51965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
52065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
52165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
52265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon: {
52365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            EventKind eventKind = nullEvent;
52465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
52565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            switch (mouseEvent.type()) {
52665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            case WebEvent::MouseDown:
52765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                eventKind = mouseDown;
52865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                buttonStateFromLastMouseEvent |= (1 << buttonNumber(mouseEvent.button()));
52965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                break;
53065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            case WebEvent::MouseUp:
53165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                eventKind = mouseUp;
53265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                buttonStateFromLastMouseEvent &= ~(1 << buttonNumber(mouseEvent.button()));
53365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                break;
53465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            case WebEvent::MouseMove:
53565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                eventKind = nullEvent;
53665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                break;
53765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            default:
53865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                ASSERT_NOT_REACHED();
53965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            }
54065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
54165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            EventRecord event = initializeEventRecord(eventKind);
54265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.modifiers = modifiersForEvent(mouseEvent);
54365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.where.h = mouseEvent.globalPosition().x();
54465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.where.v = mouseEvent.globalPosition().y();
54565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            NPP_HandleEvent(&event);
5472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            // Some plug-ins return false even if the mouse event has been handled.
5492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            // This leads to bugs such as <rdar://problem/9167611>. Work around this
5502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            // by always returning true.
5512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return true;
55265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
55365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
55465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
55565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
55665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
55765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
55865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
55965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
56065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
56165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
56265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePlugin::platformHandleWheelEvent(const WebWheelEvent& wheelEvent)
56365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
56465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
56565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa: {
56665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPCocoaEvent event = initializeEvent(NPCocoaEventScrollWheel);
56765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
56865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.modifierFlags = modifierFlags(wheelEvent);
56965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.pluginX = wheelEvent.position().x() - m_frameRect.x();
57065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.pluginY = wheelEvent.position().y() - m_frameRect.y();
57165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.buttonNumber = 0;
57265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.clickCount = 0;
57365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.deltaX = wheelEvent.delta().width();
57465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.deltaY = wheelEvent.delta().height();
57565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.mouse.deltaZ = 0;
57665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return NPP_HandleEvent(&event);
57765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
57865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
57965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
58065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon:
58165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // Carbon doesn't have wheel events.
58265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
58365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
58465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
58565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
58665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
58765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
58865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
58965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
59065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
59165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
59265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePlugin::platformHandleMouseEnterEvent(const WebMouseEvent& mouseEvent)
59365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
59465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
59565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa: {
59665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPCocoaEvent event = initializeEvent(NPCocoaEventMouseEntered);
59765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
59865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            fillInCocoaEventFromMouseEvent(event, mouseEvent, m_frameRect.location());
59965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return NPP_HandleEvent(&event);
60065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
60165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
60265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
60365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon: {
60465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            EventRecord eventRecord = initializeEventRecord(NPEventType_AdjustCursorEvent);
60565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            eventRecord.modifiers = modifiersForEvent(mouseEvent);
60665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
60765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return NPP_HandleEvent(&eventRecord);
60865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
60965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
61065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
61165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
61265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
61365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
61465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
61565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
61665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
61765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
61865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePlugin::platformHandleMouseLeaveEvent(const WebMouseEvent& mouseEvent)
61965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
62065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
62165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa: {
62265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPCocoaEvent event = initializeEvent(NPCocoaEventMouseExited);
62365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
62465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            fillInCocoaEventFromMouseEvent(event, mouseEvent, m_frameRect.location());
62565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return NPP_HandleEvent(&event);
62665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
62765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
62865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
62965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon: {
63065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            EventRecord eventRecord = initializeEventRecord(NPEventType_AdjustCursorEvent);
63165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            eventRecord.modifiers = modifiersForEvent(mouseEvent);
63265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
63365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return NPP_HandleEvent(&eventRecord);
63465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
63565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
63665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
63765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
63865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
63965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
64065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
64265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
64365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
64465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic unsigned modifierFlags(const WebKeyboardEvent& keyboardEvent)
64565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
64665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned modifierFlags = 0;
64765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (keyboardEvent.capsLockKey())
6492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        modifierFlags |= NSAlphaShiftKeyMask;
65065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (keyboardEvent.shiftKey())
65165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifierFlags |= NSShiftKeyMask;
65265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (keyboardEvent.controlKey())
65365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifierFlags |= NSControlKeyMask;
65465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (keyboardEvent.altKey())
65565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifierFlags |= NSAlternateKeyMask;
65665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (keyboardEvent.metaKey())
65765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifierFlags |= NSCommandKeyMask;
65865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
65965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return modifierFlags;
66065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
66165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic bool isFlagsChangedEvent(const WebKeyboardEvent& keyboardEvent)
6632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
6642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    switch (keyboardEvent.nativeVirtualKeyCode()) {
6652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case 54: // Right Command
6662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case 55: // Left Command
6672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case 57: // Capslock
6692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case 56: // Left Shift
6712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case 60: // Right Shift
6722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case 58: // Left Alt
6742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case 61: // Right Alt
6752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case 59: // Left Ctrl
6772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case 62: // Right Ctrl
6782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return true;
6792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
6802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return false;
6822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
6832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
68465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic NPCocoaEvent initializeKeyboardEvent(const WebKeyboardEvent& keyboardEvent)
68565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
68665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPCocoaEventType eventType;
6872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (isFlagsChangedEvent(keyboardEvent))
6892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        eventType = NPCocoaEventFlagsChanged;
6902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    else {
6912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        switch (keyboardEvent.type()) {
6922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            case WebEvent::KeyDown:
6932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                eventType = NPCocoaEventKeyDown;
6942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                break;
6952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            case WebEvent::KeyUp:
6962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                eventType = NPCocoaEventKeyUp;
6972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                break;
6982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            default:
6992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                ASSERT_NOT_REACHED();
7002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                return NPCocoaEvent();
7012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
70265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
70365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
70465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPCocoaEvent event = initializeEvent(eventType);
70565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.key.modifierFlags = modifierFlags(keyboardEvent);
70665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.key.characters = reinterpret_cast<NPNSString*>(static_cast<NSString*>(keyboardEvent.text()));
70765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.key.charactersIgnoringModifiers = reinterpret_cast<NPNSString*>(static_cast<NSString*>(keyboardEvent.unmodifiedText()));
70865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.key.isARepeat = keyboardEvent.isAutoRepeat();
70965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.data.key.keyCode = keyboardEvent.nativeVirtualKeyCode();
71065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
71165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return event;
71265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
71365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
71465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NetscapePlugin::platformHandleKeyboardEvent(const WebKeyboardEvent& keyboardEvent)
71565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
71665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool handled = false;
71765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
71865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
71965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPEventModelCocoa: {
72065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NPCocoaEvent event = initializeKeyboardEvent(keyboardEvent);
72165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        handled = NPP_HandleEvent(&event);
72265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
72365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
72465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
72565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
72665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPEventModelCarbon: {
72765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        EventKind eventKind = nullEvent;
72865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
72965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        switch (keyboardEvent.type()) {
73065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case WebEvent::KeyDown:
73165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            eventKind = keyboardEvent.isAutoRepeat() ? autoKey : keyDown;
73265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
73365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case WebEvent::KeyUp:
73465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            eventKind = keyUp;
73565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
73665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
73765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
73865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
73965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
74065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        EventRecord event = initializeEventRecord(eventKind);
74165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        event.modifiers = modifiersForEvent(keyboardEvent);
74265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        event.message = keyboardEvent.nativeVirtualKeyCode() << 8 | keyboardEvent.macCharCode();
74365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        handled = NPP_HandleEvent(&event);
74465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
74565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
74665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
74765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
74865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
74965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT_NOT_REACHED();
75065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
75165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
75265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Most plug-ins simply return true for all keyboard events, even those that aren't handled.
75365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This leads to bugs such as <rdar://problem/8740926>. We work around this by returning false
75465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // if the keyboard event has the command modifier pressed.
75565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (keyboardEvent.metaKey())
75665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
75765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
75865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return handled;
75965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
76065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
76165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::platformSetFocus(bool hasFocus)
76265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
76365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginHasFocus = hasFocus;
76465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginController->setComplexTextInputEnabled(m_pluginHasFocus && m_windowHasFocus);
76565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
76665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
76765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa: {
76865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPCocoaEvent event = initializeEvent(NPCocoaEventFocusChanged);
76965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
77065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.focus.hasFocus = hasFocus;
77165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPP_HandleEvent(&event);
77265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
77365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
77465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
77565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
77665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon: {
77765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            EventRecord event = initializeEventRecord(hasFocus ? NPEventType_GetFocusEvent : NPEventType_LoseFocusEvent);
77865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
77965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPP_HandleEvent(&event);
78065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
78165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
78265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
78365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
78465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
78565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
78665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
78765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
78865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
78965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::windowFocusChanged(bool hasFocus)
79065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
79165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_windowHasFocus = hasFocus;
79265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_pluginController->setComplexTextInputEnabled(m_pluginHasFocus && m_windowHasFocus);
79365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
79465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
79565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa: {
79665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPCocoaEvent event = initializeEvent(NPCocoaEventWindowFocusChanged);
79765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
79865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.data.focus.hasFocus = hasFocus;
79965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPP_HandleEvent(&event);
80065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
80165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
80265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
80365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
80465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon: {
80565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            HiliteWindow(windowRef(), hasFocus);
80665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            if (hasFocus)
80765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                SetUserFocusWindow(windowRef());
80865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
80965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            EventRecord event = initializeEventRecord(activateEvt);
81065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.message = reinterpret_cast<unsigned long>(windowRef());
81165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            if (hasFocus)
81265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                event.modifiers |= activeFlag;
81365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
81465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPP_HandleEvent(&event);
81565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
81665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
81765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
81865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
81965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
82065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
82165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
82265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
82365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
82465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
82565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic Rect computeFakeWindowBoundsRect(const WebCore::IntRect& windowFrameInScreenCoordinates, const WebCore::IntRect& viewFrameInWindowCoordinates)
82665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
82765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben 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.
82865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CGFloat maxY = NSMaxY([[[NSScreen screens] objectAtIndex:0] frame]);
82965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int flippedWindowFrameYCoordinate = maxY - windowFrameInScreenCoordinates.maxY();
8312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int flippedViewFrameYCoordinate = windowFrameInScreenCoordinates.height() - viewFrameInWindowCoordinates.maxY();
83265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
83365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Rect bounds;
83465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
83565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bounds.top = flippedWindowFrameYCoordinate + flippedViewFrameYCoordinate;
83665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bounds.left = windowFrameInScreenCoordinates.x();
83765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bounds.right = bounds.left + viewFrameInWindowCoordinates.width();
83865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bounds.bottom = bounds.top + viewFrameInWindowCoordinates.height();
83965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
84065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return bounds;
84165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
84265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
84365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
84465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::windowAndViewFramesChanged(const IntRect& windowFrameInScreenCoordinates, const IntRect& viewFrameInWindowCoordinates)
84565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
84665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_windowFrameInScreenCoordinates = windowFrameInScreenCoordinates;
84765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_viewFrameInWindowCoordinates = viewFrameInWindowCoordinates;
84865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
84965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
85065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCocoa:
85165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            // Nothing to do.
85265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
85365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
85465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
85565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case NPEventModelCarbon: {
85665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            Rect bounds = computeFakeWindowBoundsRect(windowFrameInScreenCoordinates, viewFrameInWindowCoordinates);
85765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
85865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ::SetWindowBounds(windowRef(), kWindowStructureRgn, &bounds);
85965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
86065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
86165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
86265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
86365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        default:
86465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            ASSERT_NOT_REACHED();
86565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
86665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
86765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
86865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::windowVisibilityChanged(bool)
86965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
87065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: Implement.
87165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
87265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
87365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochuint64_t NetscapePlugin::pluginComplexTextInputIdentifier() const
87465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
87581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Just return a dummy value; this is only called for in-process plug-ins, which we don't support on Mac.
87681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return static_cast<uint64_t>(reinterpret_cast<uintptr_t>(this));
87765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
87865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
87965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
88065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
88165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic bool convertStringToKeyCodes(const String& string, ScriptCode scriptCode, Vector<UInt8>& keyCodes)
88265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
88365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Create the mapping.
88465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    UnicodeMapping mapping;
88565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
88665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (GetTextEncodingFromScriptInfo(scriptCode, kTextLanguageDontCare, kTextRegionDontCare, &mapping.otherEncoding) != noErr)
88765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
88865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
88965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    mapping.unicodeEncoding = CreateTextEncoding(kTextEncodingUnicodeDefault, kTextEncodingDefaultVariant, kTextEncodingDefaultFormat);
89065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    mapping.mappingVersion = kUnicodeUseLatestMapping;
89165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
89265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Create the converter
89365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    UnicodeToTextInfo textInfo;
89465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
89565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (CreateUnicodeToTextInfo(&mapping, &textInfo) != noErr)
89665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
89765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
89865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ByteCount inputLength = string.length() * sizeof(UniChar);
89965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ByteCount inputRead;
90065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ByteCount outputLength;
90165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ByteCount maxOutputLength = string.length() * sizeof(UniChar);
90265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
90365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<UInt8> outputData(maxOutputLength);
90465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OSStatus status = ConvertFromUnicodeToText(textInfo, inputLength, string.characters(), kNilOptions, 0, 0, 0, 0, maxOutputLength, &inputRead, &outputLength, outputData.data());
90565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
90665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DisposeUnicodeToTextInfo(&textInfo);
90765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
90865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (status != noErr)
90965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
91065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
91165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    outputData.swap(keyCodes);
91265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
91365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
91465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
91565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
91665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::sendComplexTextInput(const String& textInput)
91765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
91865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (m_eventModel) {
91965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPEventModelCocoa: {
92065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NPCocoaEvent event = initializeEvent(NPCocoaEventTextInput);
92165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        event.data.text.text = reinterpret_cast<NPNSString*>(static_cast<NSString*>(textInput));
92265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NPP_HandleEvent(&event);
92365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
92465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
92565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
92665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case NPEventModelCarbon: {
92765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ScriptCode scriptCode = WKGetScriptCodeFromCurrentKeyboardInputSource();
92865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        Vector<UInt8> keyCodes;
92965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
93065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!convertStringToKeyCodes(textInput, scriptCode, keyCodes))
93165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
93265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
93365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Set the script code as the keyboard script. Normally Carbon does this whenever the input source changes.
93465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // However, this is only done for the process that has the keyboard focus. We cheat and do it here instead.
93565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        SetScriptManagerVariable(smKeyScript, scriptCode);
93665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
93765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        EventRecord event = initializeEventRecord(keyDown);
93865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        event.modifiers = 0;
93965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
94065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        for (size_t i = 0; i < keyCodes.size(); i++) {
94165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            event.message = keyCodes[i];
94265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            NPP_HandleEvent(&event);
94365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
94465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
94565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
94665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
94765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
94865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT_NOT_REACHED();
94965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
95065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
95165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
95265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPlatformLayer* NetscapePlugin::pluginLayer()
95365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
95465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return static_cast<PlatformLayer*>(m_pluginLayer.get());
95565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
95665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
95765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NP_NO_CARBON
95865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NetscapePlugin::nullEventTimerFired()
95965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
96065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    EventRecord event = initializeEventRecord(nullEvent);
96165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
96265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.message = 0;
96365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CGPoint mousePosition;
96465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HIGetMousePosition(kHICoordSpaceScreenPixel, 0, &mousePosition);
96565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.where.h = mousePosition.x;
96665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.where.v = mousePosition.y;
96765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
96865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    event.modifiers = GetCurrentKeyModifiers();
96965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!Button())
97065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        event.modifiers |= btnState;
97165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
97265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPP_HandleEvent(&event);
97365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
97465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
97565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
97665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
977