mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 06:27:45 +00:00
LibWeb: Fix O(n^2) traversal in hit testing
We already walk the entire paint tree within each stacking context in the main hit testing function (StackingContext::hit_test()), so there's no need for each individual paintable to walk its own children again. By not doing that, we remove a source of O(n^2) traversal which made hit testing on deeply nested web pages unbearably slow.
This commit is contained in:
parent
f7cfd47b48
commit
996f3228a2
2 changed files with 8 additions and 18 deletions
|
@ -535,16 +535,9 @@ Optional<HitTestResult> PaintableBox::hit_test(Gfx::FloatPoint const& position,
|
|||
return stacking_context()->hit_test(position, type);
|
||||
}
|
||||
|
||||
Optional<HitTestResult> result;
|
||||
if (absolute_border_box_rect().contains(position.x(), position.y()))
|
||||
result = HitTestResult { *this };
|
||||
for_each_child_in_paint_order([&](auto& child) {
|
||||
if (child.paintable()) {
|
||||
if (auto child_result = child.paintable()->hit_test(position, type); child_result.has_value())
|
||||
result = move(child_result);
|
||||
}
|
||||
});
|
||||
return result;
|
||||
return HitTestResult { *this };
|
||||
return {};
|
||||
}
|
||||
|
||||
Optional<HitTestResult> PaintableWithLines::hit_test(const Gfx::FloatPoint& position, HitTestType type) const
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue