diff --git a/include/wx/msw/private/webview_edge.h b/include/wx/msw/private/webview_edge.h index 7c5efcce51..58d2f25908 100644 --- a/include/wx/msw/private/webview_edge.h +++ b/include/wx/msw/private/webview_edge.h @@ -75,6 +75,8 @@ public: ICoreWebView2Settings* GetSettings(); + void UpdateWebMessageHandler(); + static wxDynamicLibrary ms_loaderDll; static wxString ms_browserExecutableDir; static wxString ms_version; diff --git a/samples/webview/webview.cpp b/samples/webview/webview.cpp index 02441633a7..d78bbfe8d2 100644 --- a/samples/webview/webview.cpp +++ b/samples/webview/webview.cpp @@ -158,6 +158,7 @@ public: void OnRunScriptDateWithEmulationLevel(wxCommandEvent& evt); void OnRunScriptArrayWithEmulationLevel(wxCommandEvent& evt); #endif + void OnRunScriptMessage(wxCommandEvent& evt); void OnRunScriptCustom(wxCommandEvent& evt); void OnAddUserScript(wxCommandEvent& evt); void OnClearSelection(wxCommandEvent& evt); @@ -229,6 +230,7 @@ private: wxMenuItem* m_script_date_el; wxMenuItem* m_script_array_el; #endif + wxMenuItem* m_script_message; wxMenuItem* m_script_custom; wxMenuItem* m_selection_clear; wxMenuItem* m_selection_delete; @@ -487,6 +489,7 @@ WebFrame::WebFrame(const wxString& url) : m_script_array_el = script_menu->Append(wxID_ANY, "Return array changing emulation level"); } #endif + m_script_message = script_menu->Append(wxID_ANY, "Send script message"); m_script_custom = script_menu->Append(wxID_ANY, "Custom script"); m_tools_menu->AppendSubMenu(script_menu, _("Run Script")); wxMenuItem* addUserScript = m_tools_menu->Append(wxID_ANY, _("Add user script")); @@ -587,6 +590,7 @@ WebFrame::WebFrame(const wxString& url) : Bind(wxEVT_MENU, &WebFrame::OnRunScriptArrayWithEmulationLevel, this, m_script_array_el->GetId()); } #endif + Bind(wxEVT_MENU, &WebFrame::OnRunScriptMessage, this, m_script_message->GetId()); Bind(wxEVT_MENU, &WebFrame::OnRunScriptCustom, this, m_script_custom->GetId()); Bind(wxEVT_MENU, &WebFrame::OnAddUserScript, this, addUserScript->GetId()); Bind(wxEVT_MENU, &WebFrame::OnClearSelection, this, m_selection_clear->GetId()); @@ -1187,6 +1191,11 @@ void WebFrame::OnRunScriptArrayWithEmulationLevel(wxCommandEvent& WXUNUSED(evt)) } #endif +void WebFrame::OnRunScriptMessage(wxCommandEvent & evt) +{ + RunScript("window.wx.postMessage('This is a web message');"); +} + void WebFrame::OnRunScriptCustom(wxCommandEvent& WXUNUSED(evt)) { wxTextEntryDialog dialog diff --git a/src/gtk/webview_webkit2.cpp b/src/gtk/webview_webkit2.cpp index 3d61057b97..4ae910e5af 100644 --- a/src/gtk/webview_webkit2.cpp +++ b/src/gtk/webview_webkit2.cpp @@ -1307,7 +1307,17 @@ bool wxWebViewWebKit::AddScriptMessageHandler(const wxString& name) WebKitUserContentManager *ucm = webkit_web_view_get_user_content_manager(m_web_view); g_signal_connect(ucm, wxString::Format("script-message-received::%s", name).utf8_str(), G_CALLBACK(wxgtk_webview_webkit_script_message_received), this); - return webkit_user_content_manager_register_script_message_handler(ucm, name.utf8_str()); + bool res = webkit_user_content_manager_register_script_message_handler(ucm, name.utf8_str()); + if (res) + { + // Make webkit message handler available under common name + wxString js = wxString::Format("window.%s = window.webkit.messageHandlers.%s;", + name, name); + AddUserScript(js); + RunScript(js); + } + + return res; } bool wxWebViewWebKit::RemoveScriptMessageHandler(const wxString& name) diff --git a/src/msw/webview_edge.cpp b/src/msw/webview_edge.cpp index 600375da22..8bc4e2590a 100644 --- a/src/msw/webview_edge.cpp +++ b/src/msw/webview_edge.cpp @@ -420,8 +420,8 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control if (settings) { settings->put_IsStatusBarEnabled(false); - settings->put_IsWebMessageEnabled(!m_scriptMsgHandlerName.empty()); } + UpdateWebMessageHandler(); if (!m_pendingUserScripts.empty()) { @@ -440,6 +440,24 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control return S_OK; } +void wxWebViewEdgeImpl::UpdateWebMessageHandler() +{ + wxCOMPtr settings(GetSettings()); + if (!settings) + return; + + settings->put_IsWebMessageEnabled(!m_scriptMsgHandlerName.empty()); + + if (!m_scriptMsgHandlerName.empty()) + { + // Make edge message handler available under common name + wxString js = wxString::Format("window.%s = window.chrome.webview;", + m_scriptMsgHandlerName); + m_ctrl->AddUserScript(js); + m_webView->ExecuteScript(js.wc_str(), NULL); + } +} + ICoreWebView2Settings* wxWebViewEdgeImpl::GetSettings() { if (!m_webView) @@ -826,9 +844,7 @@ bool wxWebViewEdge::AddScriptMessageHandler(const wxString& name) return false; m_impl->m_scriptMsgHandlerName = name; - wxCOMPtr settings(m_impl->GetSettings()); - if (settings) - settings->put_IsWebMessageEnabled(true); + m_impl->UpdateWebMessageHandler(); return true; } @@ -836,9 +852,7 @@ bool wxWebViewEdge::AddScriptMessageHandler(const wxString& name) bool wxWebViewEdge::RemoveScriptMessageHandler(const wxString& WXUNUSED(name)) { m_impl->m_scriptMsgHandlerName.clear(); - wxCOMPtr settings(m_impl->GetSettings()); - if (settings) - settings->put_IsWebMessageEnabled(false); + m_impl->UpdateWebMessageHandler(); return true; }