LibWeb: Run IntersectionObserver steps only when needed

Instead of updating IOs in every iteration of the HTML event loop,
we now only do it after a relayout, or after the viewport changes.
This commit is contained in:
Andreas Kling 2024-02-24 08:09:42 +01:00
parent d3f8d24abb
commit 11b4216e65
3 changed files with 8 additions and 3 deletions

View file

@ -1106,6 +1106,9 @@ void Document::update_layout()
m_needs_layout = false;
m_layout_update_timer->stop();
// OPTIMIZATION: We do this here instead of in HTML::EventLoop::process() to avoid redundant work.
run_the_update_intersection_observations_steps(HighResolutionTime::unsafe_shared_current_time());
}
[[nodiscard]] static Element::RequiredInvalidationAfterStyleChange update_style_recursively(Node& node)

View file

@ -248,9 +248,7 @@ void EventLoop::process()
});
// 14. For each fully active Document in docs, run the update intersection observations steps for that Document, passing in now as the timestamp. [INTERSECTIONOBSERVER]
for_each_fully_active_document_in_docs([&](DOM::Document& document) {
document.run_the_update_intersection_observations_steps(now);
});
// OPTIMIZATION: We do this automatically after layout or viewport changes, so we don't need to do it here.
// FIXME: 15. Invoke the mark paint timing algorithm for each Document object in docs.

View file

@ -29,6 +29,7 @@
#include <LibWeb/HTML/TraversableNavigable.h>
#include <LibWeb/HTML/Window.h>
#include <LibWeb/HTML/WindowProxy.h>
#include <LibWeb/HighResolutionTime/TimeOrigin.h>
#include <LibWeb/Infra/Strings.h>
#include <LibWeb/Layout/Node.h>
#include <LibWeb/Loader/GeneratedPagesLoader.h>
@ -1944,6 +1945,9 @@ void Navigable::scroll_offset_did_change()
// 3. Append doc to docs pending scroll event targets.
doc->pending_scroll_event_targets().append(*doc);
// OPTIMIZATION: We do this here instead of in HTML::EventLoop::process() to avoid redundant work.
doc->run_the_update_intersection_observations_steps(HighResolutionTime::unsafe_shared_current_time());
}
CSSPixelRect Navigable::to_top_level_rect(CSSPixelRect const& a_rect)