@@ -70,6 +70,8 @@ const WEBVIEW_BRIDGE_JS : *char = """(function(){'use strict';function generateI
7070@ extern public func gtk_init (argc : *mut int, argv : *mut *mut *char) : int
7171@ extern public func gtk_main ()
7272@ extern public func gtk_main_quit ()
73+ @ extern public func gtk_main_iteration () : int
74+ @ extern public func gtk_events_pending () : int
7375@ extern public func gtk_widget_show_all (widget : *mut GtkWidget)
7476@ extern public func gtk_widget_destroy (widget : *mut GtkWidget)
7577@ extern public func gtk_widget_set_size_request (widget : *mut GtkWidget, width : int, height : int)
@@ -437,16 +439,19 @@ func linux_json_escape(sv : std::string_view) : string {
437439// params}, calls the bound handler, and sends the result back via
438440// window.__webview__.onReply(id, 0, result).
439441func linux_on_message (wv : *mut WebView, msg : *char) {
442+ fprintf (stderr, "[WV-BRIDGE] message received\n " )
440443 var msg_view = std:: string_view:: make_no_len (msg)
441444
442445 var id_str = linux_json_value (msg_view, "\" id\" :" )
443446 var method = linux_json_value (msg_view, "\" method\" :" )
444447 var params_str = linux_json_value (msg_view, "\" params\" :" )
445448
446449 if (method.size () == 0 ) {
450+ fprintf (stderr, "[WV-BRIDGE] empty method\n " )
447451 return
448452 }
449453
454+ fprintf (stderr, "[WV-BRIDGE] method=%s\n " , method.data ())
450455 var method_view = std:: string_view:: make_view (&method)
451456 var params_view = std:: string_view:: make_view (¶ms_str)
452457 var result = wv.bind_ctx.handler (method_view, params_view)
@@ -677,6 +682,15 @@ public func webview_load_html(wv : *mut WebView, html : *char) {
677682public func webview_evaluate_js (wv : *mut WebView, script : *char) {
678683 if (wv.web_view != null) {
679684 webkit_web_view_run_javascript (wv.web_view as *mut WebKitWebView, script, null, null, null)
685+ // Pump the GLib main loop until no more events are pending so the queued
686+ // JS (e.g. onReply) actually executes. A single iteration may pick up an
687+ // unrelated event (e.g. download-thread I/O) and leave the JS evaluation
688+ // callback still queued; the Promise would then never resolve.
689+ var safety = 0
690+ while (gtk_events_pending () != 0 && safety < 20 ) {
691+ gtk_main_iteration ()
692+ safety = safety + 1
693+ }
680694 }
681695}
682696
0 commit comments