1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/* 2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. 3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Collabora Ltd. All rights reserved. 4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in> 6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without 8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions 9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * are met: 10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer. 12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * documentation and/or other materials provided with the distribution. 15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */ 28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef __LP64__ 30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "config.h" 32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "PluginView.h" 33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 341325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include "Bridge.h" 35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Document.h" 36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "DocumentLoader.h" 37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Element.h" 38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "EventNames.h" 39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FocusController.h" 40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FrameLoader.h" 41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FrameLoadRequest.h" 42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FrameTree.h" 43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Frame.h" 44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FrameView.h" 45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "GraphicsContext.h" 46d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "HostWindow.h" 47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "HTMLNames.h" 48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "HTMLPlugInElement.h" 49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Image.h" 50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "JSDOMBinding.h" 51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "KeyboardEvent.h" 52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "MouseEvent.h" 53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "NotImplemented.h" 54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Page.h" 55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "PlatformMouseEvent.h" 56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "PlatformKeyboardEvent.h" 57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "PluginDebug.h" 58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "PluginPackage.h" 59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "PluginMainThreadScheduler.h" 60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "RenderLayer.h" 61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "ScriptController.h" 62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Settings.h" 631325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include "npruntime_impl.h" 641325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include "runtime_root.h" 651325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include <runtime/JSLock.h> 661325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include <runtime/JSValue.h> 671325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include <wtf/RetainPtr.h> 681325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block 69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing JSC::ExecState; 71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing JSC::Interpreter; 72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing JSC::JSLock; 73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing JSC::JSObject; 74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing JSC::JSValue; 75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing JSC::UString; 76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if PLATFORM(QT) 78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <QWidget> 79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <QKeyEvent> 80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <QPainter> 81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "QWebPageClient.h" 82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectQT_BEGIN_NAMESPACE 835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if QT_VERSION < 0x040500 845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianextern Q_GUI_EXPORT WindowPtr qt_mac_window_for(const QWidget* w); 855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else 865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianextern Q_GUI_EXPORT OSWindowRef qt_mac_window_for(const QWidget* w); 875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectQT_END_NAMESPACE 89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 91643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if PLATFORM(WX) 92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <wx/defs.h> 93643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <wx/wx.h> 94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 95643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 96635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing std::min; 97635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing namespace WTF; 99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore { 101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing namespace HTMLNames; 103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic int modifiersForEvent(UIEventWithKeyState *event); 105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic inline WindowRef nativeWindowFor(PlatformWidget widget) 107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if PLATFORM(QT) 109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (widget) 110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return static_cast<WindowRef>(qt_mac_window_for(widget)); 111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if PLATFORM(WX) 113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (widget) 114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return (WindowRef)widget->MacGetTopLevelWindowRef(); 115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic inline CGContextRef cgHandleFor(PlatformWidget widget) 120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if PLATFORM(QT) 122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (widget) 123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return (CGContextRef)widget->macCGHandle(); 124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if PLATFORM(WX) 126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (widget) 127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return (CGContextRef)widget->MacGetCGContextRef(); 128643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic inline IntPoint topLevelOffsetFor(PlatformWidget widget) 133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if PLATFORM(QT) 135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (widget) { 136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project PlatformWidget topLevel = widget->window(); 137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return widget->mapTo(topLevel, QPoint(0, 0)) + topLevel->geometry().topLeft() - topLevel->pos(); 138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if PLATFORM(WX) 141643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (widget) { 142643ca7872b450ea4efacab6188849e5aac2ba161Steve Block PlatformWidget toplevel = wxGetTopLevelParent(widget); 143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return toplevel->ScreenToClient(widget->GetScreenPosition()); 144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return IntPoint(); 147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// --------------- Lifetime management ----------------- 150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 151231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool PluginView::platformStart() 152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 153231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(m_isStarted); 154231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(m_status == PluginStatusLoadedSuccessfully); 155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (m_drawingModel == NPDrawingModel(-1)) { 1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // We default to QuickDraw, even though we don't support it, 1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // since that's what Safari does, and some plugins expect this 1590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // behavior and never set the drawing model explicitly. 1600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef NP_NO_QUICKDRAW 1610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_drawingModel = NPDrawingModelQuickDraw; 1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // QuickDraw not available, so we have to default to CoreGraphics 1640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_drawingModel = NPDrawingModelCoreGraphics; 1650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (m_eventModel == NPEventModel(-1)) { 1690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // If the plug-in did not specify an event model 1700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // we default to Carbon, when it is available. 1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef NP_NO_CARBON 1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_eventModel = NPEventModelCarbon; 1730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 1740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_eventModel = NPEventModelCocoa; 1750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 1760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 1770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Gracefully handle unsupported drawing or event models. We can do this 1790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // now since the drawing and event model can only be set during NPP_New. 1800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch NPBool eventModelSupported, drawingModelSupported; 1810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (getValueStatic(NPNVariable(NPNVsupportsCarbonBool + m_eventModel), &eventModelSupported) != NPERR_NO_ERROR 1820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch || !eventModelSupported) { 1830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_status = PluginStatusCanNotLoadPlugin; 1840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LOG(Plugins, "Plug-in '%s' uses unsupported event model %s", 1850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_plugin->name().utf8().data(), prettyNameForEventModel(m_eventModel)); 186231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 1870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 1880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (getValueStatic(NPNVariable(NPNVsupportsQuickDrawBool + m_drawingModel), &drawingModelSupported) != NPERR_NO_ERROR 1900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch || !drawingModelSupported) { 1910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_status = PluginStatusCanNotLoadPlugin; 1920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LOG(Plugins, "Plug-in '%s' uses unsupported drawing model %s", 1930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_plugin->name().utf8().data(), prettyNameForDrawingModel(m_drawingModel)); 194231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 1950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 1960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 197231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if PLATFORM(QT) 198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Set the platformPluginWidget only in the case of QWebView so that the context menu appears in the right place. 199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // In all other cases, we use off-screen rendering 200231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient()) { 201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (QWidget* widget = qobject_cast<QWidget*>(client->pluginParent())) 202cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block setPlatformPluginWidget(widget); 203231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if PLATFORM(WX) 206643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (wxWindow* widget = m_parentFrame->view()->hostWindow()->platformPageClient()) 207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block setPlatformPluginWidget(widget); 208643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 209635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 210643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Create a fake window relative to which all events will be sent when using offscreen rendering 211643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!platformPluginWidget()) { 212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Make the default size really big. It is unclear why this is required but with a smaller size, mouse move 213643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // events don't get processed. Resizing the fake window to flash's size doesn't help. 214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ::Rect windowBounds = { 0, 0, 1000, 1000 }; 215643ca7872b450ea4efacab6188849e5aac2ba161Steve Block CreateNewWindow(kDocumentWindowClass, kWindowStandardDocumentAttributes, &windowBounds, &m_fakeWindow); 216643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Flash requires the window to be hilited to process mouse move events. 217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block HiliteWindow(m_fakeWindow, true); 218643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 220643ca7872b450ea4efacab6188849e5aac2ba161Steve Block show(); 221231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 222231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 223635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 224635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 225231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::platformDestroy() 226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 227231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (platformPluginWidget()) 228231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block setPlatformPluginWidget(0); 229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else { 230643ca7872b450ea4efacab6188849e5aac2ba161Steve Block CGContextRelease(m_contextRef); 231643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_fakeWindow) 232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block DisposeWindow(m_fakeWindow); 233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 234635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 235635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// Used before the plugin view has been initialized properly, and as a 2370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// fallback for variables that do not require a view to resolve. 238635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNPError PluginView::getValueStatic(NPNVariable variable, void* value) 239635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LOG(Plugins, "PluginView::getValueStatic(%s)", prettyNameForNPNVariable(variable).data()); 241635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project switch (variable) { 243635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case NPNVToolkit: 2448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *static_cast<uint32*>(value) = 0; 245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return NPERR_NO_ERROR; 246635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 247635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case NPNVjavascriptEnabledBool: 2488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *static_cast<NPBool*>(value) = true; 249635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return NPERR_NO_ERROR; 250635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef NP_NO_CARBON 2520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPNVsupportsCarbonBool: 2530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *static_cast<NPBool*>(value) = true; 2540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return NPERR_NO_ERROR; 2550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 2570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPNVsupportsCocoaBool: 2580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *static_cast<NPBool*>(value) = false; 2590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return NPERR_NO_ERROR; 2600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // CoreGraphics is the only drawing model we support 2620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPNVsupportsCoreGraphicsBool: 2630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *static_cast<NPBool*>(value) = true; 2640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return NPERR_NO_ERROR; 2650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef NP_NO_QUICKDRAW 2670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // QuickDraw is deprecated in 10.5 and not supported on 64-bit 2680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPNVsupportsQuickDrawBool: 2690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 2700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPNVsupportsOpenGLBool: 2710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPNVsupportsCoreAnimationBool: 2720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *static_cast<NPBool*>(value) = false; 2730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return NPERR_NO_ERROR; 2740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project default: 276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return NPERR_GENERIC_ERROR; 277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 278635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// Used only for variables that need a view to resolve 281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNPError PluginView::getValue(NPNVariable variable, void* value) 282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LOG(Plugins, "PluginView::getValue(%s)", prettyNameForNPNVariable(variable).data()); 284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 285635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project switch (variable) { 286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case NPNVWindowNPObject: { 287635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_isJavaScriptPaused) 288635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return NPERR_GENERIC_ERROR; 289635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 290635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project NPObject* windowScriptObject = m_parentFrame->script()->windowScriptNPObject(); 291635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 292635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Return value is expected to be retained, as described in 293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // <http://www.mozilla.org/projects/plugin/npruntime.html> 294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (windowScriptObject) 295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _NPN_RetainObject(windowScriptObject); 296635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 297635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void** v = (void**)value; 298635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *v = windowScriptObject; 299635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 300635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return NPERR_NO_ERROR; 301635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 302635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case NPNVPluginElementNPObject: { 304635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_isJavaScriptPaused) 305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return NPERR_GENERIC_ERROR; 306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 307635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project NPObject* pluginScriptObject = 0; 308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_element->hasTagName(appletTag) || m_element->hasTagName(embedTag) || m_element->hasTagName(objectTag)) 310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project pluginScriptObject = static_cast<HTMLPlugInElement*>(m_element)->getNPObject(); 311635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Return value is expected to be retained, as described in 313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // <http://www.mozilla.org/projects/plugin/npruntime.html> 314635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (pluginScriptObject) 315635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _NPN_RetainObject(pluginScriptObject); 316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void** v = (void**)value; 318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *v = pluginScriptObject; 319635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 320635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return NPERR_NO_ERROR; 321635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 322635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 323635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project default: 324635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return getValueStatic(variable, value); 325635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 326635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 327635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 328635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::setParent(ScrollView* parent) 329635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 3300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LOG(Plugins, "PluginView::setParent(%p)", parent); 3310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 332635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Widget::setParent(parent); 333635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 334635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (parent) 335635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project init(); 336635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 337635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 338635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// -------------- Geometry and painting ---------------- 339635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 340635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::show() 341635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 3420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LOG(Plugins, "PluginView::show()"); 343635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 344635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project setSelfVisible(true); 345635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 346635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Widget::show(); 347635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::hide() 350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 3510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LOG(Plugins, "PluginView::hide()"); 352635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project setSelfVisible(false); 354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Widget::hide(); 356635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 357635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::setFocus() 359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 3600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LOG(Plugins, "PluginView::setFocus()"); 361635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 362635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (platformPluginWidget()) 363643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if PLATFORM(QT) 364635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project platformPluginWidget()->setFocus(Qt::OtherFocusReason); 365643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else 366643ca7872b450ea4efacab6188849e5aac2ba161Steve Block platformPluginWidget()->SetFocus(); 367643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 368635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else 369635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Widget::setFocus(); 370635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 371635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // TODO: Also handle and pass on blur events (focus lost) 372635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 373635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project EventRecord record; 374635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.what = getFocusEvent; 375635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.message = 0; 376635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.when = TickCount(); 377635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.where = globalMousePosForPlugin(); 378635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.modifiers = GetCurrentKeyModifiers(); 379635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 380635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!dispatchNPEvent(record)) 381635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project LOG(Events, "PluginView::setFocus(): Get-focus event not accepted"); 382635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 383635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 384635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::setParentVisible(bool visible) 385635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 386635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (isParentVisible() == visible) 387635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 388635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 389635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Widget::setParentVisible(visible); 390635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 391635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 392635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::setNPWindowRect(const IntRect&) 393635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 394635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project setNPWindowIfNeeded(); 395635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 396635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 397635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::setNPWindowIfNeeded() 398635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 399635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_isStarted || !parent() || !m_plugin->pluginFuncs()->setwindow) 400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 401635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 402643ca7872b450ea4efacab6188849e5aac2ba161Steve Block CGContextRef newContextRef = 0; 403643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WindowRef newWindowRef = 0; 404643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (platformPluginWidget()) { 405643ca7872b450ea4efacab6188849e5aac2ba161Steve Block newContextRef = cgHandleFor(platformPluginWidget()); 406643ca7872b450ea4efacab6188849e5aac2ba161Steve Block newWindowRef = nativeWindowFor(platformPluginWidget()); 407643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_npWindow.type = NPWindowTypeWindow; 408643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else { 409643ca7872b450ea4efacab6188849e5aac2ba161Steve Block newContextRef = m_contextRef; 410643ca7872b450ea4efacab6188849e5aac2ba161Steve Block newWindowRef = m_fakeWindow; 411643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_npWindow.type = NPWindowTypeDrawable; 412643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 413635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 414643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!newContextRef || !newWindowRef) 415635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 416635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 417635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_npWindow.window = (void*)&m_npCgContext; 418635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_npCgContext.window = newWindowRef; 419635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_npCgContext.context = newContextRef; 420635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 421635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_npWindow.x = m_windowRect.x(); 422635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_npWindow.y = m_windowRect.y(); 423635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_npWindow.width = m_windowRect.width(); 424635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_npWindow.height = m_windowRect.height(); 425635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 426635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // TODO: (also clip against scrollbars, etc.) 4270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_npWindow.clipRect.left = max(0, m_windowRect.x()); 4280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_npWindow.clipRect.top = max(0, m_windowRect.y()); 4290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_npWindow.clipRect.right = m_windowRect.x() + m_windowRect.width(); 4300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_npWindow.clipRect.bottom = m_windowRect.y() + m_windowRect.height(); 4310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LOG(Plugins, "PluginView::setNPWindowIfNeeded(): window=%p, context=%p," 433643ca7872b450ea4efacab6188849e5aac2ba161Steve Block " window.x:%ld window.y:%ld window.width:%d window.height:%d window.clipRect size:%dx%d", 4340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch newWindowRef, newContextRef, m_npWindow.x, m_npWindow.y, m_npWindow.width, m_npWindow.height, 4350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_npWindow.clipRect.right - m_npWindow.clipRect.left, m_npWindow.clipRect.bottom - m_npWindow.clipRect.top); 436635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 437635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project PluginView::setCurrentPluginView(this); 4380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly); 439635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project setCallingPlugin(true); 440635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow); 441635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project setCallingPlugin(false); 442635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project PluginView::setCurrentPluginView(0); 443635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 444635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 445635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::updatePluginWidget() 446635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 447635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!parent()) 448635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 449635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 450635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(parent()->isFrameView()); 451635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FrameView* frameView = static_cast<FrameView*>(parent()); 452635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 453635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect oldWindowRect = m_windowRect; 454635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project IntRect oldClipRect = m_clipRect; 455635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 4560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_windowRect = frameView->contentsToWindow(frameRect()); 4570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch IntPoint offset = topLevelOffsetFor(platformPluginWidget()); 4580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_windowRect.move(offset.x(), offset.y()); 4590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 460643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!platformPluginWidget()) { 461643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_windowRect.size() != oldWindowRect.size()) { 462643ca7872b450ea4efacab6188849e5aac2ba161Steve Block CGContextRelease(m_contextRef); 463643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if PLATFORM(QT) 464643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_pixmap = QPixmap(m_windowRect.size()); 465643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_pixmap.fill(Qt::transparent); 466643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_contextRef = qt_mac_cg_context(&m_pixmap); 467643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 468643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 469643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 470643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 471635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_clipRect = windowClipRect(); 472635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_clipRect.move(-m_windowRect.x(), -m_windowRect.y()); 473635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 474635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (platformPluginWidget() && (m_windowRect != oldWindowRect || m_clipRect != oldClipRect)) 475635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project setNPWindowIfNeeded(); 476635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 477635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 478635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::paint(GraphicsContext* context, const IntRect& rect) 479635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 4800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!m_isStarted || m_status != PluginStatusLoadedSuccessfully) { 481635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project paintMissingPluginIcon(context, rect); 482635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 483635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 484635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 485635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (context->paintingDisabled()) 486635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 487635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 488635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project setNPWindowIfNeeded(); 489635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 490231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block CGContextRef cgContext = m_npCgContext.context; 491231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!cgContext) 492231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 493231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 494231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block CGContextSaveGState(cgContext); 495643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (platformPluginWidget()) { 496643ca7872b450ea4efacab6188849e5aac2ba161Steve Block IntPoint offset = frameRect().location(); 497643ca7872b450ea4efacab6188849e5aac2ba161Steve Block CGContextTranslateCTM(cgContext, offset.x(), offset.y()); 498643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 499643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 500643ca7872b450ea4efacab6188849e5aac2ba161Steve Block IntRect targetRect(frameRect()); 501643ca7872b450ea4efacab6188849e5aac2ba161Steve Block targetRect.intersects(rect); 502643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 503643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // clip the context so that plugin only updates the interested area. 504643ca7872b450ea4efacab6188849e5aac2ba161Steve Block CGRect r; 505643ca7872b450ea4efacab6188849e5aac2ba161Steve Block r.origin.x = targetRect.x() - frameRect().x(); 506643ca7872b450ea4efacab6188849e5aac2ba161Steve Block r.origin.y = targetRect.y() - frameRect().y(); 507643ca7872b450ea4efacab6188849e5aac2ba161Steve Block r.size.width = targetRect.width(); 508643ca7872b450ea4efacab6188849e5aac2ba161Steve Block r.size.height = targetRect.height(); 509643ca7872b450ea4efacab6188849e5aac2ba161Steve Block CGContextClipToRect(cgContext, r); 510643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 511643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!platformPluginWidget() && m_isTransparent) { // clean the pixmap in transparent mode 512643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if PLATFORM(QT) 513643ca7872b450ea4efacab6188849e5aac2ba161Steve Block QPainter painter(&m_pixmap); 514643ca7872b450ea4efacab6188849e5aac2ba161Steve Block painter.setCompositionMode(QPainter::CompositionMode_Clear); 515643ca7872b450ea4efacab6188849e5aac2ba161Steve Block painter.fillRect(QRectF(r.origin.x, r.origin.y, r.size.width, r.size.height), Qt::transparent); 516643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 517643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 518231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 519635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project EventRecord event; 520635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project event.what = updateEvt; 521635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project event.message = (long unsigned int)m_npCgContext.window; 522635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project event.when = TickCount(); 523635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project event.where.h = 0; 524635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project event.where.v = 0; 525635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project event.modifiers = GetCurrentKeyModifiers(); 526635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 527635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!dispatchNPEvent(event)) 528635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project LOG(Events, "PluginView::paint(): Paint event not accepted"); 529635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 530231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block CGContextRestoreGState(cgContext); 531643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 532643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!platformPluginWidget()) { 533643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if PLATFORM(QT) 534643ca7872b450ea4efacab6188849e5aac2ba161Steve Block QPainter* painter = context->platformContext(); 535643ca7872b450ea4efacab6188849e5aac2ba161Steve Block painter->drawPixmap(targetRect.x(), targetRect.y(), m_pixmap, 536643ca7872b450ea4efacab6188849e5aac2ba161Steve Block targetRect.x() - frameRect().x(), targetRect.y() - frameRect().y(), targetRect.width(), targetRect.height()); 537643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 538643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 539635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 540635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 541635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::invalidateRect(const IntRect& rect) 542635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 5438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (platformPluginWidget()) 544643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if PLATFORM(QT) 5458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian platformPluginWidget()->update(convertToContainingWindow(rect)); 546643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else 547643ca7872b450ea4efacab6188849e5aac2ba161Steve Block platformPluginWidget()->RefreshRect(convertToContainingWindow(rect)); 548643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 549643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else 550643ca7872b450ea4efacab6188849e5aac2ba161Steve Block invalidateWindowlessPluginRect(rect); 551635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 552635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 553635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::invalidateRect(NPRect* rect) 554635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 555643ca7872b450ea4efacab6188849e5aac2ba161Steve Block IntRect r(rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top); 556643ca7872b450ea4efacab6188849e5aac2ba161Steve Block invalidateRect(r); 557635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 558635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 559635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::invalidateRegion(NPRegion region) 560635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 561635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // TODO: optimize 562635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project invalidate(); 563635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 564635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 565635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::forceRedraw() 566635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 567635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project notImplemented(); 568635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 569635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 570635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 571635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// ----------------- Event handling -------------------- 572635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 573635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::handleMouseEvent(MouseEvent* event) 574635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 5750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!m_isStarted) 5760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 5770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 578635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project EventRecord record; 579635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 580635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (event->type() == eventNames().mousemoveEvent) { 581643ca7872b450ea4efacab6188849e5aac2ba161Steve Block record.what = nullEvent; 582635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } else if (event->type() == eventNames().mouseoverEvent) { 583635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.what = adjustCursorEvent; 584635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } else if (event->type() == eventNames().mouseoutEvent) { 585635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.what = adjustCursorEvent; 586635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } else if (event->type() == eventNames().mousedownEvent) { 587635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.what = mouseDown; 588635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // The plugin needs focus to receive keyboard events 589635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (Page* page = m_parentFrame->page()) 590635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project page->focusController()->setFocusedFrame(m_parentFrame); 591635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_parentFrame->document()->setFocusedNode(m_element); 592635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } else if (event->type() == eventNames().mouseupEvent) { 593635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.what = mouseUp; 594635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } else { 595635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 596635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 597635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 598643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (platformPluginWidget()) { 599643ca7872b450ea4efacab6188849e5aac2ba161Steve Block record.where = globalMousePosForPlugin(); 600643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else { 601643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (event->button() == 2) { 602643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // always pass the global position for right-click since Flash uses it to position the context menu 603643ca7872b450ea4efacab6188849e5aac2ba161Steve Block record.where = globalMousePosForPlugin(); 604643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else { 605643ca7872b450ea4efacab6188849e5aac2ba161Steve Block IntPoint postZoomPos = roundedIntPoint(m_element->renderer()->absoluteToLocal(event->absoluteLocation())); 606643ca7872b450ea4efacab6188849e5aac2ba161Steve Block record.where.h = postZoomPos.x() + m_windowRect.x(); 607643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // The number 22 is the height of the title bar. As to why it figures in the calculation below 608643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // is left as an exercise to the reader :-) 609643ca7872b450ea4efacab6188849e5aac2ba161Steve Block record.where.v = postZoomPos.y() + m_windowRect.y() - 22; 610643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 611643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 612635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.modifiers = modifiersForEvent(event); 613635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 614635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!event->buttonDown()) 615635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.modifiers |= btnState; 616635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 617635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (event->button() == 2) 618635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.modifiers |= controlKey; 619635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 620635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!dispatchNPEvent(record)) { 621635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (record.what == adjustCursorEvent) 622635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; // Signals that the plugin wants a normal cursor 623635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 624635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project LOG(Events, "PluginView::handleMouseEvent(): Mouse event type %d at %d,%d not accepted", 625635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.what, record.where.h, record.where.v); 626635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } else { 627635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project event->setDefaultHandled(); 628635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 629635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 630635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 631635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::handleKeyboardEvent(KeyboardEvent* event) 632635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 6330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!m_isStarted) 6340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 6350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 6360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LOG(Plugins, "PluginView::handleKeyboardEvent() ----------------- "); 637635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 6380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LOG(Plugins, "PV::hKE(): KE.keyCode: 0x%02X, KE.charCode: %d", 639635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project event->keyCode(), event->charCode()); 640635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 641635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project EventRecord record; 642635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 643635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (event->type() == eventNames().keydownEvent) { 644635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // This event is the result of a PlatformKeyboardEvent::KeyDown which 645635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // was disambiguated into a PlatformKeyboardEvent::RawKeyDown. Since 646635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // we don't have access to the text here, we return, and wait for the 647635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // corresponding event based on PlatformKeyboardEvent::Char. 648635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 649635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } else if (event->type() == eventNames().keypressEvent) { 650635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Which would be this one. This event was disambiguated from the same 651635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // PlatformKeyboardEvent::KeyDown, but to a PlatformKeyboardEvent::Char, 652635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // which retains the text from the original event. So, we can safely pass 653635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // on the event as a key-down event to the plugin. 654635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.what = keyDown; 655635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } else if (event->type() == eventNames().keyupEvent) { 656635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // PlatformKeyboardEvent::KeyUp events always have the text, so nothing 657635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // fancy here. 658635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.what = keyUp; 659635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } else { 660635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 661635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 662635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 663635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project const PlatformKeyboardEvent* platformEvent = event->keyEvent(); 664635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int keyCode = platformEvent->nativeVirtualKeyCode(); 665635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 666635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project const String text = platformEvent->text(); 667635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (text.length() < 1) { 668635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project event->setDefaultHandled(); 669635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 670635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 671635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 672635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project WTF::RetainPtr<CFStringRef> cfText(WTF::AdoptCF, text.createCFString()); 673635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 6740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LOG(Plugins, "PV::hKE(): PKE.text: %s, PKE.unmodifiedText: %s, PKE.keyIdentifier: %s", 675635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project text.ascii().data(), platformEvent->unmodifiedText().ascii().data(), 676635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project platformEvent->keyIdentifier().ascii().data()); 677635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 678635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project char charCodes[2] = { 0, 0 }; 679635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!CFStringGetCString(cfText.get(), charCodes, 2, CFStringGetSystemEncoding())) { 680635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project LOG_ERROR("Could not resolve character code using system encoding."); 681635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project event->setDefaultHandled(); 682635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 683635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 684635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 685635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.where = globalMousePosForPlugin(); 686635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.modifiers = modifiersForEvent(event); 687635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.message = ((keyCode & 0xFF) << 8) | (charCodes[0] & 0xFF); 688635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project record.when = TickCount(); 689635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 6900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LOG(Plugins, "PV::hKE(): record.modifiers: %d", record.modifiers); 691635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 692643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if PLATFORM(QT) 6930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch LOG(Plugins, "PV::hKE(): PKE.qtEvent()->nativeVirtualKey: 0x%02X, charCode: %d", 694635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project keyCode, int(uchar(charCodes[0]))); 695643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 696635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 697635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!dispatchNPEvent(record)) 698635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project LOG(Events, "PluginView::handleKeyboardEvent(): Keyboard event type %d not accepted", record.what); 699635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else 700635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project event->setDefaultHandled(); 701635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 702635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 703635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic int modifiersForEvent(UIEventWithKeyState* event) 704635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 705635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int modifiers = 0; 706635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 707635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (event->ctrlKey()) 708635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project modifiers |= controlKey; 709635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 710635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (event->altKey()) 711635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project modifiers |= optionKey; 712635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 713635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (event->metaKey()) 714635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project modifiers |= cmdKey; 715635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 716635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (event->shiftKey()) 717635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project modifiers |= shiftKey; 718635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 719635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return modifiers; 720635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 721635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 722635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic bool tigerOrBetter() 723635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 724635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static SInt32 systemVersion = 0; 725635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 726635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!systemVersion) { 727635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (Gestalt(gestaltSystemVersion, &systemVersion) != noErr) 728635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return false; 729635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 730635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 731635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return systemVersion >= 0x1040; 732635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 733635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 734635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectPoint PluginView::globalMousePosForPlugin() const 735635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 736635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Point pos; 737635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project GetGlobalMouse(&pos); 738635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 739635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project float scaleFactor = tigerOrBetter() ? HIGetScaleFactor() : 1; 740635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 741635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project pos.h = short(pos.h * scaleFactor); 742635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project pos.v = short(pos.v * scaleFactor); 743635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 744643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if PLATFORM(WX) 745643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // make sure the titlebar/toolbar size is included 746643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WindowRef windowRef = nativeWindowFor(platformPluginWidget()); 747643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ::Rect content, structure; 748643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 749643ca7872b450ea4efacab6188849e5aac2ba161Steve Block GetWindowBounds(windowRef, kWindowStructureRgn, &structure); 750643ca7872b450ea4efacab6188849e5aac2ba161Steve Block GetWindowBounds(windowRef, kWindowContentRgn, &content); 751643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 752643ca7872b450ea4efacab6188849e5aac2ba161Steve Block int top = content.top - structure.top; 753643ca7872b450ea4efacab6188849e5aac2ba161Steve Block pos.v -= top; 754643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 755643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 756635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return pos; 757635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 758635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 759635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool PluginView::dispatchNPEvent(NPEvent& event) 760635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 761635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project PluginView::setCurrentPluginView(this); 7620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly); 763635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project setCallingPlugin(true); 764635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 765635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool accepted = m_plugin->pluginFuncs()->event(m_instance, &event); 766635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 767635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project setCallingPlugin(false); 768635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project PluginView::setCurrentPluginView(0); 769635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return accepted; 770635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 771635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 772635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// ------------------- Miscellaneous ------------------ 773635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 774635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32 len, const char* buf) 775635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 776635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project String filename(buf, len); 777635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 778635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (filename.startsWith("file:///")) 779635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project filename = filename.substring(8); 780635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 781635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!fileExists(filename)) 782635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return NPERR_FILE_NOT_FOUND; 783635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 784635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FILE* fileHandle = fopen((filename.utf8()).data(), "r"); 785635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 786635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (fileHandle == 0) 787635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return NPERR_FILE_NOT_FOUND; 788635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 789635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int bytesRead = fread(buffer.data(), 1, 0, fileHandle); 790635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 791635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project fclose(fileHandle); 792635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 793635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (bytesRead <= 0) 794635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return NPERR_FILE_NOT_FOUND; 795635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 796635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return NPERR_NO_ERROR; 797635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 798635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 799231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::halt() 8000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 8010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 8020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 803231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::restart() 804231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 805231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 8060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 807635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace WebCore 808635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 8090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 8100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 8110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "../PluginViewNone.cpp" 8120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 813635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // !__LP64__ 814