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)]
174#[serde(tag = "command", rename_all = "snake_case")]
175pub enum PluginCommand {
176 LaunchBrowser {
177 browser_kind: BrowserKind,
178 browser_binary: Option<String>,
179 },
180 OpenPage {
181 browser_session: BrowserSessionHandle,
182 },
183 ClosePage {
184 browser_session: BrowserSessionHandle,
185 page_session: PageSessionHandle,
186 },
187 NavigatePage {
188 browser_session: BrowserSessionHandle,
189 page_session: PageSessionHandle,
190 url: String,
191 },
192 ClickElement {
193 browser_session: BrowserSessionHandle,
194 page_session: PageSessionHandle,
195 css_selector: String,
196 },
197 CountElements {
198 browser_session: BrowserSessionHandle,
199 page_session: PageSessionHandle,
200 css_selector: String,
201 },
202 HighlightElements {
203 browser_session: BrowserSessionHandle,
204 page_session: PageSessionHandle,
205 css_selector: String,
206 duration_ms: u64,
207 },
208 FocusElement {
209 browser_session: BrowserSessionHandle,
210 page_session: PageSessionHandle,
211 css_selector: String,
212 },
213 FillElement {
214 browser_session: BrowserSessionHandle,
215 page_session: PageSessionHandle,
216 css_selector: String,
217 value: String,
218 },
219 HoverElement {
220 browser_session: BrowserSessionHandle,
221 page_session: PageSessionHandle,
222 css_selector: String,
223 },
224 PressKey {
225 browser_session: BrowserSessionHandle,
226 page_session: PageSessionHandle,
227 css_selector: String,
228 key: String,
229 text: Option<String>,
230 },
231 GetTextContent {
232 browser_session: BrowserSessionHandle,
233 page_session: PageSessionHandle,
234 css_selector: String,
235 },
236 GetInnerText {
237 browser_session: BrowserSessionHandle,
238 page_session: PageSessionHandle,
239 css_selector: String,
240 },
241 WaitForSelector {
242 browser_session: BrowserSessionHandle,
243 page_session: PageSessionHandle,
244 css_selector: String,
245 visible: bool,
246 },
247 OpenChromeWindow {
248 chrome_binary: Option<String>,
249 },
250 DiscoverInitialTab {
251 cdp_websocket_url: String,
252 },
253 OpenChromeTab {
254 cdp_websocket_url: String,
255 },
256 CloseBrowserProcess {
257 process_id: u32,
258 },
259 CloseChromeTab {
260 cdp_websocket_url: String,
261 target_id: String,
262 },
263 NavigateChromeTab {
264 cdp_websocket_url: String,
265 target_id: String,
266 url: String,
267 },
268 InjectChromiumBidiMapper {
269 cdp_websocket_url: String,
270 },
271 ResolveBidiContextForTab {
272 cdp_websocket_url: String,
273 mapper_target_id: Option<String>,
274 browsing_context_id: Option<String>,
275 url: Option<String>,
276 },
277 ClickElementViaCdp {
278 cdp_websocket_url: String,
279 target_id: String,
280 css_selector: String,
281 },
282 CountElementsViaCdp {
283 cdp_websocket_url: String,
284 target_id: String,
285 css_selector: String,
286 },
287 HighlightElementsViaCdp {
288 cdp_websocket_url: String,
289 target_id: String,
290 css_selector: String,
291 duration_ms: u64,
292 },
293 FocusElementViaCdp {
294 cdp_websocket_url: String,
295 target_id: String,
296 css_selector: String,
297 },
298 FillElementViaCdp {
299 cdp_websocket_url: String,
300 target_id: String,
301 css_selector: String,
302 value: String,
303 },
304 HoverElementViaCdp {
305 cdp_websocket_url: String,
306 target_id: String,
307 css_selector: String,
308 },
309 PressKeyViaCdp {
310 cdp_websocket_url: String,
311 target_id: String,
312 css_selector: String,
313 key: String,
314 text: Option<String>,
315 },
316 GetTextContentViaCdp {
317 cdp_websocket_url: String,
318 target_id: String,
319 css_selector: String,
320 },
321 GetInnerTextViaCdp {
322 cdp_websocket_url: String,
323 target_id: String,
324 css_selector: String,
325 },
326 WaitForSelectorViaCdp {
327 cdp_websocket_url: String,
328 target_id: String,
329 css_selector: String,
330 visible: bool,
331 },
332}
333
334#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
335#[serde(tag = "result", rename_all = "snake_case")]
336pub enum PluginResult {
337 LaunchBrowser(BrowserLaunchInfo),
338 OpenPage(PageInfo),
339 ClosePage,
340 NavigatePage(TabNavigationInfo),
341 ClickElement(ClickInfo),
342 CountElements(ElementCountInfo),
343 HighlightElements(HighlightElementsInfo),
344 FocusElement(FocusInfo),
345 FillElement(FillInfo),
346 HoverElement(HoverInfo),
347 PressKey(PressKeyInfo),
348 GetTextContent(TextInfo),
349 GetInnerText(TextInfo),
350 WaitForSelector(WaitForSelectorInfo),
351 OpenChromeWindow(ChromeLaunchInfo),
352 DiscoverInitialTab(ChromeTabInfo),
353 OpenChromeTab(ChromeTabInfo),
354 CloseBrowserProcess,
355 CloseChromeTab,
356 NavigateChromeTab(TabNavigationInfo),
357 InjectChromiumBidiMapper(ChromiumBidiMapperInfo),
358 ResolveBidiContextForTab {
359 browsing_context_id: String,
360 mapper: ChromiumBidiMapperInfo,
361 },
362 ClickElementViaCdp(ClickInfo),
363 CountElementsViaCdp(ElementCountInfo),
364 HighlightElementsViaCdp(HighlightElementsInfo),
365 FocusElementViaCdp(FocusInfo),
366 FillElementViaCdp(FillInfo),
367 HoverElementViaCdp(HoverInfo),
368 PressKeyViaCdp(PressKeyInfo),
369 GetTextContentViaCdp(TextInfo),
370 GetInnerTextViaCdp(TextInfo),
371 WaitForSelectorViaCdp(WaitForSelectorInfo),
372}
373
374#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
375pub struct PluginEnvelope {
376 pub ok: bool,
377 pub result: Option<PluginResult>,
378 pub error: Option<String>,
379}