소스 검색

feat: expose `WebviewWinowBuilder::on_download` (#9922)

* feat: expose `WebviewWinowBuilder::on_download`

closes #9921

* fix tests
Amr Bashir 1 년 전
부모
커밋
ddaabda365
2개의 변경된 파일55개의 추가작업 그리고 0개의 파일을 삭제
  1. 5 0
      .changes/webview-builder-on-download.md
  2. 50 0
      core/tauri/src/webview/webview_window.rs

+ 5 - 0
.changes/webview-builder-on-download.md

@@ -0,0 +1,5 @@
+---
+"tauri": "patch:feat"
+---
+
+Add `WebviewWindowBuilder::on_download`.

+ 50 - 0
core/tauri/src/webview/webview_window.rs

@@ -44,6 +44,8 @@ use tauri_macros::default_runtime;
 #[cfg(windows)]
 use windows::Win32::Foundation::HWND;
 
+use super::DownloadEvent;
+
 /// A builder for [`WebviewWindow`], a window that hosts a single webview.
 pub struct WebviewWindowBuilder<'a, R: Runtime, M: Manager<R>> {
   window_builder: WindowBuilder<'a, R, M>,
@@ -263,6 +265,54 @@ tauri::Builder::default()
     self
   }
 
+  /// Set a download event handler to be notified when a download is requested or finished.
+  ///
+  /// Returning `false` prevents the download from happening on a [`DownloadEvent::Requested`] event.
+  ///
+  /// # Examples
+  ///
+  #[cfg_attr(
+    feature = "unstable",
+    doc = r####"
+```rust,no_run
+use tauri::{
+  utils::config::{Csp, CspDirectiveSources, WebviewUrl},
+  webview::{DownloadEvent, WebviewWindowBuilder},
+};
+
+tauri::Builder::default()
+  .setup(|app| {
+    let handle = app.handle();
+    let webview_window = WebviewWindowBuilder::new(handle, "core", WebviewUrl::App("index.html".into()))
+      .on_download(|webview, event| {
+        match event {
+          DownloadEvent::Requested { url, destination } => {
+            println!("downloading {}", url);
+            *destination = "/home/tauri/target/path".into();
+          }
+          DownloadEvent::Finished { url, path, success } => {
+            println!("downloaded {} to {:?}, success: {}", url, path, success);
+          }
+          _ => (),
+        }
+        // let the download start
+        true
+      })
+      .build()?;
+
+    Ok(())
+  });
+```
+  "####
+  )]
+  pub fn on_download<F: Fn(Webview<R>, DownloadEvent<'_>) -> bool + Send + Sync + 'static>(
+    mut self,
+    f: F,
+  ) -> Self {
+    self.webview_builder.download_handler.replace(Arc::new(f));
+    self
+  }
+
   /// Defines a closure to be executed when a page load event is triggered.
   /// The event can be either [`tauri_runtime::webview::PageLoadEvent::Started`] if the page has started loading
   /// or [`tauri_runtime::webview::PageLoadEvent::Finished`] when the page finishes loading.