Skip to main content

ferridriver_script/bindings/
file_chooser.rs

1//! `FileChooserJs` — QuickJS binding for
2//! [`ferridriver::file_chooser::FileChooser`].
3//!
4//! Mirrors Playwright's client-side `FileChooser` class from
5//! `/tmp/playwright/packages/playwright-core/src/client/fileChooser.ts`:
6//! sync `element()` / `isMultiple()` accessors + async
7//! `setFiles(files, options?)`.
8
9use ferridriver::file_chooser::FileChooser as CoreFileChooser;
10use rquickjs::JsLifetime;
11use rquickjs::class::Trace;
12
13use crate::bindings::convert::FerriResultExt;
14
15#[derive(JsLifetime, Trace)]
16#[rquickjs::class(rename = "FileChooser")]
17pub struct FileChooserJs {
18  #[qjs(skip_trace)]
19  inner: CoreFileChooser,
20}
21
22impl FileChooserJs {
23  #[must_use]
24  pub fn new(inner: CoreFileChooser) -> Self {
25    Self { inner }
26  }
27}
28
29#[rquickjs::methods]
30impl FileChooserJs {
31  /// Playwright: `fileChooser.element(): ElementHandle`.
32  #[qjs(rename = "element")]
33  pub fn element(&self) -> crate::bindings::element_handle::ElementHandleJs {
34    crate::bindings::element_handle::ElementHandleJs::new(self.inner.element().clone())
35  }
36
37  /// Playwright: `fileChooser.isMultiple(): boolean`.
38  #[qjs(rename = "isMultiple")]
39  pub fn is_multiple(&self) -> bool {
40    self.inner.is_multiple()
41  }
42
43  /// Playwright: `fileChooser.page(): Page`. Derived from the captured
44  /// element's owning page.
45  #[qjs(rename = "page")]
46  pub fn page(&self) -> crate::bindings::page::PageJs {
47    crate::bindings::page::PageJs::new(self.inner.page().clone())
48  }
49
50  /// Playwright: `fileChooser.setFiles(files, options?): Promise<void>`.
51  /// Accepts the full `string | string[] | FilePayload | FilePayload[]`
52  /// union — delegates through the captured `ElementHandle`'s
53  /// `setInputFiles`, which reuses the §1.5 path/payload plumbing.
54  #[qjs(rename = "setFiles")]
55  pub async fn set_files<'js>(
56    &self,
57    ctx: rquickjs::Ctx<'js>,
58    files: rquickjs::Value<'js>,
59    options: rquickjs::function::Opt<rquickjs::Value<'js>>,
60  ) -> rquickjs::Result<()> {
61    let files = crate::bindings::convert::parse_input_files(&ctx, files)?;
62    let opts = crate::bindings::convert::parse_set_input_files_options(&ctx, options)?;
63    self.inner.set_files(files, opts).await.into_js()
64  }
65}