1use serde::{Deserialize, Serialize};
2
3pub const ALLWRIGHT_PLUGIN_API_VERSION: u32 = 1;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum SurfaceFamily {
7 Web,
8 Mobile,
9 Desktop,
10}
11
12#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
13#[serde(rename_all = "snake_case")]
14pub enum BrowserKind {
15 Chromium,
16 Firefox,
17}
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq)]
20pub struct SurfacePluginDescriptor {
21 pub id: &'static str,
22 pub family: SurfaceFamily,
23 pub version: &'static str,
24 pub description: &'static str,
25}
26
27pub trait SurfacePlugin: Send + Sync {
28 fn descriptor(&self) -> SurfacePluginDescriptor;
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
32pub struct ChromeLaunchInfo {
33 pub browser: String,
34 pub note: String,
35 pub cdp_websocket_url: String,
36 pub user_data_dir: String,
37 pub process_id: u32,
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
41pub struct BrowserLaunchInfo {
42 pub browser_kind: BrowserKind,
43 pub browser: String,
44 pub note: String,
45 pub user_data_dir: String,
46 pub process_id: u32,
47 pub browser_session: BrowserSessionHandle,
48 pub initial_page: PageInfo,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
52pub struct ChromeTabInfo {
53 pub note: String,
54 pub target_id: String,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
58pub struct TabNavigationInfo {
59 pub url: String,
60 pub note: String,
61 pub page_session: PageSessionHandle,
62 pub automation: AutomationSessionInfo,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
66pub struct ChromiumBidiMapperInfo {
67 pub package_version: String,
68 pub mapper_target_id: String,
69 pub mapper_session_id: String,
70 pub note: String,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
74#[serde(tag = "kind", rename_all = "snake_case")]
75pub enum BrowserSessionHandle {
76 Chromium {
77 cdp_websocket_url: String,
78 },
79 Firefox {
80 connection_id: String,
81 bidi_session_id: String,
82 },
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
86#[serde(tag = "kind", rename_all = "snake_case")]
87pub enum PageSessionHandle {
88 Chromium {
89 target_id: String,
90 browsing_context_id: Option<String>,
91 #[serde(default)]
92 mapper_target_id: Option<String>,
93 },
94 Firefox {
95 browsing_context_id: String,
96 },
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
100pub struct PageInfo {
101 pub note: String,
102 pub page_session: PageSessionHandle,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
106pub struct AutomationSessionInfo {
107 pub bidi_session_id: String,
108 pub note: String,
109 pub mapper_target_id: Option<String>,
110 pub mapper_session_id: Option<String>,
111 pub package_version: Option<String>,
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
115pub struct ClickInfo {
116 pub css_selector: String,
117 pub note: String,
118 pub bidi_session_id: String,
119}
120
121#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
122pub struct ElementCountInfo {
123 pub css_selector: String,
124 pub count: u32,
125 pub note: String,
126}
127
128#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
129pub struct HighlightElementsInfo {
130 pub css_selector: String,
131 pub count: u32,
132 pub note: String,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
136pub struct FocusInfo {
137 pub css_selector: String,
138 pub note: String,
139}
140
141#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
142pub struct FillInfo {
143 pub css_selector: String,
144 pub value: String,
145 pub note: String,
146}
147
148#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
149pub struct HoverInfo {
150 pub css_selector: String,
151 pub note: String,
152}
153
154#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
155pub struct PressKeyInfo {
156 pub css_selector: String,
157 pub key: String,
158 pub note: String,
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
162pub struct TextInfo {
163 pub css_selector: String,
164 pub text: String,
165 pub note: String,
166}
167
168#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
169pub struct WaitForSelectorInfo {
170 pub css_selector: String,
171 pub visible: bool,
172 pub note: String,
173}
174
175#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
176pub struct ScreenshotInfo {
177 pub png_data: Vec<u8>,
178 pub note: String,
179}
180
181#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
182#[serde(tag = "command", rename_all = "snake_case")]
183pub enum PluginCommand {
184 LaunchBrowser {
185 browser_kind: BrowserKind,
186 browser_binary: Option<String>,
187 },
188 OpenPage {
189 browser_session: BrowserSessionHandle,
190 },
191 ClosePage {
192 browser_session: BrowserSessionHandle,
193 page_session: PageSessionHandle,
194 },
195 NavigatePage {
196 browser_session: BrowserSessionHandle,
197 page_session: PageSessionHandle,
198 url: String,
199 },
200 ClickElement {
201 browser_session: BrowserSessionHandle,
202 page_session: PageSessionHandle,
203 css_selector: String,
204 },
205 CountElements {
206 browser_session: BrowserSessionHandle,
207 page_session: PageSessionHandle,
208 css_selector: String,
209 },
210 HighlightElements {
211 browser_session: BrowserSessionHandle,
212 page_session: PageSessionHandle,
213 css_selector: String,
214 duration_ms: u64,
215 },
216 FocusElement {
217 browser_session: BrowserSessionHandle,
218 page_session: PageSessionHandle,
219 css_selector: String,
220 },
221 FillElement {
222 browser_session: BrowserSessionHandle,
223 page_session: PageSessionHandle,
224 css_selector: String,
225 value: String,
226 },
227 HoverElement {
228 browser_session: BrowserSessionHandle,
229 page_session: PageSessionHandle,
230 css_selector: String,
231 },
232 PressKey {
233 browser_session: BrowserSessionHandle,
234 page_session: PageSessionHandle,
235 css_selector: String,
236 key: String,
237 text: Option<String>,
238 },
239 GetTextContent {
240 browser_session: BrowserSessionHandle,
241 page_session: PageSessionHandle,
242 css_selector: String,
243 },
244 GetInnerText {
245 browser_session: BrowserSessionHandle,
246 page_session: PageSessionHandle,
247 css_selector: String,
248 },
249 WaitForSelector {
250 browser_session: BrowserSessionHandle,
251 page_session: PageSessionHandle,
252 css_selector: String,
253 visible: bool,
254 },
255 Screenshot {
256 browser_session: BrowserSessionHandle,
257 page_session: PageSessionHandle,
258 full_page: bool,
259 },
260 OpenChromeWindow {
261 chrome_binary: Option<String>,
262 },
263 DiscoverInitialTab {
264 cdp_websocket_url: String,
265 },
266 OpenChromeTab {
267 cdp_websocket_url: String,
268 },
269 CloseBrowserProcess {
270 process_id: u32,
271 },
272 CloseChromeTab {
273 cdp_websocket_url: String,
274 target_id: String,
275 },
276 NavigateChromeTab {
277 cdp_websocket_url: String,
278 target_id: String,
279 url: String,
280 },
281 InjectChromiumBidiMapper {
282 cdp_websocket_url: String,
283 },
284 ResolveBidiContextForTab {
285 cdp_websocket_url: String,
286 mapper_target_id: Option<String>,
287 browsing_context_id: Option<String>,
288 url: Option<String>,
289 },
290 ClickElementViaCdp {
291 cdp_websocket_url: String,
292 target_id: String,
293 css_selector: String,
294 },
295 CountElementsViaCdp {
296 cdp_websocket_url: String,
297 target_id: String,
298 css_selector: String,
299 },
300 HighlightElementsViaCdp {
301 cdp_websocket_url: String,
302 target_id: String,
303 css_selector: String,
304 duration_ms: u64,
305 },
306 FocusElementViaCdp {
307 cdp_websocket_url: String,
308 target_id: String,
309 css_selector: String,
310 },
311 FillElementViaCdp {
312 cdp_websocket_url: String,
313 target_id: String,
314 css_selector: String,
315 value: String,
316 },
317 HoverElementViaCdp {
318 cdp_websocket_url: String,
319 target_id: String,
320 css_selector: String,
321 },
322 PressKeyViaCdp {
323 cdp_websocket_url: String,
324 target_id: String,
325 css_selector: String,
326 key: String,
327 text: Option<String>,
328 },
329 GetTextContentViaCdp {
330 cdp_websocket_url: String,
331 target_id: String,
332 css_selector: String,
333 },
334 GetInnerTextViaCdp {
335 cdp_websocket_url: String,
336 target_id: String,
337 css_selector: String,
338 },
339 WaitForSelectorViaCdp {
340 cdp_websocket_url: String,
341 target_id: String,
342 css_selector: String,
343 visible: bool,
344 },
345 ScreenshotViaCdp {
346 cdp_websocket_url: String,
347 target_id: String,
348 },
349}
350
351#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
352#[serde(tag = "result", rename_all = "snake_case")]
353pub enum PluginResult {
354 LaunchBrowser(BrowserLaunchInfo),
355 OpenPage(PageInfo),
356 ClosePage,
357 NavigatePage(TabNavigationInfo),
358 ClickElement(ClickInfo),
359 CountElements(ElementCountInfo),
360 HighlightElements(HighlightElementsInfo),
361 FocusElement(FocusInfo),
362 FillElement(FillInfo),
363 HoverElement(HoverInfo),
364 PressKey(PressKeyInfo),
365 GetTextContent(TextInfo),
366 GetInnerText(TextInfo),
367 WaitForSelector(WaitForSelectorInfo),
368 Screenshot(ScreenshotInfo),
369 OpenChromeWindow(ChromeLaunchInfo),
370 DiscoverInitialTab(ChromeTabInfo),
371 OpenChromeTab(ChromeTabInfo),
372 CloseBrowserProcess,
373 CloseChromeTab,
374 NavigateChromeTab(TabNavigationInfo),
375 InjectChromiumBidiMapper(ChromiumBidiMapperInfo),
376 ResolveBidiContextForTab {
377 browsing_context_id: String,
378 mapper: ChromiumBidiMapperInfo,
379 },
380 ClickElementViaCdp(ClickInfo),
381 CountElementsViaCdp(ElementCountInfo),
382 HighlightElementsViaCdp(HighlightElementsInfo),
383 FocusElementViaCdp(FocusInfo),
384 FillElementViaCdp(FillInfo),
385 HoverElementViaCdp(HoverInfo),
386 PressKeyViaCdp(PressKeyInfo),
387 GetTextContentViaCdp(TextInfo),
388 GetInnerTextViaCdp(TextInfo),
389 WaitForSelectorViaCdp(WaitForSelectorInfo),
390 ScreenshotViaCdp(ScreenshotInfo),
391}
392
393#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
394pub struct PluginEnvelope {
395 pub ok: bool,
396 pub result: Option<PluginResult>,
397 pub error: Option<String>,
398}