From df20e5ec76a61a12a8b12a31ff6db21226fcd8f0 Mon Sep 17 00:00:00 2001 From: nns52k <58716684+nns52k@users.noreply.github.com> Date: Mon, 18 Jan 2021 15:42:11 +0800 Subject: [PATCH 01/12] Fix case of WebView2.h in the #inclue directive Using the correct case is important when using case-sensitive file systems as when cross-compiling, for example. --- include/wx/msw/private/webview_edge.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/wx/msw/private/webview_edge.h b/include/wx/msw/private/webview_edge.h index f78d984395..146d87d34c 100644 --- a/include/wx/msw/private/webview_edge.h +++ b/include/wx/msw/private/webview_edge.h @@ -13,7 +13,7 @@ #include "wx/dynlib.h" #include "wx/msw/private/comptr.h" -#include +#include #ifndef __ICoreWebView2Environment_INTERFACE_DEFINED__ #error "WebView2 SDK version 0.9.430 or newer is required" From b465a95dcc9d92d4ee3a4bf7a58287ad0c98d251 Mon Sep 17 00:00:00 2001 From: nns52k <58716684+nns52k@users.noreply.github.com> Date: Sun, 17 Jan 2021 23:35:51 +0800 Subject: [PATCH 02/12] Make it possible to compile wxWebView Edge backend with gcc Remove the requirement to include wrl/event.h so that GNU C++ (maybe Clang C++ as well) can compile this file without error. --- src/msw/webview_edge.cpp | 121 ++++++++++++++++++++++++++++++++------- 1 file changed, 99 insertions(+), 22 deletions(-) diff --git a/src/msw/webview_edge.cpp b/src/msw/webview_edge.cpp index 355d384e31..603d7a8387 100644 --- a/src/msw/webview_edge.cpp +++ b/src/msw/webview_edge.cpp @@ -26,10 +26,87 @@ #include "wx/msw/private/cotaskmemptr.h" #include "wx/msw/private/webview_edge.h" -#include -#include +#include +#include -using namespace Microsoft::WRL; +template +class CInvokable : public baseT +{ +public: + CInvokable() : m_nRefCount(0) {} + virtual ~CInvokable() {} + // IUnknown methods + HRESULT QueryInterface(REFIID WXUNUSED(riid), void **ppvObj) override + { + /** + * WebView2 Runtime apparently doesn't use this method, so it doesn't + * matter how we implement this. On the other hand, this method must be + * implemented to make this invokable type a concrete class instead of a + * abstract one. + */ + *ppvObj = NULL; + return E_NOINTERFACE; + } + ULONG AddRef(void) override { + return ++m_nRefCount; + } + ULONG Release(void) override { + size_t ret = --m_nRefCount; + if (ret == 0) + delete this; + return ret; + } +private: + std::atomic m_nRefCount; +}; +template +class CInvokableLambda : public CInvokable +{ +public: + CInvokableLambda(std::function lambda) + : m_lambda(lambda) { + } + // baseT method + HRESULT Invoke(argTs ...args) override { + return m_lambda(args...); + } +private: + std::function m_lambda; +}; +template +class CInvokableMethod : public CInvokable +{ +public: + CInvokableMethod(contextT *ctx, HRESULT (contextT::*mthd)(argTs...)) + : m_ctx(ctx), m_mthd(mthd) { + } + // baseT method + HRESULT Invoke(argTs ...args) override { + return (m_ctx->*m_mthd)(args...); + } +private: + contextT *m_ctx; + HRESULT (contextT::*m_mthd)(argTs...); +}; +// the function templates to generate concrete classes from above class templates +template < + typename baseT, typename lambdaT, // base type & lambda type + typename LT, typename ...argTs // for capturing argument types of lambda +> +baseT *callback_impl(lambdaT&& lambda, HRESULT (LT::*)(argTs...) const) +{ + return new CInvokableLambda(lambda); +} +template +baseT *callback(lambdaT&& lambda) +{ + return callback_impl(std::move(lambda), &lambdaT::operator()); +} +template +baseT *callback(contextT *ctx, HRESULT (contextT::*mthd)(argTs...)) +{ + return new CInvokableMethod(ctx, mthd); +} wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewEdge, wxWebView); @@ -93,8 +170,8 @@ bool wxWebViewEdgeImpl::Create() ms_browserExecutableDir.wc_str(), userDataPath.wc_str(), nullptr, - Callback(this, - &wxWebViewEdgeImpl::OnEnvironmentCreated).Get()); + callback(this, + &wxWebViewEdgeImpl::OnEnvironmentCreated)); if (FAILED(hr)) { wxLogApiError("CreateWebView2EnvironmentWithOptions", hr); @@ -110,8 +187,8 @@ HRESULT wxWebViewEdgeImpl::OnEnvironmentCreated( environment->QueryInterface(IID_PPV_ARGS(&m_webViewEnvironment)); m_webViewEnvironment->CreateCoreWebView2Controller( m_ctrl->GetHWND(), - Callback( - this, &wxWebViewEdgeImpl::OnWebViewCreated).Get()); + callback( + this, &wxWebViewEdgeImpl::OnWebViewCreated)); return S_OK; } @@ -241,8 +318,8 @@ HRESULT wxWebViewEdgeImpl::OnNavigationCompleted(ICoreWebView2* WXUNUSED(sender) } else { - if (m_historyEnabled && !m_historyLoadingFromList && - (uri == m_ctrl->GetCurrentURL()) || + if ((m_historyEnabled && !m_historyLoadingFromList && + (uri == m_ctrl->GetCurrentURL())) || (m_ctrl->GetCurrentURL().substr(0, 4) == "file" && wxFileName::URLToFileName(m_ctrl->GetCurrentURL()).GetFullPath() == uri)) { @@ -340,28 +417,28 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control // Connect and handle the various WebView events m_webView->add_NavigationStarting( - Callback( - this, &wxWebViewEdgeImpl::OnNavigationStarting).Get(), + callback( + this, &wxWebViewEdgeImpl::OnNavigationStarting), &m_navigationStartingToken); m_webView->add_SourceChanged( Callback( this, &wxWebViewEdgeImpl::OnSourceChanged).Get(), &m_sourceChangedToken); m_webView->add_NavigationCompleted( - Callback( - this, &wxWebViewEdgeImpl::OnNavigationCompleted).Get(), + callback( + this, &wxWebViewEdgeImpl::OnNavigationCompleted), &m_navigationCompletedToken); m_webView->add_NewWindowRequested( - Callback( - this, &wxWebViewEdgeImpl::OnNewWindowRequested).Get(), + callback( + this, &wxWebViewEdgeImpl::OnNewWindowRequested), &m_newWindowRequestedToken); m_webView->add_DocumentTitleChanged( - Callback( - this, &wxWebViewEdgeImpl::OnDocumentTitleChanged).Get(), + callback( + this, &wxWebViewEdgeImpl::OnDocumentTitleChanged), &m_documentTitleChangedToken); m_webView->add_ContentLoading( - Callback( - this, &wxWebViewEdgeImpl::OnContentLoading).Get(), + callback( + this, &wxWebViewEdgeImpl::OnContentLoading), &m_contentLoadingToken); m_webView->add_ContainsFullScreenElementChanged( Callback( @@ -709,7 +786,7 @@ bool wxWebViewEdge::RunScriptSync(const wxString& javascript, wxString* output) bool scriptExecuted = false; // Start script execution - HRESULT executionResult = m_impl->m_webView->ExecuteScript(javascript.wc_str(), Callback( + HRESULT executionResult = m_impl->m_webView->ExecuteScript(javascript.wc_str(), callback( [&scriptExecuted, &executionResult, output](HRESULT error, PCWSTR result) -> HRESULT { // Handle script execution callback @@ -724,7 +801,7 @@ bool wxWebViewEdge::RunScriptSync(const wxString& javascript, wxString* output) scriptExecuted = true; return S_OK; - }).Get()); + })); // Wait for script exection while (!scriptExecuted) @@ -772,7 +849,7 @@ bool wxWebViewEdge::RunScript(const wxString& javascript, wxString* output) cons return true; } -void wxWebViewEdge::RegisterHandler(wxSharedPtr handler) +void wxWebViewEdge::RegisterHandler(wxSharedPtr WXUNUSED(handler)) { // TODO: could maybe be implemented via IWebView2WebView5::add_WebResourceRequested wxLogDebug("Registering handlers is not supported"); From 84b19a0ce03bc2442a7479738e1cdab68cc1ae87 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Wed, 27 Jan 2021 22:34:15 +0100 Subject: [PATCH 03/12] Use the same function signature as the WebView2 SDK --- include/wx/msw/private/comptr.h | 5 ++++ src/msw/webview_edge.cpp | 44 ++++++++++++++++----------------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/include/wx/msw/private/comptr.h b/include/wx/msw/private/comptr.h index 2b21cfa82e..db8c9bcf95 100644 --- a/include/wx/msw/private/comptr.h +++ b/include/wx/msw/private/comptr.h @@ -100,6 +100,11 @@ public: return m_ptr; } + T* Get() const + { + return m_ptr; + } + bool operator<(T* ptr) const { return get() < ptr; diff --git a/src/msw/webview_edge.cpp b/src/msw/webview_edge.cpp index 603d7a8387..866c2b3eb0 100644 --- a/src/msw/webview_edge.cpp +++ b/src/msw/webview_edge.cpp @@ -93,19 +93,19 @@ template < typename baseT, typename lambdaT, // base type & lambda type typename LT, typename ...argTs // for capturing argument types of lambda > -baseT *callback_impl(lambdaT&& lambda, HRESULT (LT::*)(argTs...) const) +wxCOMPtr Callback_impl(lambdaT&& lambda, HRESULT (LT::*)(argTs...) const) { - return new CInvokableLambda(lambda); + return wxCOMPtr(new CInvokableLambda(lambda)); } template -baseT *callback(lambdaT&& lambda) +wxCOMPtr Callback(lambdaT&& lambda) { - return callback_impl(std::move(lambda), &lambdaT::operator()); + return Callback_impl(std::move(lambda), &lambdaT::operator()); } template -baseT *callback(contextT *ctx, HRESULT (contextT::*mthd)(argTs...)) +wxCOMPtr Callback(contextT *ctx, HRESULT (contextT::*mthd)(argTs...)) { - return new CInvokableMethod(ctx, mthd); + return wxCOMPtr(new CInvokableMethod(ctx, mthd)); } wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewEdge, wxWebView); @@ -170,8 +170,8 @@ bool wxWebViewEdgeImpl::Create() ms_browserExecutableDir.wc_str(), userDataPath.wc_str(), nullptr, - callback(this, - &wxWebViewEdgeImpl::OnEnvironmentCreated)); + Callback(this, + &wxWebViewEdgeImpl::OnEnvironmentCreated).Get()); if (FAILED(hr)) { wxLogApiError("CreateWebView2EnvironmentWithOptions", hr); @@ -187,8 +187,8 @@ HRESULT wxWebViewEdgeImpl::OnEnvironmentCreated( environment->QueryInterface(IID_PPV_ARGS(&m_webViewEnvironment)); m_webViewEnvironment->CreateCoreWebView2Controller( m_ctrl->GetHWND(), - callback( - this, &wxWebViewEdgeImpl::OnWebViewCreated)); + Callback( + this, &wxWebViewEdgeImpl::OnWebViewCreated).Get()); return S_OK; } @@ -417,28 +417,28 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control // Connect and handle the various WebView events m_webView->add_NavigationStarting( - callback( - this, &wxWebViewEdgeImpl::OnNavigationStarting), + Callback( + this, &wxWebViewEdgeImpl::OnNavigationStarting).Get(), &m_navigationStartingToken); m_webView->add_SourceChanged( Callback( this, &wxWebViewEdgeImpl::OnSourceChanged).Get(), &m_sourceChangedToken); m_webView->add_NavigationCompleted( - callback( - this, &wxWebViewEdgeImpl::OnNavigationCompleted), + Callback( + this, &wxWebViewEdgeImpl::OnNavigationCompleted).Get(), &m_navigationCompletedToken); m_webView->add_NewWindowRequested( - callback( - this, &wxWebViewEdgeImpl::OnNewWindowRequested), + Callback( + this, &wxWebViewEdgeImpl::OnNewWindowRequested).Get(), &m_newWindowRequestedToken); m_webView->add_DocumentTitleChanged( - callback( - this, &wxWebViewEdgeImpl::OnDocumentTitleChanged), + Callback( + this, &wxWebViewEdgeImpl::OnDocumentTitleChanged).Get(), &m_documentTitleChangedToken); m_webView->add_ContentLoading( - callback( - this, &wxWebViewEdgeImpl::OnContentLoading), + Callback( + this, &wxWebViewEdgeImpl::OnContentLoading).Get(), &m_contentLoadingToken); m_webView->add_ContainsFullScreenElementChanged( Callback( @@ -786,7 +786,7 @@ bool wxWebViewEdge::RunScriptSync(const wxString& javascript, wxString* output) bool scriptExecuted = false; // Start script execution - HRESULT executionResult = m_impl->m_webView->ExecuteScript(javascript.wc_str(), callback( + HRESULT executionResult = m_impl->m_webView->ExecuteScript(javascript.wc_str(), Callback( [&scriptExecuted, &executionResult, output](HRESULT error, PCWSTR result) -> HRESULT { // Handle script execution callback @@ -801,7 +801,7 @@ bool wxWebViewEdge::RunScriptSync(const wxString& javascript, wxString* output) scriptExecuted = true; return S_OK; - })); + }).Get()); // Wait for script exection while (!scriptExecuted) From ad1219d0a201ceed31472148a115ea99172848bd Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Wed, 27 Jan 2021 22:37:57 +0100 Subject: [PATCH 04/12] Fix building with MSVC 32 bit --- src/msw/webview_edge.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/msw/webview_edge.cpp b/src/msw/webview_edge.cpp index 866c2b3eb0..c4cbe16427 100644 --- a/src/msw/webview_edge.cpp +++ b/src/msw/webview_edge.cpp @@ -36,7 +36,7 @@ public: CInvokable() : m_nRefCount(0) {} virtual ~CInvokable() {} // IUnknown methods - HRESULT QueryInterface(REFIID WXUNUSED(riid), void **ppvObj) override + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID WXUNUSED(riid), void **ppvObj) override { /** * WebView2 Runtime apparently doesn't use this method, so it doesn't @@ -47,10 +47,10 @@ public: *ppvObj = NULL; return E_NOINTERFACE; } - ULONG AddRef(void) override { + ULONG STDMETHODCALLTYPE AddRef(void) override { return ++m_nRefCount; } - ULONG Release(void) override { + ULONG STDMETHODCALLTYPE Release(void) override { size_t ret = --m_nRefCount; if (ret == 0) delete this; @@ -67,7 +67,7 @@ public: : m_lambda(lambda) { } // baseT method - HRESULT Invoke(argTs ...args) override { + HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override { return m_lambda(args...); } private: @@ -81,7 +81,7 @@ public: : m_ctx(ctx), m_mthd(mthd) { } // baseT method - HRESULT Invoke(argTs ...args) override { + HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override { return (m_ctx->*m_mthd)(args...); } private: From a8b726359b288b9eb14151785e4b541198c640a1 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Wed, 27 Jan 2021 22:41:40 +0100 Subject: [PATCH 05/12] Format wxWebViewEdge Callback code --- src/msw/webview_edge.cpp | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/msw/webview_edge.cpp b/src/msw/webview_edge.cpp index c4cbe16427..74baf46e1c 100644 --- a/src/msw/webview_edge.cpp +++ b/src/msw/webview_edge.cpp @@ -36,7 +36,7 @@ public: CInvokable() : m_nRefCount(0) {} virtual ~CInvokable() {} // IUnknown methods - HRESULT STDMETHODCALLTYPE QueryInterface(REFIID WXUNUSED(riid), void **ppvObj) override + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID WXUNUSED(riid), void** ppvObj) override { /** * WebView2 Runtime apparently doesn't use this method, so it doesn't @@ -47,10 +47,12 @@ public: *ppvObj = NULL; return E_NOINTERFACE; } - ULONG STDMETHODCALLTYPE AddRef(void) override { + ULONG STDMETHODCALLTYPE AddRef() override + { return ++m_nRefCount; } - ULONG STDMETHODCALLTYPE Release(void) override { + ULONG STDMETHODCALLTYPE Release() override + { size_t ret = --m_nRefCount; if (ret == 0) delete this; @@ -59,51 +61,58 @@ public: private: std::atomic m_nRefCount; }; + template class CInvokableLambda : public CInvokable { public: CInvokableLambda(std::function lambda) - : m_lambda(lambda) { - } + : m_lambda(lambda) + {} // baseT method - HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override { + HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override + { return m_lambda(args...); } private: std::function m_lambda; }; + template class CInvokableMethod : public CInvokable { public: - CInvokableMethod(contextT *ctx, HRESULT (contextT::*mthd)(argTs...)) - : m_ctx(ctx), m_mthd(mthd) { - } + CInvokableMethod(contextT* ctx, HRESULT(contextT::* mthd)(argTs...)) + : m_ctx(ctx), m_mthd(mthd) + {} // baseT method - HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override { + HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override + { return (m_ctx->*m_mthd)(args...); } private: - contextT *m_ctx; - HRESULT (contextT::*m_mthd)(argTs...); + contextT* m_ctx; + HRESULT(contextT::* m_mthd)(argTs...); }; + // the function templates to generate concrete classes from above class templates template < typename baseT, typename lambdaT, // base type & lambda type typename LT, typename ...argTs // for capturing argument types of lambda > -wxCOMPtr Callback_impl(lambdaT&& lambda, HRESULT (LT::*)(argTs...) const) +wxCOMPtr Callback_impl(lambdaT&& lambda, HRESULT(LT::*)(argTs...) const) { return wxCOMPtr(new CInvokableLambda(lambda)); } + template wxCOMPtr Callback(lambdaT&& lambda) { return Callback_impl(std::move(lambda), &lambdaT::operator()); } + template -wxCOMPtr Callback(contextT *ctx, HRESULT (contextT::*mthd)(argTs...)) +wxCOMPtr Callback(contextT* ctx, HRESULT(contextT::* mthd)(argTs...)) { return wxCOMPtr(new CInvokableMethod(ctx, mthd)); } From 156eda92d7bb9c6bd002c1aa739778e7e77f3158 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Sun, 21 Feb 2021 21:07:13 +0100 Subject: [PATCH 06/12] Use WRL when building with MSVC --- src/msw/webview_edge.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/msw/webview_edge.cpp b/src/msw/webview_edge.cpp index 74baf46e1c..0a73de5d08 100644 --- a/src/msw/webview_edge.cpp +++ b/src/msw/webview_edge.cpp @@ -27,6 +27,11 @@ #include "wx/msw/private/webview_edge.h" #include + +#ifdef __VISUALC__ +#include +using namespace Microsoft::WRL; +#else #include template @@ -116,6 +121,7 @@ wxCOMPtr Callback(contextT* ctx, HRESULT(contextT::* mthd)(argTs...)) { return wxCOMPtr(new CInvokableMethod(ctx, mthd)); } +#endif // !__VISUALC__ wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewEdge, wxWebView); From 66d314c232df7298cf5c792804325943eec6501c Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Thu, 25 Feb 2021 21:41:51 +0100 Subject: [PATCH 07/12] Implement QueryInterface of wxWebViewEdge CInvokable --- src/msw/webview_edge.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/msw/webview_edge.cpp b/src/msw/webview_edge.cpp index 0a73de5d08..2aefc038b2 100644 --- a/src/msw/webview_edge.cpp +++ b/src/msw/webview_edge.cpp @@ -41,14 +41,15 @@ public: CInvokable() : m_nRefCount(0) {} virtual ~CInvokable() {} // IUnknown methods - HRESULT STDMETHODCALLTYPE QueryInterface(REFIID WXUNUSED(riid), void** ppvObj) override + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObj) override { - /** - * WebView2 Runtime apparently doesn't use this method, so it doesn't - * matter how we implement this. On the other hand, this method must be - * implemented to make this invokable type a concrete class instead of a - * abstract one. - */ + if (riid == __uuidof(baseT) || riid == IID_IUnknown) + { + *ppvObj = this; + AddRef(); + return S_OK; + } + *ppvObj = NULL; return E_NOINTERFACE; } From b43803703dae91408b58793b9e84470e65388e2f Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Thu, 25 Feb 2021 22:01:47 +0100 Subject: [PATCH 08/12] Move Callback implementation to separate header file --- include/wx/msw/wrl/event.h | 104 +++++++++++++++++++++++++++++++++++++ src/msw/webview_edge.cpp | 93 +-------------------------------- 2 files changed, 105 insertions(+), 92 deletions(-) create mode 100644 include/wx/msw/wrl/event.h diff --git a/include/wx/msw/wrl/event.h b/include/wx/msw/wrl/event.h new file mode 100644 index 0000000000..71a2d86770 --- /dev/null +++ b/include/wx/msw/wrl/event.h @@ -0,0 +1,104 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wrl/event.h +// Purpose: WRL event callback implementation +// Author: nns52k +// Created: 2021-02-25 +// Copyright: (c) 2021 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_PRIVATE_WRL_H_ +#define _WX_MSW_PRIVATE_WRL_H_ + +#include + +template +class CInvokable : public baseT +{ +public: + CInvokable() : m_nRefCount(0) {} + virtual ~CInvokable() {} + // IUnknown methods + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObj) override + { + if (riid == __uuidof(baseT) || riid == IID_IUnknown) + { + *ppvObj = this; + AddRef(); + return S_OK; + } + + *ppvObj = NULL; + return E_NOINTERFACE; + } + ULONG STDMETHODCALLTYPE AddRef() override + { + return ++m_nRefCount; + } + ULONG STDMETHODCALLTYPE Release() override + { + size_t ret = --m_nRefCount; + if (ret == 0) + delete this; + return ret; + } +private: + std::atomic m_nRefCount; +}; + +template +class CInvokableLambda : public CInvokable +{ +public: + CInvokableLambda(std::function lambda) + : m_lambda(lambda) + {} + // baseT method + HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override + { + return m_lambda(args...); + } +private: + std::function m_lambda; +}; + +template +class CInvokableMethod : public CInvokable +{ +public: + CInvokableMethod(contextT* ctx, HRESULT(contextT::* mthd)(argTs...)) + : m_ctx(ctx), m_mthd(mthd) + {} + // baseT method + HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override + { + return (m_ctx->*m_mthd)(args...); + } +private: + contextT* m_ctx; + HRESULT(contextT::* m_mthd)(argTs...); +}; + +// the function templates to generate concrete classes from above class templates +template < + typename baseT, typename lambdaT, // base type & lambda type + typename LT, typename ...argTs // for capturing argument types of lambda +> +wxCOMPtr Callback_impl(lambdaT&& lambda, HRESULT(LT::*)(argTs...) const) +{ + return wxCOMPtr(new CInvokableLambda(lambda)); +} + +template +wxCOMPtr Callback(lambdaT&& lambda) +{ + return Callback_impl(std::move(lambda), &lambdaT::operator()); +} + +template +wxCOMPtr Callback(contextT* ctx, HRESULT(contextT::* mthd)(argTs...)) +{ + return wxCOMPtr(new CInvokableMethod(ctx, mthd)); +} + +#endif // _WX_MSW_PRIVATE_WRL_H_ diff --git a/src/msw/webview_edge.cpp b/src/msw/webview_edge.cpp index 2aefc038b2..7069536d72 100644 --- a/src/msw/webview_edge.cpp +++ b/src/msw/webview_edge.cpp @@ -26,102 +26,11 @@ #include "wx/msw/private/cotaskmemptr.h" #include "wx/msw/private/webview_edge.h" -#include - #ifdef __VISUALC__ #include using namespace Microsoft::WRL; #else -#include - -template -class CInvokable : public baseT -{ -public: - CInvokable() : m_nRefCount(0) {} - virtual ~CInvokable() {} - // IUnknown methods - HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObj) override - { - if (riid == __uuidof(baseT) || riid == IID_IUnknown) - { - *ppvObj = this; - AddRef(); - return S_OK; - } - - *ppvObj = NULL; - return E_NOINTERFACE; - } - ULONG STDMETHODCALLTYPE AddRef() override - { - return ++m_nRefCount; - } - ULONG STDMETHODCALLTYPE Release() override - { - size_t ret = --m_nRefCount; - if (ret == 0) - delete this; - return ret; - } -private: - std::atomic m_nRefCount; -}; - -template -class CInvokableLambda : public CInvokable -{ -public: - CInvokableLambda(std::function lambda) - : m_lambda(lambda) - {} - // baseT method - HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override - { - return m_lambda(args...); - } -private: - std::function m_lambda; -}; - -template -class CInvokableMethod : public CInvokable -{ -public: - CInvokableMethod(contextT* ctx, HRESULT(contextT::* mthd)(argTs...)) - : m_ctx(ctx), m_mthd(mthd) - {} - // baseT method - HRESULT STDMETHODCALLTYPE Invoke(argTs ...args) override - { - return (m_ctx->*m_mthd)(args...); - } -private: - contextT* m_ctx; - HRESULT(contextT::* m_mthd)(argTs...); -}; - -// the function templates to generate concrete classes from above class templates -template < - typename baseT, typename lambdaT, // base type & lambda type - typename LT, typename ...argTs // for capturing argument types of lambda -> -wxCOMPtr Callback_impl(lambdaT&& lambda, HRESULT(LT::*)(argTs...) const) -{ - return wxCOMPtr(new CInvokableLambda(lambda)); -} - -template -wxCOMPtr Callback(lambdaT&& lambda) -{ - return Callback_impl(std::move(lambda), &lambdaT::operator()); -} - -template -wxCOMPtr Callback(contextT* ctx, HRESULT(contextT::* mthd)(argTs...)) -{ - return wxCOMPtr(new CInvokableMethod(ctx, mthd)); -} +#include #endif // !__VISUALC__ wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewEdge, wxWebView); From 09bc566b6055dc86666c75500a393b3a3dc1ba47 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Fri, 26 Feb 2021 20:33:36 +0100 Subject: [PATCH 09/12] Support building wxWebViewEdge with GCC or Clang Add EventToken.h with EventRegistrationToken implementation, that can be used by the WebView2 header. --- Makefile.in | 21 ++++++++++++++------- build/bakefiles/multilib.bkl | 6 ++++++ build/cmake/lib/webview/CMakeLists.txt | 3 +++ build/msw/makefile.gcc | 13 +++++++------ build/msw/makefile.vc | 2 +- include/wx/msw/wrl/EventToken.h | 18 ++++++++++++++++++ 6 files changed, 49 insertions(+), 14 deletions(-) create mode 100644 include/wx/msw/wrl/EventToken.h diff --git a/Makefile.in b/Makefile.in index b9c14d553a..482cf73d26 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1690,15 +1690,16 @@ WEBVIEWDLL_CXXFLAGS = $(__webviewdll_PCH_INC) $(__INC_TIFF_BUILD_p) \ $(__INC_REGEX_p) $(__INC_EXPAT_p) $(WX_CPPFLAGS) -D__WX$(TOOLKIT)__ \ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) \ $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) -DWXBUILDING -DWXUSINGDLL \ - -DWXMAKINGDLL_WEBVIEW $(__webview_additional_include_p) $(PIC_FLAG) \ - $(WX_CXXFLAGS) $(CPPFLAGS) $(CXXFLAGS) + -DWXMAKINGDLL_WEBVIEW $(__webview_additional_include_wrl_p) \ + $(__webview_additional_include_p) $(PIC_FLAG) $(WX_CXXFLAGS) $(CPPFLAGS) \ + $(CXXFLAGS) WEBVIEWDLL_OBJCXXFLAGS = $(__webviewdll_PCH_INC) $(__INC_TIFF_BUILD_p) \ $(__INC_TIFF_p) $(__INC_JPEG_p) $(__INC_PNG_p) $(__INC_ZLIB_p) \ $(__INC_REGEX_p) $(__INC_EXPAT_p) $(WX_CPPFLAGS) -D__WX$(TOOLKIT)__ \ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) \ $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) -DWXBUILDING -DWXUSINGDLL \ - -DWXMAKINGDLL_WEBVIEW $(__webview_additional_include_p) $(PIC_FLAG) \ - $(CPPFLAGS) $(OBJCXXFLAGS) + -DWXMAKINGDLL_WEBVIEW $(__webview_additional_include_wrl_p) \ + $(__webview_additional_include_p) $(PIC_FLAG) $(CPPFLAGS) $(OBJCXXFLAGS) WEBVIEWDLL_OBJECTS = \ $(__WEBVIEW_SRC_PLATFORM_OBJECTS_2) \ webviewdll_webview.o \ @@ -1711,13 +1712,15 @@ WEBVIEWLIB_CXXFLAGS = $(__webviewlib_PCH_INC) $(__INC_TIFF_BUILD_p) \ $(__INC_REGEX_p) $(__INC_EXPAT_p) $(WX_CPPFLAGS) -D__WX$(TOOLKIT)__ \ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) \ $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) -DWXBUILDING \ - $(__webview_additional_include_p) $(WX_CXXFLAGS) $(CPPFLAGS) $(CXXFLAGS) + $(__webview_additional_include_wrl_p) $(__webview_additional_include_p) \ + $(WX_CXXFLAGS) $(CPPFLAGS) $(CXXFLAGS) WEBVIEWLIB_OBJCXXFLAGS = $(__webviewlib_PCH_INC) $(__INC_TIFF_BUILD_p) \ $(__INC_TIFF_p) $(__INC_JPEG_p) $(__INC_PNG_p) $(__INC_ZLIB_p) \ $(__INC_REGEX_p) $(__INC_EXPAT_p) $(WX_CPPFLAGS) -D__WX$(TOOLKIT)__ \ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) \ $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) -DWXBUILDING \ - $(__webview_additional_include_p) $(CPPFLAGS) $(OBJCXXFLAGS) + $(__webview_additional_include_wrl_p) $(__webview_additional_include_p) \ + $(CPPFLAGS) $(OBJCXXFLAGS) WEBVIEWLIB_OBJECTS = \ $(__WEBVIEW_SRC_PLATFORM_OBJECTS_3) \ webviewlib_webview.o \ @@ -12397,6 +12400,8 @@ COND_USE_SOVERSOLARIS_1___webviewdll___so_symlinks_uninst_cmd = rm -f \ @COND_TOOLKIT_GTK@ webviewdll_webview_webkit2.o @COND_TOOLKIT_MSW@__WEBVIEW_SRC_PLATFORM_OBJECTS_2 = \ @COND_TOOLKIT_MSW@ webviewdll_webview_ie.o webviewdll_webview_edge.o +@COND_TOOLKIT_MSW@__webview_additional_include_wrl_p_1 = \ +@COND_TOOLKIT_MSW@ --include-dir $(top_srcdir)/include/wx/msw/wrl @COND_TOOLKIT_MSW@__webview_additional_include_p_1 = \ @COND_TOOLKIT_MSW@ --include-dir \ @COND_TOOLKIT_MSW@ $(top_srcdir)/3rdparty/webview2/build/native/include @@ -13792,6 +13797,8 @@ COND_PLATFORM_MACOSX_1___OSX_LOWLEVEL_SRC_OBJECTS_1_4 = \ corelib_core_timer.o \ corelib_utilsexc_cf.o @COND_PLATFORM_MACOSX_1@__OSX_LOWLEVEL_SRC_OBJECTS_1_4 = $(COND_PLATFORM_MACOSX_1___OSX_LOWLEVEL_SRC_OBJECTS_1_4) +@COND_TOOLKIT_MSW@__webview_additional_include_wrl_p = \ +@COND_TOOLKIT_MSW@ -I$(top_srcdir)/include/wx/msw/wrl @COND_TOOLKIT_MSW@__webview_additional_include_p = \ @COND_TOOLKIT_MSW@ -I$(top_srcdir)/3rdparty/webview2/build/native/include @COND_MONOLITHIC_0_SHARED_1_USE_GUI_1_USE_HTML_1@__htmldll_library_link_DEP \ @@ -36060,7 +36067,7 @@ webviewdll_webviewfshandler.o: $(srcdir)/src/common/webviewfshandler.cpp $(WEBVI $(CXXC) -c -o $@ $(WEBVIEWDLL_CXXFLAGS) $(srcdir)/src/common/webviewfshandler.cpp webviewdll_version_rc.o: $(srcdir)/src/msw/version.rc $(WEBVIEWDLL_ODEP) - $(WINDRES) -i$< -o$@ $(__INC_TIFF_BUILD_p_54) $(__INC_TIFF_p_54) $(__INC_JPEG_p_54) $(__INC_PNG_p_53) $(__INC_ZLIB_p_67) $(__INC_REGEX_p_65) $(__INC_EXPAT_p_65) --define __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_67) $(__DEBUG_DEFINE_p_66) $(__EXCEPTIONS_DEFINE_p_65) $(__RTTI_DEFINE_p_65) $(__THREAD_DEFINE_p_65) --define WXBUILDING --define WXDLLNAME=$(WXDLLNAMEPREFIXGUI)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_webview$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG) $(__RCDEFDIR_p) --include-dir $(top_srcdir)/include --define WXUSINGDLL --define WXMAKINGDLL_WEBVIEW $(__webview_additional_include_p_1) + $(WINDRES) -i$< -o$@ $(__INC_TIFF_BUILD_p_54) $(__INC_TIFF_p_54) $(__INC_JPEG_p_54) $(__INC_PNG_p_53) $(__INC_ZLIB_p_67) $(__INC_REGEX_p_65) $(__INC_EXPAT_p_65) --define __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_67) $(__DEBUG_DEFINE_p_66) $(__EXCEPTIONS_DEFINE_p_65) $(__RTTI_DEFINE_p_65) $(__THREAD_DEFINE_p_65) --define WXBUILDING --define WXDLLNAME=$(WXDLLNAMEPREFIXGUI)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_webview$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG) $(__RCDEFDIR_p) --include-dir $(top_srcdir)/include --define WXUSINGDLL --define WXMAKINGDLL_WEBVIEW $(__webview_additional_include_wrl_p_1) $(__webview_additional_include_p_1) webviewlib_webview_ie.o: $(srcdir)/src/msw/webview_ie.cpp $(WEBVIEWLIB_ODEP) $(CXXC) -c -o $@ $(WEBVIEWLIB_CXXFLAGS) $(srcdir)/src/msw/webview_ie.cpp diff --git a/build/bakefiles/multilib.bkl b/build/bakefiles/multilib.bkl index 2dbd123173..05eafd756a 100644 --- a/build/bakefiles/multilib.bkl +++ b/build/bakefiles/multilib.bkl @@ -180,6 +180,10 @@ $(TOP_SRCDIR)3rdparty/webview2/build/native/include + + $(TOP_SRCDIR)include/wx/msw/wrl + + WXUSINGDLL @@ -189,6 +193,7 @@ basedll $(EXTRALIBS_WEBVIEW) $(WEBVIEW_HDR) + $(webview_additional_include_wrl) $(webview_additional_include) @@ -196,6 +201,7 @@ cond="SHARED=='0' and USE_GUI=='1' and USE_WEBVIEW=='1' and MONOLITHIC=='0'"> $(WEBVIEW_SRC) $(WEBVIEW_HDR) + $(webview_additional_include_wrl) $(webview_additional_include) diff --git a/build/cmake/lib/webview/CMakeLists.txt b/build/cmake/lib/webview/CMakeLists.txt index 56ab76375d..4cbf0fd900 100644 --- a/build/cmake/lib/webview/CMakeLists.txt +++ b/build/cmake/lib/webview/CMakeLists.txt @@ -67,6 +67,9 @@ elseif(WXMSW) endif() wx_lib_include_directories(wxwebview PRIVATE "${WEBVIEW2_PACKAGE_DIR}/build/native/include") + if(NOT MSVC) + wx_lib_include_directories(wxwebview PRIVATE "${wxSOURCE_DIR}/include/wx/msw/wrl") + endif() if (CMAKE_SIZEOF_VOID_P EQUAL 4) set(WEBVIEW2_ARCH x86) diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc index 42f5adc99c..574f068211 100644 --- a/build/msw/makefile.gcc +++ b/build/msw/makefile.gcc @@ -1140,9 +1140,9 @@ WEBVIEWDLL_CXXFLAGS = -I..\..\src\tiff\libtiff -I..\..\src\jpeg \ $(__NDEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) -I$(SETUPHDIR) -I..\..\include \ $(____CAIRO_INCLUDEDIR_FILENAMES) -W -Wall -DWXBUILDING -DWXUSINGDLL \ - -DWXMAKINGDLL_WEBVIEW -I..\..\3rdparty\webview2\build\native\include \ - $(__RTTIFLAG) $(__EXCEPTIONSFLAG) -Wno-ctor-dtor-privacy $(CPPFLAGS) \ - $(CXXFLAGS) + -DWXMAKINGDLL_WEBVIEW -I..\..\include\wx\msw\wrl \ + -I..\..\3rdparty\webview2\build\native\include $(__RTTIFLAG) \ + $(__EXCEPTIONSFLAG) -Wno-ctor-dtor-privacy $(CPPFLAGS) $(CXXFLAGS) WEBVIEWDLL_OBJECTS = \ $(OBJS)\webviewdll_dummy.o \ $(OBJS)\webviewdll_webview_ie.o \ @@ -1158,8 +1158,9 @@ WEBVIEWLIB_CXXFLAGS = -I..\..\src\tiff\libtiff -I..\..\src\jpeg \ $(__NDEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) -I$(SETUPHDIR) -I..\..\include \ $(____CAIRO_INCLUDEDIR_FILENAMES) -W -Wall -DWXBUILDING \ - -I..\..\3rdparty\webview2\build\native\include $(__RTTIFLAG) \ - $(__EXCEPTIONSFLAG) -Wno-ctor-dtor-privacy $(CPPFLAGS) $(CXXFLAGS) + -I..\..\include\wx\msw\wrl -I..\..\3rdparty\webview2\build\native\include \ + $(__RTTIFLAG) $(__EXCEPTIONSFLAG) -Wno-ctor-dtor-privacy $(CPPFLAGS) \ + $(CXXFLAGS) WEBVIEWLIB_OBJECTS = \ $(OBJS)\webviewlib_dummy.o \ $(OBJS)\webviewlib_webview_ie.o \ @@ -16404,7 +16405,7 @@ $(OBJS)\webviewdll_webviewfshandler.o: ../../src/common/webviewfshandler.cpp $(CXX) -c -o $@ $(WEBVIEWDLL_CXXFLAGS) $(CPPDEPS) $< $(OBJS)\webviewdll_version_rc.o: ../../src/msw/version.rc - $(WINDRES) -i$< -o$@ --include-dir ../../src/tiff/libtiff --include-dir ../../src/jpeg --include-dir ../../src/png --include-dir ../../src/zlib --include-dir ../../src/regex --include-dir ../../src/expat/expat/lib --define __WXMSW__ $(__WXUNIV_DEFINE_p_67) $(__DEBUG_DEFINE_p_66) $(__NDEBUG_DEFINE_p_65) $(__EXCEPTIONS_DEFINE_p_65) $(__RTTI_DEFINE_p_65) $(__THREAD_DEFINE_p_65) $(__UNICODE_DEFINE_p_67) --include-dir $(SETUPHDIR) --include-dir ../../include $(__CAIRO_INCLUDEDIR_p) --define WXBUILDING --define WXDLLNAME=wx$(PORTNAME)$(WXUNIVNAME)$(WX_VERSION_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_webview$(WXCOMPILER)$(VENDORTAG) --define WXUSINGDLL --define WXMAKINGDLL_WEBVIEW --include-dir ../../3rdparty/webview2/build/native/include + $(WINDRES) -i$< -o$@ --include-dir ../../src/tiff/libtiff --include-dir ../../src/jpeg --include-dir ../../src/png --include-dir ../../src/zlib --include-dir ../../src/regex --include-dir ../../src/expat/expat/lib --define __WXMSW__ $(__WXUNIV_DEFINE_p_67) $(__DEBUG_DEFINE_p_66) $(__NDEBUG_DEFINE_p_65) $(__EXCEPTIONS_DEFINE_p_65) $(__RTTI_DEFINE_p_65) $(__THREAD_DEFINE_p_65) $(__UNICODE_DEFINE_p_67) --include-dir $(SETUPHDIR) --include-dir ../../include $(__CAIRO_INCLUDEDIR_p) --define WXBUILDING --define WXDLLNAME=wx$(PORTNAME)$(WXUNIVNAME)$(WX_VERSION_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_webview$(WXCOMPILER)$(VENDORTAG) --define WXUSINGDLL --define WXMAKINGDLL_WEBVIEW --include-dir ../../include/wx/msw/wrl --include-dir ../../3rdparty/webview2/build/native/include $(OBJS)\webviewlib_dummy.o: ../../src/common/dummy.cpp $(CXX) -c -o $@ $(WEBVIEWLIB_CXXFLAGS) $(CPPDEPS) $< diff --git a/build/msw/makefile.vc b/build/msw/makefile.vc index 536ca5edfc..792479410b 100644 --- a/build/msw/makefile.vc +++ b/build/msw/makefile.vc @@ -16854,7 +16854,7 @@ $(OBJS)\webviewdll_webviewfshandler.obj: ..\..\src\common\webviewfshandler.cpp $(CXX) /c /nologo /TP /Fo$@ $(WEBVIEWDLL_CXXFLAGS) ..\..\src\common\webviewfshandler.cpp $(OBJS)\webviewdll_version.res: ..\..\src\msw\version.rc - rc /fo$@ /d WIN32 /i ..\..\src\tiff\libtiff /i ..\..\src\jpeg /i ..\..\src\png /i ..\..\src\zlib /i ..\..\src\regex /i ..\..\src\expat\expat\lib $(____DEBUGRUNTIME_6) /d _CRT_SECURE_NO_DEPRECATE=1 /d _CRT_NON_CONFORMING_SWPRINTFS=1 /d _SCL_SECURE_NO_WARNINGS=1 $(__NO_VC_CRTDBG_p_72) $(__TARGET_CPU_COMPFLAG_p_72) /d __WXMSW__ $(__WXUNIV_DEFINE_p_67) $(__DEBUG_DEFINE_p_66) $(__NDEBUG_DEFINE_p_65) $(__EXCEPTIONS_DEFINE_p_65) $(__RTTI_DEFINE_p_65) $(__THREAD_DEFINE_p_65) $(__UNICODE_DEFINE_p_67) /i $(SETUPHDIR) /i ..\..\include $(____CAIRO_INCLUDEDIR_FILENAMES_4) /d WXBUILDING /d WXDLLNAME=wx$(PORTNAME)$(WXUNIVNAME)$(WX_VERSION_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_webview$(WXCOMPILER)$(VENDORTAG) /d WXUSINGDLL /d WXMAKINGDLL_WEBVIEW /i ..\..\3rdparty\webview2\build\native\include ..\..\src\msw\version.rc + rc /fo$@ /d WIN32 /i ..\..\src\tiff\libtiff /i ..\..\src\jpeg /i ..\..\src\png /i ..\..\src\zlib /i ..\..\src\regex /i ..\..\src\expat\expat\lib $(____DEBUGRUNTIME_6) /d _CRT_SECURE_NO_DEPRECATE=1 /d _CRT_NON_CONFORMING_SWPRINTFS=1 /d _SCL_SECURE_NO_WARNINGS=1 $(__NO_VC_CRTDBG_p_72) $(__TARGET_CPU_COMPFLAG_p_72) /d __WXMSW__ $(__WXUNIV_DEFINE_p_67) $(__DEBUG_DEFINE_p_66) $(__NDEBUG_DEFINE_p_65) $(__EXCEPTIONS_DEFINE_p_65) $(__RTTI_DEFINE_p_65) $(__THREAD_DEFINE_p_65) $(__UNICODE_DEFINE_p_67) /i $(SETUPHDIR) /i ..\..\include $(____CAIRO_INCLUDEDIR_FILENAMES_4) /d WXBUILDING /d WXDLLNAME=wx$(PORTNAME)$(WXUNIVNAME)$(WX_VERSION_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_webview$(WXCOMPILER)$(VENDORTAG) /d WXUSINGDLL /d WXMAKINGDLL_WEBVIEW /i ..\..\3rdparty\webview2\build\native\include ..\..\src\msw\version.rc $(OBJS)\webviewlib_dummy.obj: ..\..\src\common\dummy.cpp $(CXX) /c /nologo /TP /Fo$@ $(WEBVIEWLIB_CXXFLAGS) /Ycwx/wxprec.h ..\..\src\common\dummy.cpp diff --git a/include/wx/msw/wrl/EventToken.h b/include/wx/msw/wrl/EventToken.h new file mode 100644 index 0000000000..3b79b3a26d --- /dev/null +++ b/include/wx/msw/wrl/EventToken.h @@ -0,0 +1,18 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wrl/EventToken.h +// Purpose: WRL EventRegistrationToken implementation +// Author: Maarten Bent +// Created: 2021-02-26 +// Copyright: (c) 2021 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef __eventtoken_h__ +#define __eventtoken_h__ + +typedef struct EventRegistrationToken +{ + __int64 value; +} EventRegistrationToken; + +#endif // __eventtoken_h__ From fc3cfb67cf1dc03620640209364d8befaddf0465 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Sat, 27 Feb 2021 16:34:14 +0100 Subject: [PATCH 10/12] Add missing UUIDs for wxWebViewEdge --- include/wx/msw/private/webview_edge.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/include/wx/msw/private/webview_edge.h b/include/wx/msw/private/webview_edge.h index 146d87d34c..cf774f8c86 100644 --- a/include/wx/msw/private/webview_edge.h +++ b/include/wx/msw/private/webview_edge.h @@ -19,6 +19,23 @@ #error "WebView2 SDK version 0.9.430 or newer is required" #endif +#ifndef __VISUALC__ +__CRT_UUID_DECL(ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler, 0xb99369f3, 0x9b11, 0x47b5, 0xbc,0x6f, 0x8e,0x78,0x95,0xfc,0xea,0x17); +__CRT_UUID_DECL(ICoreWebView2CreateCoreWebView2ControllerCompletedHandler, 0x6c4819f3, 0xc9b7, 0x4260, 0x81,0x27, 0xc9,0xf5,0xbd,0xe7,0xf6,0x8c); +__CRT_UUID_DECL(ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, 0x4e8a3389, 0xc9d8, 0x4bd2, 0xb6,0xb5, 0x12,0x4f,0xee,0x6c,0xc1,0x4d); +__CRT_UUID_DECL(ICoreWebView2ContainsFullScreenElementChangedEventHandler, 0xe45d98b1, 0xafef, 0x45be, 0x8b,0xaf, 0x6c,0x77,0x28,0x86,0x7f,0x73); +__CRT_UUID_DECL(ICoreWebView2ContentLoadingEventHandler, 0x364471e7, 0xf2be, 0x4910, 0xbd,0xba, 0xd7,0x20,0x77,0xd5,0x1c,0x4b); +__CRT_UUID_DECL(ICoreWebView2DocumentTitleChangedEventHandler, 0xf5f2b923, 0x953e, 0x4042, 0x9f,0x95, 0xf3,0xa1,0x18,0xe1,0xaf,0xd4); +__CRT_UUID_DECL(ICoreWebView2Environment, 0xb96d755e, 0x0319, 0x4e92, 0xa2,0x96, 0x23,0x43,0x6f,0x46,0xa1,0xfc); +__CRT_UUID_DECL(ICoreWebView2EnvironmentOptions, 0x2fde08a8, 0x1e9a, 0x4766, 0x8c,0x05, 0x95,0xa9,0xce,0xb9,0xd1,0xc5); +__CRT_UUID_DECL(ICoreWebView2ExecuteScriptCompletedHandler, 0x49511172, 0xcc67, 0x4bca, 0x99,0x23, 0x13,0x71,0x12,0xf4,0xc4,0xcc); +__CRT_UUID_DECL(ICoreWebView2NavigationCompletedEventHandler, 0xd33a35bf, 0x1c49, 0x4f98, 0x93,0xab, 0x00,0x6e,0x05,0x33,0xfe,0x1c); +__CRT_UUID_DECL(ICoreWebView2NavigationStartingEventHandler, 0x9adbe429, 0xf36d, 0x432b, 0x9d,0xdc, 0xf8,0x88,0x1f,0xbd,0x76,0xe3); +__CRT_UUID_DECL(ICoreWebView2NewWindowRequestedEventHandler, 0xd4c185fe, 0xc81c, 0x4989, 0x97,0xaf, 0x2d,0x3f,0xa7,0xab,0x56,0x51); +__CRT_UUID_DECL(ICoreWebView2SourceChangedEventHandler, 0x3c067f9f, 0x5388, 0x4772, 0x8b,0x48, 0x79,0xf7,0xef,0x1a,0xb3,0x7c); +__CRT_UUID_DECL(ICoreWebView2WebMessageReceivedEventHandler, 0x57213f19, 0x00e6, 0x49fa, 0x8e,0x07, 0x89,0x8e,0xa0,0x1e,0xcb,0xd2); +#endif + class wxWebViewEdgeImpl { public: From 272c9032347b1c1baec6f6d96d419c2d5055eaf3 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Sun, 28 Feb 2021 15:10:38 +0100 Subject: [PATCH 11/12] Silence unknown pragmas warning in the WebView2 header Using wxGCC_WARNING_SUPPRESS(unknown-pragmas) around the webview2 header does not work, so suppress it for the entire webview project. --- build/bakefiles/multilib.bkl | 6 ++++++ build/cmake/lib/webview/CMakeLists.txt | 1 + build/msw/makefile.gcc | 7 ++++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/build/bakefiles/multilib.bkl b/build/bakefiles/multilib.bkl index 05eafd756a..90ca606d72 100644 --- a/build/bakefiles/multilib.bkl +++ b/build/bakefiles/multilib.bkl @@ -184,6 +184,10 @@ $(TOP_SRCDIR)include/wx/msw/wrl + + -Wno-unknown-pragmas + + WXUSINGDLL @@ -195,6 +199,7 @@ $(WEBVIEW_HDR) $(webview_additional_include_wrl) $(webview_additional_include) + $(webview_edge_pragma_warning) $(WEBVIEW_HDR) $(webview_additional_include_wrl) $(webview_additional_include) + $(webview_edge_pragma_warning) diff --git a/build/cmake/lib/webview/CMakeLists.txt b/build/cmake/lib/webview/CMakeLists.txt index 4cbf0fd900..e2ddeb44fb 100644 --- a/build/cmake/lib/webview/CMakeLists.txt +++ b/build/cmake/lib/webview/CMakeLists.txt @@ -69,6 +69,7 @@ elseif(WXMSW) wx_lib_include_directories(wxwebview PRIVATE "${WEBVIEW2_PACKAGE_DIR}/build/native/include") if(NOT MSVC) wx_lib_include_directories(wxwebview PRIVATE "${wxSOURCE_DIR}/include/wx/msw/wrl") + target_compile_options(wxwebview PRIVATE -Wno-unknown-pragmas) endif() if (CMAKE_SIZEOF_VOID_P EQUAL 4) diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc index 574f068211..6ff7d9af53 100644 --- a/build/msw/makefile.gcc +++ b/build/msw/makefile.gcc @@ -1142,7 +1142,8 @@ WEBVIEWDLL_CXXFLAGS = -I..\..\src\tiff\libtiff -I..\..\src\jpeg \ $(____CAIRO_INCLUDEDIR_FILENAMES) -W -Wall -DWXBUILDING -DWXUSINGDLL \ -DWXMAKINGDLL_WEBVIEW -I..\..\include\wx\msw\wrl \ -I..\..\3rdparty\webview2\build\native\include $(__RTTIFLAG) \ - $(__EXCEPTIONSFLAG) -Wno-ctor-dtor-privacy $(CPPFLAGS) $(CXXFLAGS) + $(__EXCEPTIONSFLAG) -Wno-ctor-dtor-privacy -Wno-unknown-pragmas $(CPPFLAGS) \ + $(CXXFLAGS) WEBVIEWDLL_OBJECTS = \ $(OBJS)\webviewdll_dummy.o \ $(OBJS)\webviewdll_webview_ie.o \ @@ -1159,8 +1160,8 @@ WEBVIEWLIB_CXXFLAGS = -I..\..\src\tiff\libtiff -I..\..\src\jpeg \ $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) -I$(SETUPHDIR) -I..\..\include \ $(____CAIRO_INCLUDEDIR_FILENAMES) -W -Wall -DWXBUILDING \ -I..\..\include\wx\msw\wrl -I..\..\3rdparty\webview2\build\native\include \ - $(__RTTIFLAG) $(__EXCEPTIONSFLAG) -Wno-ctor-dtor-privacy $(CPPFLAGS) \ - $(CXXFLAGS) + $(__RTTIFLAG) $(__EXCEPTIONSFLAG) -Wno-ctor-dtor-privacy \ + -Wno-unknown-pragmas $(CPPFLAGS) $(CXXFLAGS) WEBVIEWLIB_OBJECTS = \ $(OBJS)\webviewlib_dummy.o \ $(OBJS)\webviewlib_webview_ie.o \ From 753253280005dde65a625493234193088941fa27 Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Sun, 28 Feb 2021 20:06:03 +0100 Subject: [PATCH 12/12] Mention GCC/Clang support in wxWebViewEdge documentation And add a comment explaining the name of the EventRegistrationToken include guard. --- include/wx/msw/wrl/EventToken.h | 3 +++ interface/wx/webview.h | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/include/wx/msw/wrl/EventToken.h b/include/wx/msw/wrl/EventToken.h index 3b79b3a26d..8d178baa5a 100644 --- a/include/wx/msw/wrl/EventToken.h +++ b/include/wx/msw/wrl/EventToken.h @@ -7,6 +7,9 @@ // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// +// Note: this include guard uses the same name as winrt/EventToken.h in the +// Windows SDK to prevent a struct type redefinition when both headers are +// included. #ifndef __eventtoken_h__ #define __eventtoken_h__ diff --git a/interface/wx/webview.h b/interface/wx/webview.h index 18581d2c9a..1df97b3d1a 100644 --- a/interface/wx/webview.h +++ b/interface/wx/webview.h @@ -320,7 +320,7 @@ public: virtual filesystems, custom urls. This backend is not enabled by default, to build it follow these steps: - - Visual Studio 2015, or newer, is required + - Visual Studio 2015 or newer, or GCC/Clang with c++11 is required - With CMake just enable @c wxUSE_WEBVIEW_EDGE - When not using CMake: - Download the WebView2 SDK