diff options
Diffstat (limited to 'components/webdriver_server')
-rw-r--r-- | components/webdriver_server/capabilities.rs | 14 | ||||
-rw-r--r-- | components/webdriver_server/lib.rs | 106 |
2 files changed, 68 insertions, 52 deletions
diff --git a/components/webdriver_server/capabilities.rs b/components/webdriver_server/capabilities.rs index 32596f5275a..477a3bfd34c 100644 --- a/components/webdriver_server/capabilities.rs +++ b/components/webdriver_server/capabilities.rs @@ -4,7 +4,7 @@ use serde_json::{Map, Value}; use webdriver::capabilities::{BrowserCapabilities, Capabilities}; -use webdriver::error::{ErrorStatus, WebDriverError, WebDriverResult}; +use webdriver::error::{WebDriverError, WebDriverResult}; pub struct ServoCapabilities { pub browser_name: String, @@ -79,42 +79,42 @@ impl BrowserCapabilities for ServoCapabilities { &mut self, _: &serde_json::Map<std::string::String, Value>, ) -> Result<bool, WebDriverError> { - Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "")) + todo!() } fn webauthn_virtual_authenticators( &mut self, _: &serde_json::Map<std::string::String, Value>, ) -> Result<bool, WebDriverError> { - Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "")) + todo!() } fn webauthn_extension_uvm( &mut self, _: &serde_json::Map<std::string::String, Value>, ) -> Result<bool, WebDriverError> { - Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "")) + todo!() } fn webauthn_extension_prf( &mut self, _: &serde_json::Map<std::string::String, Value>, ) -> Result<bool, WebDriverError> { - Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "")) + todo!() } fn webauthn_extension_large_blob( &mut self, _: &serde_json::Map<std::string::String, Value>, ) -> Result<bool, WebDriverError> { - Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "")) + todo!() } fn webauthn_extension_cred_blob( &mut self, _: &serde_json::Map<std::string::String, Value>, ) -> Result<bool, WebDriverError> { - Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "")) + todo!() } } diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 35bca6c4bd6..ce83a8f3cc1 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -29,7 +29,7 @@ use embedder_traits::{ use euclid::{Rect, Size2D}; use http::method::Method; use image::{DynamicImage, ImageFormat, RgbaImage}; -use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; +use ipc_channel::ipc::{self, IpcSender}; use ipc_channel::router::ROUTER; use keyboard_types::webdriver::send_keys; use log::{debug, info}; @@ -678,7 +678,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); self.top_level_script_command(WebDriverScriptCommand::GetUrl(sender))?; - let url = wait_for_script_response(receiver)?; + let url = receiver.recv().unwrap(); Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(url.as_str())?, @@ -694,7 +694,7 @@ impl Handler { .send(EmbedderToConstellationMessage::WebDriverCommand(cmd_msg)) .unwrap(); - let window_size = wait_for_script_response(receiver)?; + let window_size = receiver.recv().unwrap(); let window_size_response = WindowRectResponse { x: 0, y: 0, @@ -738,7 +738,7 @@ impl Handler { .unwrap(); }); - let window_size = wait_for_script_response(receiver)?; + let window_size = receiver.recv().unwrap(); let window_size_response = WindowRectResponse { x: 0, y: 0, @@ -756,7 +756,7 @@ impl Handler { sender, ))?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(is_enabled) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(is_enabled)?, ))), @@ -772,7 +772,7 @@ impl Handler { sender, ))?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(is_selected) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(is_selected)?, ))), @@ -812,7 +812,7 @@ impl Handler { self.top_level_script_command(WebDriverScriptCommand::GetTitle(sender))?; - let value = wait_for_script_response(receiver)?; + let value = receiver.recv().unwrap(); Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(value)?, ))) @@ -874,7 +874,7 @@ impl Handler { }, } - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(value) => { let value_resp = serde_json::to_value( value.map(|x| serde_json::to_value(WebElement(x)).unwrap()), @@ -1005,7 +1005,7 @@ impl Handler { let cmd = WebDriverScriptCommand::GetBrowsingContextId(frame_id, sender); self.browsing_context_script_command(cmd)?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(browsing_context_id) => { self.session_mut()?.browsing_context_id = browsing_context_id; Ok(WebDriverResponse::Void) @@ -1047,7 +1047,7 @@ impl Handler { }, } - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(value) => { let resp_value: Vec<Value> = value .into_iter() @@ -1103,7 +1103,7 @@ impl Handler { }, } - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(value) => { let value_resp = serde_json::to_value( value.map(|x| serde_json::to_value(WebElement(x)).unwrap()), @@ -1156,7 +1156,7 @@ impl Handler { }, } - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(value) => { let resp_value: Vec<Value> = value .into_iter() @@ -1175,7 +1175,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetElementRect(element.to_string(), sender); self.browsing_context_script_command(cmd)?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(rect) => { let response = ElementRectResponse { x: rect.origin.x, @@ -1193,7 +1193,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetElementText(element.to_string(), sender); self.browsing_context_script_command(cmd)?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(value)?, ))), @@ -1205,7 +1205,9 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetActiveElement(sender); self.browsing_context_script_command(cmd)?; - let value = wait_for_script_response(receiver)? + let value = receiver + .recv() + .unwrap() .map(|x| serde_json::to_value(WebElement(x)).unwrap()); Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(value)?, @@ -1216,7 +1218,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetComputedRole(element.to_string(), sender); self.browsing_context_script_command(cmd)?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(value)?, ))), @@ -1228,7 +1230,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetElementTagName(element.to_string(), sender); self.browsing_context_script_command(cmd)?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(value)?, ))), @@ -1248,7 +1250,7 @@ impl Handler { sender, ); self.browsing_context_script_command(cmd)?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(value)?, ))), @@ -1270,7 +1272,7 @@ impl Handler { ); self.browsing_context_script_command(cmd)?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(SendableWebDriverJSValue(value))?, ))), @@ -1287,7 +1289,7 @@ impl Handler { let cmd = WebDriverScriptCommand::GetElementCSS(element.to_string(), name.to_owned(), sender); self.browsing_context_script_command(cmd)?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(value)?, ))), @@ -1299,7 +1301,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetCookies(sender); self.browsing_context_script_command(cmd)?; - let cookies = wait_for_script_response(receiver)?; + let cookies = receiver.recv().unwrap(); let response = cookies .into_iter() .map(|cookie| cookie_msg_to_cookie(cookie.into_inner())) @@ -1311,7 +1313,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetCookie(name, sender); self.browsing_context_script_command(cmd)?; - let cookies = wait_for_script_response(receiver)?; + let cookies = receiver.recv().unwrap(); let response = cookies .into_iter() .map(|cookie| cookie_msg_to_cookie(cookie.into_inner())) @@ -1340,7 +1342,7 @@ impl Handler { let cmd = WebDriverScriptCommand::AddCookie(cookie_builder.build(), sender); self.browsing_context_script_command(cmd)?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(_) => Ok(WebDriverResponse::Void), Err(response) => match response { WebDriverCookieError::InvalidDomain => Err(WebDriverError::new( @@ -1359,7 +1361,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::DeleteCookie(name, sender); self.browsing_context_script_command(cmd)?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(_) => Ok(WebDriverResponse::Void), Err(error) => Err(WebDriverError::new(error, "")), } @@ -1369,7 +1371,7 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::DeleteCookies(sender); self.browsing_context_script_command(cmd)?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(_) => Ok(WebDriverResponse::Void), Err(error) => Err(WebDriverError::new(error, "")), } @@ -1424,7 +1426,7 @@ impl Handler { let cmd = WebDriverScriptCommand::GetPageSource(sender); self.browsing_context_script_command(cmd)?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(source) => Ok(WebDriverResponse::Generic(ValueResponse( serde_json::to_value(source)?, ))), @@ -1485,7 +1487,9 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let command = WebDriverScriptCommand::ExecuteScript(script, sender); self.browsing_context_script_command(command)?; - let result = wait_for_script_response(receiver)?; + let result = receiver + .recv() + .unwrap_or(Err(WebDriverJSError::BrowsingContextNotFound)); self.postprocess_js_result(result) } @@ -1501,7 +1505,7 @@ impl Handler { .iter() .map(webdriver_value_to_js_argument) .collect(); - args_string.push("window.webdriverCallback".to_string()); + args_string.push("resolve".to_string()); let timeout_script = if let Some(script_timeout) = self.session()?.script_timeout { format!("setTimeout(webdriverTimeout, {});", script_timeout) @@ -1509,7 +1513,17 @@ impl Handler { "".into() }; let script = format!( - "{} (function() {{ {}\n }})({})", + r#"(function() {{ + let webdriverPromise = new Promise(function(resolve, reject) {{ + {} + (async function() {{ + {} + }})({}) + .then((v) => {{}}, (err) => reject(err)) + }}) + .then((v) => window.webdriverCallback(v), (r) => window.webdriverException(r)) + .catch((r) => window.webdriverException(r)); + }})();"#, timeout_script, func_body, args_string.join(", "), @@ -1519,7 +1533,9 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let command = WebDriverScriptCommand::ExecuteAsyncScript(script, sender); self.browsing_context_script_command(command)?; - let result = wait_for_script_response(receiver)?; + let result = receiver + .recv() + .unwrap_or(Err(WebDriverJSError::BrowsingContextNotFound)); self.postprocess_js_result(result) } @@ -1535,15 +1551,21 @@ impl Handler { ErrorStatus::NoSuchWindow, "Pipeline id not found in browsing context", )), - Err(WebDriverJSError::JSError) => Err(WebDriverError::new( + Err(WebDriverJSError::JSException(_e)) => Err(WebDriverError::new( ErrorStatus::JavascriptError, "JS evaluation raised an exception", )), + Err(WebDriverJSError::JSError) => Err(WebDriverError::new( + ErrorStatus::JavascriptError, + "JS evaluation raised an unknown exception", + )), Err(WebDriverJSError::StaleElementReference) => Err(WebDriverError::new( ErrorStatus::StaleElementReference, "Stale element", )), - Err(WebDriverJSError::Timeout) => Err(WebDriverError::new(ErrorStatus::Timeout, "")), + Err(WebDriverJSError::Timeout) => { + Err(WebDriverError::new(ErrorStatus::ScriptTimeout, "")) + }, Err(WebDriverJSError::UnknownType) => Err(WebDriverError::new( ErrorStatus::UnsupportedOperation, "Unsupported return type", @@ -1567,7 +1589,10 @@ impl Handler { .unwrap(); // TODO: distinguish the not found and not focusable cases - wait_for_script_response(receiver)?.map_err(|error| WebDriverError::new(error, ""))?; + receiver + .recv() + .unwrap() + .map_err(|error| WebDriverError::new(error, ""))?; let input_events = send_keys(&keys.text); @@ -1590,7 +1615,7 @@ impl Handler { let command = WebDriverScriptCommand::ElementClick(element.to_string(), sender); self.browsing_context_script_command(command)?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(element_id) => match element_id { Some(element_id) => { let id = Uuid::new_v4().to_string(); @@ -1663,7 +1688,7 @@ impl Handler { .send(EmbedderToConstellationMessage::WebDriverCommand(cmd_msg)) .unwrap(); - if let Some(x) = wait_for_script_response(receiver)? { + if let Some(x) = receiver.recv().unwrap() { img = Some(x); break; }; @@ -1714,7 +1739,7 @@ impl Handler { let command = WebDriverScriptCommand::GetBoundingClientRect(element.to_string(), sender); self.browsing_context_script_command(command)?; - match wait_for_script_response(receiver)? { + match receiver.recv().unwrap() { Ok(rect) => { let encoded = self.take_screenshot(Some(Rect::from_untyped(&rect)))?; @@ -1919,12 +1944,3 @@ fn webdriver_value_to_js_argument(v: &Value) -> String { }, } } - -fn wait_for_script_response<T>(receiver: IpcReceiver<T>) -> Result<T, WebDriverError> -where - T: for<'de> Deserialize<'de> + Serialize, -{ - receiver - .recv() - .map_err(|_| WebDriverError::new(ErrorStatus::NoSuchWindow, "")) -} |