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