|
@@ -11,44 +11,56 @@
|
|
|
|
|
|
namespace Web::Layout {
|
|
namespace Web::Layout {
|
|
|
|
|
|
|
|
+LayoutState::LayoutState(LayoutState const* parent)
|
|
|
|
+ : m_parent(parent)
|
|
|
|
+ , m_root(find_root())
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+LayoutState::~LayoutState()
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+
|
|
LayoutState::UsedValues& LayoutState::get_mutable(NodeWithStyleAndBoxModelMetrics const& box)
|
|
LayoutState::UsedValues& LayoutState::get_mutable(NodeWithStyleAndBoxModelMetrics const& box)
|
|
{
|
|
{
|
|
- auto serial_id = box.serial_id();
|
|
|
|
- if (used_values_per_layout_node[serial_id])
|
|
|
|
- return *used_values_per_layout_node[serial_id];
|
|
|
|
|
|
+ if (auto* used_values = used_values_per_layout_node.get(&box).value_or(nullptr))
|
|
|
|
+ return *used_values;
|
|
|
|
|
|
for (auto const* ancestor = m_parent; ancestor; ancestor = ancestor->m_parent) {
|
|
for (auto const* ancestor = m_parent; ancestor; ancestor = ancestor->m_parent) {
|
|
- if (ancestor->used_values_per_layout_node[serial_id]) {
|
|
|
|
- auto cow_used_values = adopt_own(*new UsedValues(*ancestor->used_values_per_layout_node[serial_id]));
|
|
|
|
|
|
+ if (auto* ancestor_used_values = ancestor->used_values_per_layout_node.get(&box).value_or(nullptr)) {
|
|
|
|
+ auto cow_used_values = adopt_own(*new UsedValues(*ancestor_used_values));
|
|
auto* cow_used_values_ptr = cow_used_values.ptr();
|
|
auto* cow_used_values_ptr = cow_used_values.ptr();
|
|
- used_values_per_layout_node[serial_id] = move(cow_used_values);
|
|
|
|
|
|
+ used_values_per_layout_node.set(&box, move(cow_used_values));
|
|
return *cow_used_values_ptr;
|
|
return *cow_used_values_ptr;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
auto const* containing_block_used_values = box.is_viewport() ? nullptr : &get(*box.containing_block());
|
|
auto const* containing_block_used_values = box.is_viewport() ? nullptr : &get(*box.containing_block());
|
|
|
|
|
|
- used_values_per_layout_node[serial_id] = adopt_own(*new UsedValues);
|
|
|
|
- used_values_per_layout_node[serial_id]->set_node(const_cast<NodeWithStyleAndBoxModelMetrics&>(box), containing_block_used_values);
|
|
|
|
- return *used_values_per_layout_node[serial_id];
|
|
|
|
|
|
+ auto new_used_values = adopt_own(*new UsedValues);
|
|
|
|
+ auto* new_used_values_ptr = new_used_values.ptr();
|
|
|
|
+ new_used_values->set_node(const_cast<NodeWithStyleAndBoxModelMetrics&>(box), containing_block_used_values);
|
|
|
|
+ used_values_per_layout_node.set(&box, move(new_used_values));
|
|
|
|
+ return *new_used_values_ptr;
|
|
}
|
|
}
|
|
|
|
|
|
LayoutState::UsedValues const& LayoutState::get(NodeWithStyleAndBoxModelMetrics const& box) const
|
|
LayoutState::UsedValues const& LayoutState::get(NodeWithStyleAndBoxModelMetrics const& box) const
|
|
{
|
|
{
|
|
- auto serial_id = box.serial_id();
|
|
|
|
- if (used_values_per_layout_node[serial_id])
|
|
|
|
- return *used_values_per_layout_node[serial_id];
|
|
|
|
|
|
+ if (auto const* used_values = used_values_per_layout_node.get(&box).value_or(nullptr))
|
|
|
|
+ return *used_values;
|
|
|
|
|
|
- for (auto* ancestor = m_parent; ancestor; ancestor = ancestor->m_parent) {
|
|
|
|
- if (ancestor->used_values_per_layout_node[serial_id])
|
|
|
|
- return *ancestor->used_values_per_layout_node[serial_id];
|
|
|
|
|
|
+ for (auto const* ancestor = m_parent; ancestor; ancestor = ancestor->m_parent) {
|
|
|
|
+ if (auto const* ancestor_used_values = ancestor->used_values_per_layout_node.get(&box).value_or(nullptr))
|
|
|
|
+ return *ancestor_used_values;
|
|
}
|
|
}
|
|
|
|
|
|
auto const* containing_block_used_values = box.is_viewport() ? nullptr : &get(*box.containing_block());
|
|
auto const* containing_block_used_values = box.is_viewport() ? nullptr : &get(*box.containing_block());
|
|
|
|
|
|
- const_cast<LayoutState*>(this)->used_values_per_layout_node[serial_id] = adopt_own(*new UsedValues);
|
|
|
|
- const_cast<LayoutState*>(this)->used_values_per_layout_node[serial_id]->set_node(const_cast<NodeWithStyleAndBoxModelMetrics&>(box), containing_block_used_values);
|
|
|
|
- return *used_values_per_layout_node[serial_id];
|
|
|
|
|
|
+ auto new_used_values = adopt_own(*new UsedValues);
|
|
|
|
+ auto* new_used_values_ptr = new_used_values.ptr();
|
|
|
|
+ new_used_values->set_node(const_cast<NodeWithStyleAndBoxModelMetrics&>(box), containing_block_used_values);
|
|
|
|
+ const_cast<LayoutState*>(this)->used_values_per_layout_node.set(&box, move(new_used_values));
|
|
|
|
+ return *new_used_values_ptr;
|
|
}
|
|
}
|
|
|
|
|
|
void LayoutState::commit()
|
|
void LayoutState::commit()
|
|
@@ -58,10 +70,8 @@ void LayoutState::commit()
|
|
|
|
|
|
HashTable<Layout::TextNode*> text_nodes;
|
|
HashTable<Layout::TextNode*> text_nodes;
|
|
|
|
|
|
- for (auto& used_values_ptr : used_values_per_layout_node) {
|
|
|
|
- if (!used_values_ptr)
|
|
|
|
- continue;
|
|
|
|
- auto& used_values = *used_values_ptr;
|
|
|
|
|
|
+ for (auto& it : used_values_per_layout_node) {
|
|
|
|
+ auto& used_values = *it.value;
|
|
auto& node = const_cast<NodeWithStyleAndBoxModelMetrics&>(used_values.node());
|
|
auto& node = const_cast<NodeWithStyleAndBoxModelMetrics&>(used_values.node());
|
|
|
|
|
|
// Transfer box model metrics.
|
|
// Transfer box model metrics.
|