1#![allow(missing_docs)]
6
7use std::collections::HashMap;
8
9use base::generic_channel::{GenericOneshotSender, GenericSender};
10use base::id::{BrowsingContextId, WebViewId};
11use cookie::Cookie;
12use crossbeam_channel::Sender;
13use euclid::default::Rect as UntypedRect;
14use euclid::{Rect, Size2D};
15use hyper_serde::Serde;
16use image::RgbaImage;
17use malloc_size_of_derive::MallocSizeOf;
18use rustc_hash::FxHashMap;
19use serde::{Deserialize, Serialize};
20use servo_geometry::{DeviceIndependentIntRect, DeviceIndependentPixel};
21use style_traits::CSSPixel;
22use url::Url;
23use webdriver::error::ErrorStatus;
24
25use crate::{InputEvent, JSValue, JavaScriptEvaluationError, ScreenshotCaptureError, TraversalId};
26
27#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
28pub enum WebDriverUserPrompt {
29 Alert,
30 BeforeUnload,
31 Confirm,
32 Default,
33 File,
34 Prompt,
35 FallbackDefault,
36}
37
38impl WebDriverUserPrompt {
39 pub fn new_from_str(s: &str) -> Option<Self> {
40 match s {
41 "alert" => Some(WebDriverUserPrompt::Alert),
42 "beforeUnload" => Some(WebDriverUserPrompt::BeforeUnload),
43 "confirm" => Some(WebDriverUserPrompt::Confirm),
44 "default" => Some(WebDriverUserPrompt::Default),
45 "file" => Some(WebDriverUserPrompt::File),
46 "prompt" => Some(WebDriverUserPrompt::Prompt),
47 "fallbackDefault" => Some(WebDriverUserPrompt::FallbackDefault),
48 _ => None,
49 }
50 }
51}
52
53#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
54pub enum WebDriverUserPromptAction {
55 Accept,
56 Dismiss,
57 Ignore,
58}
59
60impl WebDriverUserPromptAction {
61 pub fn new_from_str(s: &str) -> Option<Self> {
62 match s {
63 "accept" => Some(WebDriverUserPromptAction::Accept),
64 "dismiss" => Some(WebDriverUserPromptAction::Dismiss),
65 "ignore" => Some(WebDriverUserPromptAction::Ignore),
66 _ => None,
67 }
68 }
69}
70
71#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, MallocSizeOf, PartialEq, Serialize)]
73pub enum CustomHandlersAutomationMode {
74 AutoAccept,
75 AutoReject,
76 #[default]
77 None,
78}
79
80#[derive(Clone, Copy, Debug, Deserialize, Eq, MallocSizeOf, PartialEq, Serialize)]
82pub enum NewWindowTypeHint {
83 Auto,
84 Tab,
85 Window,
86}
87
88#[derive(Debug)]
90pub enum WebDriverCommandMsg {
91 GetWindowRect(WebViewId, GenericOneshotSender<DeviceIndependentIntRect>),
93 GetViewportSize(
95 WebViewId,
96 GenericOneshotSender<Size2D<f32, DeviceIndependentPixel>>,
97 ),
98 LoadUrl(WebViewId, Url, GenericSender<WebDriverLoadStatus>),
100 Refresh(WebViewId, GenericSender<WebDriverLoadStatus>),
102 GoBack(WebViewId, GenericSender<WebDriverLoadStatus>),
104 GoForward(WebViewId, GenericSender<WebDriverLoadStatus>),
106 ScriptCommand(BrowsingContextId, WebDriverScriptCommand),
109 InputEvent(WebViewId, InputEvent, Option<Sender<()>>),
113 SetWindowRect(
115 WebViewId,
116 DeviceIndependentIntRect,
117 GenericOneshotSender<DeviceIndependentIntRect>,
118 ),
119 MaximizeWebView(WebViewId, GenericOneshotSender<DeviceIndependentIntRect>),
121 TakeScreenshot(
123 WebViewId,
124 Option<Rect<f32, CSSPixel>>,
125 Sender<Result<RgbaImage, ScreenshotCaptureError>>,
126 ),
127 NewWindow(
131 NewWindowTypeHint,
132 GenericOneshotSender<WebViewId>,
133 Option<GenericSender<WebDriverLoadStatus>>,
134 ),
135 CloseWebView(WebViewId, GenericOneshotSender<()>),
137 FocusWebView(WebViewId),
139 GetFocusedWebView(GenericOneshotSender<Option<WebViewId>>),
141 GetAllWebViews(GenericOneshotSender<Vec<WebViewId>>),
143 IsWebViewOpen(WebViewId, GenericOneshotSender<bool>),
145 IsBrowsingContextOpen(BrowsingContextId, GenericOneshotSender<bool>),
147 CurrentUserPrompt(WebViewId, GenericOneshotSender<Option<WebDriverUserPrompt>>),
148 HandleUserPrompt(
149 WebViewId,
150 WebDriverUserPromptAction,
151 GenericOneshotSender<Result<String, ()>>,
152 ),
153 GetAlertText(WebViewId, GenericOneshotSender<Result<String, ()>>),
154 SendAlertText(WebViewId, String),
155 FocusBrowsingContext(BrowsingContextId),
156 Shutdown,
157 ResetAllCookies(Sender<()>),
158}
159
160#[derive(Debug, Deserialize, Serialize)]
161pub enum WebDriverScriptCommand {
162 AddCookie(
163 #[serde(
164 deserialize_with = "::hyper_serde::deserialize",
165 serialize_with = "::hyper_serde::serialize"
166 )]
167 Cookie<'static>,
168 GenericSender<Result<(), ErrorStatus>>,
169 ),
170 DeleteCookies(GenericSender<Result<(), ErrorStatus>>),
171 DeleteCookie(String, GenericSender<Result<(), ErrorStatus>>),
172 ElementClear(String, GenericSender<Result<(), ErrorStatus>>),
173 ExecuteScriptWithCallback(String, GenericSender<WebDriverJSResult>),
174 FindElementsCSSSelector(String, GenericSender<Result<Vec<String>, ErrorStatus>>),
175 FindElementsLinkText(
176 String,
177 bool,
178 GenericSender<Result<Vec<String>, ErrorStatus>>,
179 ),
180 FindElementsTagName(String, GenericSender<Result<Vec<String>, ErrorStatus>>),
181 FindElementsXpathSelector(String, GenericSender<Result<Vec<String>, ErrorStatus>>),
182 FindElementElementsCSSSelector(
183 String,
184 String,
185 GenericSender<Result<Vec<String>, ErrorStatus>>,
186 ),
187 FindElementElementsLinkText(
188 String,
189 String,
190 bool,
191 GenericSender<Result<Vec<String>, ErrorStatus>>,
192 ),
193 FindElementElementsTagName(
194 String,
195 String,
196 GenericSender<Result<Vec<String>, ErrorStatus>>,
197 ),
198 FindElementElementsXPathSelector(
199 String,
200 String,
201 GenericSender<Result<Vec<String>, ErrorStatus>>,
202 ),
203 FindShadowElementsCSSSelector(
204 String,
205 String,
206 GenericSender<Result<Vec<String>, ErrorStatus>>,
207 ),
208 FindShadowElementsLinkText(
209 String,
210 String,
211 bool,
212 GenericSender<Result<Vec<String>, ErrorStatus>>,
213 ),
214 FindShadowElementsTagName(
215 String,
216 String,
217 GenericSender<Result<Vec<String>, ErrorStatus>>,
218 ),
219 FindShadowElementsXPathSelector(
220 String,
221 String,
222 GenericSender<Result<Vec<String>, ErrorStatus>>,
223 ),
224 GetElementShadowRoot(String, GenericSender<Result<Option<String>, ErrorStatus>>),
225 ElementClick(String, GenericSender<Result<Option<String>, ErrorStatus>>),
226 GetKnownElement(String, GenericSender<Result<(), ErrorStatus>>),
227 GetKnownShadowRoot(String, GenericSender<Result<(), ErrorStatus>>),
228 GetKnownWindow(String, GenericSender<Result<(), ErrorStatus>>),
229 GetActiveElement(GenericSender<Option<String>>),
230 GetComputedRole(String, GenericSender<Result<Option<String>, ErrorStatus>>),
231 GetCookie(
232 String,
233 GenericSender<Result<Vec<Serde<Cookie<'static>>>, ErrorStatus>>,
234 ),
235 GetCookies(GenericSender<Result<Vec<Serde<Cookie<'static>>>, ErrorStatus>>),
236 GetElementAttribute(
237 String,
238 String,
239 GenericSender<Result<Option<String>, ErrorStatus>>,
240 ),
241 GetElementProperty(String, String, GenericSender<Result<JSValue, ErrorStatus>>),
242 GetElementCSS(String, String, GenericSender<Result<String, ErrorStatus>>),
243 GetElementRect(String, GenericSender<Result<UntypedRect<f64>, ErrorStatus>>),
244 GetElementTagName(String, GenericSender<Result<String, ErrorStatus>>),
245 GetElementText(String, GenericSender<Result<String, ErrorStatus>>),
246 GetElementInViewCenterPoint(
247 String,
248 GenericOneshotSender<Result<Option<(i64, i64)>, ErrorStatus>>,
249 ),
250 ScrollAndGetBoundingClientRect(String, GenericSender<Result<UntypedRect<f32>, ErrorStatus>>),
251 GetBrowsingContextId(
252 WebDriverFrameId,
253 GenericSender<Result<BrowsingContextId, ErrorStatus>>,
254 ),
255 GetParentFrameId(GenericSender<Result<BrowsingContextId, ErrorStatus>>),
256 GetUrl(GenericSender<String>),
257 GetPageSource(GenericSender<Result<String, ErrorStatus>>),
258 IsEnabled(String, GenericSender<Result<bool, ErrorStatus>>),
259 IsSelected(String, GenericSender<Result<bool, ErrorStatus>>),
260 GetTitle(GenericSender<String>),
261 WillSendKeys(
263 String,
264 String,
265 bool,
266 GenericSender<Result<bool, ErrorStatus>>,
267 ),
268 AddLoadStatusSender(WebViewId, GenericSender<WebDriverLoadStatus>),
269 RemoveLoadStatusSender(WebViewId),
270 SetProtocolHandlerAutomationMode(CustomHandlersAutomationMode),
271}
272
273pub type WebDriverJSResult = Result<JSValue, JavaScriptEvaluationError>;
274
275#[derive(Debug, Deserialize, Serialize)]
276pub enum WebDriverFrameId {
277 Short(u16),
278 Element(String),
279}
280
281#[derive(Debug, Deserialize, Serialize)]
282pub enum WebDriverLoadStatus {
283 NavigationStart,
284 NavigationStop,
286 Complete,
288 Timeout,
290 Blocked,
292}
293
294#[derive(Clone, Default)]
297pub struct WebDriverSenders {
298 pub load_status_senders: FxHashMap<WebViewId, GenericSender<WebDriverLoadStatus>>,
299 pub script_evaluation_interrupt_sender: Option<GenericSender<WebDriverJSResult>>,
300 pub pending_traversals: HashMap<TraversalId, GenericSender<WebDriverLoadStatus>>,
301}