ferridriver_script/bindings/
mod.rs1pub mod abort;
22pub mod artifacts;
23pub mod bdd;
24pub mod blob;
25pub mod browser;
26pub mod browser_type;
27pub mod console_message;
28pub mod context;
29pub mod convert;
30pub mod dialog;
31pub mod disposable;
32pub mod download;
33pub mod element_handle;
34pub mod expect;
35pub mod fetch;
36pub mod file_chooser;
37pub mod form_data;
38pub mod frame;
39pub mod frame_locator;
40pub mod http_client;
41pub mod js_handle;
42pub mod keyboard;
43pub mod locator;
44pub mod mouse;
45pub mod network;
46pub mod page;
47pub mod plugins;
48pub mod process;
49pub mod streams;
50pub mod video;
51pub mod web_error;
52pub mod webapi;
53
54pub use artifacts::ArtifactsJs;
55pub use bdd::{
56 CollectedAllow, CollectedRegistry, CollectedTool, HookArg, JsArg, ScenarioWorld, ScriptAttachment, StepOutcome,
57 collect_registry, drain_attachments, install_bdd, invoke_hook, invoke_step, reset_world, set_scenario_world,
58 tools_len, tools_snapshot,
59};
60pub use browser::BrowserJs;
61pub use browser_type::{BrowserTypeJs, install_browser_type};
62pub use console_message::ConsoleMessageJs;
63pub use context::BrowserContextJs;
64pub use dialog::DialogJs;
65pub use disposable::DisposableJs;
66pub use download::DownloadJs;
67pub use element_handle::ElementHandleJs;
68pub use file_chooser::FileChooserJs;
69pub use frame::FrameJs;
70pub use frame_locator::FrameLocatorJs;
71pub use http_client::{HttpClientJs, HttpResponseJs};
72pub use js_handle::JSHandleJs;
73pub use keyboard::KeyboardJs;
74pub use locator::LocatorJs;
75pub use mouse::MouseJs;
76pub use network::{RequestJs, ResponseJs, RouteJs, WebSocketJs};
77pub use page::PageJs;
78pub use plugins::{PluginBinding, PluginCommandsJs, install_plugins};
79pub use video::VideoJs;
80pub use web_error::WebErrorJs;
81
82use rquickjs::{AsyncContext, Ctx, class::Class};
83use std::sync::Arc;
84
85pub fn define_classes<'js>(ctx: &Ctx<'js>) -> rquickjs::Result<()> {
93 let g = ctx.globals();
94 Class::<PageJs>::define(&g)?;
95 Class::<FrameJs>::define(&g)?;
96 Class::<LocatorJs>::define(&g)?;
97 Class::<BrowserContextJs>::define(&g)?;
98 Class::<BrowserJs>::define(&g)?;
99 Class::<HttpClientJs>::define(&g)?;
100 Class::<HttpResponseJs>::define(&g)?;
101 Class::<KeyboardJs>::define(&g)?;
102 Class::<MouseJs>::define(&g)?;
103 Class::<ArtifactsJs>::define(&g)?;
104 Class::<JSHandleJs>::define(&g)?;
105 Class::<ElementHandleJs>::define(&g)?;
106 Class::<RouteJs>::define(&g)?;
113 Class::<WebSocketJs>::define(&g)?;
114 Class::<DialogJs>::define(&g)?;
115 Class::<FileChooserJs>::define(&g)?;
116 Class::<DownloadJs>::define(&g)?;
117 Class::<DisposableJs>::define(&g)?;
118 Class::<ConsoleMessageJs>::define(&g)?;
119 Class::<WebErrorJs>::define(&g)?;
120 Class::<VideoJs>::define(&g)?;
121 Class::<BrowserTypeJs>::define(&g)?;
122 Class::<FrameLocatorJs>::define(&g)?;
123 Class::<crate::bindings::page::TouchscreenJs>::define(&g)?;
124 Class::<crate::bindings::fetch::HeadersJs>::define(&g)?;
125 Class::<crate::bindings::fetch::FetchResponseJs>::define(&g)?;
126 Class::<crate::bindings::fetch::FetchRequestJs>::define(&g)?;
127 Class::<crate::bindings::abort::AbortControllerJs<'js>>::define(&g)?;
128 Class::<crate::bindings::abort::AbortSignalJs<'js>>::define(&g)?;
129 Class::<crate::bindings::streams::ReadableStreamJs>::define(&g)?;
130 Class::<crate::bindings::streams::ReadableStreamDefaultReaderJs>::define(&g)?;
131 Class::<crate::bindings::streams::ReadableStreamDefaultControllerJs>::define(&g)?;
132 Class::<crate::bindings::blob::BlobJs>::define(&g)?;
133 Class::<crate::bindings::form_data::FormDataJs>::define(&g)?;
134 Ok(())
135}
136
137pub fn install_page(ctx: &Ctx<'_>, page: Arc<ferridriver::Page>, async_ctx: AsyncContext) -> rquickjs::Result<()> {
148 install_page_on(ctx, &ctx.globals(), page, async_ctx)
149}
150
151pub fn install_page_on<'js>(
159 ctx: &Ctx<'js>,
160 target: &rquickjs::Object<'js>,
161 page: Arc<ferridriver::Page>,
162 async_ctx: AsyncContext,
163) -> rquickjs::Result<()> {
164 let js_page = Class::instance(ctx.clone(), PageJs::new_with_async_ctx(page, async_ctx))?;
165 target.set("page", js_page)?;
166 page::ensure_page_callbacks(ctx);
170 Ok(())
171}
172
173pub fn install_browser_context(ctx: &Ctx<'_>, bcx: Arc<ferridriver::context::ContextRef>) -> rquickjs::Result<()> {
175 install_browser_context_on(ctx, &ctx.globals(), bcx)
176}
177
178pub fn install_browser_context_on<'js>(
180 ctx: &Ctx<'js>,
181 target: &rquickjs::Object<'js>,
182 bcx: Arc<ferridriver::context::ContextRef>,
183) -> rquickjs::Result<()> {
184 let js_bcx = Class::instance(ctx.clone(), BrowserContextJs::new(bcx))?;
185 target.set("context", js_bcx)?;
186 Ok(())
187}
188
189pub fn install_browser(ctx: &Ctx<'_>, browser: Arc<ferridriver::Browser>) -> rquickjs::Result<()> {
194 install_browser_on(ctx, &ctx.globals(), browser)
195}
196
197pub fn install_browser_on<'js>(
199 ctx: &Ctx<'js>,
200 target: &rquickjs::Object<'js>,
201 browser: Arc<ferridriver::Browser>,
202) -> rquickjs::Result<()> {
203 let js_browser = Class::instance(ctx.clone(), BrowserJs::new(browser))?;
204 target.set("browser", js_browser)?;
205 Ok(())
206}
207
208pub fn install_request(ctx: &Ctx<'_>, req: Arc<ferridriver::http_client::HttpClient>) -> rquickjs::Result<()> {
210 install_request_on(ctx, &ctx.globals(), req)
211}
212
213pub fn install_request_on<'js>(
215 ctx: &Ctx<'js>,
216 target: &rquickjs::Object<'js>,
217 req: Arc<ferridriver::http_client::HttpClient>,
218) -> rquickjs::Result<()> {
219 let js_req = Class::instance(ctx.clone(), HttpClientJs::new(req))?;
220 target.set("request", js_req)?;
221 Ok(())
222}
223
224pub fn install_artifacts(ctx: &Ctx<'_>, sandbox: Arc<crate::fs::PathSandbox>) -> rquickjs::Result<()> {
227 let js_art = Class::instance(ctx.clone(), ArtifactsJs::new(sandbox))?;
228 ctx.globals().set("artifacts", js_art)?;
229 Ok(())
230}