1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 23:07:34 +00:00

LibWeb: Broadcast the viewport rect to clients immediately after layout

This lets elements figure out if they're visible within the viewport or
not, so they take appropriate action.

Fixes the issues with animations not starting until the viewport was
resized or scrolled.
This commit is contained in:
Andreas Kling 2023-05-09 07:25:20 +02:00
parent dbe961ca02
commit 6ae208dbf6
3 changed files with 11 additions and 0 deletions

View file

@ -889,6 +889,9 @@ void Document::update_layout()
layout_state.commit();
// Broadcast the current viewport rect to any new paintables, so they know whether they're visible or not.
browsing_context()->inform_all_viewport_clients_about_the_current_viewport_rect();
browsing_context()->set_needs_display();
if (browsing_context()->is_top_level() && browsing_context()->active_document() == this) {

View file

@ -539,6 +539,12 @@ void BrowsingContext::set_active_document(JS::NonnullGCPtr<DOM::Document> docume
previously_active_document->did_stop_being_active_document_in_browsing_context({});
}
void BrowsingContext::inform_all_viewport_clients_about_the_current_viewport_rect()
{
for (auto* client : m_viewport_clients)
client->browsing_context_did_set_viewport_rect(viewport_rect());
}
void BrowsingContext::set_viewport_rect(CSSPixelRect const& rect)
{
bool did_change = false;

View file

@ -277,6 +277,8 @@ public:
virtual String const& window_handle() const override { return m_window_handle; }
virtual void set_window_handle(String handle) override { m_window_handle = move(handle); }
void inform_all_viewport_clients_about_the_current_viewport_rect();
private:
explicit BrowsingContext(Page&, HTML::NavigableContainer*);