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 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}