diff --git a/components/gfx/display_list/mod.rs b/components/gfx/display_list/mod.rs index fb6aa952440..a904ee41bc2 100644 --- a/components/gfx/display_list/mod.rs +++ b/components/gfx/display_list/mod.rs @@ -55,11 +55,10 @@ impl DisplayList { scroll_offsets: &ScrollOffsetMap) -> Option { let mut result = Vec::new(); - let mut translated_point = client_point.clone(); let mut traversal = DisplayListTraversal::new(self); self.text_index_contents(node, &mut traversal, - &mut translated_point, + client_point, client_point, scroll_offsets, &mut result); @@ -69,30 +68,32 @@ impl DisplayList { pub fn text_index_contents<'a>(&self, node: OpaqueNode, traversal: &mut DisplayListTraversal<'a>, - translated_point: &mut Point2D, + translated_point: &Point2D, client_point: &Point2D, scroll_offsets: &ScrollOffsetMap, result: &mut Vec) { while let Some(item) = traversal.next() { match item { &DisplayItem::PushStackingContext(ref stacking_context_item) => { + let mut point = *translated_point; DisplayList::translate_point(&stacking_context_item.stacking_context, - translated_point, + &mut point, client_point); self.text_index_contents(node, traversal, - translated_point, + &point, client_point, scroll_offsets, result); } &DisplayItem::PushScrollRoot(ref item) => { + let mut point = *translated_point; DisplayList::scroll_root(&item.scroll_root, - translated_point, + &mut point, scroll_offsets); self.text_index_contents(node, traversal, - translated_point, + &point, client_point, scroll_offsets, result); @@ -115,7 +116,7 @@ impl DisplayList { // Return all nodes containing the point of interest, bottommost first, and // respecting the `pointer-events` CSS property. pub fn hit_test(&self, - translated_point: &mut Point2D, + translated_point: &Point2D, client_point: &Point2D, scroll_offsets: &ScrollOffsetMap) -> Vec { @@ -131,28 +132,30 @@ impl DisplayList { pub fn hit_test_contents<'a>(&self, traversal: &mut DisplayListTraversal<'a>, - translated_point: &mut Point2D, + translated_point: &Point2D, client_point: &Point2D, scroll_offsets: &ScrollOffsetMap, result: &mut Vec) { while let Some(item) = traversal.next() { match item { &DisplayItem::PushStackingContext(ref stacking_context_item) => { + let mut point = *translated_point; DisplayList::translate_point(&stacking_context_item.stacking_context, - translated_point, + &mut point, client_point); self.hit_test_contents(traversal, - translated_point, + &point, client_point, scroll_offsets, result); } &DisplayItem::PushScrollRoot(ref item) => { + let mut point = *translated_point; DisplayList::scroll_root(&item.scroll_root, - translated_point, + &mut point, scroll_offsets); self.hit_test_contents(traversal, - translated_point, + &point, client_point, scroll_offsets, result); diff --git a/components/layout/query.rs b/components/layout/query.rs index 4068c3230bf..4fe98c05969 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -141,7 +141,7 @@ impl LayoutRPC for LayoutRPCImpl { fn nodes_from_point(&self, page_point: Point2D, client_point: Point2D) -> Vec { - let mut page_point = Point2D::new(Au::from_f32_px(page_point.x), + let page_point = Point2D::new(Au::from_f32_px(page_point.x), Au::from_f32_px(page_point.y)); let client_point = Point2D::new(Au::from_f32_px(client_point.x), Au::from_f32_px(client_point.y)); @@ -152,7 +152,7 @@ impl LayoutRPC for LayoutRPCImpl { let result = match rw_data.display_list { None => panic!("Tried to hit test without a DisplayList"), Some(ref display_list) => { - display_list.hit_test(&mut page_point, + display_list.hit_test(&page_point, &client_point, &rw_data.stacking_context_scroll_offsets) } diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 794a743fe62..fdedc3d38d1 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -8432,6 +8432,12 @@ "url": "/_mozilla/mozilla/globals/entry.worker.html" } ], + "mozilla/hit_test_multiple_sc.html": [ + { + "path": "mozilla/hit_test_multiple_sc.html", + "url": "/_mozilla/mozilla/hit_test_multiple_sc.html" + } + ], "mozilla/hit_test_nested_sc.html": [ { "path": "mozilla/hit_test_nested_sc.html", diff --git a/tests/wpt/mozilla/tests/mozilla/hit_test_multiple_sc.html b/tests/wpt/mozilla/tests/mozilla/hit_test_multiple_sc.html new file mode 100644 index 00000000000..1c79d25ea06 --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/hit_test_multiple_sc.html @@ -0,0 +1,27 @@ + + +Hit testing works for following stacking contexts + + + +
+
+