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 AccessibilitySnapshotInfo {
177 pub snapshot: String,
178 pub format: String,
179}
180
181#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
182pub struct ScreenshotInfo {
183 pub png_data: Vec<u8>,
184 pub note: String,
185}
186
187#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
188#[serde(tag = "command", rename_all = "snake_case")]
189pub enum PluginCommand {
190 LaunchBrowser {
191 browser_kind: BrowserKind,
192 browser_binary: Option<String>,
193 },
194 OpenPage {
195 browser_session: BrowserSessionHandle,
196 },
197 ClosePage {
198 browser_session: BrowserSessionHandle,
199 page_session: PageSessionHandle,
200 },
201 NavigatePage {
202 browser_session: BrowserSessionHandle,
203 page_session: PageSessionHandle,
204 url: String,
205 },
206 ClickElement {
207 browser_session: BrowserSessionHandle,
208 page_session: PageSessionHandle,
209 css_selector: String,
210 },
211 CountElements {
212 browser_session: BrowserSessionHandle,
213 page_session: PageSessionHandle,
214 css_selector: String,
215 },
216 HighlightElements {
217 browser_session: BrowserSessionHandle,
218 page_session: PageSessionHandle,
219 css_selector: String,
220 duration_ms: u64,
221 },
222 FocusElement {
223 browser_session: BrowserSessionHandle,
224 page_session: PageSessionHandle,
225 css_selector: String,
226 },
227 FillElement {
228 browser_session: BrowserSessionHandle,
229 page_session: PageSessionHandle,
230 css_selector: String,
231 value: String,
232 },
233 HoverElement {
234 browser_session: BrowserSessionHandle,
235 page_session: PageSessionHandle,
236 css_selector: String,
237 },
238 PressKey {
239 browser_session: BrowserSessionHandle,
240 page_session: PageSessionHandle,
241 css_selector: String,
242 key: String,
243 text: Option<String>,
244 },
245 GetTextContent {
246 browser_session: BrowserSessionHandle,
247 page_session: PageSessionHandle,
248 css_selector: String,
249 },
250 GetInnerText {
251 browser_session: BrowserSessionHandle,
252 page_session: PageSessionHandle,
253 css_selector: String,
254 },
255 WaitForSelector {
256 browser_session: BrowserSessionHandle,
257 page_session: PageSessionHandle,
258 css_selector: String,
259 visible: bool,
260 },
261 AccessibilitySnapshot {
262 browser_session: BrowserSessionHandle,
263 page_session: PageSessionHandle,
264 format: String,
265 #[serde(default)]
266 mode: String,
267 },
268 Screenshot {
269 browser_session: BrowserSessionHandle,
270 page_session: PageSessionHandle,
271 full_page: bool,
272 },
273 OpenChromeWindow {
274 chrome_binary: Option<String>,
275 },
276 DiscoverInitialTab {
277 cdp_websocket_url: String,
278 },
279 OpenChromeTab {
280 cdp_websocket_url: String,
281 },
282 CloseBrowserProcess {
283 process_id: u32,
284 },
285 CloseChromeTab {
286 cdp_websocket_url: String,
287 target_id: String,
288 },
289 NavigateChromeTab {
290 cdp_websocket_url: String,
291 target_id: String,
292 url: String,
293 },
294 InjectChromiumBidiMapper {
295 cdp_websocket_url: String,
296 },
297 ResolveBidiContextForTab {
298 cdp_websocket_url: String,
299 mapper_target_id: Option<String>,
300 browsing_context_id: Option<String>,
301 url: Option<String>,
302 },
303 ClickElementViaCdp {
304 cdp_websocket_url: String,
305 target_id: String,
306 css_selector: String,
307 },
308 CountElementsViaCdp {
309 cdp_websocket_url: String,
310 target_id: String,
311 css_selector: String,
312 },
313 HighlightElementsViaCdp {
314 cdp_websocket_url: String,
315 target_id: String,
316 css_selector: String,
317 duration_ms: u64,
318 },
319 FocusElementViaCdp {
320 cdp_websocket_url: String,
321 target_id: String,
322 css_selector: String,
323 },
324 FillElementViaCdp {
325 cdp_websocket_url: String,
326 target_id: String,
327 css_selector: String,
328 value: String,
329 },
330 HoverElementViaCdp {
331 cdp_websocket_url: String,
332 target_id: String,
333 css_selector: String,
334 },
335 PressKeyViaCdp {
336 cdp_websocket_url: String,
337 target_id: String,
338 css_selector: String,
339 key: String,
340 text: Option<String>,
341 },
342 GetTextContentViaCdp {
343 cdp_websocket_url: String,
344 target_id: String,
345 css_selector: String,
346 },
347 GetInnerTextViaCdp {
348 cdp_websocket_url: String,
349 target_id: String,
350 css_selector: String,
351 },
352 WaitForSelectorViaCdp {
353 cdp_websocket_url: String,
354 target_id: String,
355 css_selector: String,
356 visible: bool,
357 },
358 ScreenshotViaCdp {
359 cdp_websocket_url: String,
360 target_id: String,
361 },
362}
363
364#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
365#[serde(tag = "result", rename_all = "snake_case")]
366pub enum PluginResult {
367 LaunchBrowser(BrowserLaunchInfo),
368 OpenPage(PageInfo),
369 ClosePage,
370 NavigatePage(TabNavigationInfo),
371 ClickElement(ClickInfo),
372 CountElements(ElementCountInfo),
373 HighlightElements(HighlightElementsInfo),
374 FocusElement(FocusInfo),
375 FillElement(FillInfo),
376 HoverElement(HoverInfo),
377 PressKey(PressKeyInfo),
378 GetTextContent(TextInfo),
379 GetInnerText(TextInfo),
380 WaitForSelector(WaitForSelectorInfo),
381 AccessibilitySnapshot(AccessibilitySnapshotInfo),
382 Screenshot(ScreenshotInfo),
383 OpenChromeWindow(ChromeLaunchInfo),
384 DiscoverInitialTab(ChromeTabInfo),
385 OpenChromeTab(ChromeTabInfo),
386 CloseBrowserProcess,
387 CloseChromeTab,
388 NavigateChromeTab(TabNavigationInfo),
389 InjectChromiumBidiMapper(ChromiumBidiMapperInfo),
390 ResolveBidiContextForTab {
391 browsing_context_id: String,
392 mapper: ChromiumBidiMapperInfo,
393 },
394 ClickElementViaCdp(ClickInfo),
395 CountElementsViaCdp(ElementCountInfo),
396 HighlightElementsViaCdp(HighlightElementsInfo),
397 FocusElementViaCdp(FocusInfo),
398 FillElementViaCdp(FillInfo),
399 HoverElementViaCdp(HoverInfo),
400 PressKeyViaCdp(PressKeyInfo),
401 GetTextContentViaCdp(TextInfo),
402 GetInnerTextViaCdp(TextInfo),
403 WaitForSelectorViaCdp(WaitForSelectorInfo),
404 ScreenshotViaCdp(ScreenshotInfo),
405}
406
407#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
408pub struct PluginEnvelope {
409 pub ok: bool,
410 pub result: Option<PluginResult>,
411 pub error: Option<String>,
412}