From e54afec43b767ffdb43debbd526d249c3c5b5490 Mon Sep 17 00:00:00 2001 From: Amr Bashir Date: Thu, 3 Mar 2022 06:41:42 +0200 Subject: [PATCH] feat: expose webview native handles, closes #495 (#513) * feat: expose webview native handles, closes #495 * fix linux * [skip ci] update changefile --- .changes/native-handles.md | 6 +++++ src/webview/mod.rs | 46 +++++++++++++++++++++++++++++++++--- src/webview/webkitgtk/mod.rs | 2 +- 3 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 .changes/native-handles.md diff --git a/.changes/native-handles.md b/.changes/native-handles.md new file mode 100644 index 000000000..d2cc487da --- /dev/null +++ b/.changes/native-handles.md @@ -0,0 +1,6 @@ +--- +"wry": "minor" +--- + +* Expose methods to access the underlying native handles of the webview. +* **Breaking change**: `WebviewExtWindows::controller` now returns the controller directley and not wrapped in an `Option` diff --git a/src/webview/mod.rs b/src/webview/mod.rs index 322289e5a..4c4562f87 100644 --- a/src/webview/mod.rs +++ b/src/webview/mod.rs @@ -435,13 +435,53 @@ pub fn webview_version() -> Result { #[cfg(target_os = "windows")] pub trait WebviewExtWindows { /// Returns WebView2 Controller - fn controller(&self) -> Option; + fn controller(&self) -> ICoreWebView2Controller; } #[cfg(target_os = "windows")] impl WebviewExtWindows for WebView { - fn controller(&self) -> Option { - Some(self.webview.controller.clone()) + fn controller(&self) -> ICoreWebView2Controller { + self.webview.controller.clone() + } +} + +/// Additional methods on `WebView` that are specific to Linux. +#[cfg(target_os = "linux")] +pub trait WebviewExtUnix { + /// Returns Webkit2gtk Webview handle + fn webview(&self) -> Rc; +} + +#[cfg(target_os = "linux")] +impl WebviewExtUnix for WebView { + fn webview(&self) -> Rc { + self.webview.webview.clone() + } +} + +/// Additional methods on `WebView` that are specific to macOS. +#[cfg(target_os = "macOS")] +pub trait WebviewExtMacOS { + /// Returns WKWebView handle + fn webview(&self) -> cocoa::base::id; + /// Returns WKWebView manager [(userContentController)](https://developer.apple.com/documentation/webkit/wkscriptmessagehandler/1396222-usercontentcontroller) handle + fn manager(&self) -> cocoa::base::id; + /// Returns NSWindow associated with the WKWebView webview + fn ns_window(&self) -> cocoa::base::id; +} + +#[cfg(target_os = "macOS")] +impl WebviewExtMacOS for WebView { + fn webview(&self) -> cocoa::base::id { + self.webview.webview.clone() + } + + fn manager(&self) -> cocoa::base::id { + self.webview.manager.clone() + } + + fn ns_window(&self) -> cocoa::base::id { + self.webview.ns_window.clone() } } diff --git a/src/webview/webkitgtk/mod.rs b/src/webview/webkitgtk/mod.rs index 86e34816e..95d715fdd 100644 --- a/src/webview/webkitgtk/mod.rs +++ b/src/webview/webkitgtk/mod.rs @@ -33,7 +33,7 @@ mod file_drop; mod web_context; pub struct InnerWebView { - webview: Rc, + pub(crate) webview: Rc, } impl InnerWebView {