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