[GTK] Plugin process crashes with GTK2 windowed plugins
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 25 Apr 2014 07:58:31 +0000 (07:58 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 25 Apr 2014 07:58:31 +0000 (07:58 +0000)
https://bugs.webkit.org/show_bug.cgi?id=132127

Reviewed by Martin Robinson.

It happens sometimes because the socket is used before the plug
has been added. A runtime critical warnings is shown and it
sometimes ends up crashing.

* WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:
(WebKit::NetscapePlugin::platformPostInitializeWindowed): Do not
show the plug widget until the socket is connected.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@167795 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp

index 7da999b..9197515 100644 (file)
@@ -1,3 +1,18 @@
+2014-04-25  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [GTK] Plugin process crashes with GTK2 windowed plugins
+        https://bugs.webkit.org/show_bug.cgi?id=132127
+
+        Reviewed by Martin Robinson.
+
+        It happens sometimes because the socket is used before the plug
+        has been added. A runtime critical warnings is shown and it
+        sometimes ends up crashing.
+
+        * WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:
+        (WebKit::NetscapePlugin::platformPostInitializeWindowed): Do not
+        show the plug widget until the socket is connected.
+
 2014-04-24  Andreas Kling  <akling@apple.com>
 
         [iOS WebKit2] Enable optimization to mmap downloaded resources once they become file-backed.
index 5f43ec2..db4bf24 100644 (file)
@@ -150,10 +150,11 @@ bool NetscapePlugin::platformPostInitializeWindowed(bool needsXEmbed, uint64_t w
     // containing a plug with the UI process socket embedded.
     m_platformPluginWidget = gtk_plug_new(static_cast<Window>(windowID));
     GtkWidget* socket = gtk_socket_new();
-    g_signal_connect(socket, "plug-removed", G_CALLBACK(socketPlugRemovedCallback), 0);
+    // Do not show the plug widget until the socket is connected.
+    g_signal_connect_swapped(socket, "plug-added", G_CALLBACK(gtk_widget_show), m_platformPluginWidget);
+    g_signal_connect(socket, "plug-removed", G_CALLBACK(socketPlugRemovedCallback), nullptr);
     gtk_container_add(GTK_CONTAINER(m_platformPluginWidget), socket);
     gtk_widget_show(socket);
-    gtk_widget_show(m_platformPluginWidget);
 
     m_npWindow.window = GINT_TO_POINTER(gtk_socket_get_id(GTK_SOCKET(socket)));
     GdkWindow* window = gtk_widget_get_window(socket);