summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibWeb/DOM/Element.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/Userland/Libraries/LibWeb/DOM/Element.cpp b/Userland/Libraries/LibWeb/DOM/Element.cpp
index d1cb73e856..d4859fd0b1 100644
--- a/Userland/Libraries/LibWeb/DOM/Element.cpp
+++ b/Userland/Libraries/LibWeb/DOM/Element.cpp
@@ -415,8 +415,17 @@ static RequiredInvalidation compute_required_invalidation(CSS::StyleProperties c
return RequiredInvalidation::Relayout;
if (*old_value == *new_value)
continue;
- if (CSS::property_affects_layout(property_id))
+
+ // OPTIMIZATION: Special handling for CSS `visibility`:
+ if (property_id == CSS::PropertyID::Visibility) {
+ // We don't need to relayout if the visibility changes from visible to hidden or vice versa. Only collapse requires relayout.
+ if ((old_value->to_identifier() == CSS::ValueID::Collapse) != (new_value->to_identifier() == CSS::ValueID::Collapse))
+ return RequiredInvalidation::Relayout;
+ // Of course, we still have to repaint on any visibility change.
+ requires_repaint = true;
+ } else if (CSS::property_affects_layout(property_id)) {
return RequiredInvalidation::Relayout;
+ }
if (CSS::property_affects_stacking_context(property_id))
requires_stacking_context_tree_rebuild = true;
requires_repaint = true;