Closed Bug 539138 Opened 12 years ago Closed 11 years ago

Flash OOPP: Gdk-CRITICAL **: gdk_window_get_origin: assertion `GDK_IS_WINDOW (window)' failed [@ libgdk-x11-2.0.so.0.1800.9@0x2bb7b ]

Categories

(External Software Affecting Firefox :: Flash (Adobe), defect)

x86_64
Linux
defect
Not set
normal

Tracking

(Not tracked)

RESOLVED WORKSFORME

People

(Reporter: karlt, Assigned: karlt)

References

Details

With any OOP Flash (LNX 10,0,42,34) windowed plugin instance:

[PluginModuleParent] NPP_New: got return value 0
[PluginInstanceParent] NPP_GetValue(NPPVpluginNeedsXEmbed)
nsPluginNativeWindowGtk2: NPPVpluginNeedsXEmbed=1
nsPluginNativeWindowGtk2: call SetWindow with xid=0x32005f8
[PluginModuleParent] NPP_SetWindow
[PluginInstanceChild] NPP_SetWindow(0x32005f8, 8, 8, 648 x 361)
[PluginModuleChild] _getvalue

Gdk-CRITICAL **: gdk_window_get_origin: assertion `GDK_IS_WINDOW (window)' failed

#0  IA__g_log (log_domain=0x7f84a5a19fd3 "Gdk", 
    log_level=G_LOG_LEVEL_CRITICAL, 
    format=0x7f84a481a09d "%s: assertion `%s' failed") at gmessages.c:525
#1  0x00007f84a59e997b in IA__gdk_window_get_origin (window=0x0, 
    x=0x7f849e691320, y=0x7f849e691324) at gdkwindow.c:3979
#2  0x00007f84a59e7e83 in IA__gdk_screen_get_monitor_at_window (
    screen=0x2354130, window=0x0) at gdkscreen.c:317
#3  0x00007f84aad9b7a3 in ?? ()
   from /home/karl/.mozilla/plugins/libflashplayer.so
#4  0x00007f84aad9eafd in ?? ()
   from /home/karl/.mozilla/plugins/libflashplayer.so
#5  0x00007f84aad95448 in ?? ()
   from /home/karl/.mozilla/plugins/libflashplayer.so
#6  0x00007f84aad995b9 in ?? ()
   from /home/karl/.mozilla/plugins/libflashplayer.so
#7  0x00007f84a994c040 in mozilla::plugins::PluginInstanceChild::AnswerNPP_SetWindow (this=0x2348c00, aWindow=@0x7f849e691570, rv=0x7f849e69163c)
    at /home/karl/moz/dev/dom/plugins/PluginInstanceChild.cpp:446
Calls from the OOP plugin:

gtk_plug_new(52429150)                     = 0x012cf060
gtk_drawing_area_new()                     = 0x012d3150
gtk_object_get_type()                      = 19359600
gtk_widget_get_type()                      = 17351696
g_type_check_instance_cast(0x012d3150, 17351696) = 0x012d3150
g_type_check_instance_cast(0x012d3150, 19359600) = 0x012d3150
gtk_container_get_type()                   = 18951664
g_type_check_instance_cast(0x012cf060, 18951664) = 0x012cf060
gtk_container_add(0x012cf060, 0x012d3150)  = <void>
gtk_widget_add_events(0x012d3150, 2125582) = <void>
g_type_check_instance_cast(0x012d3150, 80) = 0x012d3150
g_signal_connect_data(0x012d3150, "event", 0x7f157d271b50, 0x7f1570b68000,
 0) = 10
gtk_widget_show(0x012d3150)                = <void>
gtk_widget_get_screen(0x012d3150)          = 0x01280130
gdk_screen_get_monitor_at_window(0x01280130, NULL) = 1
gdk_screen_get_monitor_geometry(0x01280130, 1, 0x7f1570b65370) = <void>
gtk_widget_show(0x012cf060 <unfinished ...>
_setjmp(0x7f157dd06ea0, 0x12d31c0, 0, 0x12d5010, 0x7f1570b64260) = 0
<... gtk_widget_show resumed> )            = <void>

When the GtkPlug is in the same process as the GtkSocket, for some reason
(probably because the GtkSocket is the parent container and that is realized),
the GtkPlug is created already realized (i.e. it has a window).  Parenting the
GtkDrawingArea in the GtkPlug container then realizes the GtkDrawingArea,
giving it a window.

When the GtkPlug is created in a separate process to the GtkSocket, it is not
already realized.  Parenting the GtkDrawingArea in the GtkPlug container does
not realize the GtkDrawingArea because the parent is not realized.
Even when showing the GtkDrawingArea, it is not realized because its parent is
not realized or shown.

At the time of the gdk_screen_get_monitor_at_window() call, the GtkDrawingArea
is not realized, but its NULL (non-existant) window is passed to
gdk_screen_get_monitor_at_window(), causing the assertion.

In default gtk builds gdk_window_get_origin() will detect the NULL window and
return early.  When this happens, as gdk_screen_get_monitor_at_window() is
currently written, it returns the last monitor in the list, and so Flash will
sometimes not get the correct geometry.

The results will be more serious in systems where GTK is built without checks
(as an optimization on embedded devices for example).  On such systems
gdk_window_get_origin() will crash.

If gdk_window_get_origin() doesn't crash it looks like the problems will be
limited to Flash having the incorrect monitor geometry as the next thing that
happens is that the GtkPlug is shown, which will cause the GdkDrawingArea to
be realized.
Blocks: OOPP
> The results will be more serious in systems where GTK is built without checks
> (as an optimization on embedded devices for example).  On such systems
> gdk_window_get_origin() will crash.

That might be what is happening here:
bp-a2cc6176-152d-4474-b96f-4d8132100423

libflashplayer.so           9BC43748D925AB0C97B43BB3C7019E210
is the latest stable Flash LNX 10,0,45,2.

0  	libgdk-x11-2.0.so.0.1800.9  	libgdk-x11-2.0.so.0.1800.9@0x2bb7b  	
1 	libgdk-x11-2.0.so.0.1800.9 	libgdk-x11-2.0.so.0.1800.9@0x2a7f6 	
2 	libflashplayer.so 	libflashplayer.so@0x3a35a 	
3 	libflashplayer.so 	libflashplayer.so@0x3d9ef 	
4 	libflashplayer.so 	libflashplayer.so@0x33570 	
5 	libflashplayer.so 	libflashplayer.so@0x37da3 	
6 	libxul.so mozilla::plugins::PluginInstanceChild::AnswerNPP_SetWindow 	dom/plugins/PluginInstanceChild.cpp:598


objdump -d --no-show-raw-insn --start-address=0x3a356 libflashplayer.so --stop-address=0x3a35b

   3a356:       call   2d7a0 <gdk_screen_get_monitor_at_window@plt>
Assignee: karlt → nobody
Component: Plug-ins → Flash (Adobe)
Product: Core → Plugins
QA Contact: plugins → adobe-flash
Summary: Flash OOPP: Gdk-CRITICAL **: gdk_window_get_origin: assertion `GDK_IS_WINDOW (window)' failed → Flash OOPP: Gdk-CRITICAL **: gdk_window_get_origin: assertion `GDK_IS_WINDOW (window)' failed [@ libgdk-x11-2.0.so.0.1800.9@0x2bb7b ]
Version: Trunk → 10.x
Assignee: nobody → karlt
Karl, should we just dup this bug against bug 561308?  (Or the other way.)
I'll mark this WFM since the check-in in bug 561308.

The bugs are similar but involve different parts of code in Flash Player.

Bug 561308 was also fixed in flashplayer10_1_rc2_linux_041910 (or probably earlier in one of the betas), so we don't actually /need/ the check-in of bug 561308 with that version of Flash Player.

However, without the patch in bug 561308, flashplayer10_1_rc2_linux_041910 still shows this bug with the gdk_window_get_origin assertion as well as a new
(<unknown>:2247): Gdk-WARNING **:
  gdkdrawable-x11.c:878 drawable is not a pixmap or window
this one from gdk_x11_drawable_get_xid().
Status: NEW → RESOLVED
Closed: 11 years ago
Depends on: 561308
Resolution: --- → WORKSFORME
Version and milestone values are being reset to defaults as part of product refactoring.
Version: 10.x → unspecified
You need to log in before you can comment on or make changes to this bug.