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. 4d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2009, 2010 Kakai, Inc. <brian@kakai.com> 5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2010 Igalia S.L. 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginView.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3253733164eb6cabab5a1eddcabb42e4ce27eb0e44Ben Murdoch#include "BridgeJSC.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DocumentLoader.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Element.h" 365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "FocusController.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoadRequest.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h" 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h" 4306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "GtkVersioning.h" 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h" 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLPlugInElement.h" 46d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "HostWindow.h" 47d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "Image.h" 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "KeyboardEvent.h" 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MouseEvent.h" 502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "NotImplemented.h" 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h" 522bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "PlatformContextCairo.h" 53d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "PlatformKeyboardEvent.h" 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformMouseEvent.h" 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginDebug.h" 565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "PluginMainThreadScheduler.h" 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginPackage.h" 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderLayer.h" 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h" 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSDOMBinding.h" 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ScriptController.h" 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "npruntime_impl.h" 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "runtime_root.h" 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <runtime/JSLock.h> 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <runtime/JSValue.h> 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 67f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#ifdef GTK_API_VERSION_2 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <gdkconfig.h> 69f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <gtk/gtk.h> 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if defined(XP_UNIX) 7328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "RefPtrCairo.h" 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "gtk2xtbin.h" 75d0825bca7fe65beaee391d30da42e937db621564Steve Block#define Bool int // this got undefined somewhere 76d0825bca7fe65beaee391d30da42e937db621564Steve Block#define Status int // ditto 77d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <X11/extensions/Xrender.h> 78d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <cairo/cairo-xlib.h> 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <gdk/gdkx.h> 80231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#elif defined(GDK_WINDOWING_WIN32) 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginMessageThrottlerWin.h" 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <gdk/gdkwin32.h> 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing JSC::ExecState; 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing JSC::Interpreter; 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing JSC::JSLock; 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing JSC::JSObject; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing JSC::UString; 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing std::min; 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WTF; 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool PluginView::dispatchNPEvent(NPEvent& event) 1008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 1018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // sanity check 1028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!m_plugin->pluginFuncs()->event) 1038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return false; 1048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian PluginView::setCurrentPluginView(this); 1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly); 1078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian setCallingPlugin(true); 1088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool accepted = m_plugin->pluginFuncs()->event(m_instance, &event); 1108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian setCallingPlugin(false); 1128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian PluginView::setCurrentPluginView(0); 1138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return accepted; 1148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 1158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 116d0825bca7fe65beaee391d30da42e937db621564Steve Block#if defined(XP_UNIX) 117d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic Window getRootWindow(Frame* parentFrame) 118d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 119d0825bca7fe65beaee391d30da42e937db621564Steve Block GtkWidget* parentWidget = parentFrame->view()->hostWindow()->platformPageClient(); 120d0825bca7fe65beaee391d30da42e937db621564Steve Block GdkScreen* gscreen = gtk_widget_get_screen(parentWidget); 121d0825bca7fe65beaee391d30da42e937db621564Steve Block return GDK_WINDOW_XWINDOW(gdk_screen_get_root_window(gscreen)); 122d0825bca7fe65beaee391d30da42e937db621564Steve Block} 123d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 124d0825bca7fe65beaee391d30da42e937db621564Steve Block 125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::updatePluginWidget() 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 127d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!parent()) 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(parent()->isFrameView()); 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameView* frameView = static_cast<FrameView*>(parent()); 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect oldWindowRect = m_windowRect; 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect oldClipRect = m_clipRect; 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_windowRect = IntRect(frameView->contentsToWindow(frameRect().location()), frameRect().size()); 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_clipRect = windowClipRect(); 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_clipRect.move(-m_windowRect.x(), -m_windowRect.y()); 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_windowRect == oldWindowRect && m_clipRect == oldClipRect) 141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 142d0825bca7fe65beaee391d30da42e937db621564Steve Block 143d0825bca7fe65beaee391d30da42e937db621564Steve Block#if defined(XP_UNIX) 144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_isWindowed) { 145a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch Display* display = GDK_DISPLAY_XDISPLAY(gdk_display_get_default()); 146d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_drawable) 147a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch XFreePixmap(display, m_drawable); 148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 149a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_drawable = XCreatePixmap(display, getRootWindow(m_parentFrame.get()), 150d0825bca7fe65beaee391d30da42e937db621564Steve Block m_windowRect.width(), m_windowRect.height(), 151d0825bca7fe65beaee391d30da42e937db621564Steve Block ((NPSetWindowCallbackStruct*)m_npWindow.ws_info)->depth); 152a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch XSync(display, false); // make sure that the server knows about the Drawable 153d0825bca7fe65beaee391d30da42e937db621564Steve Block } 154d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 155d0825bca7fe65beaee391d30da42e937db621564Steve Block 156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block setNPWindowIfNeeded(); 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15921939df44de1705786c545cd1bf519d47250322dBen Murdochvoid PluginView::setFocus(bool focused) 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 161692e5dbf12901edacf14812a6fae25462920af42Steve Block ASSERT(platformPluginWidget() == platformWidget()); 16221939df44de1705786c545cd1bf519d47250322dBen Murdoch Widget::setFocus(focused); 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::show() 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 167692e5dbf12901edacf14812a6fae25462920af42Steve Block ASSERT(platformPluginWidget() == platformWidget()); 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Widget::show(); 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::hide() 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 173692e5dbf12901edacf14812a6fae25462920af42Steve Block ASSERT(platformPluginWidget() == platformWidget()); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Widget::hide(); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::paint(GraphicsContext* context, const IntRect& rect) 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_isStarted) { 180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project paintMissingPluginIcon(context, rect); 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (context->paintingDisabled()) 1858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 1868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian setNPWindowIfNeeded(); 1888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_isWindowed) 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 192d0825bca7fe65beaee391d30da42e937db621564Steve Block#if defined(XP_UNIX) 193d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!m_drawable) 194d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 196a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch Display* display = GDK_DISPLAY_XDISPLAY(gdk_display_get_default()); 197a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch const bool syncX = m_pluginDisplay && m_pluginDisplay != display; 198d0825bca7fe65beaee391d30da42e937db621564Steve Block 199d0825bca7fe65beaee391d30da42e937db621564Steve Block IntRect exposedRect(rect); 200d0825bca7fe65beaee391d30da42e937db621564Steve Block exposedRect.intersect(frameRect()); 201d0825bca7fe65beaee391d30da42e937db621564Steve Block exposedRect.move(-frameRect().x(), -frameRect().y()); 202d0825bca7fe65beaee391d30da42e937db621564Steve Block 20328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu RefPtr<cairo_surface_t> drawableSurface = adoptRef(cairo_xlib_surface_create(display, 20428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_drawable, 20528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_visual, 20628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_windowRect.width(), 20728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_windowRect.height())); 208a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 209a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (m_isTransparent) { 210d0825bca7fe65beaee391d30da42e937db621564Steve Block // If we have a 32 bit drawable and the plugin wants transparency, 211d0825bca7fe65beaee391d30da42e937db621564Steve Block // we'll clear the exposed area to transparent first. Otherwise, 212d0825bca7fe65beaee391d30da42e937db621564Steve Block // we'd end up with junk in there from the last paint, or, worse, 213d0825bca7fe65beaee391d30da42e937db621564Steve Block // uninitialized data. 21428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu RefPtr<cairo_t> cr = adoptRef(cairo_create(drawableSurface.get())); 215d0825bca7fe65beaee391d30da42e937db621564Steve Block 216a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (!(cairo_surface_get_content(drawableSurface.get()) & CAIRO_CONTENT_ALPHA)) { 217a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Attempt to fake it when we don't have an alpha channel on our 218a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // pixmap. If that's not possible, at least clear the window to 219a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // avoid drawing artifacts. 220d0825bca7fe65beaee391d30da42e937db621564Steve Block 221a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // This Would not work without double buffering, but we always use it. 2222bde8e466a4451c7319e3a072d118917957d6554Steve Block cairo_set_source_surface(cr.get(), cairo_get_group_target(context->platformContext()->cr()), 223a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch -m_windowRect.x(), -m_windowRect.y()); 224a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch cairo_set_operator(cr.get(), CAIRO_OPERATOR_SOURCE); 225a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch } else 226a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch cairo_set_operator(cr.get(), CAIRO_OPERATOR_CLEAR); 227d0825bca7fe65beaee391d30da42e937db621564Steve Block 228a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch cairo_rectangle(cr.get(), exposedRect.x(), exposedRect.y(), 229a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch exposedRect.width(), exposedRect.height()); 230a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch cairo_fill(cr.get()); 231d0825bca7fe65beaee391d30da42e937db621564Steve Block } 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 233d0825bca7fe65beaee391d30da42e937db621564Steve Block XEvent xevent; 234d0825bca7fe65beaee391d30da42e937db621564Steve Block memset(&xevent, 0, sizeof(XEvent)); 235d0825bca7fe65beaee391d30da42e937db621564Steve Block XGraphicsExposeEvent& exposeEvent = xevent.xgraphicsexpose; 236d0825bca7fe65beaee391d30da42e937db621564Steve Block exposeEvent.type = GraphicsExpose; 237a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch exposeEvent.display = display; 238d0825bca7fe65beaee391d30da42e937db621564Steve Block exposeEvent.drawable = m_drawable; 239d0825bca7fe65beaee391d30da42e937db621564Steve Block exposeEvent.x = exposedRect.x(); 240d0825bca7fe65beaee391d30da42e937db621564Steve Block exposeEvent.y = exposedRect.y(); 241d0825bca7fe65beaee391d30da42e937db621564Steve Block exposeEvent.width = exposedRect.x() + exposedRect.width(); // flash bug? it thinks width is the right in transparent mode 242d0825bca7fe65beaee391d30da42e937db621564Steve Block exposeEvent.height = exposedRect.y() + exposedRect.height(); // flash bug? it thinks height is the bottom in transparent mode 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 244d0825bca7fe65beaee391d30da42e937db621564Steve Block dispatchNPEvent(xevent); 245d0825bca7fe65beaee391d30da42e937db621564Steve Block 246d0825bca7fe65beaee391d30da42e937db621564Steve Block if (syncX) 24768513a70bcd92384395513322f1b801e7bf9c729Steve Block XSync(m_pluginDisplay, false); // sync changes by plugin 248d0825bca7fe65beaee391d30da42e937db621564Steve Block 2492bde8e466a4451c7319e3a072d118917957d6554Steve Block cairo_t* cr = context->platformContext()->cr(); 250d0825bca7fe65beaee391d30da42e937db621564Steve Block cairo_save(cr); 251d0825bca7fe65beaee391d30da42e937db621564Steve Block 252a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch cairo_set_source_surface(cr, drawableSurface.get(), frameRect().x(), frameRect().y()); 253d0825bca7fe65beaee391d30da42e937db621564Steve Block 254d0825bca7fe65beaee391d30da42e937db621564Steve Block cairo_rectangle(cr, 255d0825bca7fe65beaee391d30da42e937db621564Steve Block frameRect().x() + exposedRect.x(), frameRect().y() + exposedRect.y(), 256d0825bca7fe65beaee391d30da42e937db621564Steve Block exposedRect.width(), exposedRect.height()); 257d0825bca7fe65beaee391d30da42e937db621564Steve Block cairo_clip(cr); 258d0825bca7fe65beaee391d30da42e937db621564Steve Block 259d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_isTransparent) 260d0825bca7fe65beaee391d30da42e937db621564Steve Block cairo_set_operator(cr, CAIRO_OPERATOR_OVER); 261d0825bca7fe65beaee391d30da42e937db621564Steve Block else 262d0825bca7fe65beaee391d30da42e937db621564Steve Block cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); 263d0825bca7fe65beaee391d30da42e937db621564Steve Block cairo_paint(cr); 264d0825bca7fe65beaee391d30da42e937db621564Steve Block 265d0825bca7fe65beaee391d30da42e937db621564Steve Block cairo_restore(cr); 266d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif // defined(XP_UNIX) 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::handleKeyboardEvent(KeyboardEvent* event) 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly); 272d0825bca7fe65beaee391d30da42e937db621564Steve Block 273d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_isWindowed) 274d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 275d0825bca7fe65beaee391d30da42e937db621564Steve Block 276d0825bca7fe65beaee391d30da42e937db621564Steve Block if (event->type() != eventNames().keydownEvent && event->type() != eventNames().keyupEvent) 277d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 278d0825bca7fe65beaee391d30da42e937db621564Steve Block 279d0825bca7fe65beaee391d30da42e937db621564Steve Block NPEvent xEvent; 280d0825bca7fe65beaee391d30da42e937db621564Steve Block#if defined(XP_UNIX) 2815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick initXEvent(&xEvent); 282d0825bca7fe65beaee391d30da42e937db621564Steve Block GdkEventKey* gdkEvent = event->keyEvent()->gdkEventKey(); 283d0825bca7fe65beaee391d30da42e937db621564Steve Block 284d0825bca7fe65beaee391d30da42e937db621564Steve Block xEvent.type = (event->type() == eventNames().keydownEvent) ? 2 : 3; // KeyPress/Release get unset somewhere 2858a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block xEvent.xkey.root = getRootWindow(m_parentFrame.get()); 286d0825bca7fe65beaee391d30da42e937db621564Steve Block xEvent.xkey.subwindow = 0; // we have no child window 287d0825bca7fe65beaee391d30da42e937db621564Steve Block xEvent.xkey.time = event->timeStamp(); 288d0825bca7fe65beaee391d30da42e937db621564Steve Block xEvent.xkey.state = gdkEvent->state; // GdkModifierType mirrors xlib state masks 2894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang xEvent.xkey.keycode = gdkEvent->hardware_keycode; 290d0825bca7fe65beaee391d30da42e937db621564Steve Block xEvent.xkey.same_screen = true; 291d0825bca7fe65beaee391d30da42e937db621564Steve Block 292d0825bca7fe65beaee391d30da42e937db621564Steve Block // NOTE: As the XEvents sent to the plug-in are synthesized and there is not a native window 293d0825bca7fe65beaee391d30da42e937db621564Steve Block // corresponding to the plug-in rectangle, some of the members of the XEvent structures are not 294d0825bca7fe65beaee391d30da42e937db621564Steve Block // set to their normal Xserver values. e.g. Key events don't have a position. 295d0825bca7fe65beaee391d30da42e937db621564Steve Block // source: https://developer.mozilla.org/en/NPEvent 296d0825bca7fe65beaee391d30da42e937db621564Steve Block xEvent.xkey.x = 0; 297d0825bca7fe65beaee391d30da42e937db621564Steve Block xEvent.xkey.y = 0; 298d0825bca7fe65beaee391d30da42e937db621564Steve Block xEvent.xkey.x_root = 0; 299d0825bca7fe65beaee391d30da42e937db621564Steve Block xEvent.xkey.y_root = 0; 300d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 301d0825bca7fe65beaee391d30da42e937db621564Steve Block 302d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!dispatchNPEvent(xEvent)) 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event->setDefaultHandled(); 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 306d0825bca7fe65beaee391d30da42e937db621564Steve Block#if defined(XP_UNIX) 307d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic unsigned int inputEventState(MouseEvent* event) 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 309d0825bca7fe65beaee391d30da42e937db621564Steve Block unsigned int state = 0; 310d0825bca7fe65beaee391d30da42e937db621564Steve Block if (event->ctrlKey()) 311d0825bca7fe65beaee391d30da42e937db621564Steve Block state |= ControlMask; 312d0825bca7fe65beaee391d30da42e937db621564Steve Block if (event->shiftKey()) 313d0825bca7fe65beaee391d30da42e937db621564Steve Block state |= ShiftMask; 314d0825bca7fe65beaee391d30da42e937db621564Steve Block if (event->altKey()) 315d0825bca7fe65beaee391d30da42e937db621564Steve Block state |= Mod1Mask; 316d0825bca7fe65beaee391d30da42e937db621564Steve Block if (event->metaKey()) 317d0825bca7fe65beaee391d30da42e937db621564Steve Block state |= Mod4Mask; 318d0825bca7fe65beaee391d30da42e937db621564Steve Block return state; 319d0825bca7fe65beaee391d30da42e937db621564Steve Block} 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 321d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid PluginView::initXEvent(XEvent* xEvent) 322d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 323d0825bca7fe65beaee391d30da42e937db621564Steve Block memset(xEvent, 0, sizeof(XEvent)); 324d0825bca7fe65beaee391d30da42e937db621564Steve Block 325d0825bca7fe65beaee391d30da42e937db621564Steve Block xEvent->xany.serial = 0; // we are unaware of the last request processed by X Server 326d0825bca7fe65beaee391d30da42e937db621564Steve Block xEvent->xany.send_event = false; 327d0825bca7fe65beaee391d30da42e937db621564Steve Block GtkWidget* widget = m_parentFrame->view()->hostWindow()->platformPageClient(); 32881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch xEvent->xany.display = GDK_DISPLAY_XDISPLAY(gtk_widget_get_display(widget)); 32981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 33081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Mozilla also sends None here for windowless plugins. See nsObjectFrame.cpp in the Mozilla sources. 33181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // This method also sets up FocusIn and FocusOut events for windows plugins, but Mozilla doesn't 33281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // even send these types of events to windowed plugins. In the future, it may be good to only 33381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // send them to windowless plugins. 33481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch xEvent->xany.window = None; 335d0825bca7fe65beaee391d30da42e937db621564Steve Block} 336d0825bca7fe65beaee391d30da42e937db621564Steve Block 337d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic void setXButtonEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos, Frame* parentFrame) 338d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 339d0825bca7fe65beaee391d30da42e937db621564Steve Block XButtonEvent& xbutton = xEvent->xbutton; 340d0825bca7fe65beaee391d30da42e937db621564Steve Block xbutton.type = event->type() == eventNames().mousedownEvent ? ButtonPress : ButtonRelease; 341d0825bca7fe65beaee391d30da42e937db621564Steve Block xbutton.root = getRootWindow(parentFrame); 342d0825bca7fe65beaee391d30da42e937db621564Steve Block xbutton.subwindow = 0; 343d0825bca7fe65beaee391d30da42e937db621564Steve Block xbutton.time = event->timeStamp(); 344d0825bca7fe65beaee391d30da42e937db621564Steve Block xbutton.x = postZoomPos.x(); 345d0825bca7fe65beaee391d30da42e937db621564Steve Block xbutton.y = postZoomPos.y(); 346d0825bca7fe65beaee391d30da42e937db621564Steve Block xbutton.x_root = event->screenX(); 347d0825bca7fe65beaee391d30da42e937db621564Steve Block xbutton.y_root = event->screenY(); 348d0825bca7fe65beaee391d30da42e937db621564Steve Block xbutton.state = inputEventState(event); 349d0825bca7fe65beaee391d30da42e937db621564Steve Block switch (event->button()) { 350d0825bca7fe65beaee391d30da42e937db621564Steve Block case MiddleButton: 351d0825bca7fe65beaee391d30da42e937db621564Steve Block xbutton.button = Button2; 352d0825bca7fe65beaee391d30da42e937db621564Steve Block break; 353d0825bca7fe65beaee391d30da42e937db621564Steve Block case RightButton: 354d0825bca7fe65beaee391d30da42e937db621564Steve Block xbutton.button = Button3; 355d0825bca7fe65beaee391d30da42e937db621564Steve Block break; 356d0825bca7fe65beaee391d30da42e937db621564Steve Block case LeftButton: 357d0825bca7fe65beaee391d30da42e937db621564Steve Block default: 358d0825bca7fe65beaee391d30da42e937db621564Steve Block xbutton.button = Button1; 359d0825bca7fe65beaee391d30da42e937db621564Steve Block break; 360d0825bca7fe65beaee391d30da42e937db621564Steve Block } 361d0825bca7fe65beaee391d30da42e937db621564Steve Block xbutton.same_screen = true; 362d0825bca7fe65beaee391d30da42e937db621564Steve Block} 363d0825bca7fe65beaee391d30da42e937db621564Steve Block 364d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic void setXMotionEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos, Frame* parentFrame) 365d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 366d0825bca7fe65beaee391d30da42e937db621564Steve Block XMotionEvent& xmotion = xEvent->xmotion; 367d0825bca7fe65beaee391d30da42e937db621564Steve Block xmotion.type = MotionNotify; 368d0825bca7fe65beaee391d30da42e937db621564Steve Block xmotion.root = getRootWindow(parentFrame); 369d0825bca7fe65beaee391d30da42e937db621564Steve Block xmotion.subwindow = 0; 370d0825bca7fe65beaee391d30da42e937db621564Steve Block xmotion.time = event->timeStamp(); 371d0825bca7fe65beaee391d30da42e937db621564Steve Block xmotion.x = postZoomPos.x(); 372d0825bca7fe65beaee391d30da42e937db621564Steve Block xmotion.y = postZoomPos.y(); 373d0825bca7fe65beaee391d30da42e937db621564Steve Block xmotion.x_root = event->screenX(); 374d0825bca7fe65beaee391d30da42e937db621564Steve Block xmotion.y_root = event->screenY(); 375d0825bca7fe65beaee391d30da42e937db621564Steve Block xmotion.state = inputEventState(event); 376d0825bca7fe65beaee391d30da42e937db621564Steve Block xmotion.is_hint = NotifyNormal; 377d0825bca7fe65beaee391d30da42e937db621564Steve Block xmotion.same_screen = true; 378d0825bca7fe65beaee391d30da42e937db621564Steve Block} 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 380d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic void setXCrossingEventSpecificFields(XEvent* xEvent, MouseEvent* event, const IntPoint& postZoomPos, Frame* parentFrame) 381d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 382d0825bca7fe65beaee391d30da42e937db621564Steve Block XCrossingEvent& xcrossing = xEvent->xcrossing; 383d0825bca7fe65beaee391d30da42e937db621564Steve Block xcrossing.type = event->type() == eventNames().mouseoverEvent ? EnterNotify : LeaveNotify; 384d0825bca7fe65beaee391d30da42e937db621564Steve Block xcrossing.root = getRootWindow(parentFrame); 385d0825bca7fe65beaee391d30da42e937db621564Steve Block xcrossing.subwindow = 0; 386d0825bca7fe65beaee391d30da42e937db621564Steve Block xcrossing.time = event->timeStamp(); 387d0825bca7fe65beaee391d30da42e937db621564Steve Block xcrossing.x = postZoomPos.y(); 388d0825bca7fe65beaee391d30da42e937db621564Steve Block xcrossing.y = postZoomPos.x(); 389d0825bca7fe65beaee391d30da42e937db621564Steve Block xcrossing.x_root = event->screenX(); 390d0825bca7fe65beaee391d30da42e937db621564Steve Block xcrossing.y_root = event->screenY(); 391d0825bca7fe65beaee391d30da42e937db621564Steve Block xcrossing.state = inputEventState(event); 392d0825bca7fe65beaee391d30da42e937db621564Steve Block xcrossing.mode = NotifyNormal; 393d0825bca7fe65beaee391d30da42e937db621564Steve Block xcrossing.detail = NotifyDetailNone; 394d0825bca7fe65beaee391d30da42e937db621564Steve Block xcrossing.same_screen = true; 395d0825bca7fe65beaee391d30da42e937db621564Steve Block xcrossing.focus = false; 396d0825bca7fe65beaee391d30da42e937db621564Steve Block} 397d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 399d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid PluginView::handleMouseEvent(MouseEvent* event) 400d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 4010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly); 402d0825bca7fe65beaee391d30da42e937db621564Steve Block 403d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_isWindowed) 404d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 405d0825bca7fe65beaee391d30da42e937db621564Steve Block 4065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (event->type() == eventNames().mousedownEvent) { 4075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (Page* page = m_parentFrame->page()) 4085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick page->focusController()->setActive(true); 4095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick focusPluginElement(); 4105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 4115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 412d0825bca7fe65beaee391d30da42e937db621564Steve Block NPEvent xEvent; 413d0825bca7fe65beaee391d30da42e937db621564Steve Block#if defined(XP_UNIX) 414d0825bca7fe65beaee391d30da42e937db621564Steve Block initXEvent(&xEvent); 415d0825bca7fe65beaee391d30da42e937db621564Steve Block 416d0825bca7fe65beaee391d30da42e937db621564Steve Block IntPoint postZoomPos = roundedIntPoint(m_element->renderer()->absoluteToLocal(event->absoluteLocation())); 417d0825bca7fe65beaee391d30da42e937db621564Steve Block 418d0825bca7fe65beaee391d30da42e937db621564Steve Block if (event->type() == eventNames().mousedownEvent || event->type() == eventNames().mouseupEvent) 4198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block setXButtonEventSpecificFields(&xEvent, event, postZoomPos, m_parentFrame.get()); 420d0825bca7fe65beaee391d30da42e937db621564Steve Block else if (event->type() == eventNames().mousemoveEvent) 4218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block setXMotionEventSpecificFields(&xEvent, event, postZoomPos, m_parentFrame.get()); 42281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch else if (event->type() == eventNames().mouseoutEvent || event->type() == eventNames().mouseoverEvent) { 4238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block setXCrossingEventSpecificFields(&xEvent, event, postZoomPos, m_parentFrame.get()); 42481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 42581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // This is a work-around for plugins which change the cursor. When that happens we 42681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // get out of sync with GDK somehow. Resetting the cursor here seems to fix the issue. 42781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (event->type() == eventNames().mouseoutEvent) 42881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch gdk_window_set_cursor(gtk_widget_get_window(m_parentFrame->view()->hostWindow()->platformPageClient()), 0); 42981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 430d0825bca7fe65beaee391d30da42e937db621564Steve Block else 431d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 432d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 433d0825bca7fe65beaee391d30da42e937db621564Steve Block 434d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!dispatchNPEvent(xEvent)) 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event->setDefaultHandled(); 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438d0825bca7fe65beaee391d30da42e937db621564Steve Block#if defined(XP_UNIX) 439d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid PluginView::handleFocusInEvent() 440d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 441d0825bca7fe65beaee391d30da42e937db621564Steve Block XEvent npEvent; 442d0825bca7fe65beaee391d30da42e937db621564Steve Block initXEvent(&npEvent); 443d0825bca7fe65beaee391d30da42e937db621564Steve Block 444d0825bca7fe65beaee391d30da42e937db621564Steve Block XFocusChangeEvent& event = npEvent.xfocus; 445d0825bca7fe65beaee391d30da42e937db621564Steve Block event.type = 9; // FocusIn gets unset somewhere 446d0825bca7fe65beaee391d30da42e937db621564Steve Block event.mode = NotifyNormal; 447d0825bca7fe65beaee391d30da42e937db621564Steve Block event.detail = NotifyDetailNone; 448d0825bca7fe65beaee391d30da42e937db621564Steve Block 449d0825bca7fe65beaee391d30da42e937db621564Steve Block dispatchNPEvent(npEvent); 450d0825bca7fe65beaee391d30da42e937db621564Steve Block} 451d0825bca7fe65beaee391d30da42e937db621564Steve Block 452d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid PluginView::handleFocusOutEvent() 453d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 454d0825bca7fe65beaee391d30da42e937db621564Steve Block XEvent npEvent; 455d0825bca7fe65beaee391d30da42e937db621564Steve Block initXEvent(&npEvent); 456d0825bca7fe65beaee391d30da42e937db621564Steve Block 457d0825bca7fe65beaee391d30da42e937db621564Steve Block XFocusChangeEvent& event = npEvent.xfocus; 458d0825bca7fe65beaee391d30da42e937db621564Steve Block event.type = 10; // FocusOut gets unset somewhere 459d0825bca7fe65beaee391d30da42e937db621564Steve Block event.mode = NotifyNormal; 460d0825bca7fe65beaee391d30da42e937db621564Steve Block event.detail = NotifyDetailNone; 461d0825bca7fe65beaee391d30da42e937db621564Steve Block 462d0825bca7fe65beaee391d30da42e937db621564Steve Block dispatchNPEvent(npEvent); 463d0825bca7fe65beaee391d30da42e937db621564Steve Block} 464d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 465d0825bca7fe65beaee391d30da42e937db621564Steve Block 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::setParent(ScrollView* parent) 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Widget::setParent(parent); 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (parent) 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project init(); 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid PluginView::setNPWindowRect(const IntRect&) 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 476d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!m_isWindowed) 477d0825bca7fe65beaee391d30da42e937db621564Steve Block setNPWindowIfNeeded(); 4788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid PluginView::setNPWindowIfNeeded() 4818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 4828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!m_isStarted || !parent() || !m_plugin->pluginFuncs()->setwindow) 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 485d0825bca7fe65beaee391d30da42e937db621564Steve Block // If the plugin didn't load sucessfully, no point in calling setwindow 486d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_status != PluginStatusLoadedSuccessfully) 487d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 488d0825bca7fe65beaee391d30da42e937db621564Steve Block 489d0825bca7fe65beaee391d30da42e937db621564Steve Block // On Unix, only call plugin's setwindow if it's full-page or windowed 490d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_mode != NP_FULL && m_mode != NP_EMBED) 491d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 493d0825bca7fe65beaee391d30da42e937db621564Steve Block // Check if the platformPluginWidget still exists 494d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_isWindowed && !platformPluginWidget()) 495d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 497d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_isWindowed) { 498d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.x = m_windowRect.x(); 499d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.y = m_windowRect.y(); 500d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.width = m_windowRect.width(); 501d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.height = m_windowRect.height(); 502d0825bca7fe65beaee391d30da42e937db621564Steve Block 503ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block m_npWindow.clipRect.left = max(0, m_clipRect.x()); 504ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block m_npWindow.clipRect.top = max(0, m_clipRect.y()); 505ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block m_npWindow.clipRect.right = m_clipRect.x() + m_clipRect.width(); 506ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block m_npWindow.clipRect.bottom = m_clipRect.y() + m_clipRect.height(); 507d0825bca7fe65beaee391d30da42e937db621564Steve Block } else { 508d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.x = 0; 509d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.y = 0; 510ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block m_npWindow.width = m_windowRect.width(); 511ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block m_npWindow.height = m_windowRect.height(); 512d0825bca7fe65beaee391d30da42e937db621564Steve Block 513d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.clipRect.left = 0; 514d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.clipRect.top = 0; 515d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.clipRect.right = 0; 516d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.clipRect.bottom = 0; 517d0825bca7fe65beaee391d30da42e937db621564Steve Block } 518d0825bca7fe65beaee391d30da42e937db621564Steve Block 5198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian PluginView::setCurrentPluginView(this); 5200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly); 5218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian setCallingPlugin(true); 5228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow); 5238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian setCallingPlugin(false); 5248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian PluginView::setCurrentPluginView(0); 525f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 52681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_isWindowed) 52781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 52881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 529f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if defined(XP_UNIX) 53081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // GtkXtBin will call gtk_widget_size_allocate, so we don't need to do it here. 53181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_needsXEmbed) { 53281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch gtk_xtbin_set_position(GTK_XTBIN(platformPluginWidget()), m_windowRect.x(), m_windowRect.y()); 53381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch gtk_xtbin_resize(platformPluginWidget(), m_windowRect.width(), m_windowRect.height()); 53481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 53581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 536f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif 53781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 53881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GtkAllocation allocation = { m_windowRect.x(), m_windowRect.y(), m_windowRect.width(), m_windowRect.height() }; 53981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 54081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // If the window has not been embedded yet (the plug added), we delay setting its allocation until 54181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // that point. This fixes issues with some Java plugin instances not rendering immediately. 54281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_plugAdded) { 54381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_delayedAllocation = allocation; 54481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 545f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 54681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch gtk_widget_size_allocate(platformPluginWidget(), &allocation); 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::setParentVisible(bool visible) 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isParentVisible() == visible) 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Widget::setParentVisible(visible); 5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isSelfVisible() && platformPluginWidget()) { 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (visible) 5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gtk_widget_show(platformPluginWidget()); 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gtk_widget_hide(platformPluginWidget()); 5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNPError PluginView::handlePostReadFile(Vector<char>& outputBuffer, uint32_t filenameLength, const char* filenameBuffer) 5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // There doesn't seem to be any documentation about what encoding the filename 5672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // is in, but most ports seem to assume UTF-8 here and the test plugin is definitely 5682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // sending the path in UTF-8 encoding. 5692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch CString filename(filenameBuffer, filenameLength); 5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch GRefPtr<GFile> file = adoptGRef(g_file_new_for_commandline_arg(filename.data())); 5722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (g_file_query_file_type(file.get(), G_FILE_QUERY_INFO_NONE, 0) != G_FILE_TYPE_REGULAR) 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NPERR_FILE_NOT_FOUND; 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch GRefPtr<GFileInfo> fileInfo = adoptGRef(g_file_query_info(file.get(), 5762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch G_FILE_ATTRIBUTE_STANDARD_SIZE, 5772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch G_FILE_QUERY_INFO_NONE, 5782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 0, 0)); 5792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!fileInfo) 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NPERR_FILE_NOT_FOUND; 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch GRefPtr<GFileInputStream> inputStream = adoptGRef(g_file_read(file.get(), 0, 0)); 5832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!inputStream) 5842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return NPERR_FILE_NOT_FOUND; 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch outputBuffer.resize(g_file_info_get_size(fileInfo.get())); 5872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch gsize bytesRead = 0; 5882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!g_input_stream_read_all(G_INPUT_STREAM(inputStream.get()), 5892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch outputBuffer.data(), outputBuffer.size(), &bytesRead, 0, 0)) 5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NPERR_FILE_NOT_FOUND; 5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NPERR_NO_ERROR; 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 595dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool PluginView::platformGetValueStatic(NPNVariable variable, void* value, NPError* result) 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (variable) { 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NPNVToolkit: 599231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if defined(XP_UNIX) 60021939df44de1705786c545cd1bf519d47250322dBen Murdoch *static_cast<uint32_t*>(value) = 2; 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 60221939df44de1705786c545cd1bf519d47250322dBen Murdoch *static_cast<uint32_t*>(value) = 0; 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 604dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *result = NPERR_NO_ERROR; 605dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return true; 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NPNVSupportsXEmbedBool: 608231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if defined(XP_UNIX) 6098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *static_cast<NPBool*>(value) = true; 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 6118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *static_cast<NPBool*>(value) = false; 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 613dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *result = NPERR_NO_ERROR; 614dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return true; 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NPNVjavascriptEnabledBool: 6178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *static_cast<NPBool*>(value) = true; 618dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *result = NPERR_NO_ERROR; 619dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return true; 6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 621d0825bca7fe65beaee391d30da42e937db621564Steve Block case NPNVSupportsWindowless: 622d0825bca7fe65beaee391d30da42e937db621564Steve Block#if defined(XP_UNIX) 623d0825bca7fe65beaee391d30da42e937db621564Steve Block *static_cast<NPBool*>(value) = true; 624d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 625d0825bca7fe65beaee391d30da42e937db621564Steve Block *static_cast<NPBool*>(value) = false; 626d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 627dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *result = NPERR_NO_ERROR; 628dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return true; 629d0825bca7fe65beaee391d30da42e937db621564Steve Block 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 631dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 635dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool PluginView::platformGetValue(NPNVariable variable, void* value, NPError* result) 6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (variable) { 6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NPNVxDisplay: 639231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if defined(XP_UNIX) 6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_needsXEmbed) 641a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch *(void **)value = (void *)GDK_DISPLAY_XDISPLAY(gdk_display_get_default()); 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *(void **)value = (void *)GTK_XTBIN(platformPluginWidget())->xtclient.xtdisplay; 644dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *result = NPERR_NO_ERROR; 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 646dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *result = NPERR_GENERIC_ERROR; 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 648dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return true; 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 650643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if defined(XP_UNIX) 6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NPNVxtAppContext: 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_needsXEmbed) { 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *(void **)value = XtDisplayToApplicationContext (GTK_XTBIN(platformPluginWidget())->xtclient.xtdisplay); 6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 655dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *result = NPERR_NO_ERROR; 6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *result = NPERR_GENERIC_ERROR; 658dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return true; 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NPNVnetscapeWindow: { 66281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GdkWindow* gdkWindow = gtk_widget_get_window(m_parentFrame->view()->hostWindow()->platformPageClient()); 663231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if defined(XP_UNIX) 66481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *static_cast<Window*>(value) = GDK_WINDOW_XWINDOW(gdk_window_get_toplevel(gdkWindow)); 66581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#elif defined(GDK_WINDOWING_WIN32) 6662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *static_cast<HGDIOBJ*>(value) = GDK_WINDOW_HWND(gdkWindow); 6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 668dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *result = NPERR_NO_ERROR; 669dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return true; 6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 672dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block default: 673dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::invalidateRect(const IntRect& rect) 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_isWindowed) { 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gtk_widget_queue_draw_area(GTK_WIDGET(platformPluginWidget()), rect.x(), rect.y(), rect.width(), rect.height()); 6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project invalidateWindowlessPluginRect(rect); 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::invalidateRect(NPRect* rect) 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!rect) { 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project invalidate(); 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IntRect r(rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top); 695d0825bca7fe65beaee391d30da42e937db621564Steve Block invalidateWindowlessPluginRect(r); 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid PluginView::invalidateRegion(NPRegion) 6995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 7005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // TODO: optimize 7015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian invalidate(); 7025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 7035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::forceRedraw() 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_isWindowed) 7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gtk_widget_queue_draw(platformPluginWidget()); 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 709231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block gtk_widget_queue_draw(m_parentFrame->view()->hostWindow()->platformPageClient()); 7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#ifndef GDK_WINDOWING_WIN32 713d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic Display* getPluginDisplay() 714d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 715d0825bca7fe65beaee391d30da42e937db621564Steve Block // The plugin toolkit might have a different X connection open. Since we're 716d0825bca7fe65beaee391d30da42e937db621564Steve Block // a gdk/gtk app, we'll (probably?) have the same X connection as any gdk-based 717d0825bca7fe65beaee391d30da42e937db621564Steve Block // plugins, so we can return that. We might want to add other implementations here 718d0825bca7fe65beaee391d30da42e937db621564Steve Block // later. 719d0825bca7fe65beaee391d30da42e937db621564Steve Block 720d0825bca7fe65beaee391d30da42e937db621564Steve Block#if defined(XP_UNIX) 721d0825bca7fe65beaee391d30da42e937db621564Steve Block return GDK_DISPLAY_XDISPLAY(gdk_display_get_default()); 722d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 723d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 724d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 725d0825bca7fe65beaee391d30da42e937db621564Steve Block} 7262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 727d0825bca7fe65beaee391d30da42e937db621564Steve Block 728d0825bca7fe65beaee391d30da42e937db621564Steve Block#if defined(XP_UNIX) 729d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic void getVisualAndColormap(int depth, Visual** visual, Colormap* colormap) 730d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 731d0825bca7fe65beaee391d30da42e937db621564Steve Block *visual = 0; 732d0825bca7fe65beaee391d30da42e937db621564Steve Block *colormap = 0; 733d0825bca7fe65beaee391d30da42e937db621564Steve Block 734a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch Display* display = GDK_DISPLAY_XDISPLAY(gdk_display_get_default()); 735d0825bca7fe65beaee391d30da42e937db621564Steve Block int rmaj, rmin; 736a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (depth == 32 && (!XRenderQueryVersion(display, &rmaj, &rmin) || (rmaj == 0 && rmin < 5))) 737d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 738d0825bca7fe65beaee391d30da42e937db621564Steve Block 739d0825bca7fe65beaee391d30da42e937db621564Steve Block XVisualInfo templ; 740d0825bca7fe65beaee391d30da42e937db621564Steve Block templ.screen = gdk_screen_get_number(gdk_screen_get_default()); 741d0825bca7fe65beaee391d30da42e937db621564Steve Block templ.depth = depth; 742d0825bca7fe65beaee391d30da42e937db621564Steve Block templ.c_class = TrueColor; 743d0825bca7fe65beaee391d30da42e937db621564Steve Block int nVisuals; 744a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch XVisualInfo* visualInfo = XGetVisualInfo(display, VisualScreenMask | VisualDepthMask | VisualClassMask, &templ, &nVisuals); 745d0825bca7fe65beaee391d30da42e937db621564Steve Block 746d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!nVisuals) 747d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 748d0825bca7fe65beaee391d30da42e937db621564Steve Block 749d0825bca7fe65beaee391d30da42e937db621564Steve Block if (depth == 32) { 750d0825bca7fe65beaee391d30da42e937db621564Steve Block for (int idx = 0; idx < nVisuals; ++idx) { 751a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch XRenderPictFormat* format = XRenderFindVisualFormat(display, visualInfo[idx].visual); 752d0825bca7fe65beaee391d30da42e937db621564Steve Block if (format->type == PictTypeDirect && format->direct.alphaMask) { 753d0825bca7fe65beaee391d30da42e937db621564Steve Block *visual = visualInfo[idx].visual; 754d0825bca7fe65beaee391d30da42e937db621564Steve Block break; 755d0825bca7fe65beaee391d30da42e937db621564Steve Block } 756d0825bca7fe65beaee391d30da42e937db621564Steve Block } 757d0825bca7fe65beaee391d30da42e937db621564Steve Block } else 758d0825bca7fe65beaee391d30da42e937db621564Steve Block *visual = visualInfo[0].visual; 759d0825bca7fe65beaee391d30da42e937db621564Steve Block 760d0825bca7fe65beaee391d30da42e937db621564Steve Block XFree(visualInfo); 761d0825bca7fe65beaee391d30da42e937db621564Steve Block 762d0825bca7fe65beaee391d30da42e937db621564Steve Block if (*visual) 763a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch *colormap = XCreateColormap(display, GDK_ROOT_WINDOW(), *visual, AllocNone); 764d0825bca7fe65beaee391d30da42e937db621564Steve Block} 765d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 766d0825bca7fe65beaee391d30da42e937db621564Steve Block 76781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochgboolean PluginView::plugRemovedCallback(GtkSocket* socket, PluginView* view) 768dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 76981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch view->m_plugAdded = false; 770dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return TRUE; 771dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 772dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 77381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid PluginView::plugAddedCallback(GtkSocket* socket, PluginView* view) 774dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 77581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(socket); 77681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(view); 777dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 77881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch view->m_plugAdded = true; 77981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!view->m_delayedAllocation.isEmpty()) { 78081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GtkAllocation allocation(view->m_delayedAllocation); 78181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch gtk_widget_size_allocate(GTK_WIDGET(socket), &allocation); 78281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch view->m_delayedAllocation.setSize(IntSize()); 78381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 784dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 785dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 786231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool PluginView::platformStart() 7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 788231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(m_isStarted); 789231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(m_status == PluginStatusLoadedSuccessfully); 7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if defined(XP_UNIX) 7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_plugin->pluginFuncs()->getvalue) { 7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PluginView::setCurrentPluginView(this); 7940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly); 7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setCallingPlugin(true); 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_plugin->pluginFuncs()->getvalue(m_instance, NPPVpluginNeedsXEmbed, &m_needsXEmbed); 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setCallingPlugin(false); 7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PluginView::setCurrentPluginView(0); 7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 802d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_isWindowed) { 803dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block GtkWidget* pageClient = m_parentFrame->view()->hostWindow()->platformPageClient(); 8042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if defined(XP_UNIX) 805d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_needsXEmbed) { 806dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // If our parent is not anchored the startup process will 807dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // fail miserably for XEmbed plugins a bit later on when 808dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // we try to get the ID of our window (since realize will 809dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // fail), so let's just abort here. 810dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!gtk_widget_get_parent(pageClient)) 811dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 812dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 81381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_plugAdded = false; 814d0825bca7fe65beaee391d30da42e937db621564Steve Block setPlatformWidget(gtk_socket_new()); 815dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_container_add(GTK_CONTAINER(pageClient), platformPluginWidget()); 81681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch g_signal_connect(platformPluginWidget(), "plug-added", G_CALLBACK(PluginView::plugAddedCallback), this); 81781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch g_signal_connect(platformPluginWidget(), "plug-removed", G_CALLBACK(PluginView::plugRemovedCallback), this); 818d0825bca7fe65beaee391d30da42e937db621564Steve Block } else 819e14391e94c850b8bd03680c23b38978db68687a8John Reck setPlatformWidget(gtk_xtbin_new(pageClient, 0)); 820d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setPlatformWidget(gtk_socket_new()); 822dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gtk_container_add(GTK_CONTAINER(pageClient), platformPluginWidget()); 8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 824d0825bca7fe65beaee391d30da42e937db621564Steve Block } else { 825d0825bca7fe65beaee391d30da42e937db621564Steve Block setPlatformWidget(0); 8262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if defined(XP_UNIX) 827d0825bca7fe65beaee391d30da42e937db621564Steve Block m_pluginDisplay = getPluginDisplay(); 8282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 829d0825bca7fe65beaee391d30da42e937db621564Steve Block } 830d0825bca7fe65beaee391d30da42e937db621564Steve Block 8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project show(); 8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 833231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if defined(XP_UNIX) 834d0825bca7fe65beaee391d30da42e937db621564Steve Block NPSetWindowCallbackStruct* ws = new NPSetWindowCallbackStruct(); 8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ws->type = 0; 836d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 838d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_isWindowed) { 839d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.type = NPWindowTypeWindow; 840d0825bca7fe65beaee391d30da42e937db621564Steve Block#if defined(XP_UNIX) 8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_needsXEmbed) { 84206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen GtkWidget* widget = platformPluginWidget(); 84306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen gtk_widget_realize(widget); 8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_npWindow.window = (void*)gtk_socket_get_id(GTK_SOCKET(platformPluginWidget())); 84506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen GdkWindow* window = gtk_widget_get_window(widget); 84606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ws->display = GDK_WINDOW_XDISPLAY(window); 847a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ws->visual = GDK_VISUAL_XVISUAL(gdk_window_get_visual(window)); 848a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ws->depth = gdk_visual_get_depth(gdk_window_get_visual(window)); 849a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ws->colormap = XCreateColormap(ws->display, GDK_ROOT_WINDOW(), ws->visual, AllocNone); 8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_npWindow.window = (void*)GTK_XTBIN(platformPluginWidget())->xtwindow; 8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ws->display = GTK_XTBIN(platformPluginWidget())->xtdisplay; 8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ws->visual = GTK_XTBIN(platformPluginWidget())->xtclient.xtvisual; 8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ws->depth = GTK_XTBIN(platformPluginWidget())->xtclient.xtdepth; 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ws->colormap = GTK_XTBIN(platformPluginWidget())->xtclient.xtcolormap; 8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project XFlush (ws->display); 8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#elif defined(GDK_WINDOWING_WIN32) 85906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_npWindow.window = (void*)GDK_WINDOW_HWND(gtk_widget_get_window(platformPluginWidget())); 8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_npWindow.type = NPWindowTypeDrawable; 863d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.window = 0; // Not used? 864d0825bca7fe65beaee391d30da42e937db621564Steve Block 865d0825bca7fe65beaee391d30da42e937db621564Steve Block#if defined(XP_UNIX) 866d0825bca7fe65beaee391d30da42e937db621564Steve Block GdkScreen* gscreen = gdk_screen_get_default(); 867d0825bca7fe65beaee391d30da42e937db621564Steve Block GdkVisual* gvisual = gdk_screen_get_system_visual(gscreen); 868d0825bca7fe65beaee391d30da42e937db621564Steve Block 86906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (gdk_visual_get_depth(gvisual) == 32 || !m_plugin->quirks().contains(PluginQuirkRequiresDefaultScreenDepth)) { 870d0825bca7fe65beaee391d30da42e937db621564Steve Block getVisualAndColormap(32, &m_visual, &m_colormap); 871d0825bca7fe65beaee391d30da42e937db621564Steve Block ws->depth = 32; 872d0825bca7fe65beaee391d30da42e937db621564Steve Block } 873d0825bca7fe65beaee391d30da42e937db621564Steve Block 874d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!m_visual) { 87506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen getVisualAndColormap(gdk_visual_get_depth(gvisual), &m_visual, &m_colormap); 87606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ws->depth = gdk_visual_get_depth(gvisual); 877d0825bca7fe65beaee391d30da42e937db621564Steve Block } 878d0825bca7fe65beaee391d30da42e937db621564Steve Block 879a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ws->display = GDK_DISPLAY_XDISPLAY(gdk_display_get_default()); 880d0825bca7fe65beaee391d30da42e937db621564Steve Block ws->visual = m_visual; 881d0825bca7fe65beaee391d30da42e937db621564Steve Block ws->colormap = m_colormap; 882d0825bca7fe65beaee391d30da42e937db621564Steve Block 883d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.x = 0; 884d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.y = 0; 885d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.width = -1; 886d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.height = -1; 887d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 888d0825bca7fe65beaee391d30da42e937db621564Steve Block notImplemented(); 889d0825bca7fe65beaee391d30da42e937db621564Steve Block m_status = PluginStatusCanNotLoadPlugin; 890d0825bca7fe65beaee391d30da42e937db621564Steve Block return false; 891d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 894d0825bca7fe65beaee391d30da42e937db621564Steve Block#if defined(XP_UNIX) 895d0825bca7fe65beaee391d30da42e937db621564Steve Block m_npWindow.ws_info = ws; 896d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 897d0825bca7fe65beaee391d30da42e937db621564Steve Block 8988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // TODO remove in favor of null events, like mac port? 899dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!(m_plugin->quirks().contains(PluginQuirkDeferFirstSetWindowCall))) 9008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian updatePluginWidget(); // was: setNPWindowIfNeeded(), but this doesn't produce 0x0 rects at first go 9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 902231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 903231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 904231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 905231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::platformDestroy() 906231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 907d0825bca7fe65beaee391d30da42e937db621564Steve Block#if defined(XP_UNIX) 908d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_drawable) { 909a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch XFreePixmap(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), m_drawable); 910d0825bca7fe65beaee391d30da42e937db621564Steve Block m_drawable = 0; 911d0825bca7fe65beaee391d30da42e937db621564Steve Block } 912d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 913231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 914231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 915231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::halt() 916231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 919231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid PluginView::restart() 9200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 9210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 9220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 924