diff options
author | Daniel Robertson <danlrobertson89@gmail.com> | 2016-02-20 19:45:10 +0000 |
---|---|---|
committer | Daniel Robertson <danlrobertson89@gmail.com> | 2016-02-24 11:41:42 -0500 |
commit | 83b2388ef4deb6eaa3d26088d0e78c07bca4e7cf (patch) | |
tree | fad4f4edde1b4386707f60cb10e87fb6240c169b /components/script/webdriver_handlers.rs | |
parent | 875f1e92ccafebc8ddebc722f430e5037007b9dc (diff) | |
download | servo-83b2388ef4deb6eaa3d26088d0e78c07bca4e7cf.tar.gz servo-83b2388ef4deb6eaa3d26088d0e78c07bca4e7cf.zip |
Implement GetElementRect webdriver command
Implement the webdriver Get Element Rect command
Diffstat (limited to 'components/script/webdriver_handlers.rs')
-rw-r--r-- | components/script/webdriver_handlers.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 0c9831bf3f6..1b1d92fc914 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -22,6 +22,9 @@ use dom::htmlinputelement::HTMLInputElement; use dom::htmloptionelement::HTMLOptionElement; use dom::node::Node; use dom::window::ScriptHelpers; +use euclid::point::Point2D; +use euclid::rect::Rect; +use euclid::size::Size2D; use ipc_channel::ipc::IpcSender; use js::jsapi::JSContext; use js::jsapi::{HandleValue, RootedValue}; @@ -185,6 +188,44 @@ pub fn handle_get_title(page: &Rc<Page>, _pipeline: PipelineId, reply: IpcSender reply.send(String::from(page.document().Title())).unwrap(); } +pub fn handle_get_rect(page: &Rc<Page>, + pipeline: PipelineId, + element_id: String, + reply: IpcSender<Result<Rect<f64>, ()>>) { + reply.send(match find_node_by_unique_id(&*page, pipeline, element_id) { + Some(elem) => { + // https://w3c.github.io/webdriver/webdriver-spec.html#dfn-calculate-the-absolute-position + match elem.downcast::<HTMLElement>() { + Some(html_elem) => { + // Step 1 + let mut x = 0; + let mut y = 0; + + let mut offset_parent = html_elem.GetOffsetParent(); + + // Step 2 + while let Some(element) = offset_parent { + offset_parent = match element.downcast::<HTMLElement>() { + Some(elem) => { + x += elem.OffsetLeft(); + y += elem.OffsetTop(); + elem.GetOffsetParent() + }, + None => None + }; + } + // Step 3 + Ok(Rect::new(Point2D::new(x as f64, y as f64), + Size2D::new(html_elem.OffsetWidth() as f64, + html_elem.OffsetHeight() as f64))) + }, + None => Err(()) + } + }, + None => Err(()) + }).unwrap(); +} + pub fn handle_get_text(page: &Rc<Page>, pipeline: PipelineId, node_id: String, |