diff --git a/build/cmake/lib/webview/CMakeLists.txt b/build/cmake/lib/webview/CMakeLists.txt index 161a487336..ca0c944255 100644 --- a/build/cmake/lib/webview/CMakeLists.txt +++ b/build/cmake/lib/webview/CMakeLists.txt @@ -46,9 +46,9 @@ if(APPLE) elseif(WXMSW) if(wxUSE_WEBVIEW_EDGE) # Update the following variables if updating WebView2 SDK - set(WEBVIEW2_VERSION "1.0.705.50") + set(WEBVIEW2_VERSION "1.0.864.35") set(WEBVIEW2_URL "https://www.nuget.org/api/v2/package/Microsoft.Web.WebView2/${WEBVIEW2_VERSION}") - set(WEBVIEW2_SHA256 "6a34bb553e18cfac7297b4031f3eac2558e439f8d16a45945c22945ac404105d") + set(WEBVIEW2_SHA256 "542b271732b9d5435c33180eb4d5ea65fcb10aaf39f4d4be5953abe8d4bd1046") set(WEBVIEW2_DEFAULT_PACKAGE_DIR "${CMAKE_CURRENT_BINARY_DIR}/packages/Microsoft.Web.WebView2.${WEBVIEW2_VERSION}") diff --git a/include/wx/msw/private/webview_edge.h b/include/wx/msw/private/webview_edge.h index 2bd4a4cef8..edafca6ac0 100644 --- a/include/wx/msw/private/webview_edge.h +++ b/include/wx/msw/private/webview_edge.h @@ -18,8 +18,8 @@ #include -#ifndef __ICoreWebView2_2_INTERFACE_DEFINED__ - #error "WebView2 SDK version 1.0.705.50 or newer is required" +#ifndef __ICoreWebView2Settings3_INTERFACE_DEFINED__ + #error "WebView2 SDK version 1.0.864.35 or newer is required" #endif #ifndef __VISUALC__ @@ -39,6 +39,7 @@ __CRT_UUID_DECL(ICoreWebView2NavigationStartingEventHandler, 0x9adbe429, 0xf36d, __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); +__CRT_UUID_DECL(IID_ICoreWebView2Settings3, 0xfdb5ab74, 0xaf33, 0x4854, 0x84,0xf0,0x0a,0x63,0x1d,0xeb,0x5e,0xba); #endif WX_DECLARE_STRING_HASH_MAP(wxSharedPtr, wxStringToWebHandlerMap); @@ -65,6 +66,7 @@ public: wxString m_pendingPage; int m_pendingContextMenuEnabled; int m_pendingAccessToDevToolsEnabled; + int m_pendingEnableBrowserAcceleratorKeys; wxVector m_pendingUserScripts; wxVector m_userScriptIds; wxString m_scriptMsgHandlerName; diff --git a/include/wx/msw/webview_edge.h b/include/wx/msw/webview_edge.h index ba186e2971..1283d165b9 100644 --- a/include/wx/msw/webview_edge.h +++ b/include/wx/msw/webview_edge.h @@ -86,6 +86,9 @@ public: virtual void EnableAccessToDevTools(bool enable = true) override; virtual bool IsAccessToDevToolsEnabled() const override; + virtual void EnableBrowserAcceleratorKeys(bool enable = true) override; + virtual bool AreBrowserAcceleratorKeysEnabled() const override; + virtual bool SetUserAgent(const wxString& userAgent) override; virtual bool RunScript(const wxString& javascript, wxString* output = nullptr) const override; diff --git a/include/wx/webview.h b/include/wx/webview.h index e486d1255a..bb40d05d91 100644 --- a/include/wx/webview.h +++ b/include/wx/webview.h @@ -210,6 +210,8 @@ public: m_showMenu = enable; } virtual void EnableAccessToDevTools(bool WXUNUSED(enable) = true) { } + virtual void EnableBrowserAcceleratorKeys(bool WXUNUSED(enable) = true) { } + virtual bool AreBrowserAcceleratorKeysEnabled() const { return false; } virtual wxString GetCurrentTitle() const = 0; virtual wxString GetCurrentURL() const = 0; // TODO: handle choosing a frame when calling GetPageSource()? diff --git a/interface/wx/webview.h b/interface/wx/webview.h index 9ff79dd4d2..b6e8adcc6d 100644 --- a/interface/wx/webview.h +++ b/interface/wx/webview.h @@ -579,7 +579,7 @@ public: - With CMake just enable @c wxUSE_WEBVIEW_EDGE - When not using CMake: - Download the WebView2 SDK - nuget package (Version 1.0.705.50 or newer) + nuget package (Version 1.0.864.35 or newer) - Extract the package (it's a zip archive) to @c wxWidgets/3rdparty/webview2 (you should have @c 3rdparty/webview2/build/native/include/WebView2.h file after unpacking it) @@ -1212,7 +1212,7 @@ public: virtual void Paste(); /** - @name Context Menu + @name Settings */ /** @@ -1232,10 +1232,6 @@ public: */ virtual bool IsContextMenuEnabled() const; - /** - @name Dev Tools - */ - /** Enable or disable access to dev tools for the user. @@ -1254,6 +1250,30 @@ public: */ virtual bool IsAccessToDevToolsEnabled() const; + /** + Enable or disable if browser accelerator keys are enabled. + + Browser accelerator keys are enabled by default. + + The webview might implement various accelerator keys. This includes + allowing accelerator key access to features such as printing and + navigation. In many cases this might not be desired and the default + keys can be disabled with this setting. + + @note This is only implemented for the Edge backend. + + @since 3.3.0 + */ + virtual void EnableBrowserAcceleratorKeys(bool enable = true); + + /** + Returns @true if browser accelerator keys are enabled. + + @since 3.3.0 + */ + virtual bool AreBrowserAcceleratorKeysEnabled() const; + + /** @name History */ diff --git a/samples/webview/webview.cpp b/samples/webview/webview.cpp index 6b8a6acc48..02eaf2155c 100644 --- a/samples/webview/webview.cpp +++ b/samples/webview/webview.cpp @@ -171,6 +171,7 @@ public: void OnFindOptions(wxCommandEvent& evt); void OnEnableContextMenu(wxCommandEvent& evt); void OnEnableDevTools(wxCommandEvent& evt); + void OnEnableBrowserAcceleratorKeys(wxCommandEvent& evt); private: wxTextCtrl* m_url; @@ -237,6 +238,7 @@ private: wxMenuItem* m_find; wxMenuItem* m_context_menu; wxMenuItem* m_dev_tools; + wxMenuItem* m_browser_accelerator_keys; wxInfoBar *m_info; wxStaticText* m_info_text; @@ -537,6 +539,7 @@ WebFrame::WebFrame(const wxString& url) : m_context_menu = m_tools_menu->AppendCheckItem(wxID_ANY, _("Enable Context Menu")); m_dev_tools = m_tools_menu->AppendCheckItem(wxID_ANY, _("Enable Dev Tools")); + m_browser_accelerator_keys = m_tools_menu->AppendCheckItem(wxID_ANY, _("Enable Browser Accelerator Keys")); //By default we want to handle navigation and new windows m_tools_handle_navigation->Check(); @@ -635,6 +638,7 @@ WebFrame::WebFrame(const wxString& url) : Bind(wxEVT_MENU, &WebFrame::OnFind, this, m_find->GetId()); Bind(wxEVT_MENU, &WebFrame::OnEnableContextMenu, this, m_context_menu->GetId()); Bind(wxEVT_MENU, &WebFrame::OnEnableDevTools, this, m_dev_tools->GetId()); + Bind(wxEVT_MENU, &WebFrame::OnEnableBrowserAcceleratorKeys, this, m_browser_accelerator_keys->GetId()); //Connect the idle events Bind(wxEVT_IDLE, &WebFrame::OnIdle, this); @@ -810,6 +814,11 @@ void WebFrame::OnEnableDevTools(wxCommandEvent& evt) m_browser->EnableAccessToDevTools(evt.IsChecked()); } +void WebFrame::OnEnableBrowserAcceleratorKeys(wxCommandEvent& evt) +{ + m_browser->EnableBrowserAcceleratorKeys(evt.IsChecked()); +} + void WebFrame::OnFind(wxCommandEvent& WXUNUSED(evt)) { wxString value = m_browser->GetSelectedText(); @@ -1035,6 +1044,7 @@ void WebFrame::OnToolsClicked(wxCommandEvent& WXUNUSED(evt)) m_context_menu->Check(m_browser->IsContextMenuEnabled()); m_dev_tools->Check(m_browser->IsAccessToDevToolsEnabled()); + m_browser_accelerator_keys->Check(m_browser->AreBrowserAcceleratorKeysEnabled()); //Firstly we clear the existing menu items, then we add the current ones wxMenuHistoryMap::const_iterator it; diff --git a/src/msw/webview_edge.cpp b/src/msw/webview_edge.cpp index e1d5efb6fc..a4ef4e2014 100644 --- a/src/msw/webview_edge.cpp +++ b/src/msw/webview_edge.cpp @@ -284,6 +284,7 @@ bool wxWebViewEdgeImpl::Create() m_inEventCallback = false; m_pendingContextMenuEnabled = -1; m_pendingAccessToDevToolsEnabled = 0; + m_pendingEnableBrowserAcceleratorKeys = -1; m_historyLoadingFromList = false; m_historyEnabled = true; @@ -667,6 +668,12 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control m_pendingContextMenuEnabled = -1; } + if (m_pendingEnableBrowserAcceleratorKeys != -1) + { + m_ctrl->EnableBrowserAcceleratorKeys(m_pendingEnableBrowserAcceleratorKeys == 1); + m_pendingEnableBrowserAcceleratorKeys = -1; + } + wxCOMPtr settings(GetSettings()); if (settings) { @@ -1058,6 +1065,37 @@ bool wxWebViewEdge::IsAccessToDevToolsEnabled() const return true; } +void wxWebViewEdge::EnableBrowserAcceleratorKeys(bool enable) +{ + wxCOMPtr settings(m_impl->GetSettings()); + if (settings) + { + wxCOMPtr settings3; + if (SUCCEEDED(settings->QueryInterface(IID_PPV_ARGS(&settings3)))) + settings3->put_AreBrowserAcceleratorKeysEnabled(enable); + } + else + m_impl->m_pendingEnableBrowserAcceleratorKeys = enable ? 1 : 0; +} + +bool wxWebViewEdge::AreBrowserAcceleratorKeysEnabled() const +{ + wxCOMPtr settings(m_impl->GetSettings()); + if (settings) + { + BOOL browserAcceleratorKeysEnabled = TRUE; + wxCOMPtr settings3; + if (SUCCEEDED(settings->QueryInterface(IID_PPV_ARGS(&settings3)))) + settings3->get_AreBrowserAcceleratorKeysEnabled(&browserAcceleratorKeysEnabled); + + if (!browserAcceleratorKeysEnabled) + return false; + } + + return true; +} + + bool wxWebViewEdge::SetUserAgent(const wxString& userAgent) { m_impl->m_customUserAgent = userAgent;