diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/element.rs | 20 | ||||
-rw-r--r-- | components/script/dom/node.rs | 5 | ||||
-rw-r--r-- | components/script/dom/webidls/Element.webidl | 5 | ||||
-rw-r--r-- | components/script/dom/window.rs | 9 |
4 files changed, 39 insertions, 0 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index ff9864c88b8..e2e260a2bb8 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -1296,6 +1296,26 @@ impl<'a> ElementMethods for &'a Element { rect.origin.x + rect.size.width) } + fn ClientTop(self) -> i32 { + let node = NodeCast::from_ref(self); + node.get_client_rect().origin.y + } + + fn ClientLeft(self) -> i32 { + let node = NodeCast::from_ref(self); + node.get_client_rect().origin.x + } + + fn ClientWidth(self) -> i32 { + let node = NodeCast::from_ref(self); + node.get_client_rect().size.width + } + + fn ClientHeight(self) -> i32 { + let node = NodeCast::from_ref(self); + node.get_client_rect().size.height + } + // https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#widl-Element-innerHTML fn GetInnerHTML(self) -> Fallible<DOMString> { //XXX TODO: XML case diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index d7432c570b0..790b2b3b249 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -504,6 +504,7 @@ pub trait NodeHelpers { fn get_bounding_content_box(self) -> Rect<Au>; fn get_content_boxes(self) -> Vec<Rect<Au>>; + fn get_client_rect(self) -> Rect<i32>; fn before(self, nodes: Vec<NodeOrString>) -> ErrorResult; fn after(self, nodes: Vec<NodeOrString>) -> ErrorResult; @@ -806,6 +807,10 @@ impl<'a> NodeHelpers for &'a Node { window_from_node(self).r().content_boxes_query(self.to_trusted_node_address()) } + fn get_client_rect(self) -> Rect<i32> { + window_from_node(self).r().client_rect_query(self.to_trusted_node_address()) + } + // https://dom.spec.whatwg.org/#dom-childnode-before fn before(self, nodes: Vec<NodeOrString>) -> ErrorResult { match self.parent_node.get() { diff --git a/components/script/dom/webidls/Element.webidl b/components/script/dom/webidls/Element.webidl index cbaf599d25e..4dce68f6ba4 100644 --- a/components/script/dom/webidls/Element.webidl +++ b/components/script/dom/webidls/Element.webidl @@ -59,6 +59,11 @@ interface Element : Node { partial interface Element { DOMRectList getClientRects(); DOMRect getBoundingClientRect(); + + readonly attribute long clientTop; + readonly attribute long clientLeft; + readonly attribute long clientWidth; + readonly attribute long clientHeight; }; // https://domparsing.spec.whatwg.org/#extensions-to-the-element-interface diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 845f7ea7521..c4ed0ea6072 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -534,6 +534,7 @@ pub trait WindowHelpers { fn layout(&self) -> &LayoutRPC; fn content_box_query(self, content_box_request: TrustedNodeAddress) -> Rect<Au>; fn content_boxes_query(self, content_boxes_request: TrustedNodeAddress) -> Vec<Rect<Au>>; + fn client_rect_query(self, node_geometry_request: TrustedNodeAddress) -> Rect<i32>; fn handle_reflow_complete_msg(self, reflow_id: u32); fn handle_resize_inactive_msg(self, new_size: WindowSizeData); fn set_fragment_name(self, fragment: Option<String>); @@ -764,6 +765,13 @@ impl<'a> WindowHelpers for &'a Window { rects } + fn client_rect_query(self, node_geometry_request: TrustedNodeAddress) -> Rect<i32> { + self.reflow(ReflowGoal::ForScriptQuery, + ReflowQueryType::NodeGeometryQuery(node_geometry_request), + ReflowReason::Query); + self.layout_rpc.node_geometry().client_rect + } + fn handle_reflow_complete_msg(self, reflow_id: u32) { let last_reflow_id = self.last_reflow_id.get(); if last_reflow_id == reflow_id { @@ -1072,6 +1080,7 @@ fn debug_reflow_events(goal: &ReflowGoal, query_type: &ReflowQueryType, reason: ReflowQueryType::NoQuery => "\tNoQuery", ReflowQueryType::ContentBoxQuery(_n) => "\tContentBoxQuery", ReflowQueryType::ContentBoxesQuery(_n) => "\tContentBoxesQuery", + ReflowQueryType::NodeGeometryQuery(_n) => "\tNodeGeometryQuery", }); debug_msg.push_str(match *reason { |