Skip to main content

ferridriver_script/bindings/
console_message.rs

1//! `ConsoleMessageJs` — QuickJS binding for
2//! [`ferridriver::console_message::ConsoleMessage`].
3//!
4//! Mirrors Playwright's client-side `ConsoleMessage` class from
5//! `/tmp/playwright/packages/playwright-core/src/client/consoleMessage.ts`:
6//! sync `type()` / `text()` / `args()` / `location()` / `timestamp()`.
7//! `page()` is omitted (symmetric with `DownloadJs` / `FileChooserJs`).
8
9use ferridriver::console_message::ConsoleMessage as CoreConsoleMessage;
10use rquickjs::JsLifetime;
11use rquickjs::class::{Class, Trace};
12
13use crate::bindings::js_handle::JSHandleJs;
14
15#[derive(JsLifetime, Trace)]
16#[rquickjs::class(rename = "ConsoleMessage")]
17pub struct ConsoleMessageJs {
18  #[qjs(skip_trace)]
19  inner: CoreConsoleMessage,
20}
21
22impl ConsoleMessageJs {
23  #[must_use]
24  pub fn new(inner: CoreConsoleMessage) -> Self {
25    Self { inner }
26  }
27}
28
29#[rquickjs::methods]
30impl ConsoleMessageJs {
31  /// Playwright: `consoleMessage.type(): string`.
32  #[qjs(rename = "type")]
33  pub fn type_str(&self) -> String {
34    self.inner.type_str().to_string()
35  }
36
37  /// Playwright: `consoleMessage.text(): string`.
38  #[qjs(rename = "text")]
39  pub fn text(&self) -> String {
40    self.inner.text().to_string()
41  }
42
43  /// Playwright: `consoleMessage.args(): JSHandle[]`.
44  #[qjs(rename = "args")]
45  pub fn args<'js>(&self, ctx: rquickjs::Ctx<'js>) -> rquickjs::Result<Vec<rquickjs::Value<'js>>> {
46    let mut out = Vec::with_capacity(self.inner.args().len());
47    for h in self.inner.args() {
48      let instance = Class::instance(ctx.clone(), JSHandleJs::new(h.clone()))?;
49      out.push(rquickjs::IntoJs::into_js(instance, &ctx)?);
50    }
51    Ok(out)
52  }
53
54  /// Playwright: `consoleMessage.location(): { url, lineNumber, columnNumber }`.
55  #[qjs(rename = "location")]
56  pub fn location<'js>(&self, ctx: rquickjs::Ctx<'js>) -> rquickjs::Result<rquickjs::Value<'js>> {
57    let loc = self.inner.location();
58    let obj = rquickjs::Object::new(ctx.clone())?;
59    obj.set("url", loc.url.clone())?;
60    obj.set("lineNumber", loc.line_number)?;
61    obj.set("columnNumber", loc.column_number)?;
62    rquickjs::IntoJs::into_js(obj, &ctx)
63  }
64
65  /// Playwright: `consoleMessage.timestamp(): number`.
66  #[qjs(rename = "timestamp")]
67  pub fn timestamp(&self) -> f64 {
68    #[allow(clippy::cast_precision_loss)]
69    {
70      self.inner.timestamp() as f64
71    }
72  }
73}