mirror of
https://github.com/SerenityOS/serenity
synced 2024-10-15 04:13:11 +00:00
LibWeb: Don't relayout when visibility changes between visible/hidden
Layout will be identical for both of those values, so only a repaint is necessary. If it changes to/from "collapse" however, we do need to relayout. This means we can't simply use the "affects-layout" mechanism. We have to write a little bit of custom code. This makes Google Groups (and surely many other sites) significantly more responsive by avoiding large amounts of layout work.
This commit is contained in:
parent
53d47c6614
commit
f37f081f15
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue