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