aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/layout_thread.rs
diff options
context:
space:
mode:
authorJack Moffitt <jack@metajack.im>2016-03-01 15:09:04 -0700
committerJack Moffitt <jack@metajack.im>2016-03-03 15:17:46 -0700
commit2507bfb2cf3a5d16d457bb8ebc56545d8d6cee09 (patch)
treeed3d6375a91b71c1a3dbac6ba4244b2e1d61e5f4 /components/layout/layout_thread.rs
parent056a7cf1a2284063e5d32c6627b86f6931957a74 (diff)
downloadservo-2507bfb2cf3a5d16d457bb8ebc56545d8d6cee09.tar.gz
servo-2507bfb2cf3a5d16d457bb8ebc56545d8d6cee09.zip
Suppress reflows before RefreshTick or FirstLoad
This fixes a bug where partially loaded content is displayed to the user before it should be, usually before stylesheets have loaded. This commit supresses reflows until either FirstLoad or RefreshTick, whichever comes first. Unfortunately, hit_test and mouse_over did not do reflows if they were necessary, and so by suppressing the initial spurious reflows, these methods started to panic without a display list to query. This patch also transforms these into queries similar to the other existing queries.
Diffstat (limited to 'components/layout/layout_thread.rs')
-rw-r--r--components/layout/layout_thread.rs21
1 files changed, 20 insertions, 1 deletions
diff --git a/components/layout/layout_thread.rs b/components/layout/layout_thread.rs
index bf4a6ac9745..866c7ac2239 100644
--- a/components/layout/layout_thread.rs
+++ b/components/layout/layout_thread.rs
@@ -22,7 +22,7 @@ use euclid::size::Size2D;
use flow::{self, Flow, ImmutableFlowUtils, MutableFlowUtils, MutableOwnedFlowUtils};
use flow_ref::{self, FlowRef};
use fnv::FnvHasher;
-use gfx::display_list::{ClippingRegion, DisplayList, LayerInfo};
+use gfx::display_list::{ClippingRegion, DisplayItemMetadata, DisplayList, LayerInfo};
use gfx::display_list::{OpaqueNode, StackingContext, StackingContextId, StackingContextType};
use gfx::font;
use gfx::font_cache_thread::FontCacheThread;
@@ -114,6 +114,9 @@ pub struct LayoutThreadData {
/// A queued response for the client {top, left, width, height} of a node in pixels.
pub client_rect_response: Rect<i32>,
+ /// A queued response for the node at a given point
+ pub hit_test_response: (Option<DisplayItemMetadata>, bool),
+
/// A queued response for the resolved style property of an element.
pub resolved_style_response: Option<String>,
@@ -458,6 +461,7 @@ impl LayoutThread {
content_box_response: Rect::zero(),
content_boxes_response: Vec::new(),
client_rect_response: Rect::zero(),
+ hit_test_response: (None, false),
resolved_style_response: None,
offset_parent_response: OffsetParentResponse::empty(),
margin_style_response: MarginStyleResponse::empty(),
@@ -978,6 +982,9 @@ impl LayoutThread {
ReflowQueryType::ContentBoxesQuery(_) => {
rw_data.content_boxes_response = Vec::new();
},
+ ReflowQueryType::HitTestQuery(_, _) => {
+ rw_data.hit_test_response = (None, false);
+ },
ReflowQueryType::NodeGeometryQuery(_) => {
rw_data.client_rect_response = Rect::zero();
},
@@ -1120,6 +1127,18 @@ impl LayoutThread {
let node = unsafe { ServoLayoutNode::new(&node) };
rw_data.content_boxes_response = process_content_boxes_request(node, &mut root_flow);
},
+ ReflowQueryType::HitTestQuery(point, update_cursor) => {
+ let point = Point2D::new(Au::from_f32_px(point.x), Au::from_f32_px(point.y));
+ let result = match rw_data.display_list {
+ None => panic!("Tried to hit test with no display list"),
+ Some(ref dl) => dl.hit_test(point),
+ };
+ rw_data.hit_test_response = if result.len() > 0 {
+ (Some(result[0]), update_cursor)
+ } else {
+ (None, update_cursor)
+ };
+ },
ReflowQueryType::NodeGeometryQuery(node) => {
let node = unsafe { ServoLayoutNode::new(&node) };
rw_data.client_rect_response = process_node_geometry_request(node, &mut root_flow);