FIX: async evaluateJavaScript on vebwiew on MacOS

Change-Id: If4c34ef0e9b23622047842bada5a32efcee04498
This commit is contained in:
chunmao.guo 2022-08-02 17:59:28 +08:00 committed by Lane.Wei
parent 9df3e7500a
commit 4b4e70efcb
3 changed files with 20 additions and 1 deletions

View File

@ -1,14 +1,15 @@
#include "WebView.hpp"
#include "slic3r/GUI/GUI_App.hpp"
#include "slic3r/Utils/MacDarkMode.hpp"
#include <wx/webviewarchivehandler.h>
#include <wx/webviewfshandler.h>
#include <wx/msw/webview_edge.h>
#include <wx/uri.h>
#include "wx/private/jsscriptwrapper.h"
#ifdef __WIN32__
#include "../WebView2.h"
#include "wx/private/jsscriptwrapper.h"
#endif
class FakeWebView : public wxWebView
@ -124,6 +125,12 @@ bool WebView::RunScript(wxWebView *webView, wxString const &javascript)
int count = 0;
wxJSScriptWrapper wrapJS(javascript, &count);
return webView2->ExecuteScript(wrapJS.GetWrappedCode(), NULL) == 0;
#elif defined __WXMAC__
WKWebView * wkWebView = (WKWebView *) webView->GetNativeBackend();
int count = 0;
wxJSScriptWrapper wrapJS(javascript, &count);
Slic3r::GUI::WKWebView_evaluateJavaScript(wkWebView, wrapJS.GetWrappedCode(), nullptr);
return true;
#else
wxString result;
return webView->RunScript(javascript, &result);

View File

@ -10,6 +10,7 @@ namespace GUI {
extern bool mac_dark_mode();
extern double mac_max_scaling_factor();
extern void set_miniaturizable(void * window);
void WKWebView_evaluateJavaScript(void * web, wxString const & script, void (*callback)(wxString const &));
void initGestures(void * view, wxEvtHandler * handler);

View File

@ -1,4 +1,5 @@
#import "MacDarkMode.hpp"
#include "wx/osx/core/cfstring.h"
#import <algorithm>
@ -57,6 +58,16 @@ void set_miniaturizable(void * window)
}
}
void WKWebView_evaluateJavaScript(void * web, wxString const & script, void (*callback)(wxString const &))
{
[(WKWebView*)web evaluateJavaScript:wxCFStringRef(script).AsNSString() completionHandler: ^(id result, NSError *error) {
if (callback && error != nil) {
wxString err = wxCFStringRef(error.localizedFailureReason).AsString();
callback(err);
}
}];
}
}
}