diff options
-rw-r--r-- | components/webdriver_server/lib.rs | 101 |
1 files changed, 33 insertions, 68 deletions
diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index aa1e6ae4135..41df5773667 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -299,6 +299,18 @@ impl Handler { } } + #[inline] + fn frame_script_command(&self, cmd_msg: WebDriverScriptCommand) -> WebDriverResult<()> { + Ok(self.constellation_chan.send(ConstellationMsg::WebDriverCommand( + WebDriverCommandMsg::ScriptCommand(try!(self.frame_pipeline()), cmd_msg))).unwrap()) + } + + #[inline] + fn root_script_command(&self, cmd_msg: WebDriverScriptCommand) -> WebDriverResult<()> { + Ok(self.constellation_chan.send(ConstellationMsg::WebDriverCommand( + WebDriverCommandMsg::ScriptCommand(try!(self.root_pipeline()), cmd_msg))).unwrap()) + } + fn handle_get(&self, parameters: &GetParameters) -> WebDriverResult<WebDriverResponse> { let url = match Url::parse(¶meters.url[..]) { Ok(url) => url, @@ -336,13 +348,8 @@ impl Handler { } fn handle_current_url(&self) -> WebDriverResult<WebDriverResponse> { - let pipeline_id = try!(self.root_pipeline()); - let (sender, receiver) = ipc::channel().unwrap(); - - let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, - WebDriverScriptCommand::GetUrl(sender)); - self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + try!(self.root_script_command(WebDriverScriptCommand::GetUrl(sender))); let url = receiver.recv().unwrap(); @@ -350,13 +357,9 @@ impl Handler { } fn handle_window_size(&self) -> WebDriverResult<WebDriverResponse> { - let pipeline_id = try!(self.root_pipeline()); - let (sender, receiver) = ipc::channel().unwrap(); - let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, - WebDriverScriptCommand::GetWindowSize(sender)); - self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + try!(self.root_script_command(WebDriverScriptCommand::GetWindowSize(sender))); match receiver.recv().unwrap() { Some(window_size) => { @@ -369,14 +372,9 @@ impl Handler { } fn handle_is_enabled(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> { - let pipeline_id = try!(self.root_pipeline()); - let (sender, receiver) = ipc::channel().unwrap(); - let element_id = element.id.clone(); - let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, - WebDriverScriptCommand::IsEnabled(element_id, sender)); - self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + try!(self.root_script_command(WebDriverScriptCommand::IsEnabled(element.id.clone(), sender))); match receiver.recv().unwrap() { Ok(is_enabled) => Ok(WebDriverResponse::Generic(ValueResponse::new(is_enabled.to_json()))), @@ -385,14 +383,9 @@ impl Handler { } fn handle_is_selected(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> { - let pipeline_id = try!(self.root_pipeline()); - let (sender, receiver) = ipc::channel().unwrap(); - let element_id = element.id.clone(); - let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, - WebDriverScriptCommand::IsSelected(element_id, sender)); - self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + try!(self.root_script_command(WebDriverScriptCommand::IsSelected(element.id.clone(), sender))); match receiver.recv().unwrap() { Ok(is_selected) => Ok(WebDriverResponse::Generic(ValueResponse::new(is_selected.to_json()))), @@ -422,12 +415,10 @@ impl Handler { } fn handle_title(&self) -> WebDriverResult<WebDriverResponse> { - let pipeline_id = try!(self.root_pipeline()); - let (sender, receiver) = ipc::channel().unwrap(); - let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, - WebDriverScriptCommand::GetTitle(sender)); - self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + + try!(self.root_script_command(WebDriverScriptCommand::GetTitle(sender))); + let value = receiver.recv().unwrap(); Ok(WebDriverResponse::Generic(ValueResponse::new(value.to_json()))) } @@ -447,17 +438,16 @@ impl Handler { } fn handle_find_element(&self, parameters: &LocatorParameters) -> WebDriverResult<WebDriverResponse> { - let pipeline_id = try!(self.frame_pipeline()); - if parameters.using != LocatorStrategy::CSSSelector { return Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "Unsupported locator strategy")) } let (sender, receiver) = ipc::channel().unwrap(); - let cmd = WebDriverScriptCommand::FindElementCSS(parameters.value.clone(), sender); - let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, cmd); - self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + + try!(self.frame_script_command(WebDriverScriptCommand::FindElementCSS(parameters.value.clone(), + sender))); + match receiver.recv().unwrap() { Ok(value) => { let value_resp = value.map(|x| WebElement::new(x).to_json()).to_json(); @@ -519,17 +509,14 @@ impl Handler { fn handle_find_elements(&self, parameters: &LocatorParameters) -> WebDriverResult<WebDriverResponse> { - let pipeline_id = try!(self.frame_pipeline()); - if parameters.using != LocatorStrategy::CSSSelector { return Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "Unsupported locator strategy")) } let (sender, receiver) = ipc::channel().unwrap(); - let cmd = WebDriverScriptCommand::FindElementsCSS(parameters.value.clone(), sender); - let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, cmd); - self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + try!(self.frame_script_command(WebDriverScriptCommand::FindElementCSS(parameters.value.clone(), + sender))); match receiver.recv().unwrap() { Ok(value) => { let resp_value: Vec<Json> = value.into_iter().map( @@ -543,12 +530,8 @@ impl Handler { // https://w3c.github.io/webdriver/webdriver-spec.html#get-element-rect fn handle_element_rect(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> { - let pipeline_id = try!(self.frame_pipeline()); - let (sender, receiver) = ipc::channel().unwrap(); - let cmd = WebDriverScriptCommand::GetElementRect(element.id.clone(), sender); - let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, cmd); - self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + try!(self.frame_script_command(WebDriverScriptCommand::GetElementRect(element.id.clone(), sender))); match receiver.recv().unwrap() { Ok(rect) => { let response = ElementRectResponse::new(rect.origin.x, rect.origin.y, @@ -561,12 +544,8 @@ impl Handler { } fn handle_element_text(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> { - let pipeline_id = try!(self.frame_pipeline()); - let (sender, receiver) = ipc::channel().unwrap(); - let cmd = WebDriverScriptCommand::GetElementText(element.id.clone(), sender); - let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, cmd); - self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + try!(self.frame_script_command(WebDriverScriptCommand::GetElementText(element.id.clone(), sender))); match receiver.recv().unwrap() { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse::new(value.to_json()))), Err(_) => Err(WebDriverError::new(ErrorStatus::StaleElementReference, @@ -575,23 +554,15 @@ impl Handler { } fn handle_active_element(&self) -> WebDriverResult<WebDriverResponse> { - let pipeline_id = try!(self.frame_pipeline()); - let (sender, receiver) = ipc::channel().unwrap(); - let cmd = WebDriverScriptCommand::GetActiveElement(sender); - let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, cmd); - self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + try!(self.frame_script_command(WebDriverScriptCommand::GetActiveElement(sender))); let value = receiver.recv().unwrap().map(|x| WebElement::new(x).to_json()); Ok(WebDriverResponse::Generic(ValueResponse::new(value.to_json()))) } fn handle_element_tag_name(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> { - let pipeline_id = try!(self.frame_pipeline()); - let (sender, receiver) = ipc::channel().unwrap(); - let cmd = WebDriverScriptCommand::GetElementTagName(element.id.clone(), sender); - let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, cmd); - self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + try!(self.frame_script_command(WebDriverScriptCommand::GetElementTagName(element.id.clone(), sender))); match receiver.recv().unwrap() { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse::new(value.to_json()))), Err(_) => Err(WebDriverError::new(ErrorStatus::StaleElementReference, @@ -600,12 +571,9 @@ impl Handler { } fn handle_element_attribute(&self, element: &WebElement, name: &str) -> WebDriverResult<WebDriverResponse> { - let pipeline_id = try!(self.frame_pipeline()); - let (sender, receiver) = ipc::channel().unwrap(); - let cmd = WebDriverScriptCommand::GetElementAttribute(element.id.clone(), name.to_owned(), sender); - let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, cmd); - self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + try!(self.frame_script_command(WebDriverScriptCommand::GetElementAttribute(element.id.clone(), name.to_owned(), + sender))); match receiver.recv().unwrap() { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse::new(value.to_json()))), Err(_) => Err(WebDriverError::new(ErrorStatus::StaleElementReference, @@ -614,12 +582,9 @@ impl Handler { } fn handle_element_css(&self, element: &WebElement, name: &str) -> WebDriverResult<WebDriverResponse> { - let pipeline_id = try!(self.frame_pipeline()); - let (sender, receiver) = ipc::channel().unwrap(); - let cmd = WebDriverScriptCommand::GetElementCSS(element.id.clone(), name.to_owned(), sender); - let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, cmd); - self.constellation_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + try!(self.frame_script_command(WebDriverScriptCommand::GetElementCSS(element.id.clone(), name.to_owned(), + sender))); match receiver.recv().unwrap() { Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse::new(value.to_json()))), Err(_) => Err(WebDriverError::new(ErrorStatus::StaleElementReference, |