|
@@ -3793,12 +3793,19 @@ Element const* Document::element_from_point(double x, double y)
|
|
|
|
|
|
// 2. If there is a box in the viewport that would be a target for hit testing at coordinates x,y, when applying the transforms
|
|
|
// that apply to the descendants of the viewport, return the associated element and terminate these steps.
|
|
|
+ Optional<Painting::HitTestResult> hit_test_result;
|
|
|
if (auto const* paintable_box = this->paintable_box(); paintable_box) {
|
|
|
- if (auto result = paintable_box->hit_test(position, Painting::HitTestType::Exact); result.has_value()) {
|
|
|
- if (auto* dom_node = result->dom_node(); dom_node && dom_node->is_element())
|
|
|
- return static_cast<Element const*>(dom_node);
|
|
|
- }
|
|
|
+ (void)paintable_box->hit_test(position, Painting::HitTestType::Exact, [&](Painting::HitTestResult result) {
|
|
|
+ auto* dom_node = result.dom_node();
|
|
|
+ if (dom_node && dom_node->is_element()) {
|
|
|
+ hit_test_result = result;
|
|
|
+ return Painting::TraversalDecision::Break;
|
|
|
+ }
|
|
|
+ return Painting::TraversalDecision::Continue;
|
|
|
+ });
|
|
|
}
|
|
|
+ if (hit_test_result.has_value())
|
|
|
+ return static_cast<Element*>(hit_test_result->dom_node());
|
|
|
|
|
|
// 3. If the document has a root element, return the root element and terminate these steps.
|
|
|
if (auto const* document_root_element = first_child_of_type<Element>(); document_root_element)
|