Add common web message identifier

This commit is contained in:
Tobias Taschner
2021-02-27 11:55:50 +01:00
parent c9606d7b5a
commit 29bfcdfd5e
4 changed files with 43 additions and 8 deletions

View File

@@ -75,6 +75,8 @@ public:
ICoreWebView2Settings* GetSettings(); ICoreWebView2Settings* GetSettings();
void UpdateWebMessageHandler();
static wxDynamicLibrary ms_loaderDll; static wxDynamicLibrary ms_loaderDll;
static wxString ms_browserExecutableDir; static wxString ms_browserExecutableDir;
static wxString ms_version; static wxString ms_version;

View File

@@ -158,6 +158,7 @@ public:
void OnRunScriptDateWithEmulationLevel(wxCommandEvent& evt); void OnRunScriptDateWithEmulationLevel(wxCommandEvent& evt);
void OnRunScriptArrayWithEmulationLevel(wxCommandEvent& evt); void OnRunScriptArrayWithEmulationLevel(wxCommandEvent& evt);
#endif #endif
void OnRunScriptMessage(wxCommandEvent& evt);
void OnRunScriptCustom(wxCommandEvent& evt); void OnRunScriptCustom(wxCommandEvent& evt);
void OnAddUserScript(wxCommandEvent& evt); void OnAddUserScript(wxCommandEvent& evt);
void OnClearSelection(wxCommandEvent& evt); void OnClearSelection(wxCommandEvent& evt);
@@ -229,6 +230,7 @@ private:
wxMenuItem* m_script_date_el; wxMenuItem* m_script_date_el;
wxMenuItem* m_script_array_el; wxMenuItem* m_script_array_el;
#endif #endif
wxMenuItem* m_script_message;
wxMenuItem* m_script_custom; wxMenuItem* m_script_custom;
wxMenuItem* m_selection_clear; wxMenuItem* m_selection_clear;
wxMenuItem* m_selection_delete; 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"); m_script_array_el = script_menu->Append(wxID_ANY, "Return array changing emulation level");
} }
#endif #endif
m_script_message = script_menu->Append(wxID_ANY, "Send script message");
m_script_custom = script_menu->Append(wxID_ANY, "Custom script"); m_script_custom = script_menu->Append(wxID_ANY, "Custom script");
m_tools_menu->AppendSubMenu(script_menu, _("Run Script")); m_tools_menu->AppendSubMenu(script_menu, _("Run Script"));
wxMenuItem* addUserScript = m_tools_menu->Append(wxID_ANY, _("Add user 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()); Bind(wxEVT_MENU, &WebFrame::OnRunScriptArrayWithEmulationLevel, this, m_script_array_el->GetId());
} }
#endif #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::OnRunScriptCustom, this, m_script_custom->GetId());
Bind(wxEVT_MENU, &WebFrame::OnAddUserScript, this, addUserScript->GetId()); Bind(wxEVT_MENU, &WebFrame::OnAddUserScript, this, addUserScript->GetId());
Bind(wxEVT_MENU, &WebFrame::OnClearSelection, this, m_selection_clear->GetId()); Bind(wxEVT_MENU, &WebFrame::OnClearSelection, this, m_selection_clear->GetId());
@@ -1187,6 +1191,11 @@ void WebFrame::OnRunScriptArrayWithEmulationLevel(wxCommandEvent& WXUNUSED(evt))
} }
#endif #endif
void WebFrame::OnRunScriptMessage(wxCommandEvent & evt)
{
RunScript("window.wx.postMessage('This is a web message');");
}
void WebFrame::OnRunScriptCustom(wxCommandEvent& WXUNUSED(evt)) void WebFrame::OnRunScriptCustom(wxCommandEvent& WXUNUSED(evt))
{ {
wxTextEntryDialog dialog wxTextEntryDialog dialog

View File

@@ -1307,7 +1307,17 @@ bool wxWebViewWebKit::AddScriptMessageHandler(const wxString& name)
WebKitUserContentManager *ucm = webkit_web_view_get_user_content_manager(m_web_view); 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_signal_connect(ucm, wxString::Format("script-message-received::%s", name).utf8_str(),
G_CALLBACK(wxgtk_webview_webkit_script_message_received), this); 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) bool wxWebViewWebKit::RemoveScriptMessageHandler(const wxString& name)

View File

@@ -420,8 +420,8 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control
if (settings) if (settings)
{ {
settings->put_IsStatusBarEnabled(false); settings->put_IsStatusBarEnabled(false);
settings->put_IsWebMessageEnabled(!m_scriptMsgHandlerName.empty());
} }
UpdateWebMessageHandler();
if (!m_pendingUserScripts.empty()) if (!m_pendingUserScripts.empty())
{ {
@@ -440,6 +440,24 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control
return S_OK; return S_OK;
} }
void wxWebViewEdgeImpl::UpdateWebMessageHandler()
{
wxCOMPtr<ICoreWebView2Settings> 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() ICoreWebView2Settings* wxWebViewEdgeImpl::GetSettings()
{ {
if (!m_webView) if (!m_webView)
@@ -826,9 +844,7 @@ bool wxWebViewEdge::AddScriptMessageHandler(const wxString& name)
return false; return false;
m_impl->m_scriptMsgHandlerName = name; m_impl->m_scriptMsgHandlerName = name;
wxCOMPtr<ICoreWebView2Settings> settings(m_impl->GetSettings()); m_impl->UpdateWebMessageHandler();
if (settings)
settings->put_IsWebMessageEnabled(true);
return true; return true;
} }
@@ -836,9 +852,7 @@ bool wxWebViewEdge::AddScriptMessageHandler(const wxString& name)
bool wxWebViewEdge::RemoveScriptMessageHandler(const wxString& WXUNUSED(name)) bool wxWebViewEdge::RemoveScriptMessageHandler(const wxString& WXUNUSED(name))
{ {
m_impl->m_scriptMsgHandlerName.clear(); m_impl->m_scriptMsgHandlerName.clear();
wxCOMPtr<ICoreWebView2Settings> settings(m_impl->GetSettings()); m_impl->UpdateWebMessageHandler();
if (settings)
settings->put_IsWebMessageEnabled(false);
return true; return true;
} }