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