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 
5 use http::Method;
6 use serde_json::Value;
7 
8 use crate::command::{VoidWebDriverExtensionCommand, WebDriverCommand, WebDriverExtensionCommand};
9 use crate::error::WebDriverResult;
10 use crate::Parameters;
11 
standard_routes<U: WebDriverExtensionRoute>() -> Vec<(Method, &'static str, Route<U>)>12 pub fn standard_routes<U: WebDriverExtensionRoute>() -> Vec<(Method, &'static str, Route<U>)> {
13     return 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}/elements",
123             Route::FindElements,
124         ),
125         (
126             Method::POST,
127             "/session/{sessionId}/element/{elementId}/element",
128             Route::FindElementElement,
129         ),
130         (
131             Method::POST,
132             "/session/{sessionId}/element/{elementId}/elements",
133             Route::FindElementElements,
134         ),
135         (
136             Method::GET,
137             "/session/{sessionId}/element/active",
138             Route::GetActiveElement,
139         ),
140         (
141             Method::GET,
142             "/session/{sessionId}/element/{elementId}/shadow",
143             Route::GetShadowRoot,
144         ),
145         (
146             Method::GET,
147             "/session/{sessionId}/element/{elementId}/displayed",
148             Route::IsDisplayed,
149         ),
150         (
151             Method::GET,
152             "/session/{sessionId}/element/{elementId}/selected",
153             Route::IsSelected,
154         ),
155         (
156             Method::GET,
157             "/session/{sessionId}/element/{elementId}/attribute/{name}",
158             Route::GetElementAttribute,
159         ),
160         (
161             Method::GET,
162             "/session/{sessionId}/element/{elementId}/property/{name}",
163             Route::GetElementProperty,
164         ),
165         (
166             Method::GET,
167             "/session/{sessionId}/element/{elementId}/css/{propertyName}",
168             Route::GetCSSValue,
169         ),
170         (
171             Method::GET,
172             "/session/{sessionId}/element/{elementId}/text",
173             Route::GetElementText,
174         ),
175         (
176             Method::GET,
177             "/session/{sessionId}/element/{elementId}/name",
178             Route::GetElementTagName,
179         ),
180         (
181             Method::GET,
182             "/session/{sessionId}/element/{elementId}/rect",
183             Route::GetElementRect,
184         ),
185         (
186             Method::GET,
187             "/session/{sessionId}/element/{elementId}/enabled",
188             Route::IsEnabled,
189         ),
190         (
191             Method::POST,
192             "/session/{sessionId}/execute/sync",
193             Route::ExecuteScript,
194         ),
195         (
196             Method::POST,
197             "/session/{sessionId}/execute/async",
198             Route::ExecuteAsyncScript,
199         ),
200         (
201             Method::GET,
202             "/session/{sessionId}/cookie",
203             Route::GetCookies,
204         ),
205         (
206             Method::GET,
207             "/session/{sessionId}/cookie/{name}",
208             Route::GetNamedCookie,
209         ),
210         (
211             Method::POST,
212             "/session/{sessionId}/cookie",
213             Route::AddCookie,
214         ),
215         (
216             Method::DELETE,
217             "/session/{sessionId}/cookie",
218             Route::DeleteCookies,
219         ),
220         (
221             Method::DELETE,
222             "/session/{sessionId}/cookie/{name}",
223             Route::DeleteCookie,
224         ),
225         (
226             Method::GET,
227             "/session/{sessionId}/timeouts",
228             Route::GetTimeouts,
229         ),
230         (
231             Method::POST,
232             "/session/{sessionId}/timeouts",
233             Route::SetTimeouts,
234         ),
235         (
236             Method::POST,
237             "/session/{sessionId}/element/{elementId}/click",
238             Route::ElementClick,
239         ),
240         (
241             Method::POST,
242             "/session/{sessionId}/element/{elementId}/clear",
243             Route::ElementClear,
244         ),
245         (
246             Method::POST,
247             "/session/{sessionId}/element/{elementId}/value",
248             Route::ElementSendKeys,
249         ),
250         (
251             Method::POST,
252             "/session/{sessionId}/alert/dismiss",
253             Route::DismissAlert,
254         ),
255         (
256             Method::POST,
257             "/session/{sessionId}/alert/accept",
258             Route::AcceptAlert,
259         ),
260         (
261             Method::GET,
262             "/session/{sessionId}/alert/text",
263             Route::GetAlertText,
264         ),
265         (
266             Method::POST,
267             "/session/{sessionId}/alert/text",
268             Route::SendAlertText,
269         ),
270         (
271             Method::GET,
272             "/session/{sessionId}/screenshot",
273             Route::TakeScreenshot,
274         ),
275         (
276             Method::GET,
277             "/session/{sessionId}/element/{elementId}/screenshot",
278             Route::TakeElementScreenshot,
279         ),
280         (
281             Method::POST,
282             "/session/{sessionId}/actions",
283             Route::PerformActions,
284         ),
285         (
286             Method::DELETE,
287             "/session/{sessionId}/actions",
288             Route::ReleaseActions,
289         ),
290         (Method::POST, "/session/{sessionId}/print", Route::Print),
291         (Method::GET, "/status", Route::Status),
292     ];
293 }
294 
295 #[derive(Clone, Copy, Debug)]
296 pub enum Route<U: WebDriverExtensionRoute> {
297     NewSession,
298     DeleteSession,
299     Get,
300     GetCurrentUrl,
301     GoBack,
302     GoForward,
303     Refresh,
304     GetTitle,
305     GetPageSource,
306     GetWindowHandle,
307     GetWindowHandles,
308     NewWindow,
309     CloseWindow,
310     GetWindowSize,     // deprecated
311     SetWindowSize,     // deprecated
312     GetWindowPosition, // deprecated
313     SetWindowPosition, // deprecated
314     GetWindowRect,
315     SetWindowRect,
316     MinimizeWindow,
317     MaximizeWindow,
318     FullscreenWindow,
319     SwitchToWindow,
320     SwitchToFrame,
321     SwitchToParentFrame,
322     FindElement,
323     FindElements,
324     FindElementElement,
325     FindElementElements,
326     GetActiveElement,
327     GetShadowRoot,
328     IsDisplayed,
329     IsSelected,
330     GetElementAttribute,
331     GetElementProperty,
332     GetCSSValue,
333     GetElementText,
334     GetElementTagName,
335     GetElementRect,
336     IsEnabled,
337     ExecuteScript,
338     ExecuteAsyncScript,
339     GetCookies,
340     GetNamedCookie,
341     AddCookie,
342     DeleteCookies,
343     DeleteCookie,
344     GetTimeouts,
345     SetTimeouts,
346     ElementClick,
347     ElementClear,
348     ElementSendKeys,
349     PerformActions,
350     ReleaseActions,
351     DismissAlert,
352     AcceptAlert,
353     GetAlertText,
354     SendAlertText,
355     TakeScreenshot,
356     TakeElementScreenshot,
357     Print,
358     Status,
359     Extension(U),
360 }
361 
362 pub trait WebDriverExtensionRoute: Clone + Send + PartialEq {
363     type Command: WebDriverExtensionCommand + 'static;
364 
command( &self, _: &Parameters, _: &Value, ) -> WebDriverResult<WebDriverCommand<Self::Command>>365     fn command(
366         &self,
367         _: &Parameters,
368         _: &Value,
369     ) -> WebDriverResult<WebDriverCommand<Self::Command>>;
370 }
371 
372 #[derive(Clone, Debug, PartialEq)]
373 pub struct VoidWebDriverExtensionRoute;
374 
375 impl WebDriverExtensionRoute for VoidWebDriverExtensionRoute {
376     type Command = VoidWebDriverExtensionCommand;
377 
command( &self, _: &Parameters, _: &Value, ) -> WebDriverResult<WebDriverCommand<VoidWebDriverExtensionCommand>>378     fn command(
379         &self,
380         _: &Parameters,
381         _: &Value,
382     ) -> WebDriverResult<WebDriverCommand<VoidWebDriverExtensionCommand>> {
383         panic!("No extensions implemented");
384     }
385 }
386