diff options
Diffstat (limited to 'components/webdriver_server/lib.rs')
-rw-r--r-- | components/webdriver_server/lib.rs | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index bb3019582d0..497e543b28d 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -21,9 +21,12 @@ extern crate util; extern crate uuid; extern crate webdriver; +mod keys; + use hyper::method::Method::{self, Post}; use image::{DynamicImage, ImageFormat, RgbImage}; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; +use keys::keycodes_to_keys; use msg::constellation_msg::Msg as ConstellationMsg; use msg::constellation_msg::{ConstellationChan, FrameId, LoadData, PipelineId}; use msg::constellation_msg::{NavigationDirection, PixelFormat, WebDriverCommandMsg}; @@ -40,7 +43,7 @@ use util::prefs::{get_pref, reset_all_prefs, reset_pref, set_pref, PrefValue}; use util::task::spawn_named; use uuid::Uuid; use webdriver::command::{GetParameters, JavascriptCommandParameters, LocatorParameters}; -use webdriver::command::{Parameters, SwitchToFrameParameters, TimeoutsParameters}; +use webdriver::command::{Parameters, SendKeysParameters, SwitchToFrameParameters, TimeoutsParameters}; use webdriver::command::{WebDriverCommand, WebDriverExtensionCommand, WebDriverMessage}; use webdriver::common::{LocatorStrategy, WebElement}; use webdriver::error::{ErrorStatus, WebDriverError, WebDriverResult}; @@ -204,6 +207,7 @@ impl WebDriverSession { } } + impl Handler { pub fn new(constellation_chan: ConstellationChan) -> Handler { Handler { @@ -595,6 +599,31 @@ impl Handler { } } + fn handle_element_send_keys(&self, + element: &WebElement, + keys: &SendKeysParameters) -> WebDriverResult<WebDriverResponse> { + let pipeline_id = try!(self.frame_pipeline()); + + let ConstellationChan(ref const_chan) = self.constellation_chan; + let (sender, receiver) = ipc::channel().unwrap(); + + let cmd = WebDriverScriptCommand::FocusElement(element.id.clone(), sender); + let cmd_msg = WebDriverCommandMsg::ScriptCommand(pipeline_id, cmd); + const_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + + // TODO: distinguish the not found and not focusable cases + try!(receiver.recv().unwrap().or_else(|_| Err(WebDriverError::new( + ErrorStatus::StaleElementReference, "Element not found or not focusable")))); + + let keys = try!(keycodes_to_keys(&keys.value).or_else(|_| + Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, "Failed to convert keycodes")))); + + let cmd_msg = WebDriverCommandMsg::SendKeys(pipeline_id, keys); + const_chan.send(ConstellationMsg::WebDriverCommand(cmd_msg)).unwrap(); + + Ok(WebDriverResponse::Void) + } + fn handle_take_screenshot(&self) -> WebDriverResult<WebDriverResponse> { let mut img = None; let pipeline_id = try!(self.root_pipeline()); @@ -705,6 +734,8 @@ impl WebDriverHandler<ServoExtensionRoute> for Handler { WebDriverCommand::GetElementTagName(ref element) => self.handle_element_tag_name(element), WebDriverCommand::ExecuteScript(ref x) => self.handle_execute_script(x), WebDriverCommand::ExecuteAsyncScript(ref x) => self.handle_execute_async_script(x), + WebDriverCommand::ElementSendKeys(ref element, ref keys) => + self.handle_element_send_keys(element, keys), WebDriverCommand::SetTimeouts(ref x) => self.handle_set_timeouts(x), WebDriverCommand::TakeScreenshot => self.handle_take_screenshot(), WebDriverCommand::Extension(ref extension) => { |