From 2c035f50728f5c8b0d0b993148dc8f731e6d2332 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 13 Oct 2019 12:49:43 +0200 Subject: [PATCH] LibHTML: Split layout invalidation into style and layout invalidation When style is invalidated (for example when an external stylesheet finishes loading) we delete the whole layout tree and build a new one. This is necessary since the new style information may result in a different layout tree. When layout is invalidated (window resized, image dimensions learned, etc..) we keep the existing layout tree but run the layout algorithm once again. There's obviously lots of room for improvement here. :^) --- Libraries/LibHTML/DOM/Document.cpp | 9 ++++++++- Libraries/LibHTML/DOM/Document.h | 1 + Libraries/LibHTML/DOM/HTMLLinkElement.cpp | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Libraries/LibHTML/DOM/Document.cpp b/Libraries/LibHTML/DOM/Document.cpp index 9b0cde1ad0..492b1b231a 100644 --- a/Libraries/LibHTML/DOM/Document.cpp +++ b/Libraries/LibHTML/DOM/Document.cpp @@ -153,10 +153,17 @@ URL Document::complete_url(const String& string) const void Document::layout() { - m_layout_root = create_layout_tree(style_resolver(), nullptr); + if (!m_layout_root) + m_layout_root = create_layout_tree(style_resolver(), nullptr); m_layout_root->layout(); } +void Document::invalidate_style() +{ + m_layout_root = nullptr; + invalidate_layout(); +} + void Document::invalidate_layout() { layout(); diff --git a/Libraries/LibHTML/DOM/Document.h b/Libraries/LibHTML/DOM/Document.h index 0566298b59..148d577417 100644 --- a/Libraries/LibHTML/DOM/Document.h +++ b/Libraries/LibHTML/DOM/Document.h @@ -67,6 +67,7 @@ public: void layout(); + void invalidate_style(); void invalidate_layout(); Function on_invalidate_layout; diff --git a/Libraries/LibHTML/DOM/HTMLLinkElement.cpp b/Libraries/LibHTML/DOM/HTMLLinkElement.cpp index 94a955731f..194427ae6f 100644 --- a/Libraries/LibHTML/DOM/HTMLLinkElement.cpp +++ b/Libraries/LibHTML/DOM/HTMLLinkElement.cpp @@ -29,7 +29,7 @@ void HTMLLinkElement::inserted_into(Node&) return; } document().add_sheet(*sheet); - document().invalidate_layout(); + document().invalidate_style(); }); } }