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 },
266 Screenshot {
267 browser_session: BrowserSessionHandle,
268 page_session: PageSessionHandle,
269 full_page: bool,
270 },
271 OpenChromeWindow {
272 chrome_binary: Option<String>,
273 },
274 DiscoverInitialTab {
275 cdp_websocket_url: String,
276 },
277 OpenChromeTab {
278 cdp_websocket_url: String,
279 },
280 CloseBrowserProcess {
281 process_id: u32,
282 },
283 CloseChromeTab {
284 cdp_websocket_url: String,
285 target_id: String,
286 },
287 NavigateChromeTab {
288 cdp_websocket_url: String,
289 target_id: String,
290 url: String,
291 },
292 InjectChromiumBidiMapper {
293 cdp_websocket_url: String,
294 },
295 ResolveBidiContextForTab {
296 cdp_websocket_url: String,
297 mapper_target_id: Option<String>,
298 browsing_context_id: Option<String>,
299 url: Option<String>,
300 },
301 ClickElementViaCdp {
302 cdp_websocket_url: String,
303 target_id: String,
304 css_selector: String,
305 },
306 CountElementsViaCdp {
307 cdp_websocket_url: String,
308 target_id: String,
309 css_selector: String,
310 },
311 HighlightElementsViaCdp {
312 cdp_websocket_url: String,
313 target_id: String,
314 css_selector: String,
315 duration_ms: u64,
316 },
317 FocusElementViaCdp {
318 cdp_websocket_url: String,
319 target_id: String,
320 css_selector: String,
321 },
322 FillElementViaCdp {
323 cdp_websocket_url: String,
324 target_id: String,
325 css_selector: String,
326 value: String,
327 },
328 HoverElementViaCdp {
329 cdp_websocket_url: String,
330 target_id: String,
331 css_selector: String,
332 },
333 PressKeyViaCdp {
334 cdp_websocket_url: String,
335 target_id: String,
336 css_selector: String,
337 key: String,
338 text: Option<String>,
339 },
340 GetTextContentViaCdp {
341 cdp_websocket_url: String,
342 target_id: String,
343 css_selector: String,
344 },
345 GetInnerTextViaCdp {
346 cdp_websocket_url: String,
347 target_id: String,
348 css_selector: String,
349 },
350 WaitForSelectorViaCdp {
351 cdp_websocket_url: String,
352 target_id: String,
353 css_selector: String,
354 visible: bool,
355 },
356 ScreenshotViaCdp {
357 cdp_websocket_url: String,
358 target_id: String,
359 },
360}
361
362#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
363#[serde(tag = "result", rename_all = "snake_case")]
364pub enum PluginResult {
365 LaunchBrowser(BrowserLaunchInfo),
366 OpenPage(PageInfo),
367 ClosePage,
368 NavigatePage(TabNavigationInfo),
369 ClickElement(ClickInfo),
370 CountElements(ElementCountInfo),
371 HighlightElements(HighlightElementsInfo),
372 FocusElement(FocusInfo),
373 FillElement(FillInfo),
374 HoverElement(HoverInfo),
375 PressKey(PressKeyInfo),
376 GetTextContent(TextInfo),
377 GetInnerText(TextInfo),
378 WaitForSelector(WaitForSelectorInfo),
379 AccessibilitySnapshot(AccessibilitySnapshotInfo),
380 Screenshot(ScreenshotInfo),
381 OpenChromeWindow(ChromeLaunchInfo),
382 DiscoverInitialTab(ChromeTabInfo),
383 OpenChromeTab(ChromeTabInfo),
384 CloseBrowserProcess,
385 CloseChromeTab,
386 NavigateChromeTab(TabNavigationInfo),
387 InjectChromiumBidiMapper(ChromiumBidiMapperInfo),
388 ResolveBidiContextForTab {
389 browsing_context_id: String,
390 mapper: ChromiumBidiMapperInfo,
391 },
392 ClickElementViaCdp(ClickInfo),
393 CountElementsViaCdp(ElementCountInfo),
394 HighlightElementsViaCdp(HighlightElementsInfo),
395 FocusElementViaCdp(FocusInfo),
396 FillElementViaCdp(FillInfo),
397 HoverElementViaCdp(HoverInfo),
398 PressKeyViaCdp(PressKeyInfo),
399 GetTextContentViaCdp(TextInfo),
400 GetInnerTextViaCdp(TextInfo),
401 WaitForSelectorViaCdp(WaitForSelectorInfo),
402 ScreenshotViaCdp(ScreenshotInfo),
403}
404
405#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
406pub struct PluginEnvelope {
407 pub ok: bool,
408 pub result: Option<PluginResult>,
409 pub error: Option<String>,
410}