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