1use 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, SetWindowSize, GetWindowPosition, SetWindowPosition, 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}