mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-16 06:45:42 +00:00
b=569775 leak foreign colormap wrappers to work-around an old GDK bug that could destroy the browser's colormap r=cjones
This commit is contained in:
parent
0eab1ae8fb
commit
9b43663e20
@ -811,16 +811,36 @@ PluginInstanceChild::AnswerNPP_SetWindow(const NPRemoteWindow& aWindow)
|
||||
return false;
|
||||
|
||||
#ifdef MOZ_WIDGET_GTK2
|
||||
if (aWindow.type == NPWindowTypeWindow
|
||||
&& gtk_check_version(2,18,7) != NULL) { // older
|
||||
GdkWindow* socket_window = gdk_window_lookup(aWindow.window);
|
||||
if (socket_window) {
|
||||
// A GdkWindow for the socket already exists. Need to
|
||||
// workaround https://bugzilla.gnome.org/show_bug.cgi?id=607061
|
||||
// See wrap_gtk_plug_embedded in PluginModuleChild.cpp.
|
||||
g_object_set_data(G_OBJECT(socket_window),
|
||||
"moz-existed-before-set-window",
|
||||
GUINT_TO_POINTER(1));
|
||||
if (gtk_check_version(2,18,7) != NULL) { // older
|
||||
if (aWindow.type == NPWindowTypeWindow) {
|
||||
GdkWindow* socket_window = gdk_window_lookup(aWindow.window);
|
||||
if (socket_window) {
|
||||
// A GdkWindow for the socket already exists. Need to
|
||||
// workaround https://bugzilla.gnome.org/show_bug.cgi?id=607061
|
||||
// See wrap_gtk_plug_embedded in PluginModuleChild.cpp.
|
||||
g_object_set_data(G_OBJECT(socket_window),
|
||||
"moz-existed-before-set-window",
|
||||
GUINT_TO_POINTER(1));
|
||||
}
|
||||
}
|
||||
|
||||
if (aWindow.visualID != None
|
||||
&& gtk_check_version(2, 12, 10) != NULL) { // older
|
||||
// Workaround for a bug in Gtk+ (prior to 2.12.10) where deleting
|
||||
// a foreign GdkColormap will also free the XColormap.
|
||||
// http://git.gnome.org/browse/gtk+/log/gdk/x11/gdkcolor-x11.c?id=GTK_2_12_10
|
||||
GdkVisual *gdkvisual = gdkx_visual_get(aWindow.visualID);
|
||||
GdkColormap *gdkcolor =
|
||||
gdk_x11_colormap_foreign_new(gdkvisual, aWindow.colormap);
|
||||
|
||||
if (g_object_get_data(G_OBJECT(gdkcolor), "moz-have-extra-ref")) {
|
||||
// We already have a ref to keep the object alive.
|
||||
g_object_unref(gdkcolor);
|
||||
} else {
|
||||
// leak and mark as already leaked
|
||||
g_object_set_data(G_OBJECT(gdkcolor),
|
||||
"moz-have-extra-ref", GUINT_TO_POINTER(1));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user