aboutsummaryrefslogtreecommitdiffstats
path: root/components/webdriver_server
diff options
context:
space:
mode:
Diffstat (limited to 'components/webdriver_server')
-rw-r--r--components/webdriver_server/capabilities.rs14
-rw-r--r--components/webdriver_server/lib.rs106
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, ""))
-}