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 enum HookType {
108 NewPage,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
112pub struct HookRegistration {
113 pub opaque_state: String,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
117#[serde(tag = "hook_type", content = "result", rename_all = "snake_case")]
118pub enum HookResult {
119 NewPage(PageInfo),
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
123pub struct AutomationSessionInfo {
124 pub bidi_session_id: String,
125 pub note: String,
126 pub mapper_target_id: Option<String>,
127 pub mapper_session_id: Option<String>,
128 pub package_version: Option<String>,
129}
130
131#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
132pub struct ClickInfo {
133 pub css_selector: String,
134 pub note: String,
135 pub bidi_session_id: String,
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
139pub struct ElementCountInfo {
140 pub css_selector: String,
141 pub count: u32,
142 pub note: String,
143}
144
145#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
146pub struct HighlightElementsInfo {
147 pub css_selector: String,
148 pub count: u32,
149 pub note: String,
150}
151
152#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
153pub struct FocusInfo {
154 pub css_selector: String,
155 pub note: String,
156}
157
158#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
159pub struct FillInfo {
160 pub css_selector: String,
161 pub value: String,
162 pub note: String,
163}
164
165#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
166pub struct HoverInfo {
167 pub css_selector: String,
168 pub note: String,
169}
170
171#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
172pub struct PressKeyInfo {
173 pub css_selector: String,
174 pub key: String,
175 pub note: String,
176}
177
178#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
179pub struct TextInfo {
180 pub css_selector: String,
181 pub text: String,
182 pub note: String,
183}
184
185#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
186pub struct WaitForSelectorInfo {
187 pub css_selector: String,
188 pub visible: bool,
189 pub note: String,
190}
191
192#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
193pub struct AccessibilitySnapshotInfo {
194 pub snapshot: String,
195 pub format: String,
196}
197
198#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
199pub struct ScreenshotInfo {
200 pub png_data: Vec<u8>,
201 pub note: String,
202}
203
204#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
205#[serde(tag = "command", rename_all = "snake_case")]
206pub enum PluginCommand {
207 LaunchBrowser {
208 browser_kind: BrowserKind,
209 browser_binary: Option<String>,
210 },
211 OpenPage {
212 browser_session: BrowserSessionHandle,
213 },
214 RegisterHook {
215 browser_session: BrowserSessionHandle,
216 hook_type: HookType,
217 },
218 PollHook {
219 browser_session: BrowserSessionHandle,
220 registration: HookRegistration,
221 },
222 ClosePage {
223 browser_session: BrowserSessionHandle,
224 page_session: PageSessionHandle,
225 },
226 NavigatePage {
227 browser_session: BrowserSessionHandle,
228 page_session: PageSessionHandle,
229 url: String,
230 },
231 ClickElement {
232 browser_session: BrowserSessionHandle,
233 page_session: PageSessionHandle,
234 css_selector: String,
235 },
236 CountElements {
237 browser_session: BrowserSessionHandle,
238 page_session: PageSessionHandle,
239 css_selector: String,
240 },
241 HighlightElements {
242 browser_session: BrowserSessionHandle,
243 page_session: PageSessionHandle,
244 css_selector: String,
245 duration_ms: u64,
246 },
247 FocusElement {
248 browser_session: BrowserSessionHandle,
249 page_session: PageSessionHandle,
250 css_selector: String,
251 },
252 FillElement {
253 browser_session: BrowserSessionHandle,
254 page_session: PageSessionHandle,
255 css_selector: String,
256 value: String,
257 },
258 HoverElement {
259 browser_session: BrowserSessionHandle,
260 page_session: PageSessionHandle,
261 css_selector: String,
262 },
263 PressKey {
264 browser_session: BrowserSessionHandle,
265 page_session: PageSessionHandle,
266 css_selector: String,
267 key: String,
268 text: Option<String>,
269 },
270 GetTextContent {
271 browser_session: BrowserSessionHandle,
272 page_session: PageSessionHandle,
273 css_selector: String,
274 },
275 GetInnerText {
276 browser_session: BrowserSessionHandle,
277 page_session: PageSessionHandle,
278 css_selector: String,
279 },
280 WaitForSelector {
281 browser_session: BrowserSessionHandle,
282 page_session: PageSessionHandle,
283 css_selector: String,
284 visible: bool,
285 },
286 AccessibilitySnapshot {
287 browser_session: BrowserSessionHandle,
288 page_session: PageSessionHandle,
289 format: String,
290 #[serde(default)]
291 mode: String,
292 },
293 Screenshot {
294 browser_session: BrowserSessionHandle,
295 page_session: PageSessionHandle,
296 full_page: bool,
297 },
298 OpenChromeWindow {
299 chrome_binary: Option<String>,
300 },
301 DiscoverInitialTab {
302 cdp_websocket_url: String,
303 },
304 OpenChromeTab {
305 cdp_websocket_url: String,
306 },
307 CloseBrowserProcess {
308 process_id: u32,
309 },
310 CloseChromeTab {
311 cdp_websocket_url: String,
312 target_id: String,
313 },
314 NavigateChromeTab {
315 cdp_websocket_url: String,
316 target_id: String,
317 url: String,
318 },
319 InjectChromiumBidiMapper {
320 cdp_websocket_url: String,
321 },
322 ResolveBidiContextForTab {
323 cdp_websocket_url: String,
324 mapper_target_id: Option<String>,
325 browsing_context_id: Option<String>,
326 url: Option<String>,
327 },
328 ClickElementViaCdp {
329 cdp_websocket_url: String,
330 target_id: String,
331 css_selector: String,
332 },
333 CountElementsViaCdp {
334 cdp_websocket_url: String,
335 target_id: String,
336 css_selector: String,
337 },
338 HighlightElementsViaCdp {
339 cdp_websocket_url: String,
340 target_id: String,
341 css_selector: String,
342 duration_ms: u64,
343 },
344 FocusElementViaCdp {
345 cdp_websocket_url: String,
346 target_id: String,
347 css_selector: String,
348 },
349 FillElementViaCdp {
350 cdp_websocket_url: String,
351 target_id: String,
352 css_selector: String,
353 value: String,
354 },
355 HoverElementViaCdp {
356 cdp_websocket_url: String,
357 target_id: String,
358 css_selector: String,
359 },
360 PressKeyViaCdp {
361 cdp_websocket_url: String,
362 target_id: String,
363 css_selector: String,
364 key: String,
365 text: Option<String>,
366 },
367 GetTextContentViaCdp {
368 cdp_websocket_url: String,
369 target_id: String,
370 css_selector: String,
371 },
372 GetInnerTextViaCdp {
373 cdp_websocket_url: String,
374 target_id: String,
375 css_selector: String,
376 },
377 WaitForSelectorViaCdp {
378 cdp_websocket_url: String,
379 target_id: String,
380 css_selector: String,
381 visible: bool,
382 },
383 ScreenshotViaCdp {
384 cdp_websocket_url: String,
385 target_id: String,
386 },
387}
388
389#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
390#[serde(tag = "result", rename_all = "snake_case")]
391pub enum PluginResult {
392 LaunchBrowser(BrowserLaunchInfo),
393 OpenPage(PageInfo),
394 RegisterHook(HookRegistration),
395 PollHook(HookResult),
396 ClosePage,
397 NavigatePage(TabNavigationInfo),
398 ClickElement(ClickInfo),
399 CountElements(ElementCountInfo),
400 HighlightElements(HighlightElementsInfo),
401 FocusElement(FocusInfo),
402 FillElement(FillInfo),
403 HoverElement(HoverInfo),
404 PressKey(PressKeyInfo),
405 GetTextContent(TextInfo),
406 GetInnerText(TextInfo),
407 WaitForSelector(WaitForSelectorInfo),
408 AccessibilitySnapshot(AccessibilitySnapshotInfo),
409 Screenshot(ScreenshotInfo),
410 OpenChromeWindow(ChromeLaunchInfo),
411 DiscoverInitialTab(ChromeTabInfo),
412 OpenChromeTab(ChromeTabInfo),
413 CloseBrowserProcess,
414 CloseChromeTab,
415 NavigateChromeTab(TabNavigationInfo),
416 InjectChromiumBidiMapper(ChromiumBidiMapperInfo),
417 ResolveBidiContextForTab {
418 browsing_context_id: String,
419 mapper: ChromiumBidiMapperInfo,
420 },
421 ClickElementViaCdp(ClickInfo),
422 CountElementsViaCdp(ElementCountInfo),
423 HighlightElementsViaCdp(HighlightElementsInfo),
424 FocusElementViaCdp(FocusInfo),
425 FillElementViaCdp(FillInfo),
426 HoverElementViaCdp(HoverInfo),
427 PressKeyViaCdp(PressKeyInfo),
428 GetTextContentViaCdp(TextInfo),
429 GetInnerTextViaCdp(TextInfo),
430 WaitForSelectorViaCdp(WaitForSelectorInfo),
431 ScreenshotViaCdp(ScreenshotInfo),
432}
433
434#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
435pub struct PluginEnvelope {
436 pub ok: bool,
437 pub result: Option<PluginResult>,
438 pub error: Option<String>,
439}