18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Collabora Ltd. All rights reserved.
4231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginView.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3168513a70bcd92384395513322f1b801e7bf9c729Steve Block#if USE(JSC)
3253733164eb6cabab5a1eddcabb42e4ce27eb0e44Ben Murdoch#include "BridgeJSC.h"
3368513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
34a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "Chrome.h"
35a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "ChromeClient.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DocumentLoader.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Element.h"
39231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "FloatPoint.h"
40231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "FocusController.h"
415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Frame.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoadRequest.h"
435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "FrameLoader.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLPlugInElement.h"
49d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "HostWindow.h"
502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "IFrameShimSupport.h"
515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Image.h"
5268513a70bcd92384395513322f1b801e7bf9c729Steve Block#if USE(JSC)
535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "JSDOMBinding.h"
5468513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "KeyboardEvent.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MouseEvent.h"
575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "NotImplemented.h"
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformMouseEvent.h"
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "PlatformKeyboardEvent.h"
615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "PluginContainerQt.h"
625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "PluginDebug.h"
635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "PluginPackage.h"
645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "PluginMainThreadScheduler.h"
651325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include "QWebPageClient.h"
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderLayer.h"
675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "ScriptController.h"
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h"
695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "npruntime_impl.h"
7006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "qwebpage_p.h"
7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(JSC)
725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "runtime_root.h"
7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
741325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block
75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <QApplication>
76231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <QDesktopWidget>
77a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <QGraphicsWidget>
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <QKeyEvent>
79231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <QPainter>
80a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <QStyleOptionGraphicsItem>
815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <QWidget>
825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <QX11Info>
830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <X11/X.h>
84231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef QT_NO_XRENDER
85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#define Bool int
86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#define Status int
87231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <X11/extensions/Xrender.h>
88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
891325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include <runtime/JSLock.h>
901325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include <runtime/JSValue.h>
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing JSC::ExecState;
9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(JSC)
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing JSC::Interpreter;
9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing JSC::JSLock;
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing JSC::JSObject;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing JSC::UString;
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing std::min;
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WTF;
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames;
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
108a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if USE(ACCELERATED_COMPOSITING)
109a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch// Qt's GraphicsLayer (GraphicsLayerQt) requires layers to be QGraphicsWidgets
110a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochclass PluginGraphicsLayerQt : public QGraphicsWidget {
111a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochpublic:
112a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    PluginGraphicsLayerQt(PluginView* view) : m_view(view) { }
113a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ~PluginGraphicsLayerQt() { }
114a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
115a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0)
116a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
117a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        Q_UNUSED(widget);
118a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_view->paintUsingXPixmap(painter, option->exposedRect.toRect());
119a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
120a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
121a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochprivate:
122a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    PluginView* m_view;
123a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch};
124a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
125a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::updatePluginWidget()
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
128231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!parent())
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(parent()->isFrameView());
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameView* frameView = static_cast<FrameView*>(parent());
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect oldWindowRect = m_windowRect;
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect oldClipRect = m_clipRect;
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_windowRect = IntRect(frameView->contentsToWindow(frameRect().location()), frameRect().size());
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_clipRect = windowClipRect();
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_clipRect.move(-m_windowRect.x(), -m_windowRect.y());
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (m_windowRect == oldWindowRect && m_clipRect == oldClipRect)
1425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return;
1435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
14481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // The plugin had a zero width or height before but was resized, we need to show it again.
14581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (oldWindowRect.isEmpty())
14681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        show();
14781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
148cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!m_isWindowed && m_windowRect.size() != oldWindowRect.size()) {
149bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5)
150f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        // On Maemo5, Flash always renders to 16-bit buffer
151f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (m_renderToImage)
152f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_image = QImage(m_windowRect.width(), m_windowRect.height(), QImage::Format_RGB16);
153f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        else
154f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#endif
155f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        {
156f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            if (m_drawable)
157f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                XFreePixmap(QX11Info::display(), m_drawable);
158231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
159f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_drawable = XCreatePixmap(QX11Info::display(), QX11Info::appRootWindow(), m_windowRect.width(), m_windowRect.height(),
160f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                                       ((NPSetWindowCallbackStruct*)m_npWindow.ws_info)->depth);
161f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            QApplication::syncX(); // make sure that the server knows about the Drawable
162f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        }
163231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
164231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // do not call setNPWindowIfNeeded immediately, will be called on paint()
1665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_hasPendingGeometryChange = true;
1675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
16806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // (i) in order to move/resize the plugin window at the same time as the
1695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // rest of frame during e.g. scrolling, we set the window geometry
1705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // in the paint() function, but as paint() isn't called when the
1715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // plugin window is outside the frame which can be caused by a
1725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // scroll, we need to move/resize immediately.
17306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // (ii) if we are running layout tests from DRT, paint() won't ever get called
17406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // so we need to call setNPWindowIfNeeded() if window geometry has changed
17506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (!m_windowRect.intersects(frameView->frameRect())
17606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        || (QWebPagePrivate::drtRun && platformPluginWidget() && (m_windowRect != oldWindowRect || m_clipRect != oldClipRect)))
1775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        setNPWindowIfNeeded();
178d0825bca7fe65beaee391d30da42e937db621564Steve Block
179a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_platformLayer) {
180a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        // Make sure we get repainted afterwards. This is necessary for downward
181a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        // scrolling to move the plugin widget properly.
18281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Note that we don't invalidate the frameRect() here. This is because QWebFrame::renderRelativeCoords()
18381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // imitates ScrollView and adds the scroll offset back on to the rect we damage here (making the co-ordinates absolute
18481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // to the frame again) before passing it to FrameView.
1852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        invalidate();
186a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18921939df44de1705786c545cd1bf519d47250322dBen Murdochvoid PluginView::setFocus(bool focused)
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19121939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (platformPluginWidget()) {
19221939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (focused)
19321939df44de1705786c545cd1bf519d47250322dBen Murdoch            platformPluginWidget()->setFocus(Qt::OtherFocusReason);
19421939df44de1705786c545cd1bf519d47250322dBen Murdoch    } else {
19521939df44de1705786c545cd1bf519d47250322dBen Murdoch        Widget::setFocus(focused);
19621939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::show()
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Q_ASSERT(platformPluginWidget() == platformWidget());
202643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Widget::show();
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::hide()
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Q_ASSERT(platformPluginWidget() == platformWidget());
208643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Widget::hide();
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
211bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5)
212f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickvoid PluginView::paintUsingImageSurfaceExtension(QPainter* painter, const IntRect& exposedRect)
213f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
214f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    NPImageExpose imageExpose;
215e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    QPoint offset;
216e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
217e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    const bool surfaceHasUntransformedContents = client && qobject_cast<QWidget*>(client->pluginParent());
218e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
219e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    QPaintDevice* surface =  QPainter::redirected(painter->device(), &offset);
220e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
221e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // If the surface is a QImage, we can render directly into it
222e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (surfaceHasUntransformedContents && surface && surface->devType() == QInternal::Image) {
223e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        QImage* image = static_cast<QImage*>(surface);
224e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        offset = -offset; // negating the offset gives us the offset of the view within the surface
225e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.data = reinterpret_cast<char*>(image->bits());
226e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.dataSize.width = image->width();
227e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.dataSize.height = image->height();
228e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.stride = image->bytesPerLine();
229e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.depth = image->depth(); // this is guaranteed to be 16 on Maemo5
230e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.translateX = offset.x() + m_windowRect.x();
231e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.translateY = offset.y() + m_windowRect.y();
232e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.scaleX = 1;
233e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.scaleY = 1;
234e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    } else {
235e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        if (m_isTransparent) {
236e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            // On Maemo5, Flash expects the buffer to contain the contents that are below it.
237e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            // We don't support transparency for non-raster graphicssystem, so clean the image
238e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            // before giving to Flash.
239e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            QPainter imagePainter(&m_image);
240e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            imagePainter.fillRect(exposedRect, Qt::white);
241e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        }
242e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
243e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.data = reinterpret_cast<char*>(m_image.bits());
244e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.dataSize.width = m_image.width();
245e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.dataSize.height = m_image.height();
246e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.stride = m_image.bytesPerLine();
247e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.depth = m_image.depth();
248e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.translateX = 0;
249e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.translateY = 0;
250e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.scaleX = 1;
251e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        imageExpose.scaleY = 1;
252e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    }
253f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    imageExpose.x = exposedRect.x();
254f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    imageExpose.y = exposedRect.y();
255f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    imageExpose.width = exposedRect.width();
256f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    imageExpose.height = exposedRect.height();
257f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
258f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    XEvent xevent;
259f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    memset(&xevent, 0, sizeof(XEvent));
260f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    XGraphicsExposeEvent& exposeEvent = xevent.xgraphicsexpose;
261f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    exposeEvent.type = GraphicsExpose;
262f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    exposeEvent.display = 0;
263f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    exposeEvent.drawable = reinterpret_cast<XID>(&imageExpose);
264f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    exposeEvent.x = exposedRect.x();
265f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    exposeEvent.y = exposedRect.y();
266f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    exposeEvent.width = exposedRect.width();
267f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    exposeEvent.height = exposedRect.height();
268f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
269f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    dispatchNPEvent(xevent);
270f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
271e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (!surfaceHasUntransformedContents || !surface || surface->devType() != QInternal::Image)
272e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        painter->drawImage(QPoint(frameRect().x() + exposedRect.x(), frameRect().y() + exposedRect.y()), m_image, exposedRect);
273f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
274f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#endif
275f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
276a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid PluginView::paintUsingXPixmap(QPainter* painter, const QRect &exposedRect)
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
278231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    QPixmap qtDrawable = QPixmap::fromX11Pixmap(m_drawable, QPixmap::ExplicitlyShared);
279231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    const int drawableDepth = ((NPSetWindowCallbackStruct*)m_npWindow.ws_info)->depth;
280231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(drawableDepth == qtDrawable.depth());
281f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    const bool syncX = m_pluginDisplay && m_pluginDisplay != QX11Info::display();
282231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
283cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // When printing, Qt uses a QPicture to capture the output in preview mode. The
284cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // QPicture holds a reference to the X Pixmap. As a result, the print preview would
285cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // update itself when the X Pixmap changes. To prevent this, we create a copy.
286cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (m_element->document()->printing())
287cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        qtDrawable = qtDrawable.copy();
288cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
289231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_isTransparent && drawableDepth != 32) {
290231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // Attempt content propagation for drawable with no alpha by copying over from the backing store
291231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        QPoint offset;
292231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        QPaintDevice* backingStoreDevice =  QPainter::redirected(painter->device(), &offset);
293231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        offset = -offset; // negating the offset gives us the offset of the view within the backing store pixmap
294231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
295231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        const bool hasValidBackingStore = backingStoreDevice && backingStoreDevice->devType() == QInternal::Pixmap;
296231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        QPixmap* backingStorePixmap = static_cast<QPixmap*>(backingStoreDevice);
297231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
298231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // We cannot grab contents from the backing store when painting on QGraphicsView items
299231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // (because backing store contents are already transformed). What we really mean to do
300231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // here is to check if we are painting on QWebView, but let's be a little permissive :)
301231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
302cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        const bool backingStoreHasUntransformedContents = client && qobject_cast<QWidget*>(client->pluginParent());
303231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
304231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (hasValidBackingStore && backingStorePixmap->depth() == drawableDepth
305231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            && backingStoreHasUntransformedContents) {
306231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            GC gc = XDefaultGC(QX11Info::display(), QX11Info::appScreen());
307231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            XCopyArea(QX11Info::display(), backingStorePixmap->handle(), m_drawable, gc,
308cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                offset.x() + m_windowRect.x() + exposedRect.x(), offset.y() + m_windowRect.y() + exposedRect.y(),
309cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                exposedRect.width(), exposedRect.height(), exposedRect.x(), exposedRect.y());
310231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } else { // no backing store, clean the pixmap because the plugin thinks its transparent
311231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            QPainter painter(&qtDrawable);
312cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            painter.fillRect(exposedRect, Qt::white);
313231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
314231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
315231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (syncX)
316231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            QApplication::syncX();
317231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
318231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
319231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    XEvent xevent;
320231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    memset(&xevent, 0, sizeof(XEvent));
321231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    XGraphicsExposeEvent& exposeEvent = xevent.xgraphicsexpose;
322231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    exposeEvent.type = GraphicsExpose;
323231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    exposeEvent.display = QX11Info::display();
324cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    exposeEvent.drawable = qtDrawable.handle();
325cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    exposeEvent.x = exposedRect.x();
326cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    exposeEvent.y = exposedRect.y();
327cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    exposeEvent.width = exposedRect.x() + exposedRect.width(); // flash bug? it thinks width is the right in transparent mode
328cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    exposeEvent.height = exposedRect.y() + exposedRect.height(); // flash bug? it thinks height is the bottom in transparent mode
329231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
330231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    dispatchNPEvent(xevent);
331231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
332231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (syncX)
33368513a70bcd92384395513322f1b801e7bf9c729Steve Block        XSync(m_pluginDisplay, false); // sync changes by plugin
334231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
335a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    painter->drawPixmap(QPoint(exposedRect.x(), exposedRect.y()), qtDrawable, exposedRect);
336a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
337a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
338a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid PluginView::paint(GraphicsContext* context, const IntRect& rect)
339a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
340a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_isStarted) {
341a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        paintMissingPluginIcon(context, rect);
342a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
343a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
344a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
345a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (context->paintingDisabled())
346a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
347a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
348a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    setNPWindowIfNeeded();
349a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
350a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (m_isWindowed)
351a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
352a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
353a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if USE(ACCELERATED_COMPOSITING)
354a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (m_platformLayer)
355a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
356a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
357a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
358a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_drawable
359a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5)
360a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        && m_image.isNull()
361a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
362a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch       )
363a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
364a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
365a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    QPainter* painter = context->platformContext();
366a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    IntRect exposedRect(rect);
367a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    exposedRect.intersect(frameRect());
368a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    exposedRect.move(-frameRect().x(), -frameRect().y());
369a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
370a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5)
371a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_image.isNull()) {
372a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        paintUsingImageSurfaceExtension(painter, exposedRect);
373a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
374a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
375a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
376a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
377a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    painter->translate(frameRect().x(), frameRect().y());
378a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    paintUsingXPixmap(painter, exposedRect);
379a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    painter->translate(-frameRect().x(), -frameRect().y());
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// TODO: Unify across ports.
3830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool PluginView::dispatchNPEvent(NPEvent& event)
3840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_plugin->pluginFuncs()->event)
3860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
3870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    PluginView::setCurrentPluginView(this);
38968513a70bcd92384395513322f1b801e7bf9c729Steve Block#if USE(JSC)
390cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
39168513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
3920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    setCallingPlugin(true);
393231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    bool accepted = m_plugin->pluginFuncs()->event(m_instance, &event);
3940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    setCallingPlugin(false);
395cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    PluginView::setCurrentPluginView(0);
3960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return accepted;
3980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
400cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid setSharedXEventFields(XEvent* xEvent, QWidget* ownerWidget)
4010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
402231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xEvent->xany.serial = 0; // we are unaware of the last request processed by X Server
403231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xEvent->xany.send_event = false;
404cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    xEvent->xany.display = QX11Info::display();
405231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // NOTE: event->xany.window doesn't always respond to the .window property of other XEvent's
4060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // but does in the case of KeyPress, KeyRelease, ButtonPress, ButtonRelease, and MotionNotify
4070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // events; thus, this is right:
408cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    xEvent->xany.window = ownerWidget ? ownerWidget->window()->handle() : 0;
4090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
411231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::initXEvent(XEvent* xEvent)
412231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
413231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    memset(xEvent, 0, sizeof(XEvent));
414231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
415231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
416cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWidget* ownerWidget = client ? client->ownerWidget() : 0;
417cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    setSharedXEventFields(xEvent, ownerWidget);
418231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
419231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
420231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid setXKeyEventSpecificFields(XEvent* xEvent, KeyboardEvent* event)
4210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
422a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    const PlatformKeyboardEvent* keyEvent = event->keyEvent();
4230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
424231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xEvent->type = (event->type() == eventNames().keydownEvent) ? 2 : 3; // ints as Qt unsets KeyPress and KeyRelease
425231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xEvent->xkey.root = QX11Info::appRootWindow();
426231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xEvent->xkey.subwindow = 0; // we have no child window
427231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xEvent->xkey.time = event->timeStamp();
428a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    xEvent->xkey.state = keyEvent->nativeModifiers();
429a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    xEvent->xkey.keycode = keyEvent->nativeScanCode();
4305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
4315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // We may not have a nativeScanCode() if the key event is from DRT's eventsender. In that
43265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // case fetch the XEvent's keycode from the event's text. The only
4335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // place this keycode will be used is in webkit_test_plugin_handle_event().
43465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: Create Qt API so that we can set the appropriate keycode in DRT EventSender instead.
4355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (QWebPagePrivate::drtRun && !xEvent->xkey.keycode) {
436a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        QKeyEvent* qKeyEvent = keyEvent->qtEvent();
437a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(qKeyEvent);
43865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        QString keyText = qKeyEvent->text().left(1);
43965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        xEvent->xkey.keycode = XKeysymToKeycode(QX11Info::display(), XStringToKeysym(keyText.toUtf8().constData()));
4405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
4415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
442231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xEvent->xkey.same_screen = true;
4430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // NOTE: As the XEvents sent to the plug-in are synthesized and there is not a native window
4450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // corresponding to the plug-in rectangle, some of the members of the XEvent structures are not
4460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // set to their normal Xserver values. e.g. Key events don't have a position.
4470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // source: https://developer.mozilla.org/en/NPEvent
448231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xEvent->xkey.x = 0;
449231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xEvent->xkey.y = 0;
450231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xEvent->xkey.x_root = 0;
451231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xEvent->xkey.y_root = 0;
4520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::handleKeyboardEvent(KeyboardEvent* event)
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_isWindowed)
4570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
4580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
459231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (event->type() != eventNames().keydownEvent && event->type() != eventNames().keyupEvent)
4600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
4610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
462231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    XEvent npEvent;
463231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    initXEvent(&npEvent);
464231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    setXKeyEventSpecificFields(&npEvent, event);
4650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!dispatchNPEvent(npEvent))
4670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        event->setDefaultHandled();
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
470231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic unsigned int inputEventState(MouseEvent* event)
471231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
472231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    unsigned int state = 0;
473231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (event->ctrlKey())
474231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        state |= ControlMask;
475231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (event->shiftKey())
476231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        state |= ShiftMask;
477231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (event->altKey())
478231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        state |= Mod1Mask;
479231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (event->metaKey())
480231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        state |= Mod4Mask;
481231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return state;
482231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
483231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
484231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic void setXButtonEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos)
485231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
486231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    XButtonEvent& xbutton = xEvent->xbutton;
487231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xbutton.type = event->type() == eventNames().mousedownEvent ? ButtonPress : ButtonRelease;
488231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xbutton.root = QX11Info::appRootWindow();
489231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xbutton.subwindow = 0;
490231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xbutton.time = event->timeStamp();
491231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xbutton.x = postZoomPos.x();
492231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xbutton.y = postZoomPos.y();
493231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xbutton.x_root = event->screenX();
494231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xbutton.y_root = event->screenY();
495231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xbutton.state = inputEventState(event);
496231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    switch (event->button()) {
497231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MiddleButton:
498231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        xbutton.button = Button2;
499231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
500231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case RightButton:
501231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        xbutton.button = Button3;
502231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
503231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case LeftButton:
504231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    default:
505231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        xbutton.button = Button1;
506231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
507231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
508231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xbutton.same_screen = true;
509231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
510231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
511231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic void setXMotionEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos)
512231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
513231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    XMotionEvent& xmotion = xEvent->xmotion;
514231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xmotion.type = MotionNotify;
515231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xmotion.root = QX11Info::appRootWindow();
516231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xmotion.subwindow = 0;
517231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xmotion.time = event->timeStamp();
518231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xmotion.x = postZoomPos.x();
519231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xmotion.y = postZoomPos.y();
520231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xmotion.x_root = event->screenX();
521231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xmotion.y_root = event->screenY();
522231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xmotion.state = inputEventState(event);
523231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xmotion.is_hint = NotifyNormal;
524231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xmotion.same_screen = true;
525231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
526231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
527231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic void setXCrossingEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos)
528231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
529231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    XCrossingEvent& xcrossing = xEvent->xcrossing;
530231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xcrossing.type = event->type() == eventNames().mouseoverEvent ? EnterNotify : LeaveNotify;
531231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xcrossing.root = QX11Info::appRootWindow();
532231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xcrossing.subwindow = 0;
533231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xcrossing.time = event->timeStamp();
534231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xcrossing.x = postZoomPos.y();
535231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xcrossing.y = postZoomPos.x();
536231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xcrossing.x_root = event->screenX();
537231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xcrossing.y_root = event->screenY();
538231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xcrossing.state = inputEventState(event);
539231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xcrossing.mode = NotifyNormal;
540231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xcrossing.detail = NotifyDetailNone;
541231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xcrossing.same_screen = true;
542231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    xcrossing.focus = false;
543231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
544231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::handleMouseEvent(MouseEvent* event)
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_isWindowed)
5480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
549231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
550a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (event->button() == RightButton && m_plugin->quirks().contains(PluginQuirkIgnoreRightClickInWindowlessMode))
551a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
552a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
553231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (event->type() == eventNames().mousedownEvent) {
554231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // Give focus to the plugin on click
555231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (Page* page = m_parentFrame->page())
556231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            page->focusController()->setActive(true);
557231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
558231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        focusPluginElement();
559231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
560231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
561231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    XEvent npEvent;
562231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    initXEvent(&npEvent);
563231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
564231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    IntPoint postZoomPos = roundedIntPoint(m_element->renderer()->absoluteToLocal(event->absoluteLocation()));
565231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
566231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (event->type() == eventNames().mousedownEvent || event->type() == eventNames().mouseupEvent)
567231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        setXButtonEventSpecificFields(&npEvent, event, postZoomPos);
568231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else if (event->type() == eventNames().mousemoveEvent)
569231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        setXMotionEventSpecificFields(&npEvent, event, postZoomPos);
570231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else if (event->type() == eventNames().mouseoutEvent || event->type() == eventNames().mouseoverEvent)
571231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        setXCrossingEventSpecificFields(&npEvent, event, postZoomPos);
572231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else
573231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
574231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
575231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!dispatchNPEvent(npEvent))
576231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        event->setDefaultHandled();
577231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
578231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
579231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::handleFocusInEvent()
580231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
581231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    XEvent npEvent;
582231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    initXEvent(&npEvent);
583231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
584231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    XFocusChangeEvent& event = npEvent.xfocus;
585231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    event.type = 9; /* int as Qt unsets FocusIn */
586231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    event.mode = NotifyNormal;
587231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    event.detail = NotifyDetailNone;
588231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
589231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    dispatchNPEvent(npEvent);
590231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
591231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
592231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::handleFocusOutEvent()
593231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
594231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    XEvent npEvent;
595231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    initXEvent(&npEvent);
596231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
597231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    XFocusChangeEvent& event = npEvent.xfocus;
598231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    event.type = 10; /* int as Qt unsets FocusOut */
599231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    event.mode = NotifyNormal;
600231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    event.detail = NotifyDetailNone;
601231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
602231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    dispatchNPEvent(npEvent);
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::setParent(ScrollView* parent)
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Widget::setParent(parent);
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parent)
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        init();
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid PluginView::setNPWindowRect(const IntRect&)
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
615231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_isWindowed)
616231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        setNPWindowIfNeeded();
6175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid PluginView::setNPWindowIfNeeded()
6205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
6215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!m_isStarted || !parent() || !m_plugin->pluginFuncs()->setwindow)
6225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return;
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
624cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // If the plugin didn't load sucessfully, no point in calling setwindow
625cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (m_status != PluginStatusLoadedSuccessfully)
626cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
627cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
6285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // On Unix, only call plugin if it's full-page or windowed
6295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (m_mode != NP_FULL && m_mode != NP_EMBED)
6305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return;
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
632cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // Check if the platformPluginWidget still exists
633cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (m_isWindowed && !platformPluginWidget())
634cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
635cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
6365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!m_hasPendingGeometryChange)
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_hasPendingGeometryChange = false;
6395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
640231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_isWindowed) {
641231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        platformPluginWidget()->setGeometry(m_windowRect);
6422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // Cut out areas of the plugin occluded by iframe shims
6442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        Vector<IntRect> cutOutRects;
6452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        QRegion clipRegion = QRegion(m_clipRect);
6462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        getPluginOcclusions(m_element, this->parent(), frameRect(), cutOutRects);
6472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        for (size_t i = 0; i < cutOutRects.size(); i++) {
6482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            cutOutRects[i].move(-frameRect().x(), -frameRect().y());
6492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            clipRegion = clipRegion.subtracted(QRegion(cutOutRects[i]));
6502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
651231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // if setMask is set with an empty QRegion, no clipping will
652231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // be performed, so in that case we hide the plugin view
6532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        platformPluginWidget()->setVisible(!clipRegion.isEmpty());
6542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        platformPluginWidget()->setMask(clipRegion);
655231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
656231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.x = m_windowRect.x();
657231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.y = m_windowRect.y();
658231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else {
659231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.x = 0;
660231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.y = 0;
6615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
662231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // If the width or height are null, set the clipRect to null, indicating that
6645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // the plugin is not visible/scrolled out.
6655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!m_clipRect.width() || !m_clipRect.height()) {
666231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.clipRect.left = 0;
667231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.clipRect.right = 0;
6685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_npWindow.clipRect.top = 0;
669231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.clipRect.bottom = 0;
6705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    } else {
6715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        // Clipping rectangle of the plug-in; the origin is the top left corner of the drawable or window.
6725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_npWindow.clipRect.left = m_npWindow.x + m_clipRect.x();
6735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_npWindow.clipRect.top = m_npWindow.y + m_clipRect.y();
6745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_npWindow.clipRect.right = m_npWindow.x + m_clipRect.x() + m_clipRect.width();
6755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_npWindow.clipRect.bottom = m_npWindow.y + m_clipRect.y() + m_clipRect.height();
676231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
6775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
678ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_plugin->quirks().contains(PluginQuirkDontCallSetWindowMoreThanOnce)) {
679ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        // FLASH WORKAROUND: Only set initially. Multiple calls to
680ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        // setNPWindow() cause the plugin to crash in windowed mode.
681ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (!m_isWindowed || m_npWindow.width == -1 || m_npWindow.height == -1) {
682ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_npWindow.width = m_windowRect.width();
683ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_npWindow.height = m_windowRect.height();
684ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        }
685ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    } else {
6865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        m_npWindow.width = m_windowRect.width();
6875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        m_npWindow.height = m_windowRect.height();
6885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    PluginView::setCurrentPluginView(this);
69168513a70bcd92384395513322f1b801e7bf9c729Steve Block#if USE(JSC)
6920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
69368513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
6945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    setCallingPlugin(true);
6955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow);
6965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    setCallingPlugin(false);
6975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    PluginView::setCurrentPluginView(0);
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::setParentVisible(bool visible)
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isParentVisible() == visible)
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Widget::setParentVisible(visible);
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isSelfVisible() && platformPluginWidget())
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        platformPluginWidget()->setVisible(visible);
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
71121939df44de1705786c545cd1bf519d47250322dBen MurdochNPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32_t len, const char* buf)
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String filename(buf, len);
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (filename.startsWith("file:///"))
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        filename = filename.substring(8);
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
718d0825bca7fe65beaee391d30da42e937db621564Steve Block    long long size;
719d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!getFileSize(filename, size))
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NPERR_FILE_NOT_FOUND;
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FILE* fileHandle = fopen((filename.utf8()).data(), "r");
7230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!fileHandle)
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NPERR_FILE_NOT_FOUND;
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
726d0825bca7fe65beaee391d30da42e937db621564Steve Block    buffer.resize(size);
727d0825bca7fe65beaee391d30da42e937db621564Steve Block    int bytesRead = fread(buffer.data(), 1, size, fileHandle);
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fclose(fileHandle);
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (bytesRead <= 0)
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NPERR_FILE_NOT_FOUND;
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NPERR_NO_ERROR;
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
737dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool PluginView::platformGetValueStatic(NPNVariable variable, void* value, NPError* result)
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (variable) {
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case NPNVToolkit:
74121939df44de1705786c545cd1bf519d47250322dBen Murdoch        *static_cast<uint32_t*>(value) = 0;
742dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *result = NPERR_NO_ERROR;
743dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case NPNVSupportsXEmbedBool:
7468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        *static_cast<NPBool*>(value) = true;
747dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *result = NPERR_NO_ERROR;
748dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case NPNVjavascriptEnabledBool:
7518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        *static_cast<NPBool*>(value) = true;
752dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *result = NPERR_NO_ERROR;
753dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
755231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case NPNVSupportsWindowless:
756231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        *static_cast<NPBool*>(value) = true;
757dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *result = NPERR_NO_ERROR;
758dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
759231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
760bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if defined(MOZ_PLATFORM_MAEMO) && (MOZ_PLATFORM_MAEMO >= 5)
761f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    case NPNVSupportsWindowlessLocal:
762f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        *static_cast<NPBool*>(value) = true;
763f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        *result = NPERR_NO_ERROR;
764f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return true;
765f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#endif
766f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
768dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
772dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool PluginView::platformGetValue(NPNVariable variable, void* value, NPError* result)
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (variable) {
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case NPNVxDisplay:
776cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        *(void **)value = QX11Info::display();
777dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *result = NPERR_NO_ERROR;
778dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case NPNVxtAppContext:
781dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *result = NPERR_GENERIC_ERROR;
782dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case NPNVnetscapeWindow: {
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void* w = reinterpret_cast<void*>(value);
786cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
787cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        *((XID *)w) = client ? client->ownerWidget()->window()->winId() : 0;
788dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *result = NPERR_NO_ERROR;
789dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
792635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    case NPNVToolkit:
793635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (m_plugin->quirks().contains(PluginQuirkRequiresGtkToolKit)) {
79421939df44de1705786c545cd1bf519d47250322dBen Murdoch            *((uint32_t *)value) = 2;
795dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            *result = NPERR_NO_ERROR;
796dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return true;
797635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
798dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
799dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
801dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::invalidateRect(const IntRect& rect)
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
80728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#if USE(ACCELERATED_COMPOSITING) && !USE(TEXTURE_MAPPER)
808a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (m_platformLayer) {
809a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_platformLayer->update(QRectF(rect));
810a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
811a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
812a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
813a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
814231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_isWindowed) {
8152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (platformWidget()) {
8162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            // update() will schedule a repaint of the widget so ensure
8172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            // its knowledge of its position on the page is up to date.
8182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            platformWidget()->setGeometry(m_windowRect);
819d0825bca7fe65beaee391d30da42e937db621564Steve Block            platformWidget()->update(rect);
8202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    invalidateWindowlessPluginRect(rect);
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::invalidateRect(NPRect* rect)
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
829231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!rect) {
830231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        invalidate();
831231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
832231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
833cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    IntRect r(rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top);
834a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    invalidateRect(r);
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::invalidateRegion(NPRegion region)
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
839a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    Q_UNUSED(region);
840231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    invalidate();
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::forceRedraw()
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
845231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    invalidate();
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic Display *getPluginDisplay()
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
850231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // The plugin toolkit might run using a different X connection. At the moment, we only
851231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // support gdk based plugins (like flash) that use a different X connection.
852231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // The code below has the same effect as this one:
853231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Display *gdkDisplay = gdk_x11_display_get_xdisplay(gdk_display_get_default());
8542bde8e466a4451c7319e3a072d118917957d6554Steve Block    QLibrary library(QLatin1String("libgdk-x11-2.0"), 0);
855231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!library.load())
856231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return 0;
857231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
858231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    typedef void *(*gdk_display_get_default_ptr)();
859231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gdk_display_get_default_ptr gdk_display_get_default = (gdk_display_get_default_ptr)library.resolve("gdk_display_get_default");
860231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!gdk_display_get_default)
861231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return 0;
862231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
863231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    typedef void *(*gdk_x11_display_get_xdisplay_ptr)(void *);
864231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    gdk_x11_display_get_xdisplay_ptr gdk_x11_display_get_xdisplay = (gdk_x11_display_get_xdisplay_ptr)library.resolve("gdk_x11_display_get_xdisplay");
865231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!gdk_x11_display_get_xdisplay)
866231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return 0;
867231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
868231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return (Display*)gdk_x11_display_get_xdisplay(gdk_display_get_default());
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
871231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic void getVisualAndColormap(int depth, Visual **visual, Colormap *colormap)
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
873231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    *visual = 0;
874231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    *colormap = 0;
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
876231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef QT_NO_XRENDER
877231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    static const bool useXRender = qgetenv("QT_X11_NO_XRENDER").isNull(); // Should also check for XRender >= 0.5
878231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else
879231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    static const bool useXRender = false;
880231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
8815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
882231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!useXRender && depth == 32)
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
885231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    int nvi;
886231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    XVisualInfo templ;
887231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    templ.screen  = QX11Info::appScreen();
888231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    templ.depth   = depth;
889231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    templ.c_class = TrueColor;
890231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    XVisualInfo* xvi = XGetVisualInfo(QX11Info::display(), VisualScreenMask | VisualDepthMask | VisualClassMask, &templ, &nvi);
8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
892231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!xvi)
8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
894231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
895231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef QT_NO_XRENDER
896231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (depth == 32) {
897231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        for (int idx = 0; idx < nvi; ++idx) {
898231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            XRenderPictFormat* format = XRenderFindVisualFormat(QX11Info::display(), xvi[idx].visual);
899231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (format->type == PictTypeDirect && format->direct.alphaMask) {
900231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 *visual = xvi[idx].visual;
901231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                 break;
902231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            }
903231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block         }
904231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else
905231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif // QT_NO_XRENDER
906231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        *visual = xvi[0].visual;
907231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
908231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    XFree(xvi);
909231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
910231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (*visual)
911231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        *colormap = XCreateColormap(QX11Info::display(), QX11Info::appRootWindow(), *visual, AllocNone);
912231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
913231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
914231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool PluginView::platformStart()
915231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
916231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(m_isStarted);
917231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(m_status == PluginStatusLoadedSuccessfully);
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_plugin->pluginFuncs()->getvalue) {
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PluginView::setCurrentPluginView(this);
92168513a70bcd92384395513322f1b801e7bf9c729Steve Block#if USE(JSC)
9220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
92368513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setCallingPlugin(true);
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_plugin->pluginFuncs()->getvalue(m_instance, NPPVpluginNeedsXEmbed, &m_needsXEmbed);
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setCallingPlugin(false);
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PluginView::setCurrentPluginView(0);
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
930231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_isWindowed) {
931cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient();
932cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (m_needsXEmbed && client) {
933cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            setPlatformWidget(new PluginContainerQt(this, client->ownerWidget()));
934231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            // sync our XEmbed container window creation before sending the xid to plugins.
935231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            QApplication::syncX();
936231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } else {
937231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            notImplemented();
938231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            m_status = PluginStatusCanNotLoadPlugin;
939231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return false;
940231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
942231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        setPlatformWidget(0);
943231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_pluginDisplay = getPluginDisplay();
944a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
94528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#if USE(ACCELERATED_COMPOSITING) && !USE(TEXTURE_MAPPER)
946a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (m_parentFrame->page()->chrome()->client()->allowsAcceleratedCompositing()
947a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            && m_parentFrame->page()->settings()
948a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            && m_parentFrame->page()->settings()->acceleratedCompositingEnabled()) {
949a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_platformLayer = new PluginGraphicsLayerQt(this);
950a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // Trigger layer computation in RenderLayerCompositor
951a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_element->setNeedsStyleRecalc(SyntheticStyleChange);
952a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
953a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
95681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // If the width and the height are not zero we show the PluginView.
95781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!frameRect().isEmpty())
95881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        show();
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
960231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    NPSetWindowCallbackStruct* wsi = new NPSetWindowCallbackStruct();
9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wsi->type = 0;
9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
963231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_isWindowed) {
964231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        const QX11Info* x11Info = &platformPluginWidget()->x11Info();
965231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
966231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        wsi->display = x11Info->display();
967231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        wsi->visual = (Visual*)x11Info->visual();
968231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        wsi->depth = x11Info->depth();
969231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        wsi->colormap = x11Info->colormap();
970231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
971231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.type = NPWindowTypeWindow;
972231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.window = (void*)platformPluginWidget()->winId();
973231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.width = -1;
974231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.height = -1;
975231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else {
976231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        const QX11Info* x11Info = &QApplication::desktop()->x11Info();
977231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
978231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (x11Info->depth() == 32 || !m_plugin->quirks().contains(PluginQuirkRequiresDefaultScreenDepth)) {
979231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            getVisualAndColormap(32, &m_visual, &m_colormap);
980231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            wsi->depth = 32;
981231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
982231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
983231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!m_visual) {
984231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            getVisualAndColormap(x11Info->depth(), &m_visual, &m_colormap);
985231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            wsi->depth = x11Info->depth();
986231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
987231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
988231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        wsi->display = x11Info->display();
989231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        wsi->visual = m_visual;
990231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        wsi->colormap = m_colormap;
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
992231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.type = NPWindowTypeDrawable;
993231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.window = 0; // Not used?
994231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.x = 0;
995231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.y = 0;
996231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.width = -1;
997231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_npWindow.height = -1;
998231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
999231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1000231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_npWindow.ws_info = wsi;
10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!(m_plugin->quirks().contains(PluginQuirkDeferFirstSetWindowCall))) {
10035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        updatePluginWidget();
10045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        setNPWindowIfNeeded();
10055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1007231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return true;
10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1010231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::platformDestroy()
1011231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1012231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (platformPluginWidget())
1013231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        delete platformPluginWidget();
1014231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1015231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_drawable)
1016231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        XFreePixmap(QX11Info::display(), m_drawable);
1017231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1018231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_colormap)
1019231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        XFreeColormap(QX11Info::display(), m_colormap);
1020231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1021231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1022231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::halt()
10230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1026231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::restart()
1027231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1028231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1029a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1030a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if USE(ACCELERATED_COMPOSITING)
1031a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochPlatformLayer* PluginView::platformLayer() const
1032a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
1033a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return m_platformLayer.get();
1034a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
1035a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
10360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
1038