diff --git a/.changes/reload.md b/.changes/reload.md new file mode 100644 index 000000000..328993c56 --- /dev/null +++ b/.changes/reload.md @@ -0,0 +1,5 @@ +--- +'wry': 'patch' +--- + +feat: add `Webview.reload` diff --git a/src/android/kotlin/RustWebView.kt b/src/android/kotlin/RustWebView.kt index 4d8d82ed8..8debc1c7a 100644 --- a/src/android/kotlin/RustWebView.kt +++ b/src/android/kotlin/RustWebView.kt @@ -16,7 +16,7 @@ import kotlin.collections.Map @SuppressLint("RestrictedApi") class RustWebView(context: Context, val initScripts: Array, val id: String): WebView(context) { val isDocumentStartScriptEnabled: Boolean - + init { settings.javaScriptEnabled = true settings.domStorageEnabled = true diff --git a/src/android/kotlin/proguard-wry.pro b/src/android/kotlin/proguard-wry.pro index 6d883ff01..064ca362b 100644 --- a/src/android/kotlin/proguard-wry.pro +++ b/src/android/kotlin/proguard-wry.pro @@ -30,4 +30,4 @@ -keep class {{package-unescaped}}.RustWebChromeClient,{{package-unescaped}}.RustWebViewClient { public (...); -} \ No newline at end of file +} diff --git a/src/android/main_pipe.rs b/src/android/main_pipe.rs index b6f4f8b3c..edc4d8851 100644 --- a/src/android/main_pipe.rs +++ b/src/android/main_pipe.rs @@ -341,6 +341,11 @@ impl<'a> MainPipe<'a> { load_html(&mut self.env, webview.as_obj(), &html)?; } } + WebViewMessage::Reload => { + if let Some(webview) = &self.webview { + reload(&mut self.env, webview.as_obj())?; + } + } WebViewMessage::GetCookies(tx, url) => { if let Some(webview) = &self.webview { let url = self.env.new_string(url)?; @@ -425,6 +430,11 @@ fn load_html<'a>(env: &mut JNIEnv<'a>, webview: &JObject<'a>, html: &JString<'a> Ok(()) } +fn reload<'a>(env: &mut JNIEnv<'a>, webview: &JObject<'a>) -> JniResult<()> { + env.call_method(webview, "reload", "()V", &[])?; + Ok(()) +} + fn set_background_color<'a>( env: &mut JNIEnv<'a>, webview: &JObject<'a>, @@ -445,6 +455,7 @@ pub(crate) enum WebViewMessage { Jni(Box), LoadUrl(String, Option), LoadHtml(String), + Reload, ClearAllBrowsingData, OnDestroy, } diff --git a/src/android/mod.rs b/src/android/mod.rs index e18a4ad3e..ea201ebed 100644 --- a/src/android/mod.rs +++ b/src/android/mod.rs @@ -400,6 +400,11 @@ impl InnerWebView { Ok(()) } + pub fn reload(&self) -> Result<()> { + MainPipe::send(WebViewMessage::Reload); + Ok(()) + } + pub fn clear_all_browsing_data(&self) -> Result<()> { MainPipe::send(WebViewMessage::ClearAllBrowsingData); Ok(()) diff --git a/src/lib.rs b/src/lib.rs index ef12a5f4e..7ea996c5b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1883,6 +1883,11 @@ impl WebView { self.webview.load_url(url) } + /// Reloads the current page. + pub fn reload(&self) -> crate::Result<()> { + self.webview.reload() + } + /// Navigate to the specified url using the specified headers pub fn load_url_with_headers(&self, url: &str, headers: http::HeaderMap) -> Result<()> { self.webview.load_url_with_headers(url, headers) diff --git a/src/webkitgtk/mod.rs b/src/webkitgtk/mod.rs index 771d964d8..f72170b6a 100644 --- a/src/webkitgtk/mod.rs +++ b/src/webkitgtk/mod.rs @@ -695,6 +695,11 @@ impl InnerWebView { Ok(()) } + pub fn reload(&self) -> Result<()> { + self.webview.reload(); + Ok(()) + } + pub fn clear_all_browsing_data(&self) -> Result<()> { if let Some(context) = self.webview.context() { if let Some(data_manger) = context.website_data_manager() { diff --git a/src/webview2/mod.rs b/src/webview2/mod.rs index 4c91a230b..2bb92605f 100644 --- a/src/webview2/mod.rs +++ b/src/webview2/mod.rs @@ -1300,6 +1300,10 @@ impl InnerWebView { unsafe { self.webview.NavigateToString(&html) }.map_err(Into::into) } + pub fn reload(&self) -> Result<()> { + unsafe { self.webview.Reload() }.map_err(Into::into) + } + pub fn bounds(&self) -> Result { let mut bounds = Rect::default(); let mut rect = RECT::default(); diff --git a/src/wkwebview/mod.rs b/src/wkwebview/mod.rs index 37a6adf78..5f9860f2a 100644 --- a/src/wkwebview/mod.rs +++ b/src/wkwebview/mod.rs @@ -683,6 +683,13 @@ r#"Object.defineProperty(window, 'ipc', { Ok(()) } + /// Reloads the current page. + pub fn reload(&self) -> crate::Result<()> { + // Safety: objc runtime calls are unsafe + unsafe { self.webview.reload() }; + Ok(()) + } + pub fn clear_all_browsing_data(&self) -> Result<()> { unsafe { let config = self.webview.configuration();