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