diff options
Diffstat (limited to 'components/webdriver_server/lib.rs')
-rw-r--r-- | components/webdriver_server/lib.rs | 463 |
1 files changed, 217 insertions, 246 deletions
diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 300096061d0..6c1bbbf8094 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -18,8 +18,10 @@ extern crate log; extern crate msg; extern crate net_traits; extern crate regex; -extern crate rustc_serialize; extern crate script_traits; +#[macro_use] +extern crate serde; +extern crate serde_json; extern crate servo_channel; extern crate servo_config; extern crate servo_url; @@ -29,77 +31,55 @@ extern crate webdriver; mod keys; use euclid::TypedSize2D; -use hyper::method::Method::{self, Post}; +use hyper::Method; use image::{DynamicImage, ImageFormat, RgbImage}; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; use keys::keycodes_to_keys; use msg::constellation_msg::{BrowsingContextId, TopLevelBrowsingContextId, TraversalDirection}; use net_traits::image::base::PixelFormat; use regex::Captures; -use rustc_serialize::json::{Json, ToJson}; use script_traits::{ConstellationMsg, LoadData, WebDriverCommandMsg}; use script_traits::webdriver_msg::{LoadStatus, WebDriverCookieError, WebDriverFrameId}; -use script_traits::webdriver_msg::{WebDriverJSError, WebDriverJSResult, WebDriverScriptCommand}; +use script_traits::webdriver_msg::{WebDriverJSError, WebDriverJSResult, WebDriverScriptCommand, WebDriverJSValue}; +use serde::de::{Deserialize, Deserializer, MapAccess, Visitor}; +use serde::ser::{Serialize, Serializer}; +use serde_json::Value; use servo_channel::Sender; use servo_config::prefs::{PREFS, PrefValue}; use servo_url::ServoUrl; use std::borrow::ToOwned; use std::collections::BTreeMap; +use std::fmt; use std::net::{SocketAddr, SocketAddrV4}; use std::thread; use std::time::Duration; use uuid::Uuid; -use webdriver::command::{AddCookieParameters, GetParameters, JavascriptCommandParameters}; -use webdriver::command::{LocatorParameters, Parameters}; +use webdriver::command::{AddCookieParameters, GetParameters, JavascriptCommandParameters, LocatorParameters}; use webdriver::command::{SendKeysParameters, SwitchToFrameParameters, TimeoutsParameters}; -use webdriver::command::{WebDriverCommand, WebDriverExtensionCommand, WebDriverMessage}; -use webdriver::command::WindowRectParameters; -use webdriver::common::{Date, LocatorStrategy, Nullable, WebElement}; +use webdriver::command::{WebDriverCommand, WebDriverExtensionCommand, WebDriverMessage, WindowRectParameters}; +use webdriver::common::{Cookie, Date, LocatorStrategy, WebElement}; use webdriver::error::{ErrorStatus, WebDriverError, WebDriverResult}; use webdriver::httpapi::WebDriverExtensionRoute; -use webdriver::response::{Cookie, CookieResponse, CookiesResponse}; +use webdriver::response::{CookieResponse, CookiesResponse}; use webdriver::response::{ElementRectResponse, NewSessionResponse, ValueResponse}; use webdriver::response::{WebDriverResponse, WindowRectResponse}; use webdriver::server::{self, Session, WebDriverHandler}; fn extension_routes() -> Vec<(Method, &'static str, ServoExtensionRoute)> { - return vec![ - ( - Post, - "/session/{sessionId}/servo/prefs/get", - ServoExtensionRoute::GetPrefs, - ), - ( - Post, - "/session/{sessionId}/servo/prefs/set", - ServoExtensionRoute::SetPrefs, - ), - ( - Post, - "/session/{sessionId}/servo/prefs/reset", - ServoExtensionRoute::ResetPrefs, - ), - ]; + return vec![(Method::POST, "/session/{sessionId}/servo/prefs/get", ServoExtensionRoute::GetPrefs), + (Method::POST, "/session/{sessionId}/servo/prefs/set", ServoExtensionRoute::SetPrefs), + (Method::POST, "/session/{sessionId}/servo/prefs/reset", ServoExtensionRoute::ResetPrefs)] } fn cookie_msg_to_cookie(cookie: cookie_rs::Cookie) -> Cookie { Cookie { name: cookie.name().to_owned(), value: cookie.value().to_owned(), - path: match cookie.path() { - Some(path) => Nullable::Value(path.to_string()), - None => Nullable::Null, - }, - domain: match cookie.domain() { - Some(domain) => Nullable::Value(domain.to_string()), - None => Nullable::Null, - }, - expiry: match cookie.expires() { - Some(time) => Nullable::Value(Date::new(time.to_timespec().sec as u64)), - None => Nullable::Null, - }, - secure: cookie.secure(), - httpOnly: cookie.http_only(), + path: cookie.path().map(|s| s.to_owned()), + domain: cookie.domain().map(|s| s.to_owned()), + expiry: cookie.expires().map(|time| Date(time.to_timespec().sec as u64)), + secure: cookie.secure().unwrap_or(false), + httpOnly: cookie.http_only().unwrap_or(false), } } @@ -167,22 +147,20 @@ enum ServoExtensionRoute { impl WebDriverExtensionRoute for ServoExtensionRoute { type Command = ServoExtensionCommand; - fn command( - &self, - _captures: &Captures, - body_data: &Json, - ) -> WebDriverResult<WebDriverCommand<ServoExtensionCommand>> { + fn command(&self, + _captures: &Captures, + body_data: &Value) -> WebDriverResult<WebDriverCommand<ServoExtensionCommand>> { let command = match *self { ServoExtensionRoute::GetPrefs => { - let parameters: GetPrefsParameters = Parameters::from_json(&body_data)?; + let parameters: GetPrefsParameters = serde_json::from_value(body_data.clone())?; ServoExtensionCommand::GetPrefs(parameters) }, ServoExtensionRoute::SetPrefs => { - let parameters: SetPrefsParameters = Parameters::from_json(&body_data)?; + let parameters: SetPrefsParameters = serde_json::from_value(body_data.clone())?; ServoExtensionCommand::SetPrefs(parameters) }, ServoExtensionRoute::ResetPrefs => { - let parameters: GetPrefsParameters = Parameters::from_json(&body_data)?; + let parameters: GetPrefsParameters = serde_json::from_value(body_data.clone())?; ServoExtensionCommand::ResetPrefs(parameters) }, }; @@ -198,95 +176,148 @@ enum ServoExtensionCommand { } impl WebDriverExtensionCommand for ServoExtensionCommand { - fn parameters_json(&self) -> Option<Json> { + fn parameters_json(&self) -> Option<Value> { match *self { - ServoExtensionCommand::GetPrefs(ref x) => Some(x.to_json()), - ServoExtensionCommand::SetPrefs(ref x) => Some(x.to_json()), - ServoExtensionCommand::ResetPrefs(ref x) => Some(x.to_json()), + ServoExtensionCommand::GetPrefs(ref x) => serde_json::to_value(x).ok(), + ServoExtensionCommand::SetPrefs(ref x) => serde_json::to_value(x).ok(), + ServoExtensionCommand::ResetPrefs(ref x) => serde_json::to_value(x).ok(), } } } -#[derive(Clone, Debug, PartialEq)] -struct GetPrefsParameters { - prefs: Vec<String>, +struct SendableWebDriverJSValue(pub WebDriverJSValue); + +impl Serialize for SendableWebDriverJSValue { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + match self.0 { + WebDriverJSValue::Undefined => serializer.serialize_unit(), + WebDriverJSValue::Null => serializer.serialize_unit(), + WebDriverJSValue::Boolean(x) => serializer.serialize_bool(x), + WebDriverJSValue::Number(x) => serializer.serialize_f64(x), + WebDriverJSValue::String(ref x) => serializer.serialize_str(&x), + } + } } -impl Parameters for GetPrefsParameters { - fn from_json(body: &Json) -> WebDriverResult<GetPrefsParameters> { - let data = body.as_object().ok_or(WebDriverError::new( - ErrorStatus::InvalidArgument, - "Message body was not an object", - ))?; - let prefs_value = data.get("prefs").ok_or(WebDriverError::new( - ErrorStatus::InvalidArgument, - "Missing prefs key", - ))?; - let items = prefs_value.as_array().ok_or(WebDriverError::new( - ErrorStatus::InvalidArgument, - "prefs was not an array", - ))?; - let params = items - .iter() - .map(|x| { - x.as_string() - .map(|y| y.to_owned()) - .ok_or(WebDriverError::new( - ErrorStatus::InvalidArgument, - "Pref is not a string", - )) - }).collect::<Result<Vec<_>, _>>()?; - Ok(GetPrefsParameters { prefs: params }) +#[derive(Clone, Debug, PartialEq)] +struct WebDriverPrefValue(pub PrefValue); + +impl Serialize for WebDriverPrefValue { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + match self.0 { + PrefValue::Boolean(b) => serializer.serialize_bool(b), + PrefValue::String(ref s) => serializer.serialize_str(&s), + PrefValue::Number(f) => serializer.serialize_f64(f), + PrefValue::Missing => serializer.serialize_unit(), + } } } -impl ToJson for GetPrefsParameters { - fn to_json(&self) -> Json { - let mut data = BTreeMap::new(); - data.insert("prefs".to_owned(), self.prefs.to_json()); - Json::Object(data) +impl<'de> Deserialize<'de> for WebDriverPrefValue { + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> + where + D: Deserializer<'de>, + { + struct Visitor; + + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = WebDriverPrefValue; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("preference value") + } + + fn visit_f64<E>(self, value: f64) -> Result<Self::Value, E> + where + E: ::serde::de::Error, + { + Ok(WebDriverPrefValue(PrefValue::Number(value))) + } + + fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E> + where + E: ::serde::de::Error, + { + Ok(WebDriverPrefValue(PrefValue::Number(value as f64))) + } + + fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E> + where + E: ::serde::de::Error, + { + Ok(WebDriverPrefValue(PrefValue::Number(value as f64))) + } + + fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> + where + E: ::serde::de::Error, + { + Ok(WebDriverPrefValue(PrefValue::String(value.to_owned()))) + } + + fn visit_bool<E>(self, value: bool) -> Result<Self::Value, E> + where + E: ::serde::de::Error, + { + Ok(WebDriverPrefValue(PrefValue::Boolean(value))) + } + } + + deserializer.deserialize_any(Visitor) } } -#[derive(Clone, Debug, PartialEq)] + +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +struct GetPrefsParameters { + prefs: Vec<String>, +} + +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] struct SetPrefsParameters { - prefs: Vec<(String, PrefValue)>, + #[serde(deserialize_with = "map_to_vec")] + prefs: Vec<(String, WebDriverPrefValue)>, } -impl Parameters for SetPrefsParameters { - fn from_json(body: &Json) -> WebDriverResult<SetPrefsParameters> { - let data = body.as_object().ok_or(WebDriverError::new( - ErrorStatus::InvalidArgument, - "Message body was not an object", - ))?; - let items = data - .get("prefs") - .ok_or(WebDriverError::new( - ErrorStatus::InvalidArgument, - "Missing prefs key", - ))?.as_object() - .ok_or(WebDriverError::new( - ErrorStatus::InvalidArgument, - "prefs was not an array", - ))?; - let mut params = Vec::with_capacity(items.len()); - for (name, val) in items.iter() { - let value = PrefValue::from_json(val.clone()).or(Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - "Pref is not a boolean or string", - )))?; - let key = name.to_owned(); - params.push((key, value)); - } - Ok(SetPrefsParameters { prefs: params }) - } +fn map_to_vec<'de, D>(de: D) -> Result<Vec<(String, WebDriverPrefValue)>, D::Error> + where D: Deserializer<'de> { + de.deserialize_map(TupleVecMapVisitor) } -impl ToJson for SetPrefsParameters { - fn to_json(&self) -> Json { - let mut data = BTreeMap::new(); - data.insert("prefs".to_owned(), self.prefs.to_json()); - Json::Object(data) +struct TupleVecMapVisitor; + +impl<'de> Visitor<'de> for TupleVecMapVisitor +{ + type Value = Vec<(String, WebDriverPrefValue)>; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("a map") + } + + #[inline] + fn visit_unit<E>(self) -> Result<Self::Value, E> { + Ok(Vec::new()) + } + + #[inline] + fn visit_map<T>(self, mut access: T) -> Result<Self::Value, T::Error> + where + T: MapAccess<'de>, + { + let mut values = Vec::new(); + + while let Some((key, value)) = access.next_entry()? { + values.push((key, value)); + } + + Ok(values) } } @@ -349,12 +380,11 @@ impl Handler { let top_level_browsing_context_id = self.focus_top_level_browsing_context_id()?; let browsing_context_id = BrowsingContextId::from(top_level_browsing_context_id); let session = WebDriverSession::new(browsing_context_id, top_level_browsing_context_id); - let mut capabilities = BTreeMap::new(); - capabilities.insert("browserName".to_owned(), "servo".to_json()); - capabilities.insert("browserVersion".to_owned(), "0.0.1".to_json()); - capabilities.insert("acceptInsecureCerts".to_owned(), false.to_json()); - let response = - NewSessionResponse::new(session.id.to_string(), Json::Object(capabilities)); + let mut capabilities = serde_json::Map::new(); + capabilities.insert("browserName".to_owned(), serde_json::to_value("servo")?); + capabilities.insert("browserVersion".to_owned(), serde_json::to_value("0.0.1")?); + capabilities.insert("acceptInsecureCerts".to_owned(), serde_json::to_value(false)?); + let response = NewSessionResponse::new(session.id.to_string(), Value::Object(capabilities)); debug!("new session created {}.", session.id); self.session = Some(session); Ok(WebDriverResponse::NewSession(response)) @@ -447,9 +477,7 @@ impl Handler { let url = receiver.recv().unwrap(); - Ok(WebDriverResponse::Generic(ValueResponse::new( - url.as_str().to_json(), - ))) + Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(url.as_str())?))) } fn handle_window_size(&self) -> WebDriverResult<WebDriverResponse> { @@ -478,12 +506,12 @@ impl Handler { ) -> WebDriverResult<WebDriverResponse> { let (sender, receiver) = ipc::channel().unwrap(); let width = match params.width { - Nullable::Value(v) => v, - Nullable::Null => 0, + Some(v) => v, + None => 0, }; let height = match params.height { - Nullable::Value(v) => v, - Nullable::Null => 0, + Some(v) => v, + None => 0, }; let size = TypedSize2D::new(width as u32, height as u32); let top_level_browsing_context_id = self.session()?.top_level_browsing_context_id; @@ -526,13 +554,8 @@ impl Handler { ))?; match receiver.recv().unwrap() { - Ok(is_enabled) => Ok(WebDriverResponse::Generic(ValueResponse::new( - is_enabled.to_json(), - ))), - Err(_) => Err(WebDriverError::new( - ErrorStatus::StaleElementReference, - "Element not found", - )), + Ok(is_enabled) => Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(is_enabled)?))), + Err(_) => Err(WebDriverError::new(ErrorStatus::StaleElementReference, "Element not found")) } } @@ -545,13 +568,8 @@ impl Handler { ))?; match receiver.recv().unwrap() { - Ok(is_selected) => Ok(WebDriverResponse::Generic(ValueResponse::new( - is_selected.to_json(), - ))), - Err(_) => Err(WebDriverError::new( - ErrorStatus::StaleElementReference, - "Element not found", - )), + Ok(is_selected) => Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(is_selected)?))), + Err(_) => Err(WebDriverError::new(ErrorStatus::StaleElementReference, "Element not found")) } } @@ -590,27 +608,21 @@ impl Handler { self.top_level_script_command(WebDriverScriptCommand::GetTitle(sender))?; let value = receiver.recv().unwrap(); - Ok(WebDriverResponse::Generic(ValueResponse::new( - value.to_json(), - ))) + Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(value)?))) } fn handle_window_handle(&self) -> WebDriverResult<WebDriverResponse> { // For now we assume there's only one window so just use the session // id as the window id let handle = self.session.as_ref().unwrap().id.to_string(); - Ok(WebDriverResponse::Generic(ValueResponse::new( - handle.to_json(), - ))) + Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(handle)?))) } fn handle_window_handles(&self) -> WebDriverResult<WebDriverResponse> { // For now we assume there's only one window so just use the session // id as the window id - let handles = vec![self.session.as_ref().unwrap().id.to_string().to_json()]; - Ok(WebDriverResponse::Generic(ValueResponse::new( - handles.to_json(), - ))) + let handles = vec![serde_json::to_value(self.session.as_ref().unwrap().id.to_string())?]; + Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(handles)?))) } fn handle_find_element( @@ -631,13 +643,13 @@ impl Handler { match receiver.recv().unwrap() { Ok(value) => { - let value_resp = value.map(|x| WebElement::new(x).to_json()).to_json(); - Ok(WebDriverResponse::Generic(ValueResponse::new(value_resp))) - }, - Err(_) => Err(WebDriverError::new( - ErrorStatus::InvalidSelector, - "Invalid selector", - )), + let value_resp = serde_json::to_value( + value.map(|x| serde_json::to_value(WebElement::new(x)).unwrap()) + )?; + Ok(WebDriverResponse::Generic(ValueResponse(value_resp))) + } + Err(_) => Err(WebDriverError::new(ErrorStatus::InvalidSelector, + "Invalid selector")) } } @@ -647,14 +659,14 @@ impl Handler { ) -> WebDriverResult<WebDriverResponse> { use webdriver::common::FrameId; let frame_id = match parameters.id { - FrameId::Null => { + None => { let session = self.session_mut()?; session.browsing_context_id = BrowsingContextId::from(session.top_level_browsing_context_id); return Ok(WebDriverResponse::Void); }, - FrameId::Short(ref x) => WebDriverFrameId::Short(*x), - FrameId::Element(ref x) => WebDriverFrameId::Element(x.id.clone()), + Some(FrameId::Short(ref x)) => WebDriverFrameId::Short(*x), + Some(FrameId::Element(ref x)) => WebDriverFrameId::Element(x.id.clone()) }; self.switch_to_frame(frame_id) @@ -704,18 +716,12 @@ impl Handler { self.browsing_context_script_command(cmd)?; match receiver.recv().unwrap() { Ok(value) => { - let resp_value: Vec<Json> = value - .into_iter() - .map(|x| WebElement::new(x).to_json()) - .collect(); - Ok(WebDriverResponse::Generic(ValueResponse::new( - resp_value.to_json(), - ))) - }, - Err(_) => Err(WebDriverError::new( - ErrorStatus::InvalidSelector, - "Invalid selector", - )), + let resp_value: Vec<Value> = value.into_iter().map( + |x| serde_json::to_value(WebElement::new(x)).unwrap()).collect(); + Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(resp_value)?))) + } + Err(_) => Err(WebDriverError::new(ErrorStatus::InvalidSelector, + "Invalid selector")) } } @@ -746,13 +752,9 @@ impl Handler { let cmd = WebDriverScriptCommand::GetElementText(element.id.clone(), sender); self.browsing_context_script_command(cmd)?; match receiver.recv().unwrap() { - Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse::new( - value.to_json(), - ))), - Err(_) => Err(WebDriverError::new( - ErrorStatus::StaleElementReference, - "Unable to find element in document", - )), + Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(value)?))), + Err(_) => Err(WebDriverError::new(ErrorStatus::StaleElementReference, + "Unable to find element in document")) } } @@ -760,13 +762,8 @@ impl Handler { let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::GetActiveElement(sender); self.browsing_context_script_command(cmd)?; - let value = receiver - .recv() - .unwrap() - .map(|x| WebElement::new(x).to_json()); - Ok(WebDriverResponse::Generic(ValueResponse::new( - value.to_json(), - ))) + let value = receiver.recv().unwrap().map(|x| serde_json::to_value(WebElement::new(x)).unwrap()); + Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(value)?))) } fn handle_element_tag_name(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> { @@ -774,13 +771,9 @@ impl Handler { let cmd = WebDriverScriptCommand::GetElementTagName(element.id.clone(), sender); self.browsing_context_script_command(cmd)?; match receiver.recv().unwrap() { - Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse::new( - value.to_json(), - ))), - Err(_) => Err(WebDriverError::new( - ErrorStatus::StaleElementReference, - "Unable to find element in document", - )), + Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(value)?))), + Err(_) => Err(WebDriverError::new(ErrorStatus::StaleElementReference, + "Unable to find element in document")) } } @@ -797,13 +790,9 @@ impl Handler { ); self.browsing_context_script_command(cmd)?; match receiver.recv().unwrap() { - Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse::new( - value.to_json(), - ))), - Err(_) => Err(WebDriverError::new( - ErrorStatus::StaleElementReference, - "Unable to find element in document", - )), + Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(value)?))), + Err(_) => Err(WebDriverError::new(ErrorStatus::StaleElementReference, + "Unable to find element in document")) } } @@ -817,13 +806,9 @@ impl Handler { WebDriverScriptCommand::GetElementCSS(element.id.clone(), name.to_owned(), sender); self.browsing_context_script_command(cmd)?; match receiver.recv().unwrap() { - Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse::new( - value.to_json(), - ))), - Err(_) => Err(WebDriverError::new( - ErrorStatus::StaleElementReference, - "Unable to find element in document", - )), + Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(value)?))), + Err(_) => Err(WebDriverError::new(ErrorStatus::StaleElementReference, + "Unable to find element in document")) } } @@ -832,13 +817,10 @@ impl Handler { let cmd = WebDriverScriptCommand::GetCookies(sender); self.browsing_context_script_command(cmd)?; let cookies = receiver.recv().unwrap(); - let response = cookies - .into_iter() - .map(|cookie| cookie_msg_to_cookie(cookie.into_inner())) - .collect::<Vec<Cookie>>(); - Ok(WebDriverResponse::Cookies(CookiesResponse { - value: response, - })) + let response = cookies.into_iter().map(|cookie| { + cookie_msg_to_cookie(cookie.into_inner()) + }).collect::<Vec<Cookie>>(); + Ok(WebDriverResponse::Cookies(CookiesResponse(response))) } fn handle_get_cookie(&self, name: &str) -> WebDriverResult<WebDriverResponse> { @@ -846,14 +828,10 @@ impl Handler { let cmd = WebDriverScriptCommand::GetCookie(name.to_owned(), sender); self.browsing_context_script_command(cmd)?; let cookies = receiver.recv().unwrap(); - let response = cookies - .into_iter() - .map(|cookie| cookie_msg_to_cookie(cookie.into_inner())) - .next() - .unwrap(); - Ok(WebDriverResponse::Cookie(CookieResponse { - value: response, - })) + let response = cookies.into_iter().map(|cookie| { + cookie_msg_to_cookie(cookie.into_inner()) + }).next().unwrap(); + Ok(WebDriverResponse::Cookie(CookieResponse(response))) } fn handle_add_cookie( @@ -866,11 +844,11 @@ impl Handler { .secure(params.secure) .http_only(params.httpOnly); let cookie = match params.domain { - Nullable::Value(ref domain) => cookie.domain(domain.to_owned()), + Some(ref domain) => cookie.domain(domain.to_owned()), _ => cookie, }; let cookie = match params.path { - Nullable::Value(ref path) => cookie.path(path.to_owned()).finish(), + Some(ref path) => cookie.path(path.to_owned()).finish(), _ => cookie.finish(), }; @@ -958,9 +936,8 @@ impl Handler { result: WebDriverJSResult, ) -> WebDriverResult<WebDriverResponse> { match result { - Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse::new( - value.to_json(), - ))), + Ok(value) => + Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(SendableWebDriverJSValue(value))?))), Err(WebDriverJSError::Timeout) => Err(WebDriverError::new(ErrorStatus::Timeout, "")), Err(WebDriverJSError::UnknownType) => Err(WebDriverError::new( ErrorStatus::UnsupportedOperation, @@ -1055,9 +1032,7 @@ impl Handler { .unwrap(); let encoded = base64::encode(&png_data); - Ok(WebDriverResponse::Generic(ValueResponse::new( - encoded.to_json(), - ))) + Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(encoded)?))) } fn handle_get_prefs( @@ -1067,12 +1042,10 @@ impl Handler { let prefs = parameters .prefs .iter() - .map(|item| (item.clone(), PREFS.get(item).to_json())) + .map(|item| (item.clone(), serde_json::to_value(PREFS.get(item)).unwrap())) .collect::<BTreeMap<_, _>>(); - Ok(WebDriverResponse::Generic(ValueResponse::new( - prefs.to_json(), - ))) + Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(prefs)?))) } fn handle_set_prefs( @@ -1080,7 +1053,7 @@ impl Handler { parameters: &SetPrefsParameters, ) -> WebDriverResult<WebDriverResponse> { for &(ref key, ref value) in parameters.prefs.iter() { - PREFS.set(key, value.clone()); + PREFS.set(key, value.0.clone()); } Ok(WebDriverResponse::Void) } @@ -1096,12 +1069,10 @@ impl Handler { parameters .prefs .iter() - .map(|item| (item.clone(), PREFS.reset(item).to_json())) + .map(|item| (item.clone(), serde_json::to_value(PREFS.reset(item)).unwrap())) .collect::<BTreeMap<_, _>>() }; - Ok(WebDriverResponse::Generic(ValueResponse::new( - prefs.to_json(), - ))) + Ok(WebDriverResponse::Generic(ValueResponse(serde_json::to_value(prefs)?))) } } |