Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mozilla/geckodriver.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaja Frydrychowicz <mjzffr@gmail.com>2017-05-03 16:48:36 +0300
committerAndreas Tolfsen <ato@mozilla.com>2017-05-03 16:48:36 +0300
commit4060a72ba56130319daef8096ece492cd04a5440 (patch)
tree51d055f3d4757c9856edb5278312c73692e9f0fe
parentc8508c092fd4428a1caa6d8a46a656e940a3ebd1 (diff)
Add extension commands for addon install, uninstall (#711)
Fixes: https://github.com/mozilla/geckodriver/issues/211
-rw-r--r--src/marionette.rs124
1 files changed, 122 insertions, 2 deletions
diff --git a/src/marionette.rs b/src/marionette.rs
index 372d0d2..35e0be9 100644
--- a/src/marionette.rs
+++ b/src/marionette.rs
@@ -62,7 +62,11 @@ pub fn extension_routes() -> Vec<(Method, &'static str, GeckoExtensionRoute)> {
GeckoExtensionRoute::XblAnonymousChildren),
(Method::Post,
"/session/{sessionId}/moz/xbl/{elementId}/anonymous_by_attribute",
- GeckoExtensionRoute::XblAnonymousByAttribute)];
+ GeckoExtensionRoute::XblAnonymousByAttribute),
+ (Method::Post, "/session/{sessionId}/moz/addon/install",
+ GeckoExtensionRoute::InstallAddon),
+ (Method::Post, "/session/{sessionId}/moz/addon/uninstall",
+ GeckoExtensionRoute::UninstallAddon)];
}
#[derive(Clone, PartialEq)]
@@ -71,6 +75,8 @@ pub enum GeckoExtensionRoute {
SetContext,
XblAnonymousChildren,
XblAnonymousByAttribute,
+ InstallAddon,
+ UninstallAddon,
}
impl WebDriverExtensionRoute for GeckoExtensionRoute {
@@ -100,6 +106,14 @@ impl WebDriverExtensionRoute for GeckoExtensionRoute {
GeckoExtensionCommand::XblAnonymousByAttribute(element_id.as_str().into(),
parameters)
}
+ &GeckoExtensionRoute::InstallAddon => {
+ let parameters: AddonInstallParameters = try!(Parameters::from_json(&body_data));
+ GeckoExtensionCommand::InstallAddon(parameters)
+ }
+ &GeckoExtensionRoute::UninstallAddon => {
+ let parameters: AddonUninstallParameters = try!(Parameters::from_json(&body_data));
+ GeckoExtensionCommand::UninstallAddon(parameters)
+ }
};
Ok(WebDriverCommand::Extension(command))
}
@@ -111,6 +125,8 @@ pub enum GeckoExtensionCommand {
SetContext(GeckoContextParameters),
XblAnonymousChildren(WebElement),
XblAnonymousByAttribute(WebElement, AttributeParameters),
+ InstallAddon(AddonInstallParameters),
+ UninstallAddon(AddonUninstallParameters)
}
impl WebDriverExtensionCommand for GeckoExtensionCommand {
@@ -120,6 +136,8 @@ impl WebDriverExtensionCommand for GeckoExtensionCommand {
&GeckoExtensionCommand::SetContext(ref x) => Some(x.to_json()),
&GeckoExtensionCommand::XblAnonymousChildren(_) => None,
&GeckoExtensionCommand::XblAnonymousByAttribute(_, ref x) => Some(x.to_json()),
+ &GeckoExtensionCommand::InstallAddon(ref x) => Some(x.to_json()),
+ &GeckoExtensionCommand::UninstallAddon(ref x) => Some(x.to_json()),
}
}
}
@@ -234,6 +252,95 @@ impl ToMarionette for AttributeParameters {
}
}
+#[derive(Clone, Debug, PartialEq)]
+pub struct AddonInstallParameters {
+ pub path: String,
+ pub temporary: bool
+}
+
+impl Parameters for AddonInstallParameters {
+ fn from_json(body: &Json) -> WebDriverResult<AddonInstallParameters> {
+ let data = try!(body.as_object().ok_or(
+ WebDriverError::new(ErrorStatus::InvalidArgument,
+ "Message body was not an object")));
+
+ let path = try_opt!(
+ try_opt!(data.get("path"),
+ ErrorStatus::InvalidArgument,
+ "Missing 'path' parameter").as_string(),
+ ErrorStatus::InvalidArgument,
+ "'path' is not a string").to_string();
+
+ let temporary = match data.get("temporary") {
+ Some(x) => try_opt!(x.as_boolean(),
+ ErrorStatus::InvalidArgument,
+ "Failed to convert 'temporary' to boolean"),
+ None => false
+ };
+
+ return Ok(AddonInstallParameters {
+ path: path,
+ temporary: temporary,
+ })
+ }
+}
+
+impl ToJson for AddonInstallParameters {
+ fn to_json(&self) -> Json {
+ let mut data = BTreeMap::new();
+ data.insert("path".to_string(), self.path.to_json());
+ data.insert("temporary".to_string(), self.temporary.to_json());
+ Json::Object(data)
+ }
+}
+
+impl ToMarionette for AddonInstallParameters {
+ fn to_marionette(&self) -> WebDriverResult<BTreeMap<String, Json>> {
+ let mut data = BTreeMap::new();
+ data.insert("path".to_string(), self.path.to_json());
+ data.insert("temporary".to_string(), self.temporary.to_json());
+ Ok(data)
+ }
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct AddonUninstallParameters {
+ pub id: String
+}
+
+impl Parameters for AddonUninstallParameters {
+ fn from_json(body: &Json) -> WebDriverResult<AddonUninstallParameters> {
+ let data = try!(body.as_object().ok_or(
+ WebDriverError::new(ErrorStatus::InvalidArgument,
+ "Message body was not an object")));
+
+ let id = try_opt!(
+ try_opt!(data.get("id"),
+ ErrorStatus::InvalidArgument,
+ "Missing 'id' parameter").as_string(),
+ ErrorStatus::InvalidArgument,
+ "'id' is not a string").to_string();
+
+ return Ok(AddonUninstallParameters {id: id})
+ }
+}
+
+impl ToJson for AddonUninstallParameters {
+ fn to_json(&self) -> Json {
+ let mut data = BTreeMap::new();
+ data.insert("id".to_string(), self.id.to_json());
+ Json::Object(data)
+ }
+}
+
+impl ToMarionette for AddonUninstallParameters {
+ fn to_marionette(&self) -> WebDriverResult<BTreeMap<String, Json>> {
+ let mut data = BTreeMap::new();
+ data.insert("id".to_string(), self.id.to_json());
+ Ok(data)
+ }
+}
+
#[derive(Default)]
pub struct LogOptions {
pub level: Option<LogLevel>,
@@ -743,7 +850,14 @@ impl MarionetteSession {
let el = try!(self.to_web_element(try_opt!(resp.result.find("value"),
ErrorStatus::UnknownError, "Failed to find value field")));
WebDriverResponse::Generic(ValueResponse::new(el.to_json()))
- }
+ },
+ &GeckoExtensionCommand::InstallAddon(_) => {
+ let value = try_opt!(resp.result.find("value"),
+ ErrorStatus::UnknownError,
+ "Failed to find value field");
+ WebDriverResponse::Generic(ValueResponse::new(value.clone()))
+ },
+ &GeckoExtensionCommand::UninstallAddon(_) => WebDriverResponse::Void
}
}
})
@@ -1001,6 +1115,12 @@ impl MarionetteCommand {
let mut data = try!(x.to_marionette());
data.insert("element".to_string(), e.id.to_json());
(Some("findElement"), Some(Ok(data)))
+ },
+ &GeckoExtensionCommand::InstallAddon(ref x) => {
+ (Some("addon:install"), Some(x.to_marionette()))
+ },
+ &GeckoExtensionCommand::UninstallAddon(ref x) => {
+ (Some("addon:uninstall"), Some(x.to_marionette()))
}
}
}