Skip to main content

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}/privacy",
315            Route::GPCSetGlobalPrivacyControl,
316        ),
317        (
318            Method::GET,
319            "/session/{sessionId}/privacy",
320            Route::GPCGetGlobalPrivacyControl,
321        ),
322        (
323            Method::POST,
324            "/session/{sessionId}/webauthn/authenticator/{authenticatorId}/credential",
325            Route::WebAuthnAddCredential,
326        ),
327        (
328            Method::POST,
329            "/session/{sessionId}/webauthn/authenticator",
330            Route::WebAuthnAddVirtualAuthenticator,
331        ),
332        (
333            Method::GET,
334            "/session/{sessionId}/webauthn/authenticator/{authenticatorId}/credentials",
335            Route::WebAuthnGetCredentials,
336        ),
337        (
338            Method::DELETE,
339            "/session/{sessionId}/webauthn/authenticator/{authenticatorId}/credentials",
340            Route::WebAuthnRemoveAllCredentials,
341        ),
342        (
343            Method::DELETE,
344            "/session/{sessionId}/webauthn/authenticator/{authenticatorId}/credentials/{credentialId}",
345            Route::WebAuthnRemoveCredential,
346        ),
347        (
348            Method::DELETE,
349            "/session/{sessionId}/webauthn/authenticator/{authenticatorId}",
350            Route::WebAuthnRemoveVirtualAuthenticator,
351        ),
352        (
353            Method::POST,
354            "/session/{sessionId}/webauthn/authenticator/{authenticatorId}/uv",
355            Route::WebAuthnSetUserVerified,
356        ),
357        (Method::GET, "/status", Route::Status),
358    ]
359}
360
361#[derive(Clone, Copy, Debug)]
362pub enum Route<U: WebDriverExtensionRoute> {
363    NewSession,
364    DeleteSession,
365    Get,
366    GetCurrentUrl,
367    GoBack,
368    GoForward,
369    Refresh,
370    GetTitle,
371    GetPageSource,
372    GetWindowHandle,
373    GetWindowHandles,
374    NewWindow,
375    CloseWindow,
376    GetWindowSize,     // deprecated
377    SetWindowSize,     // deprecated
378    GetWindowPosition, // deprecated
379    SetWindowPosition, // deprecated
380    GetWindowRect,
381    SetWindowRect,
382    MinimizeWindow,
383    MaximizeWindow,
384    FullscreenWindow,
385    SwitchToWindow,
386    SwitchToFrame,
387    SwitchToParentFrame,
388    FindElement,
389    FindElements,
390    FindElementElement,
391    FindElementElements,
392    FindShadowRootElement,
393    FindShadowRootElements,
394    GetActiveElement,
395    GetShadowRoot,
396    IsDisplayed,
397    IsSelected,
398    GetElementAttribute,
399    GetElementProperty,
400    GetCSSValue,
401    GetElementText,
402    GetComputedLabel,
403    GetComputedRole,
404    GetElementTagName,
405    GetElementRect,
406    IsEnabled,
407    ExecuteScript,
408    ExecuteAsyncScript,
409    GetCookies,
410    GetNamedCookie,
411    AddCookie,
412    DeleteCookies,
413    DeleteCookie,
414    GetTimeouts,
415    SetTimeouts,
416    ElementClick,
417    ElementClear,
418    ElementSendKeys,
419    PerformActions,
420    ReleaseActions,
421    DismissAlert,
422    AcceptAlert,
423    GetAlertText,
424    SendAlertText,
425    TakeScreenshot,
426    TakeElementScreenshot,
427    Print,
428    SetPermission,
429    Status,
430    Extension(U),
431    GPCGetGlobalPrivacyControl,
432    GPCSetGlobalPrivacyControl,
433    WebAuthnAddCredential,
434    WebAuthnAddVirtualAuthenticator,
435    WebAuthnGetCredentials,
436    WebAuthnRemoveAllCredentials,
437    WebAuthnRemoveCredential,
438    WebAuthnRemoveVirtualAuthenticator,
439    WebAuthnSetUserVerified,
440}
441
442pub trait WebDriverExtensionRoute: Clone + Send + PartialEq {
443    type Command: WebDriverExtensionCommand + 'static;
444
445    fn command(
446        &self,
447        _: &Parameters,
448        _: &Value,
449    ) -> WebDriverResult<WebDriverCommand<Self::Command>>;
450}
451
452#[derive(Clone, Debug, PartialEq)]
453pub struct VoidWebDriverExtensionRoute;
454
455impl WebDriverExtensionRoute for VoidWebDriverExtensionRoute {
456    type Command = VoidWebDriverExtensionCommand;
457
458    fn command(
459        &self,
460        _: &Parameters,
461        _: &Value,
462    ) -> WebDriverResult<WebDriverCommand<VoidWebDriverExtensionCommand>> {
463        panic!("No extensions implemented");
464    }
465}