Skip to main content

ferridriver_script/bindings/
download.rs

1//! `DownloadJs` — QuickJS binding for
2//! [`ferridriver::download::Download`].
3//!
4//! Mirrors Playwright's client-side `Download` class from
5//! `/tmp/playwright/packages/playwright-core/src/client/download.ts`:
6//! sync `url()` / `suggestedFilename()` accessors + async `path()` /
7//! `saveAs(path)` / `cancel()` / `delete()` / `failure()`.
8
9use ferridriver::download::Download as CoreDownload;
10use rquickjs::JsLifetime;
11use rquickjs::class::Trace;
12
13use crate::bindings::convert::FerriResultExt;
14
15#[derive(JsLifetime, Trace)]
16#[rquickjs::class(rename = "Download")]
17pub struct DownloadJs {
18  #[qjs(skip_trace)]
19  inner: CoreDownload,
20}
21
22impl DownloadJs {
23  #[must_use]
24  pub fn new(inner: CoreDownload) -> Self {
25    Self { inner }
26  }
27}
28
29#[rquickjs::methods]
30impl DownloadJs {
31  /// Playwright: `download.url(): string`.
32  #[qjs(rename = "url")]
33  pub fn url(&self) -> String {
34    self.inner.url().to_string()
35  }
36
37  /// Playwright: `download.suggestedFilename(): string`.
38  #[qjs(rename = "suggestedFilename")]
39  pub fn suggested_filename(&self) -> String {
40    self.inner.suggested_filename()
41  }
42
43  /// Playwright: `download.page(): Page`. Returns `undefined` only when
44  /// the owning page has already been closed (the Rust weak-backref
45  /// model surfaces that case; Playwright's TS type is non-nullable).
46  #[qjs(rename = "page")]
47  pub fn page(&self) -> Option<crate::bindings::page::PageJs> {
48    self.inner.page().map(crate::bindings::page::PageJs::new)
49  }
50
51  /// Playwright: `download.path(): Promise<string>`.
52  #[qjs(rename = "path")]
53  pub async fn path(&self) -> rquickjs::Result<String> {
54    let p = self.inner.path().await.into_js()?;
55    Ok(p.to_string_lossy().into_owned())
56  }
57
58  /// Playwright: `download.saveAs(path): Promise<void>`.
59  #[qjs(rename = "saveAs")]
60  pub async fn save_as(&self, path: String) -> rquickjs::Result<()> {
61    self.inner.save_as(&std::path::PathBuf::from(path)).await.into_js()
62  }
63
64  /// Playwright: `download.cancel(): Promise<void>`.
65  #[qjs(rename = "cancel")]
66  pub async fn cancel(&self) -> rquickjs::Result<()> {
67    self.inner.cancel().await.into_js()
68  }
69
70  /// Playwright: `download.delete(): Promise<void>`.
71  #[qjs(rename = "delete")]
72  pub async fn delete(&self) -> rquickjs::Result<()> {
73    self.inner.delete().await.into_js()
74  }
75
76  /// Playwright: `download.failure(): Promise<string | null>`.
77  #[qjs(rename = "failure")]
78  pub async fn failure(&self) -> Option<String> {
79    self.inner.failure().await
80  }
81}