From 3caf48b04c1329c6f33f39f11e9af261b7ac99c9 Mon Sep 17 00:00:00 2001 From: Tobias Taschner Date: Mon, 8 Mar 2021 10:12:00 +0100 Subject: [PATCH 1/3] macOS: Implement window.print() in wxWebView A WKUIDelegate method has to be implemented to make a javascript calling window.print() working. --- src/osx/webview_webkit.mm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/osx/webview_webkit.mm b/src/osx/webview_webkit.mm index 8dae40f8b8..1457ece981 100644 --- a/src/osx/webview_webkit.mm +++ b/src/osx/webview_webkit.mm @@ -933,6 +933,15 @@ WX_API_AVAILABLE_MACOS(10, 12) } #endif // __MAC_OS_X_VERSION_MAX_ALLOWED +// The following WKUIDelegateMethods are undocumented as of macOS SDK 11.0, +// but are documented in the WebKit cocoa interface headers: +// https://github.com/WebKit/WebKit/blob/main/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h + +- (void)_webView:(WKWebView *)webView printFrame:(WKFrameInfo*)frame +{ + webKitWindow->Print(); +} + @end @implementation WebViewScriptMessageHandler From 57fa1c52b7e307f49fcbc0cf8b75526651685339 Mon Sep 17 00:00:00 2001 From: Tobias Taschner Date: Mon, 8 Mar 2021 11:42:02 +0100 Subject: [PATCH 2/3] macOS: Implement wxWebView fullscreen API --- src/osx/webview_webkit.mm | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/osx/webview_webkit.mm b/src/osx/webview_webkit.mm index 1457ece981..262409ad05 100644 --- a/src/osx/webview_webkit.mm +++ b/src/osx/webview_webkit.mm @@ -123,6 +123,12 @@ bool wxWebViewWebKit::Create(wxWindow *parent, NSRect r = wxOSXGetFrameForControl( this, pos , size ) ; WKWebViewConfiguration* webViewConfig = [[WKWebViewConfiguration alloc] init]; + + // WebKit API available since macOS 10.11 and iOS 9.0 + SEL fullScreenSelector = @selector(_setFullScreenEnabled:); + if ([webViewConfig.preferences respondsToSelector:fullScreenSelector]) + [webViewConfig.preferences performSelector:fullScreenSelector withObject:[NSNumber numberWithBool:YES]]; + if (!m_handlers.empty()) { #if __MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_13 @@ -162,6 +168,11 @@ bool wxWebViewWebKit::Create(wxWindow *parent, [m_webView setUIDelegate:uiDelegate]; + // WebKit API available since macOS 10.13 and iOS 11.0 + SEL fullScreenDelegateSelector = @selector(_setFullscreenDelegate:); + if ([m_webView respondsToSelector:fullScreenDelegateSelector]) + [m_webView performSelector:fullScreenDelegateSelector withObject:uiDelegate]; + m_UIDelegate = uiDelegate; LoadURL(strURL); @@ -942,6 +953,25 @@ WX_API_AVAILABLE_MACOS(10, 12) webKitWindow->Print(); } +- (void)SendFullscreenChangedEvent:(int)status +{ + wxWebViewEvent event(wxEVT_WEBVIEW_FULLSCREEN_CHANGED, webKitWindow->GetId(), + webKitWindow->GetCurrentURL(), wxString()); + event.SetEventObject(webKitWindow); + event.SetInt(status); + webKitWindow->HandleWindowEvent(event); +} + +- (void)_webViewDidEnterFullscreen:(WKWebView *)webView +{ + [self SendFullscreenChangedEvent:1]; +} + +- (void)_webViewDidExitFullscreen:(WKWebView *)webView +{ + [self SendFullscreenChangedEvent:0]; +} + @end @implementation WebViewScriptMessageHandler From 4ab9ee32a8c8b2d0f2c0a11de5dfa19f5370a9d2 Mon Sep 17 00:00:00 2001 From: Tobias Taschner Date: Mon, 8 Mar 2021 12:08:20 +0100 Subject: [PATCH 3/3] macOS: Implement access to dev tools for wxWebView --- include/wx/osx/webview_webkit.h | 3 +++ src/osx/webview_webkit.mm | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/wx/osx/webview_webkit.h b/include/wx/osx/webview_webkit.h index 3d95825b73..2166966cc5 100644 --- a/include/wx/osx/webview_webkit.h +++ b/include/wx/osx/webview_webkit.h @@ -71,6 +71,9 @@ public: virtual bool IsBusy() const wxOVERRIDE; + virtual bool IsAccessToDevToolsEnabled() const wxOVERRIDE; + virtual void EnableAccessToDevTools(bool enable = true) wxOVERRIDE; + //History functions virtual void ClearHistory() wxOVERRIDE; virtual void EnableHistory(bool enable = true) wxOVERRIDE; diff --git a/src/osx/webview_webkit.mm b/src/osx/webview_webkit.mm index 262409ad05..3f304310bf 100644 --- a/src/osx/webview_webkit.mm +++ b/src/osx/webview_webkit.mm @@ -308,6 +308,26 @@ bool wxWebViewWebKit::IsEditable() const return false; } +bool wxWebViewWebKit::IsAccessToDevToolsEnabled() const +{ + // WebKit API available since macOS 10.11 and iOS 9.0 + WKPreferences* prefs = m_webView.configuration.preferences; + SEL devToolsSelector = @selector(_developerExtrasEnabled); + id val = nil; + if ([prefs respondsToSelector:devToolsSelector]) + val = [prefs performSelector:devToolsSelector]; + return (val != nil); +} + +void wxWebViewWebKit::EnableAccessToDevTools(bool enable) +{ + // WebKit API available since macOS 10.11 and iOS 9.0 + WKPreferences* prefs = m_webView.configuration.preferences; + SEL devToolsSelector = @selector(_setDeveloperExtrasEnabled:); + if ([prefs respondsToSelector:devToolsSelector]) + [prefs performSelector:devToolsSelector withObject:(id)enable]; +} + void wxWebViewWebKit::SetZoomType(wxWebViewZoomType zoomType) { // there is only one supported zoom type at the moment so this setter