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