Changeset 115300 in webkit


Ignore:
Timestamp:
Apr 26, 2012 3:58:03 AM (12 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK][WebKit2] Initial windowed plugins implementation
https://bugs.webkit.org/show_bug.cgi?id=61065

Reviewed by Philippe Normand.

  • PluginProcess/PluginControllerProxy.cpp:

(WebKit::PluginControllerProxy::createPluginContainer):
(WebKit::PluginControllerProxy::windowedPluginGeometryDidChange):

  • PluginProcess/PluginControllerProxy.h:
  • UIProcess/API/gtk/WebKitWebViewBase.cpp:

(webkitWebViewBaseContainerAdd): Implement GtkContainer::add().
(webkitWebViewBaseContainerRemove): Implement GtkContainer::remove().
(webkitWebViewBaseContainerForall): Implement GtkContainer::forall().
(webkitWebViewBaseChildMoveResize): Set a new geometry for a child widget.
(webkitWebViewBaseChildAllocate): Allocate a child widget.
(resizeWebKitWebViewBaseFromAllocation): Allocate child widgets.
(webkit_web_view_base_class_init):

  • UIProcess/API/gtk/WebKitWebViewBasePrivate.h: Add webkitWebViewBaseSizeAllocate().
  • UIProcess/WebPageProxy.h:
  • UIProcess/WebPageProxy.messages.in: Add createPluginContainer

and windowedPluginGeometryDidChange messages.

  • UIProcess/gtk/WebPageProxyGtk.cpp:

(WebKit::pluginWindowMap):
(WebKit::pluginContainerPlugRemoved): Remove the socket from the
hash map when its plug is removed.
(WebKit::WebPageProxy::createPluginContainer): Create a GtkSocket
as container widget for windowed plugins.
(WebKit::WebPageProxy::windowedPluginGeometryDidChange): Call
webkitWebViewBaseSizeAllocate() to update the plugin widget
geometry.

  • UIProcess/qt/WebPageProxyQt.cpp:

(WebKit::WebPageProxy::createPluginContainer):
(WebKit::WebPageProxy::windowedPluginGeometryDidChange):

  • WebProcess/Plugins/Netscape/NetscapePlugin.cpp:

(WebKit::NetscapePlugin::NetscapePlugin):

  • WebProcess/Plugins/Netscape/NetscapePlugin.h:
  • WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:

(WebKit::socketPlugRemovedCallback): Return TRUE to avoid the
socket to be destroyed, since we need to reuse it.
(WebKit::NetscapePlugin::platformPostInitializeWindowed): Ask the
ui process to create a plugin container.
(WebKit::NetscapePlugin::platformPostInitializeWindowless):
(WebKit::NetscapePlugin::platformPostInitialize):
(WebKit::NetscapePlugin::platformGeometryDidChange): For windowed
plugins notify the ui process that the plugin geometry has
changed.
(WebKit::NetscapePlugin::platformPaint): Do nothing for windowed
plugins, the caller already calls callSetWindow().

  • WebProcess/Plugins/PluginController.h:
  • WebProcess/Plugins/PluginProxy.cpp:

(WebKit::PluginProxy::createPluginContainer):
(WebKit::PluginProxy::windowedPluginGeometryDidChange):

  • WebProcess/Plugins/PluginProxy.h:
  • WebProcess/Plugins/PluginProxy.messages.in:
  • WebProcess/Plugins/PluginView.cpp:

(WebKit::PluginView::createPluginContainer):
(WebKit::PluginView::windowedPluginGeometryDidChange):

  • WebProcess/Plugins/PluginView.h:
Location:
trunk/Source/WebKit2
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r115295 r115300  
     12012-04-26  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK][WebKit2] Initial windowed plugins implementation
     4        https://bugs.webkit.org/show_bug.cgi?id=61065
     5
     6        Reviewed by Philippe Normand.
     7
     8        * PluginProcess/PluginControllerProxy.cpp:
     9        (WebKit::PluginControllerProxy::createPluginContainer):
     10        (WebKit::PluginControllerProxy::windowedPluginGeometryDidChange):
     11        * PluginProcess/PluginControllerProxy.h:
     12        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
     13        (webkitWebViewBaseContainerAdd): Implement GtkContainer::add().
     14        (webkitWebViewBaseContainerRemove): Implement GtkContainer::remove().
     15        (webkitWebViewBaseContainerForall): Implement GtkContainer::forall().
     16        (webkitWebViewBaseChildMoveResize): Set a new geometry for a child widget.
     17        (webkitWebViewBaseChildAllocate): Allocate a child widget.
     18        (resizeWebKitWebViewBaseFromAllocation): Allocate child widgets.
     19        (webkit_web_view_base_class_init):
     20        * UIProcess/API/gtk/WebKitWebViewBasePrivate.h: Add webkitWebViewBaseSizeAllocate().
     21        * UIProcess/WebPageProxy.h:
     22        * UIProcess/WebPageProxy.messages.in: Add createPluginContainer
     23        and windowedPluginGeometryDidChange messages.
     24        * UIProcess/gtk/WebPageProxyGtk.cpp:
     25        (WebKit::pluginWindowMap):
     26        (WebKit::pluginContainerPlugRemoved): Remove the socket from the
     27        hash map when its plug is removed.
     28        (WebKit::WebPageProxy::createPluginContainer): Create a GtkSocket
     29        as container widget for windowed plugins.
     30        (WebKit::WebPageProxy::windowedPluginGeometryDidChange): Call
     31        webkitWebViewBaseSizeAllocate() to update the plugin widget
     32        geometry.
     33        * UIProcess/qt/WebPageProxyQt.cpp:
     34        (WebKit::WebPageProxy::createPluginContainer):
     35        (WebKit::WebPageProxy::windowedPluginGeometryDidChange):
     36        * WebProcess/Plugins/Netscape/NetscapePlugin.cpp:
     37        (WebKit::NetscapePlugin::NetscapePlugin):
     38        * WebProcess/Plugins/Netscape/NetscapePlugin.h:
     39        * WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:
     40        (WebKit::socketPlugRemovedCallback): Return TRUE to avoid the
     41        socket to be destroyed, since we need to reuse it.
     42        (WebKit::NetscapePlugin::platformPostInitializeWindowed): Ask the
     43        ui process to create a plugin container.
     44        (WebKit::NetscapePlugin::platformPostInitializeWindowless):
     45        (WebKit::NetscapePlugin::platformPostInitialize):
     46        (WebKit::NetscapePlugin::platformGeometryDidChange): For windowed
     47        plugins notify the ui process that the plugin geometry has
     48        changed.
     49        (WebKit::NetscapePlugin::platformPaint): Do nothing for windowed
     50        plugins, the caller already calls callSetWindow().
     51        * WebProcess/Plugins/PluginController.h:
     52        * WebProcess/Plugins/PluginProxy.cpp:
     53        (WebKit::PluginProxy::createPluginContainer):
     54        (WebKit::PluginProxy::windowedPluginGeometryDidChange):
     55        * WebProcess/Plugins/PluginProxy.h:
     56        * WebProcess/Plugins/PluginProxy.messages.in:
     57        * WebProcess/Plugins/PluginView.cpp:
     58        (WebKit::PluginView::createPluginContainer):
     59        (WebKit::PluginView::windowedPluginGeometryDidChange):
     60        * WebProcess/Plugins/PluginView.h:
     61
    1622012-04-26  Chris Fleizach2  <cfleizach@apple.com>
    263
  • trunk/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp

    r112338 r115300  
    541541}
    542542
     543#if PLUGIN_ARCHITECTURE(X11)
     544uint64_t PluginControllerProxy::createPluginContainer()
     545{
     546    uint64_t windowID = 0;
     547    m_connection->connection()->sendSync(Messages::PluginProxy::CreatePluginContainer(), Messages::PluginProxy::CreatePluginContainer::Reply(windowID), m_pluginInstanceID);
     548    return windowID;
     549}
     550
     551void PluginControllerProxy::windowedPluginGeometryDidChange(const IntRect& frameRect, const IntRect& clipRect, uint64_t windowID)
     552{
     553    m_connection->connection()->send(Messages::PluginProxy::WindowedPluginGeometryDidChange(frameRect, clipRect, windowID), m_pluginInstanceID);
     554}
     555#endif
     556
    543557} // namespace WebKit
    544558
  • trunk/Source/WebKit2/PluginProcess/PluginControllerProxy.h

    r112338 r115300  
    104104    virtual void protectPluginFromDestruction();
    105105    virtual void unprotectPluginFromDestruction();
     106#if PLUGIN_ARCHITECTURE(X11)
     107    virtual uint64_t createPluginContainer();
     108    virtual void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID);
     109#endif
    106110   
    107111    // Message handlers.
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp

    r113697 r115300  
    5656#include <gdk/gdk.h>
    5757#include <gdk/gdkkeysyms.h>
     58#include <wtf/HashMap.h>
    5859#include <wtf/gobject/GOwnPtr.h>
    5960#include <wtf/gobject/GRefPtr.h>
     
    6768using namespace WebCore;
    6869
     70typedef HashMap<GtkWidget*, IntRect> WebKitWebViewChildrenMap;
     71
    6972struct _WebKitWebViewBasePrivate {
     73    WebKitWebViewChildrenMap children;
    7074    OwnPtr<PageClientImpl> pageClient;
    7175    RefPtr<WebPageProxy> pageProxy;
     
    164168static void webkitWebViewBaseContainerAdd(GtkContainer* container, GtkWidget* widget)
    165169{
     170    WebKitWebViewBase* webView = WEBKIT_WEB_VIEW_BASE(container);
     171    WebKitWebViewBasePrivate* priv = webView->priv;
     172
     173    GtkAllocation childAllocation;
     174    gtk_widget_get_allocation(widget, &childAllocation);
     175    priv->children.set(widget, childAllocation);
     176
    166177    gtk_widget_set_parent(widget, GTK_WIDGET(container));
     178}
     179
     180static void webkitWebViewBaseContainerRemove(GtkContainer* container, GtkWidget* widget)
     181{
     182    WebKitWebViewBase* webView = WEBKIT_WEB_VIEW_BASE(container);
     183    WebKitWebViewBasePrivate* priv = webView->priv;
     184    GtkWidget* widgetContainer = GTK_WIDGET(container);
     185
     186    ASSERT(priv->children.contains(widget));
     187    gboolean wasVisible = gtk_widget_get_visible(widget);
     188    gtk_widget_unparent(widget);
     189
     190    priv->children.remove(widget);
     191    if (wasVisible && gtk_widget_get_visible(widgetContainer))
     192        gtk_widget_queue_resize(widgetContainer);
     193}
     194
     195static void webkitWebViewBaseContainerForall(GtkContainer* container, gboolean includeInternals, GtkCallback callback, gpointer callbackData)
     196{
     197    WebKitWebViewBase* webView = WEBKIT_WEB_VIEW_BASE(container);
     198    WebKitWebViewBasePrivate* priv = webView->priv;
     199
     200    WebKitWebViewChildrenMap children = priv->children;
     201    WebKitWebViewChildrenMap::const_iterator end = children.end();
     202    for (WebKitWebViewChildrenMap::const_iterator current = children.begin(); current != end; ++current)
     203        (*callback)(current->first, callbackData);
     204}
     205
     206void webkitWebViewBaseChildMoveResize(WebKitWebViewBase* webView, GtkWidget* child, const IntRect& childRect)
     207{
     208    const IntRect& geometry = webView->priv->children.get(child);
     209
     210    if (geometry == childRect)
     211        return;
     212
     213    webView->priv->children.set(child, childRect);
     214    gtk_widget_queue_resize_no_redraw(GTK_WIDGET(webView));
    167215}
    168216
     
    215263}
    216264
     265static void webkitWebViewBaseChildAllocate(GtkWidget* child, gpointer userData)
     266{
     267    if (!gtk_widget_get_visible(child))
     268        return;
     269
     270    WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(userData);
     271    WebKitWebViewBasePrivate* priv = webViewBase->priv;
     272    const IntRect& geometry = priv->children.get(child);
     273    if (geometry.isEmpty())
     274        return;
     275
     276    GtkAllocation childAllocation = geometry;
     277    gtk_widget_size_allocate(child, &childAllocation);
     278    priv->children.set(child, IntRect());
     279}
     280
    217281static void resizeWebKitWebViewBaseFromAllocation(WebKitWebViewBase* webViewBase, GtkAllocation* allocation)
    218282{
    219     WebKitWebViewBasePrivate* priv = webViewBase->priv;
    220 
     283    gtk_container_foreach(GTK_CONTAINER(webViewBase), webkitWebViewBaseChildAllocate, webViewBase);
     284
     285    WebKitWebViewBasePrivate* priv = webViewBase->priv;
    221286    if (priv->pageProxy->drawingArea())
    222287        priv->pageProxy->drawingArea()->setSize(IntSize(allocation->width, allocation->height), IntSize());
     
    251316    resizeWebKitWebViewBaseFromAllocation(webViewBase, &allocation);
    252317    webViewBase->priv->needsResizeOnMap = false;
    253 
    254318}
    255319
     
    528592    GtkContainerClass* containerClass = GTK_CONTAINER_CLASS(webkitWebViewBaseClass);
    529593    containerClass->add = webkitWebViewBaseContainerAdd;
     594    containerClass->remove = webkitWebViewBaseContainerRemove;
     595    containerClass->forall = webkitWebViewBaseContainerForall;
    530596
    531597    g_type_class_add_private(webkitWebViewBaseClass, sizeof(WebKitWebViewBasePrivate));
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h

    r113697 r115300  
    4242void webkitWebViewBaseForwardNextKeyEvent(WebKitWebViewBase*);
    4343void webkitWebViewBaseStartDrag(WebKitWebViewBase*, const WebCore::DragData&, PassRefPtr<ShareableBitmap> dragImage);
     44void webkitWebViewBaseChildMoveResize(WebKitWebViewBase*, GtkWidget*, const WebCore::IntRect&);
    4445void webkitWebViewBaseEnterFullScreen(WebKitWebViewBase*);
    4546void webkitWebViewBaseExitFullScreen(WebKitWebViewBase*);
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r115145 r115300  
    894894    void setRenderTreeSize(uint64_t treeSize) { m_renderTreeSize = treeSize; }
    895895
     896#if PLUGIN_ARCHITECTURE(X11)
     897    void createPluginContainer(uint64_t& windowID);
     898    void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID);
     899#endif
     900
    896901    PageClient* m_pageClient;
    897902    WebLoaderClient m_loaderClient;
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in

    r114367 r115300  
    287287#endif
    288288
     289#if PLUGIN_ARCHITECTURE(X11)
     290    # X11 windowed plugin messages
     291    CreatePluginContainer() -> (uint64_t windowID)
     292    WindowedPluginGeometryDidChange(WebCore::IntRect frameRect, WebCore::IntRect clipRect, uint64_t windowID)
     293#endif
     294
    289295    # Search popup menus
    290296    SaveRecentSearches(WTF::String name, Vector<String> searchItems)
  • trunk/Source/WebKit2/UIProcess/gtk/WebPageProxyGtk.cpp

    r105503 r115300  
    3131#include "NotImplemented.h"
    3232#include "PageClientImpl.h"
     33#include "WebKitWebViewBasePrivate.h"
     34#include <gtk/gtkx.h>
    3335
    3436namespace WebKit {
     
    6567}
    6668
     69typedef HashMap<uint64_t, GtkWidget* > PluginWindowMap;
     70static PluginWindowMap& pluginWindowMap()
     71{
     72    DEFINE_STATIC_LOCAL(PluginWindowMap, map, ());
     73    return map;
     74}
     75
     76static gboolean pluginContainerPlugRemoved(GtkSocket* socket)
     77{
     78    uint64_t windowID = static_cast<uint64_t>(gtk_socket_get_id(socket));
     79    pluginWindowMap().remove(windowID);
     80    return FALSE;
     81}
     82
     83void WebPageProxy::createPluginContainer(uint64_t& windowID)
     84{
     85    GtkWidget* socket = gtk_socket_new();
     86    g_signal_connect(socket, "plug-removed", G_CALLBACK(pluginContainerPlugRemoved), 0);
     87    gtk_container_add(GTK_CONTAINER(viewWidget()), socket);
     88    gtk_widget_show(socket);
     89
     90    windowID = static_cast<uint64_t>(gtk_socket_get_id(GTK_SOCKET(socket)));
     91    pluginWindowMap().set(windowID, socket);
     92}
     93
     94void WebPageProxy::windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID)
     95{
     96    GtkWidget* plugin = pluginWindowMap().get(windowID);
     97    if (!plugin)
     98        return;
     99
     100    if (gtk_widget_get_realized(plugin)) {
     101        GdkRectangle clip = clipRect;
     102        cairo_region_t* clipRegion = cairo_region_create_rectangle(&clip);
     103        gdk_window_shape_combine_region(gtk_widget_get_window(plugin), clipRegion, 0, 0);
     104        cairo_region_destroy(clipRegion);
     105    }
     106
     107    webkitWebViewBaseChildMoveResize(WEBKIT_WEB_VIEW_BASE(viewWidget()), plugin, frameRect);
     108}
     109
    67110} // namespace WebKit
  • trunk/Source/WebKit2/UIProcess/qt/WebPageProxyQt.cpp

    r105711 r115300  
    103103}
    104104
     105void WebPageProxy::createPluginContainer(uint64_t& windowID)
     106{
     107    notImplemented();
     108}
     109
     110void WebPageProxy::windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID)
     111{
     112    notImplemented();
     113}
     114
    105115} // namespace WebKit
  • trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp

    r114295 r115300  
    9090    , m_drawable(0)
    9191    , m_pluginDisplay(0)
     92#if PLATFORM(GTK)
     93    , m_platformPluginWidget(0)
     94#endif
    9295#endif
    9396{
  • trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h

    r114295 r115300  
    235235#endif
    236236
     237#if PLUGIN_ARCHITECTURE(X11)
     238    bool platformPostInitializeWindowed(bool needsXEmbed, uint64_t windowID);
     239    bool platformPostInitializeWindowless();
     240#endif
     241
    237242    uint64_t m_nextRequestID;
    238243
     
    344349    Pixmap m_drawable;
    345350    Display* m_pluginDisplay;
     351#if PLATFORM(GTK)
     352    GtkWidget* m_platformPluginWidget;
     353#endif
    346354
    347355public: // Need to call it in the NPN_GetValue browser callback.
  • trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp

    r100725 r115300  
    3030#include "NetscapePlugin.h"
    3131
     32#include "PluginController.h"
    3233#include "WebEvent.h"
    3334#include <WebCore/GraphicsContext.h>
     
    4041#include "RefPtrCairo.h"
    4142#include <cairo/cairo-xlib.h>
     43#include <gtk/gtk.h>
     44#ifndef GTK_API_VERSION_2
     45#include <gtk/gtkx.h>
     46#endif
    4247#include <gdk/gdkx.h>
    4348#include <WebCore/GtkVersioning.h>
     
    145150}
    146151
    147 bool NetscapePlugin::platformPostInitialize()
    148 {
    149152#if PLATFORM(GTK)
    150     if (moduleMixesGtkSymbols(m_pluginModule->module()))
    151         return false;
    152 #endif
    153 
    154     if (m_isWindowed)
    155         return false;
    156 
    157     if (!(m_pluginDisplay = getPluginDisplay()))
    158         return false;
    159 
    160     NPSetWindowCallbackStruct* callbackStruct = new NPSetWindowCallbackStruct;
    161     callbackStruct->type = 0;
     153static gboolean socketPlugRemovedCallback(GtkSocket*)
     154{
     155    // Default action is to destroy the GtkSocket, so we just return TRUE here
     156    // to be able to reuse the socket. For some obscure reason, newer versions
     157    // of flash plugin remove the plug from the socket, probably because the plug
     158    // created by the plugin is re-parented.
     159    return TRUE;
     160}
     161#endif
     162
     163bool NetscapePlugin::platformPostInitializeWindowed(bool needsXEmbed, uint64_t windowID)
     164{
     165    m_npWindow.type = NPWindowTypeWindow;
     166    if (!needsXEmbed) {
     167        notImplemented();
     168        return false;
     169    }
     170
    162171    Display* display = x11HostDisplay();
     172
     173#if PLATFORM(GTK)
     174    // It seems flash needs the socket to be in the same process,
     175    // I guess it uses gdk_window_lookup(), so we create a new socket here
     176    // containing a plug with the UI process socket embedded.
     177    m_platformPluginWidget = gtk_plug_new(static_cast<Window>(windowID));
     178    GtkWidget* socket = gtk_socket_new();
     179    g_signal_connect(socket, "plug-removed", G_CALLBACK(socketPlugRemovedCallback), 0);
     180    gtk_container_add(GTK_CONTAINER(m_platformPluginWidget), socket);
     181    gtk_widget_show(socket);
     182    gtk_widget_show(m_platformPluginWidget);
     183
     184    m_npWindow.window = GINT_TO_POINTER(gtk_socket_get_id(GTK_SOCKET(socket)));
     185    GdkWindow* window = gtk_widget_get_window(socket);
     186    NPSetWindowCallbackStruct* callbackStruct = static_cast<NPSetWindowCallbackStruct*>(m_npWindow.ws_info);
     187    callbackStruct->display = GDK_WINDOW_XDISPLAY(window);
     188    callbackStruct->visual = GDK_VISUAL_XVISUAL(gdk_window_get_visual(window));
     189    callbackStruct->depth = gdk_visual_get_depth(gdk_window_get_visual(window));
     190    callbackStruct->colormap = XCreateColormap(display, GDK_ROOT_WINDOW(), callbackStruct->visual, AllocNone);
     191#endif
     192
     193    XFlush(display);
     194
     195    callSetWindow();
     196
     197    return true;
     198}
     199
     200bool NetscapePlugin::platformPostInitializeWindowless()
     201{
     202    Display* display = x11HostDisplay();
     203    m_npWindow.type = NPWindowTypeDrawable;
     204    m_npWindow.window = 0;
     205
    163206    int depth = displayDepth();
    164207#if PLATFORM(QT)
    165208    ASSERT(depth == 16 || depth == 24 || depth == 32);
    166209#endif
     210    NPSetWindowCallbackStruct* callbackStruct = static_cast<NPSetWindowCallbackStruct*>(m_npWindow.ws_info);
    167211    callbackStruct->display = display;
    168212    callbackStruct->depth = depth;
     
    183227    callbackStruct->colormap = XCreateColormap(display, rootWindowID(), visual, AllocNone);
    184228
    185     m_npWindow.type = NPWindowTypeDrawable;
    186     m_npWindow.window = 0;
     229    callSetWindow();
     230
     231    return true;
     232}
     233
     234bool NetscapePlugin::platformPostInitialize()
     235{
     236#if PLATFORM(GTK)
     237    if (moduleMixesGtkSymbols(m_pluginModule->module()))
     238        return false;
     239#endif
     240
     241    uint64_t windowID = 0;
     242    bool needsXEmbed = false;
     243    if (m_isWindowed) {
     244        NPP_GetValue(NPPVpluginNeedsXEmbed, &needsXEmbed);
     245        if (needsXEmbed) {
     246            windowID = controller()->createPluginContainer();
     247            if (!windowID)
     248                return false;
     249        } else {
     250            notImplemented();
     251            return false;
     252        }
     253    }
     254
     255    if (!(m_pluginDisplay = getPluginDisplay()))
     256        return false;
     257
     258    NPSetWindowCallbackStruct* callbackStruct = new NPSetWindowCallbackStruct;
     259    callbackStruct->type = 0;
    187260    m_npWindow.ws_info = callbackStruct;
    188261
    189     callSetWindow();
    190 
    191     return true;
     262    if (m_isWindowed)
     263        return platformPostInitializeWindowed(needsXEmbed, windowID);
     264
     265    return platformPostInitializeWindowless();
    192266}
    193267
     
    214288{
    215289    if (m_isWindowed) {
    216         notImplemented();
     290        uint64_t windowID = 0;
     291#if PLATFORM(GTK)
     292        windowID = static_cast<uint64_t>(GDK_WINDOW_XID(gtk_plug_get_socket_window(GTK_PLUG(m_platformPluginWidget))));
     293#endif
     294        IntRect clipRect(m_clipRect);
     295        clipRect.move(-m_frameRectInWindowCoordinates.x(), -m_frameRectInWindowCoordinates.y());
     296        controller()->windowedPluginGeometryDidChange(m_frameRectInWindowCoordinates, clipRect, windowID);
    217297        return;
    218298    }
     
    239319void NetscapePlugin::platformPaint(GraphicsContext* context, const IntRect& dirtyRect, bool /*isSnapshot*/)
    240320{
    241     if (m_isWindowed) {
    242         notImplemented();
     321    if (m_isWindowed)
    243322        return;
    244     }
    245323
    246324    if (!m_isStarted) {
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginController.h

    r111822 r115300  
    144144    virtual void unprotectPluginFromDestruction() = 0;
    145145
     146#if PLUGIN_ARCHITECTURE(X11)
     147    // Create a plugin container for windowed plugins
     148    virtual uint64_t createPluginContainer() = 0;
     149    virtual void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID) = 0;
     150#endif
     151
    146152    // Helper class for delaying destruction of a plug-in.
    147153    class PluginDestructionProtector {
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp

    r99243 r115300  
    524524}
    525525
     526#if PLUGIN_ARCHITECTURE(X11)
     527void PluginProxy::createPluginContainer(uint64_t& windowID)
     528{
     529    windowID = controller()->createPluginContainer();
     530}
     531
     532void PluginProxy::windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID)
     533{
     534    controller()->windowedPluginGeometryDidChange(frameRect, clipRect, windowID);
     535}
     536#endif
     537
    526538void PluginProxy::update(const IntRect& paintedRect)
    527539{
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.h

    r112338 r115300  
    136136    void setLayerHostingContextID(uint32_t);
    137137#endif
     138#if PLUGIN_ARCHITECTURE(X11)
     139    void createPluginContainer(uint64_t& windowID);
     140    void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID);
     141#endif
    138142
    139143    String m_pluginPath;
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.messages.in

    r112338 r115300  
    6767    SetLayerHostingContextID(uint32_t layerHostingContextID)
    6868#endif
     69
     70#if PLUGIN_ARCHITECTURE(X11)
     71    # Create the plugin container for windowed plugins
     72    CreatePluginContainer() -> (uint64_t windowID)
     73
     74    # Update geometry of windowed plugin widget
     75    WindowedPluginGeometryDidChange(WebCore::IntRect frameRect, WebCore::IntRect clipRect, uint64_t windowID)
     76#endif
    6977}
    7078
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp

    r114414 r115300  
    3030#include "Plugin.h"
    3131#include "ShareableBitmap.h"
     32#include "WebCoreArgumentCoders.h"
    3233#include "WebEvent.h"
    3334#include "WebPage.h"
     
    12521253}
    12531254
     1255#if PLUGIN_ARCHITECTURE(X11)
     1256uint64_t PluginView::createPluginContainer()
     1257{
     1258    uint64_t windowID = 0;
     1259    m_webPage->sendSync(Messages::WebPageProxy::CreatePluginContainer(), Messages::WebPageProxy::CreatePluginContainer::Reply(windowID));
     1260    return windowID;
     1261}
     1262
     1263void PluginView::windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID)
     1264{
     1265    m_webPage->send(Messages::WebPageProxy::WindowedPluginGeometryDidChange(frameRect, clipRect, windowID));
     1266}
     1267#endif
     1268
    12541269} // namespace WebKit
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginView.h

    r114476 r115300  
    161161    virtual void protectPluginFromDestruction();
    162162    virtual void unprotectPluginFromDestruction();
     163#if PLUGIN_ARCHITECTURE(X11)
     164    virtual uint64_t createPluginContainer();
     165    virtual void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID);
     166#endif
    163167
    164168    // WebFrame::LoadListener
Note: See TracChangeset for help on using the changeset viewer.