aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/element.rs20
-rw-r--r--components/script/dom/node.rs5
-rw-r--r--components/script/dom/webidls/Element.webidl5
-rw-r--r--components/script/dom/window.rs9
4 files changed, 39 insertions, 0 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index dd6afd3061b..10b7950f82e 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -1317,6 +1317,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 42ad7608580..54535fdb7af 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -492,6 +492,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;
@@ -794,6 +795,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 81c6f329b47..f2f18a5cc0b 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 04f6b3ee6ce..7bea165b46d 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -540,6 +540,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 set_fragment_name(self, fragment: Option<String>);
fn steal_fragment_name(self) -> Option<String>;
@@ -771,6 +772,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 {
@@ -1077,6 +1085,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 {