diff --git a/include/wx/osx/webview_webkit.h b/include/wx/osx/webview_webkit.h index 968c69d4f5..420b8f6452 100644 --- a/include/wx/osx/webview_webkit.h +++ b/include/wx/osx/webview_webkit.h @@ -94,7 +94,7 @@ public: virtual void SetEditable(bool enable = true) wxOVERRIDE; virtual bool IsEditable() const wxOVERRIDE; - bool RunScript(const wxString& javascript, wxString* output = NULL) const wxOVERRIDE; + virtual void RunScriptAsync(const wxString& javascript, void* clientData = NULL) const wxOVERRIDE; virtual bool AddScriptMessageHandler(const wxString& name) wxOVERRIDE; virtual bool RemoveScriptMessageHandler(const wxString& name) wxOVERRIDE; virtual bool AddUserScript(const wxString& javascript, diff --git a/src/osx/webview_webkit.mm b/src/osx/webview_webkit.mm index f7286d58f9..8cc462d414 100644 --- a/src/osx/webview_webkit.mm +++ b/src/osx/webview_webkit.mm @@ -371,41 +371,28 @@ bool wxWebViewWebKit::CanSetZoomType(wxWebViewZoomType type) const } } -bool wxWebViewWebKit::RunScript(const wxString& javascript, wxString* output) const +void wxWebViewWebKit::RunScriptAsync(const wxString& javascript, void* clientData) const { wxJSScriptWrapper wrapJS(javascript, wxJSScriptWrapper::JS_OUTPUT_STRING); - __block int scriptResult = -1; - __block wxString result; - // Start script execution [m_webView evaluateJavaScript:wxCFStringRef(wrapJS.GetWrappedCode()).AsNSString() completionHandler:^(id _Nullable obj, NSError * _Nullable error) { if (error) { - result.assign(wxCFStringRef(error.localizedDescription).AsString()); - scriptResult = 0; + SendScriptResult(clientData, false, wxCFStringRef(error.localizedDescription).AsString()); } else { + wxString scriptResult; if (obj) - result.assign(wxCFStringRef::AsString([NSString stringWithFormat:@"%@", obj])); - scriptResult = 1; + scriptResult = wxCFStringRef::AsString([NSString stringWithFormat:@"%@", obj]); + wxString scriptOutput; + bool success = wxJSScriptWrapper::ExtractOutput(scriptResult, &scriptOutput); + + SendScriptResult(clientData, success, scriptOutput); } }]; - - // Wait for script exection - while (scriptResult == -1) - wxYield(); - - if (scriptResult == 0) - { - if (output) - output->assign(result); - return false; - } - else - return wxJSScriptWrapper::ExtractOutput(result, output); } bool wxWebViewWebKit::AddScriptMessageHandler(const wxString& name)