[GTK] Runtime critical warnings when closing a page containing windowed plugins
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 Nov 2015 16:36:29 +0000 (16:36 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 Nov 2015 16:36:29 +0000 (16:36 +0000)
https://bugs.webkit.org/show_bug.cgi?id=151132

Reviewed by Martin Robinson.

This is because our plugin widget, that is a GtkPlug (derived from
GtkWindow), can receive the delete-event signal before
NetscapePlugin::platformDestroy is called. The delete-event
signal, by default, destroys the window when the signal is not
handled. So, after the delete-event the GtkPlug is destroyed, but
our pointer hasn't been reset. We can handle the delete-event
using gtk_widget_hide_on_delete as callback, so that the plugin
widget is hidden instead of destroyed.

* WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:
(WebKit::NetscapePlugin::platformPostInitializeWindowed):

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

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

index 57d5086..9e1249a 100644 (file)
@@ -1,5 +1,24 @@
 2015-11-11  Carlos Garcia Campos  <cgarcia@igalia.com>
 
+        [GTK] Runtime critical warnings when closing a page containing windowed plugins
+        https://bugs.webkit.org/show_bug.cgi?id=151132
+
+        Reviewed by Martin Robinson.
+
+        This is because our plugin widget, that is a GtkPlug (derived from
+        GtkWindow), can receive the delete-event signal before
+        NetscapePlugin::platformDestroy is called. The delete-event
+        signal, by default, destroys the window when the signal is not
+        handled. So, after the delete-event the GtkPlug is destroyed, but
+        our pointer hasn't been reset. We can handle the delete-event
+        using gtk_widget_hide_on_delete as callback, so that the plugin
+        widget is hidden instead of destroyed.
+
+        * WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:
+        (WebKit::NetscapePlugin::platformPostInitializeWindowed):
+
+2015-11-11  Carlos Garcia Campos  <cgarcia@igalia.com>
+
         REGRESSION(r191856): [GTK] SOCK_SEQPACKET no longer used after r191856
         https://bugs.webkit.org/show_bug.cgi?id=151129
 
index e858b3f..3802897 100644 (file)
@@ -134,6 +134,11 @@ bool NetscapePlugin::platformPostInitializeWindowed(bool needsXEmbed, uint64_t w
     // I guess it uses gdk_window_lookup(), so we create a new socket here
     // containing a plug with the UI process socket embedded.
     m_platformPluginWidget = gtk_plug_new(static_cast<Window>(windowID));
+
+    // Hide the GtkPlug on delete-event since we assume the widget is valid while the plugin is active.
+    // platformDestroy() will be called anyway right after the delete-event.
+    g_signal_connect(m_platformPluginWidget, "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), nullptr);
+
     GtkWidget* socket = gtk_socket_new();
     // 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);