aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/webdriver_handlers.rs
diff options
context:
space:
mode:
authorDaniel Robertson <danlrobertson89@gmail.com>2016-02-20 19:45:10 +0000
committerDaniel Robertson <danlrobertson89@gmail.com>2016-02-24 11:41:42 -0500
commit83b2388ef4deb6eaa3d26088d0e78c07bca4e7cf (patch)
treefad4f4edde1b4386707f60cb10e87fb6240c169b /components/script/webdriver_handlers.rs
parent875f1e92ccafebc8ddebc722f430e5037007b9dc (diff)
downloadservo-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.rs41
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,