|
@@ -619,7 +619,16 @@ void FlexFormattingContext::determine_flex_base_size_and_hypothetical_main_size(
|
|
|
if (has_definite_main_size(child_box))
|
|
|
return specified_main_size_of_child_box(child_box);
|
|
|
|
|
|
- return calculate_indefinite_main_size(flex_item);
|
|
|
+ // NOTE: To avoid repeated layout work, we keep a cache of flex item main sizes on the
|
|
|
+ // root FormattingState object. It's available through a full layout cycle.
|
|
|
+ // FIXME: Make sure this cache isn't overly permissive..
|
|
|
+ auto& size_cache = m_state.m_root.flex_item_size_cache;
|
|
|
+ auto it = size_cache.find(&flex_item.box);
|
|
|
+ if (it != size_cache.end())
|
|
|
+ return it->value;
|
|
|
+ auto main_size = calculate_indefinite_main_size(flex_item);
|
|
|
+ size_cache.set(&flex_item.box, main_size);
|
|
|
+ return main_size;
|
|
|
}();
|
|
|
|
|
|
// The hypothetical main size is the item’s flex base size clamped according to its used min and max main sizes (and flooring the content box size at zero).
|