webdriver/
httpapi.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5use http::Method;
6use serde_json::Value;
7
8use crate::command::{VoidWebDriverExtensionCommand, WebDriverCommand, WebDriverExtensionCommand};
9use crate::error::WebDriverResult;
10use crate::Parameters;
11
12pub fn standard_routes<U: WebDriverExtensionRoute>() -> Vec<(Method, &'static str, Route<U>)> {
13    vec![
14        (Method::POST, "/session", Route::NewSession),
15        (Method::DELETE, "/session/{sessionId}", Route::DeleteSession),
16        (Method::POST, "/session/{sessionId}/url", Route::Get),
17        (
18            Method::GET,
19            "/session/{sessionId}/url",
20            Route::GetCurrentUrl,
21        ),
22        (Method::POST, "/session/{sessionId}/back", Route::GoBack),
23        (
24            Method::POST,
25            "/session/{sessionId}/forward",
26            Route::GoForward,
27        ),
28        (Method::POST, "/session/{sessionId}/refresh", Route::Refresh),
29        (Method::GET, "/session/{sessionId}/title", Route::GetTitle),
30        (
31            Method::GET,
32            "/session/{sessionId}/source",
33            Route::GetPageSource,
34        ),
35        (
36            Method::GET,
37            "/session/{sessionId}/window",
38            Route::GetWindowHandle,
39        ),
40        (
41            Method::GET,
42            "/session/{sessionId}/window/handles",
43            Route::GetWindowHandles,
44        ),
45        (
46            Method::POST,
47            "/session/{sessionId}/window/new",
48            Route::NewWindow,
49        ),
50        (
51            Method::DELETE,
52            "/session/{sessionId}/window",
53            Route::CloseWindow,
54        ),
55        (
56            Method::GET,
57            "/session/{sessionId}/window/size",
58            Route::GetWindowSize,
59        ),
60        (
61            Method::POST,
62            "/session/{sessionId}/window/size",
63            Route::SetWindowSize,
64        ),
65        (
66            Method::GET,
67            "/session/{sessionId}/window/position",
68            Route::GetWindowPosition,
69        ),
70        (
71            Method::POST,
72            "/session/{sessionId}/window/position",
73            Route::SetWindowPosition,
74        ),
75        (
76            Method::GET,
77            "/session/{sessionId}/window/rect",
78            Route::GetWindowRect,
79        ),
80        (
81            Method::POST,
82            "/session/{sessionId}/window/rect",
83            Route::SetWindowRect,
84        ),
85        (
86            Method::POST,
87            "/session/{sessionId}/window/minimize",
88            Route::MinimizeWindow,
89        ),
90        (
91            Method::POST,
92            "/session/{sessionId}/window/maximize",
93            Route::MaximizeWindow,
94        ),
95        (
96            Method::POST,
97            "/session/{sessionId}/window/fullscreen",
98            Route::FullscreenWindow,
99        ),
100        (
101            Method::POST,
102            "/session/{sessionId}/window",
103            Route::SwitchToWindow,
104        ),
105        (
106            Method::POST,
107            "/session/{sessionId}/frame",
108            Route::SwitchToFrame,
109        ),
110        (
111            Method::POST,
112            "/session/{sessionId}/frame/parent",
113            Route::SwitchToParentFrame,
114        ),
115        (
116            Method::POST,
117            "/session/{sessionId}/element",
118            Route::FindElement,
119        ),
120        (
121            Method::POST,
122            "/session/{sessionId}/element/{elementId}/element",
123            Route::FindElementElement,
124        ),
125        (
126            Method::POST,
127            "/session/{sessionId}/elements",
128            Route::FindElements,
129        ),
130        (
131            Method::POST,
132            "/session/{sessionId}/element/{elementId}/elements",
133            Route::FindElementElements,
134        ),
135        (
136            Method::POST,
137            "/session/{sessionId}/shadow/{shadowId}/element",
138            Route::FindShadowRootElement,
139        ),
140        (
141            Method::POST,
142            "/session/{sessionId}/shadow/{shadowId}/elements",
143            Route::FindShadowRootElements,
144        ),
145        (
146            Method::GET,
147            "/session/{sessionId}/element/active",
148            Route::GetActiveElement,
149        ),
150        (
151            Method::GET,
152            "/session/{sessionId}/element/{elementId}/shadow",
153            Route::GetShadowRoot,
154        ),
155        (
156            Method::GET,
157            "/session/{sessionId}/element/{elementId}/displayed",
158            Route::IsDisplayed,
159        ),
160        (
161            Method::GET,
162            "/session/{sessionId}/element/{elementId}/selected",
163            Route::IsSelected,
164        ),
165        (
166            Method::GET,
167            "/session/{sessionId}/element/{elementId}/attribute/{name}",
168            Route::GetElementAttribute,
169        ),
170        (
171            Method::GET,
172            "/session/{sessionId}/element/{elementId}/property/{name}",
173            Route::GetElementProperty,
174        ),
175        (
176            Method::GET,
177            "/session/{sessionId}/element/{elementId}/css/{propertyName}",
178            Route::GetCSSValue,
179        ),
180        (
181            Method::GET,
182            "/session/{sessionId}/element/{elementId}/text",
183            Route::GetElementText,
184        ),
185        (
186            Method::GET,
187            "/session/{sessionId}/element/{elementId}/computedlabel",
188            Route::GetComputedLabel,
189        ),
190        (
191            Method::GET,
192            "/session/{sessionId}/element/{elementId}/computedrole",
193            Route::GetComputedRole,
194        ),
195        (
196            Method::GET,
197            "/session/{sessionId}/element/{elementId}/name",
198            Route::GetElementTagName,
199        ),
200        (
201            Method::GET,
202            "/session/{sessionId}/element/{elementId}/rect",
203            Route::GetElementRect,
204        ),
205        (
206            Method::GET,
207            "/session/{sessionId}/element/{elementId}/enabled",
208            Route::IsEnabled,
209        ),
210        (
211            Method::POST,
212            "/session/{sessionId}/execute/sync",
213            Route::ExecuteScript,
214        ),
215        (
216            Method::POST,
217            "/session/{sessionId}/execute/async",
218            Route::ExecuteAsyncScript,
219        ),
220        (
221            Method::GET,
222            "/session/{sessionId}/cookie",
223            Route::GetCookies,
224        ),
225        (
226            Method::GET,
227            "/session/{sessionId}/cookie/{name}",
228            Route::GetNamedCookie,
229        ),
230        (
231            Method::POST,
232            "/session/{sessionId}/cookie",
233            Route::AddCookie,
234        ),
235        (
236            Method::DELETE,
237            "/session/{sessionId}/cookie",
238            Route::DeleteCookies,
239        ),
240        (
241            Method::DELETE,
242            "/session/{sessionId}/cookie/{name}",
243            Route::DeleteCookie,
244        ),
245        (
246            Method::GET,
247            "/session/{sessionId}/timeouts",
248            Route::GetTimeouts,
249        ),
250        (
251            Method::POST,
252            "/session/{sessionId}/timeouts",
253            Route::SetTimeouts,
254        ),
255        (
256            Method::POST,
257            "/session/{sessionId}/element/{elementId}/click",
258            Route::ElementClick,
259        ),
260        (
261            Method::POST,
262            "/session/{sessionId}/element/{elementId}/clear",
263            Route::ElementClear,
264        ),
265        (
266            Method::POST,
267            "/session/{sessionId}/element/{elementId}/value",
268            Route::ElementSendKeys,
269        ),
270        (
271            Method::POST,
272            "/session/{sessionId}/alert/dismiss",
273            Route::DismissAlert,
274        ),
275        (
276            Method::POST,
277            "/session/{sessionId}/alert/accept",
278            Route::AcceptAlert,
279        ),
280        (
281            Method::GET,
282            "/session/{sessionId}/alert/text",
283            Route::GetAlertText,
284        ),
285        (
286            Method::POST,
287            "/session/{sessionId}/alert/text",
288            Route::SendAlertText,
289        ),
290        (
291            Method::GET,
292            "/session/{sessionId}/screenshot",
293            Route::TakeScreenshot,
294        ),
295        (
296            Method::GET,
297            "/session/{sessionId}/element/{elementId}/screenshot",
298            Route::TakeElementScreenshot,
299        ),
300        (
301            Method::POST,
302            "/session/{sessionId}/actions",
303            Route::PerformActions,
304        ),
305        (
306            Method::DELETE,
307            "/session/{sessionId}/actions",
308            Route::ReleaseActions,
309        ),
310        (Method::POST, "/session/{sessionId}/permissions", Route::SetPermission),
311        (Method::POST, "/session/{sessionId}/print", Route::Print),
312        (
313            Method::POST,
314            "/session/{sessionId}/webauthn/authenticator",
315            Route::WebAuthnAddVirtualAuthenticator,
316        ),
317        (
318            Method::DELETE,
319            "/session/{sessionId}/webauthn/authenticator/{authenticatorId}",
320            Route::WebAuthnRemoveVirtualAuthenticator,
321        ),
322        (
323            Method::POST,
324            "/session/{sessionId}/webauthn/authenticator/{authenticatorId}/credential",
325            Route::WebAuthnAddCredential,
326        ),
327        (
328            Method::GET,
329            "/session/{sessionId}/webauthn/authenticator/{authenticatorId}/credentials",
330            Route::WebAuthnGetCredentials,
331        ),
332        (
333            Method::DELETE,
334            "/session/{sessionId}/webauthn/authenticator/{authenticatorId}/credentials/{credentialId}",
335            Route::WebAuthnRemoveCredential,
336        ),
337        (
338            Method::DELETE,
339            "/session/{sessionId}/webauthn/authenticator/{authenticatorId}/credentials",
340            Route::WebAuthnRemoveAllCredentials,
341        ),
342        (
343            Method::POST,
344            "/session/{sessionId}/webauthn/authenticator/{authenticatorId}/uv",
345            Route::WebAuthnSetUserVerified,
346        ),
347        (Method::GET, "/status", Route::Status),
348    ]
349}
350
351#[derive(Clone, Copy, Debug)]
352pub enum Route<U: WebDriverExtensionRoute> {
353    NewSession,
354    DeleteSession,
355    Get,
356    GetCurrentUrl,
357    GoBack,
358    GoForward,
359    Refresh,
360    GetTitle,
361    GetPageSource,
362    GetWindowHandle,
363    GetWindowHandles,
364    NewWindow,
365    CloseWindow,
366    GetWindowSize,     // deprecated
367    SetWindowSize,     // deprecated
368    GetWindowPosition, // deprecated
369    SetWindowPosition, // deprecated
370    GetWindowRect,
371    SetWindowRect,
372    MinimizeWindow,
373    MaximizeWindow,
374    FullscreenWindow,
375    SwitchToWindow,
376    SwitchToFrame,
377    SwitchToParentFrame,
378    FindElement,
379    FindElements,
380    FindElementElement,
381    FindElementElements,
382    FindShadowRootElement,
383    FindShadowRootElements,
384    GetActiveElement,
385    GetShadowRoot,
386    IsDisplayed,
387    IsSelected,
388    GetElementAttribute,
389    GetElementProperty,
390    GetCSSValue,
391    GetElementText,
392    GetComputedLabel,
393    GetComputedRole,
394    GetElementTagName,
395    GetElementRect,
396    IsEnabled,
397    ExecuteScript,
398    ExecuteAsyncScript,
399    GetCookies,
400    GetNamedCookie,
401    AddCookie,
402    DeleteCookies,
403    DeleteCookie,
404    GetTimeouts,
405    SetTimeouts,
406    ElementClick,
407    ElementClear,
408    ElementSendKeys,
409    PerformActions,
410    ReleaseActions,
411    DismissAlert,
412    AcceptAlert,
413    GetAlertText,
414    SendAlertText,
415    TakeScreenshot,
416    TakeElementScreenshot,
417    Print,
418    SetPermission,
419    Status,
420    Extension(U),
421    WebAuthnAddVirtualAuthenticator,
422    WebAuthnRemoveVirtualAuthenticator,
423    WebAuthnAddCredential,
424    WebAuthnGetCredentials,
425    WebAuthnRemoveCredential,
426    WebAuthnRemoveAllCredentials,
427    WebAuthnSetUserVerified,
428}
429
430pub trait WebDriverExtensionRoute: Clone + Send + PartialEq {
431    type Command: WebDriverExtensionCommand + 'static;
432
433    fn command(
434        &self,
435        _: &Parameters,
436        _: &Value,
437    ) -> WebDriverResult<WebDriverCommand<Self::Command>>;
438}
439
440#[derive(Clone, Debug, PartialEq)]
441pub struct VoidWebDriverExtensionRoute;
442
443impl WebDriverExtensionRoute for VoidWebDriverExtensionRoute {
444    type Command = VoidWebDriverExtensionCommand;
445
446    fn command(
447        &self,
448        _: &Parameters,
449        _: &Value,
450    ) -> WebDriverResult<WebDriverCommand<VoidWebDriverExtensionCommand>> {
451        panic!("No extensions implemented");
452    }
453}