Skip to main content

allwright_plugin_sdk/
lib.rs

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}