Mail: Drag'n'drop to PDF format freezes application
This is a follow up from #969 (closed)
When there's set:
$ gsettings set org.gnome.evolution.mail drag-and-drop-save-file-format 'pdf'
the Evolution can get frozen when hovering mouse above the target, like above a Nautilus window. It could be reproduced above the composer window too, but the #969 (closed) workarounds it.
This can be reproduced with webkit2gtk3-2.28.2-2.fc32.x86_64 and the backtrace of Evolution when hovering above the Nautilus window is:
Thread 1 (Thread 0x7fa3bcdaec80 (LWP 89493)):
#0 0x00007fa3c3d6fb6f in poll () at /lib64/libc.so.6
#1 0x00007fa3c7f5fc59 in g_poll (fds=0x4308bb0, nfds=1, timeout=-1) at ../glib/gpoll.c:125
#2 0x00007fa3c7f4cef9 in g_main_context_poll (context=0x4a97740, timeout=-1, priority=2147483647, fds=0x4308bb0, n_fds=1) at ../glib/gmain.c:4359
#3 0x00007fa3c7f4c81e in g_main_context_iterate (context=0x4a97740, block=1, dispatch=1, self=0x16232c0) at ../glib/gmain.c:4055
#4 0x00007fa3c7f4cca2 in g_main_loop_run (loop=0x465e2c0) at ../glib/gmain.c:4254
#5 0x00007fa3c767c57b in e_async_closure_wait (closure=0x7fa394237c00) at .../evolution-data-server/src/libedataserver/e-data-server-util.c:1804
#6 0x00007fa3ac18c9eb in em_utils_print_messages_to_file (folder=0x7fa318006190 [CamelIMAPXFolder], uid=0x44de730 "4856", filename=0x422f510 "/home/mcrha/.cache/evolution/tmp/drag-n-drop-8HbJzg/20200604202318_librsvg_2.49.2.pdf") at .../evolution/src/mail/em-utils.c:519
#7 0x00007fa3ac18dc9e in em_utils_selection_set_urilist (data=0x7ffda68d7950, folder=0x7fa318006190 [CamelIMAPXFolder], uids=0x1a84ba0) at .../evolution/src/mail/em-utils.c:1085
#8 0x00007fa3ac19f87e in ml_tree_drag_data_get (tree=0x4938fa0 [MessageList], row=4660, node=0x43de350, col=5, context=0x3b231c0 [GdkX11DragContext], data=0x7ffda68d7950, info=2, time=25694617, message_list=0x4938fa0 [MessageList]) at .../evolution/src/mail/message-list.c:2594
#13 0x00007fa3c7393707 in <emit signal ??? on instance 0x4938fa0 [MessageList]> (instance=0x4938fa0, signal_id=591, detail=0) at ../gobject/gsignal.c:3554
#9 0x00007fa3c3f9df52 in e_marshal_VOID__INT_POINTER_INT_OBJECT_BOXED_UINT_UINT (closure=0x498b2b0, return_value=0x0, n_param_values=8, param_values=0x7ffda68d6ac0, invocation_hint=0x7ffda68d6a00, marshal_data=0x0) at .../evolution/_build/src/e-util/e-marshal.c:1452
#10 0x00007fa3c73756c6 in g_closure_invoke (closure=0x498b2b0, return_value=0x0, n_param_values=8, param_values=0x7ffda68d6ac0, invocation_hint=0x7ffda68d6a00) at ../gobject/gclosure.c:810
#11 0x00007fa3c7393e92 in signal_emit_unlocked_R (node=0x474dd80, detail=0, instance=0x4938fa0, emission_return=0x0, instance_and_params=0x7ffda68d6ac0) at ../gobject/gsignal.c:3742
#12 0x00007fa3c7393184 in g_signal_emit_valist (instance=0x4938fa0, signal_id=591, detail=0, var_args=0x7ffda68d6e18) at ../gobject/gsignal.c:3498
#14 0x00007fa3c4067dc3 in et_drag_data_get (widget=0x3fe6150 [ECanvas], context=0x3b231c0 [GdkX11DragContext], selection_data=0x7ffda68d7950, info=2, time=25694617, tree=0x4938fa0 [MessageList]) at .../evolution/src/e-util/e-tree.c:2438
#15 0x00007fa3c7b2ce32 in _gtk_marshal_VOID__OBJECT_BOXED_UINT_UINTv (closure=0x3fe4c70, return_value=<optimized out>, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x15eceb0) at gtkmarshalers.c:5345
#16 0x00007fa3c73759b7 in _g_closure_invoke_va (closure=0x3fe4c70, return_value=0x0, instance=0x3fe6150, args=0x7ffda68d7318, n_params=4, param_types=0x15eceb0) at ../gobject/gclosure.c:873
#17 0x00007fa3c73924bc in g_signal_emit_valist (instance=0x3fe6150, signal_id=95, detail=0, var_args=0x7ffda68d7318) at ../gobject/gsignal.c:3407
#18 0x00007fa3c7393874 in g_signal_emit_by_name (instance=0x3fe6150, detailed_signal=0x7fa3c7b3858a "drag-data-get") at ../gobject/gsignal.c:3594
#19 0x00007fa3c7afd97d in gtk_drag_selection_get (widget=widget@entry=0x467dce0 [GtkWindow], selection_data=selection_data@entry=0x7ffda68d7950, sel_info=2, time=25694617, data=0x19d5b60) at gtkdnd.c:2723
#20 0x00007fa3c7b2b394 in _gtk_marshal_VOID__BOXED_UINT_FLAGSv (closure=0x4744600, return_value=<optimized out>, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x1605450) at gtkmarshalers.c:3697
#21 0x00007fa3c73759b7 in _g_closure_invoke_va (closure=0x4744600, return_value=0x0, instance=0x467dce0, args=0x7ffda68d77f8, n_params=3, param_types=0x1605450) at ../gobject/gclosure.c:873
#22 0x00007fa3c73924bc in g_signal_emit_valist (instance=0x467dce0, signal_id=85, detail=0, var_args=0x7ffda68d77f8) at ../gobject/gsignal.c:3407
#23 0x00007fa3c7393874 in g_signal_emit_by_name (instance=0x467dce0, detailed_signal=0x7fa3c7b93c95 "selection-get") at ../gobject/gsignal.c:3594
#24 0x00007fa3c7a0c42b in gtk_selection_invoke_handler (widget=widget@entry=0x467dce0 [GtkWindow], data=data@entry=0x7ffda68d7950, time=25694617) at gtkselection.c:3115
#25 0x00007fa3c7a0e10e in _gtk_selection_request (widget=widget@entry=0x467dce0 [GtkWindow], event=event@entry=0x7fa394234e50) at gtkselection.c:2502
#26 0x00007fa3c7b25eac in _gtk_marshal_BOOLEAN__BOXEDv (closure=0x1604d10, return_value=0x7ffda68d7c60, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x1604d40) at gtkmarshalers.c:129
#27 0x00007fa3c7375e34 in g_type_class_meta_marshalv (closure=0x1604d10, return_value=0x7ffda68d7c60, instance=0x467dce0, args=0x7ffda68d7df8, marshal_data=0x208, n_params=1, param_types=0x1604d40) at ../gobject/gclosure.c:1034
#28 0x00007fa3c73759b7 in _g_closure_invoke_va (closure=0x1604d10, return_value=0x7ffda68d7c60, instance=0x467dce0, args=0x7ffda68d7df8, n_params=1, param_types=0x1604d40) at ../gobject/gclosure.c:873
#29 0x00007fa3c73924bc in g_signal_emit_valist (instance=0x467dce0, signal_id=82, detail=0, var_args=0x7ffda68d7df8) at ../gobject/gsignal.c:3407
#30 0x00007fa3c7393707 in g_signal_emit (instance=0x467dce0, signal_id=82, detail=0) at ../gobject/gsignal.c:3554
#31 0x00007fa3c7acefe4 in gtk_widget_event_internal (widget=0x467dce0 [GtkWindow], event=0x7fa394234e50) at gtkwidget.c:7808
#32 0x00007fa3c7ad1252 in gtk_widget_event_internal (event=<optimized out>, widget=<optimized out>) at gtkwidget.c:7687
#33 gtk_widget_event (widget=<optimized out>, event=<optimized out>) at gtkwidget.c:7378
#34 0x00007fa37400ead0 in ()
#35 0x000000000161e490 in ()
#36 0x0000000000000000 in ()
When I revert the change for #969 (closed), I see WebKit is doing somethign similar:
Thread 1 (Thread 0x7f7c5b4f5c80 (LWP 37686)):
#0 0x00007f7c624b6b6f in poll () at /lib64/libc.so.6
#1 0x00007f7c666a6c59 in g_poll (fds=0x6f475f0, nfds=1, timeout=-1) at ../glib/gpoll.c:125
#2 0x00007f7c66693ef9 in g_main_context_poll (context=0x6aed0a0, timeout=-1, priority=2147483647, fds=0x6f475f0, n_fds=1) at ../glib/gmain.c:4359
#3 0x00007f7c6669381e in g_main_context_iterate (context=0x6aed0a0, block=1, dispatch=1, self=0x203f6c0) at ../glib/gmain.c:4055
#4 0x00007f7c66693ca2 in g_main_loop_run (loop=0x6933b40) at ../glib/gmain.c:4254
#5 0x00007f7c65dc357b in e_async_closure_wait (closure=0x7f7c1773a750) at .../evolution-data-server/src/libedataserver/e-data-server-util.c:1804
#6 0x00007f7c3e7949eb in em_utils_print_messages_to_file (folder=0x7fd6140 [CamelIMAPXFolder], uid=0x4b50430 "4856", filename=0x744f230 "/home/mcrha/.cache/evolution/tmp/drag-n-drop-1SqPiQ/20200604202318_librsvg_2.49.2.pdf") at .../evolution/src/mail/em-utils.c:519
#7 0x00007f7c3e795c9e in em_utils_selection_set_urilist (data=0x7fffc2e53750, folder=0x7fd6140 [CamelIMAPXFolder], uids=0x8e77e40) at .../evolution/src/mail/em-utils.c:1085
#8 0x00007f7c3e7a787e in ml_tree_drag_data_get (tree=0x5312c70 [MessageList], row=4660, node=0x7f7b7c94b010, col=5, context=0x8a25860 [GdkX11DragContext], data=0x7fffc2e53750, info=2, time=19704936, message_list=0x5312c70 [MessageList]) at .../evolution/src/mail/message-list.c:2594
#13 0x00007f7c65ada707 in <emit signal ??? on instance 0x5312c70 [MessageList]> (instance=0x5312c70, signal_id=591, detail=0) at ../gobject/gsignal.c:3554
#9 0x00007f7c626e4f52 in e_marshal_VOID__INT_POINTER_INT_OBJECT_BOXED_UINT_UINT (closure=0x48aa020, return_value=0x0, n_param_values=8, param_values=0x7fffc2e528e0, invocation_hint=0x7fffc2e52820, marshal_data=0x0) at .../evolution/_build/src/e-util/e-marshal.c:1452
#10 0x00007f7c65abc6c6 in g_closure_invoke (closure=0x48aa020, return_value=0x0, n_param_values=8, param_values=0x7fffc2e528e0, invocation_hint=0x7fffc2e52820) at ../gobject/gclosure.c:810
#11 0x00007f7c65adae92 in signal_emit_unlocked_R (node=0x52b5be0, detail=0, instance=0x5312c70, emission_return=0x0, instance_and_params=0x7fffc2e528e0) at ../gobject/gsignal.c:3742
#12 0x00007f7c65ada184 in g_signal_emit_valist (instance=0x5312c70, signal_id=591, detail=0, var_args=0x7fffc2e52c38) at ../gobject/gsignal.c:3498
#14 0x00007f7c627aedc3 in et_drag_data_get (widget=0x48a0170 [ECanvas], context=0x8a25860 [GdkX11DragContext], selection_data=0x7fffc2e53750, info=2, time=19704936, tree=0x5312c70 [MessageList]) at .../evolution/src/e-util/e-tree.c:2438
#15 0x00007f7c66273e32 in _gtk_marshal_VOID__OBJECT_BOXED_UINT_UINTv (closure=0x48a2510, return_value=<optimized out>, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x1f52100) at gtkmarshalers.c:5345
#16 0x00007f7c65abc9b7 in _g_closure_invoke_va (closure=0x48a2510, return_value=0x0, instance=0x48a0170, args=0x7fffc2e53138, n_params=4, param_types=0x1f52100) at ../gobject/gclosure.c:873
#17 0x00007f7c65ad94bc in g_signal_emit_valist (instance=0x48a0170, signal_id=95, detail=0, var_args=0x7fffc2e53138) at ../gobject/gsignal.c:3407
#18 0x00007f7c65ada874 in g_signal_emit_by_name (instance=0x48a0170, detailed_signal=0x7f7c6627f58a "drag-data-get") at ../gobject/gsignal.c:3594
#19 0x00007f7c6624497d in gtk_drag_selection_get (widget=widget@entry=0x67c6a80 [GtkWindow], selection_data=selection_data@entry=0x7fffc2e53750, sel_info=2, time=19704936, data=0x9162fd0) at gtkdnd.c:2723
#20 0x00007f7c66272394 in _gtk_marshal_VOID__BOXED_UINT_FLAGSv (closure=0x6e33370, return_value=<optimized out>, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x2021c10) at gtkmarshalers.c:3697
#21 0x00007f7c65abc9b7 in _g_closure_invoke_va (closure=0x6e33370, return_value=0x0, instance=0x67c6a80, args=0x7fffc2e53618, n_params=3, param_types=0x2021c10) at ../gobject/gclosure.c:873
#22 0x00007f7c65ad94bc in g_signal_emit_valist (instance=0x67c6a80, signal_id=85, detail=0, var_args=0x7fffc2e53618) at ../gobject/gsignal.c:3407
#23 0x00007f7c65ada874 in g_signal_emit_by_name (instance=0x67c6a80, detailed_signal=0x7f7c662dac95 "selection-get") at ../gobject/gsignal.c:3594
#24 0x00007f7c6615342b in gtk_selection_invoke_handler (widget=0x67c6a80 [GtkWindow], data=data@entry=0x7fffc2e53750, time=time@entry=19704936) at gtkselection.c:3115
#25 0x00007f7c661536ed in gtk_selection_convert (widget=0x67c6fc0 [GtkWindow], selection=0xcf, target=0x8c, time_=time_@entry=19704936) at gtkselection.c:1168
#26 0x00007f7c66244856 in gtk_drag_get_data (widget=widget@entry=0x8d7ef90 [EWebKitEditor], context=<optimized out>, target=<optimized out>, time_=time_@entry=19704936) at gtkdnd.c:900
#27 0x00007f7c6335b5b1 in WebKit::DragAndDropHandler::dragDataSelection(_GdkDragContext*, WebCore::IntPoint const&, unsigned int) (this=this@entry=0x7f7c2bd91e80, context=context@entry=0x8a25a20 [GdkX11DragContext], position=..., time=time@entry=19704936) at /usr/include/c++/10/bits/unique_ptr.h:420
#28 0x00007f7c6335b693 in WebKit::DragAndDropHandler::dragMotion(_GdkDragContext*, WebCore::IntPoint const&, unsigned int) (this=0x7f7c2bd91e80, context=context@entry=0x8a25a20 [GdkX11DragContext], position=..., time=time@entry=19704936) at ../Source/WebKit/UIProcess/gtk/DragAndDropHandler.cpp:223
#29 0x00007f7c632de9bf in webkitWebViewBaseDragMotion(GtkWidget*, GdkDragContext*, gint, gint, guint) (widget=widget@entry=0x8d7ef90 [EWebKitEditor], context=context@entry=0x8a25a20 [GdkX11DragContext], x=148, y=246, time=19704936) at DerivedSources/ForwardingHeaders/WebCore/IntPoint.h:72
#30 0x00007f7c6626e0aa in _gtk_marshal_BOOLEAN__OBJECT_INT_INT_UINTv (closure=0x2023270, return_value=0x7fffc2e53be0, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x1ff6410) at gtkmarshalers.c:884
#31 0x00007f7c65abce34 in g_type_class_meta_marshalv (closure=0x2023270, return_value=0x7fffc2e53be0, instance=0x8d7ef90, args=0x7fffc2e53d78, marshal_data=0x280, n_params=4, param_types=0x1ff6410) at ../gobject/gclosure.c:1034
#32 0x00007f7c65abc9b7 in _g_closure_invoke_va (closure=0x2023270, return_value=0x7fffc2e53be0, instance=0x8d7ef90, args=0x7fffc2e53d78, n_params=4, param_types=0x1ff6410) at ../gobject/gclosure.c:873
#33 0x00007f7c65ad94bc in g_signal_emit_valist (instance=0x8d7ef90, signal_id=93, detail=0, var_args=0x7fffc2e53d78) at ../gobject/gsignal.c:3407
#34 0x00007f7c65ada874 in g_signal_emit_by_name (instance=0x8d7ef90, detailed_signal=0x7f7c662ae5e4 "drag-motion") at ../gobject/gsignal.c:3594
#35 0x00007f7c66245c5a in gtk_drag_dest_motion (widget=widget@entry=0x8d7ef90 [EWebKitEditor], context=context@entry=0x8a25a20 [GdkX11DragContext], x=148, y=246, time=time@entry=19704936) at gtkdnd.c:1572
#36 0x00007f7c662461d9 in gtk_drag_find_widget (callback=0x7f7c66245af0 <gtk_drag_dest_motion>, time=19704936, y=<optimized out>, x=<optimized out>, info=0x8e00530, context=0x8a25a20 [GdkX11DragContext], widget=0x8d7ef90 [EWebKitEditor]) at gtkdnd.c:1270
#37 _gtk_drag_dest_handle_event (toplevel=toplevel@entry=0x6e403b0 [EMsgComposer], event=event@entry=0x9d375e0) at gtkdnd.c:1091
#38 0x00007f7c660c680b in gtk_main_do_event (event=0x9d375e0) at gtkmain.c:1938
#39 gtk_main_do_event (event=<optimized out>) at gtkmain.c:1690
#40 0x00007f7c622f5029 in _gdk_event_emit (event=event@entry=0x9d375e0) at gdkevents.c:73
#41 0x00007f7c623298e6 in gdk_event_source_dispatch (source=<optimized out>, callback=<optimized out>, user_data=<optimized out>) at gdkeventsource.c:367
#42 0x00007f7c666927d8 in g_main_dispatch (context=0x2007c00) at ../glib/gmain.c:3322
#43 0x00007f7c66693664 in g_main_context_dispatch (context=0x2007c00) at ../glib/gmain.c:3987
#44 0x00007f7c66693849 in g_main_context_iterate (context=0x2007c00, block=1, dispatch=1, self=0x203f6c0) at ../glib/gmain.c:4060
#45 0x00007f7c66693ca2 in g_main_loop_run (loop=0x4741e60) at ../glib/gmain.c:4254
#46 0x00007f7c660c591d in gtk_main () at gtkmain.c:1328
#47 0x00000000004059a3 in main (argc=1, argv=0x7fffc2e542a8) at .../evolution/src/shell/main.c:694
The problem is that the e_async_closure_wait()
iterates its own GMainContext, not the main GMainContext, thus when WebKitGTK wants to do anything in the main GMainContext its requests are not processed.