Skip to main content

allwright_plugin_sdk/
lib.rs

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