diff options
author | Andreas Kling <kling@serenityos.org> | 2022-03-21 12:12:50 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-03-21 13:03:33 +0100 |
commit | 996f3228a2e518fb5562a4b2f91743ba435df9c3 (patch) | |
tree | 988d4dbcd0b937f890a289e95ec7ea5204a6d26c /Userland/Libraries/LibWeb/Painting/PaintableBox.cpp | |
parent | f7cfd47b48fdaa9629d762e7204cfdd8e21a0596 (diff) | |
download | serenity-996f3228a2e518fb5562a4b2f91743ba435df9c3.zip |
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.
Diffstat (limited to 'Userland/Libraries/LibWeb/Painting/PaintableBox.cpp')
-rw-r--r-- | Userland/Libraries/LibWeb/Painting/PaintableBox.cpp | 11 |
1 files changed, 2 insertions, 9 deletions
diff --git a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp index 8e7f59d797..4dbcf2349a 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp +++ b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp @@ -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 |