From 0aea102bd397fc7035d1815d36fd49261e15be04 Mon Sep 17 00:00:00 2001 From: "chunmao.guo" Date: Thu, 6 Apr 2023 16:18:23 +0800 Subject: [PATCH] FIX: [STUDIO-2631] call AddScriptMessageHandler queued Change-Id: I6a71c2db3ed1b3d06931f53428a8d78881399b4d --- src/slic3r/GUI/Widgets/WebView.cpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/slic3r/GUI/Widgets/WebView.cpp b/src/slic3r/GUI/Widgets/WebView.cpp index e1006f073..74efaa67b 100644 --- a/src/slic3r/GUI/Widgets/WebView.cpp +++ b/src/slic3r/GUI/Widgets/WebView.cpp @@ -128,6 +128,7 @@ class FakeWebView : public wxWebView wxDEFINE_EVENT(EVT_WEBVIEW_RECREATED, wxCommandEvent); static std::vector g_webviews; +static std::vector g_delay_webviews; class WebViewRef : public wxObjectRefData { @@ -193,16 +194,27 @@ wxWebView* WebView::CreateWebView(wxWindow * parent, wxString const & url) WKWebView * wkWebView = (WKWebView *) webView->GetNativeBackend(); Slic3r::GUI::WKWebView_setTransparentBackground(wkWebView); #endif + auto addScriptMessageHandler = [] (wxWebView *webView) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": begin to add script message handler for wx."; + Slic3r::GUI::wxGetApp().set_adding_script_handler(true); + if (!webView->AddScriptMessageHandler("wx")) + wxLogError("Could not add script message handler"); + Slic3r::GUI::wxGetApp().set_adding_script_handler(false); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": finished add script message handler for wx."; + }; #ifndef __WIN32__ - webView->CallAfter([webView] { + webView->CallAfter([webView, addScriptMessageHandler] { #endif - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": begin to add script message handler for wx."; - Slic3r::GUI::wxGetApp().set_adding_script_handler(true); - if (!webView->AddScriptMessageHandler("wx")) - wxLogError("Could not add script message handler"); - Slic3r::GUI::wxGetApp().set_adding_script_handler(false); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": finished add script message handler for wx."; - + if (Slic3r::GUI::wxGetApp().is_adding_script_handler()) { + g_delay_webviews.push_back(webView); + } else { + addScriptMessageHandler(webView); + while (!g_delay_webviews.empty()) { + auto views = std::move(g_delay_webviews); + for (auto wv : views) + addScriptMessageHandler(wv); + } + } #ifndef __WIN32__ }); #endif