aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/query.rs
diff options
context:
space:
mode:
authorZhen Zhang <izgzhen@gmail.com>2016-04-03 15:41:37 +0800
committerZhen Zhang <izgzhen@gmail.com>2016-04-19 12:27:35 +0800
commitfefdaf76ded7675c0c67fd33f5abfbb5f74ac30f (patch)
tree90131ccb368cc04b279f82b085052ae4236495e2 /components/layout/query.rs
parentf73c6143d5375db80fd2e0b7de96a99c78b5866b (diff)
downloadservo-fefdaf76ded7675c0c67fd33f5abfbb5f74ac30f.tar.gz
servo-fefdaf76ded7675c0c67fd33f5abfbb5f74ac30f.zip
Implement ScrollTop and ScrollLeft getters:
Add new compositor message to get scroll_offset; Add new layout query for computed value of overflow-x/y; Implement layer_id method for ThreadSafeLayoutNode; Add new layout query for layer_id; Implement script interface for getting scrollTop and scrollLeft, as well as relavant helper functions.
Diffstat (limited to 'components/layout/query.rs')
-rw-r--r--components/layout/query.rs30
1 files changed, 28 insertions, 2 deletions
diff --git a/components/layout/query.rs b/components/layout/query.rs
index 1485e54f065..5b28acfa462 100644
--- a/components/layout/query.rs
+++ b/components/layout/query.rs
@@ -13,11 +13,12 @@ use flow;
use flow_ref::FlowRef;
use fragment::{Fragment, FragmentBorderBoxIterator, SpecificFragmentInfo};
use gfx::display_list::OpaqueNode;
+use gfx_traits::{LayerId};
use layout_thread::LayoutThreadData;
use msg::constellation_msg::ConstellationChan;
use opaque_node::OpaqueNodeMethods;
-use script::layout_interface::{ContentBoxResponse, ContentBoxesResponse, NodeGeometryResponse};
-use script::layout_interface::{HitTestResponse, LayoutRPC, OffsetParentResponse};
+use script::layout_interface::{ContentBoxResponse, NodeOverflowResponse, ContentBoxesResponse, NodeGeometryResponse};
+use script::layout_interface::{HitTestResponse, LayoutRPC, OffsetParentResponse, NodeLayerIdResponse};
use script::layout_interface::{ResolvedStyleResponse, ScriptLayoutChan, MarginStyleResponse};
use script_traits::LayoutMsg as ConstellationMsg;
use script_traits::UntrustedNodeAddress;
@@ -112,12 +113,23 @@ impl LayoutRPC for LayoutRPCImpl {
}
}
+ fn node_overflow(&self) -> NodeOverflowResponse {
+ NodeOverflowResponse(self.0.lock().unwrap().overflow_response.0)
+ }
+
fn node_scroll_area(&self) -> NodeGeometryResponse {
NodeGeometryResponse {
client_rect: self.0.lock().unwrap().scroll_area_response
}
}
+ fn node_layer_id(&self) -> NodeLayerIdResponse {
+ NodeLayerIdResponse {
+ layer_id: self.0.lock().unwrap().layer_id_response
+ .expect("layer_id is not correctly fetched, see PR #9968")
+ }
+ }
+
/// Retrieves the resolved value for a CSS style property.
fn resolved_style(&self) -> ResolvedStyleResponse {
let &LayoutRPCImpl(ref rw_data) = self;
@@ -425,6 +437,7 @@ impl FragmentBorderBoxIterator for UnioningFragmentScrollAreaIterator {
let bottom_padding = (border_box.size.height - bottom_border - top_border).to_px();
let top_padding = top_border.to_px();
let left_padding = left_border.to_px();
+
match self.level {
Some(start_level) if level <= start_level => { self.is_child = false; }
Some(_) => {
@@ -517,6 +530,11 @@ pub fn process_node_geometry_request<N: LayoutNode>(requested_node: N, layout_ro
iterator.client_rect
}
+pub fn process_node_layer_id_request<N: LayoutNode>(requested_node: N) -> LayerId {
+ let layout_node = requested_node.to_threadsafe();
+ layout_node.layer_id()
+}
+
pub fn process_node_scroll_area_request< N: LayoutNode>(requested_node: N, layout_root: &mut FlowRef)
-> Rect<i32> {
let mut iterator = UnioningFragmentScrollAreaIterator::new(requested_node.opaque());
@@ -691,6 +709,14 @@ pub fn process_offset_parent_query<N: LayoutNode>(requested_node: N, layout_root
}
}
+pub fn process_node_overflow_request<N: LayoutNode>(requested_node: N) -> NodeOverflowResponse {
+ let layout_node = requested_node.to_threadsafe();
+ let style = &*layout_node.style();
+ let style_box = style.get_box();
+
+ NodeOverflowResponse(Some((Point2D::new(style_box.overflow_x, style_box.overflow_y.0))))
+}
+
pub fn process_margin_style_query<N: LayoutNode>(requested_node: N)
-> MarginStyleResponse {
let layout_node = requested_node.to_threadsafe();