mirror of
https://github.com/RGBCube/serenity
synced 2025-06-01 10:08:10 +00:00
LibWeb: Copy various flags from layout node to paintable
This removes indirection when asking if a paintable is positioned, floating, etc. Removes a bunch of 1-1.5% items in the profile when hovering links on ziglang.org.
This commit is contained in:
parent
c69b266e43
commit
881e7fcee1
2 changed files with 28 additions and 21 deletions
|
@ -16,6 +16,21 @@ Paintable::Paintable(Layout::Node const& layout_node)
|
|||
: m_layout_node(layout_node)
|
||||
, m_browsing_context(const_cast<HTML::BrowsingContext&>(layout_node.browsing_context()))
|
||||
{
|
||||
auto& computed_values = layout_node.computed_values();
|
||||
m_visible = computed_values.visibility() == CSS::Visibility::Visible && computed_values.opacity() != 0;
|
||||
|
||||
if (layout_node.is_grid_item() && computed_values.z_index().has_value()) {
|
||||
// https://www.w3.org/TR/css-grid-2/#z-order
|
||||
// grid items with z_index should behave as if position were "relative"
|
||||
m_positioned = true;
|
||||
} else {
|
||||
m_positioned = computed_values.position() != CSS::Positioning::Static;
|
||||
}
|
||||
|
||||
m_fixed_position = computed_values.position() == CSS::Positioning::Fixed;
|
||||
m_absolutely_positioned = computed_values.position() == CSS::Positioning::Absolute;
|
||||
m_floating = layout_node.is_floating();
|
||||
m_inline = layout_node.is_inline();
|
||||
}
|
||||
|
||||
Paintable::~Paintable()
|
||||
|
@ -33,21 +48,6 @@ void Paintable::visit_edges(Cell::Visitor& visitor)
|
|||
visitor.visit(m_containing_block.value());
|
||||
}
|
||||
|
||||
bool Paintable::is_visible() const
|
||||
{
|
||||
return computed_values().visibility() == CSS::Visibility::Visible && computed_values().opacity() != 0;
|
||||
}
|
||||
|
||||
bool Paintable::is_positioned() const
|
||||
{
|
||||
if (layout_node().is_grid_item() && computed_values().z_index().has_value()) {
|
||||
// https://www.w3.org/TR/css-grid-2/#z-order
|
||||
// grid items with z_index should behave as if position were "relative"
|
||||
return true;
|
||||
}
|
||||
return computed_values().position() != CSS::Positioning::Static;
|
||||
}
|
||||
|
||||
void Paintable::set_dom_node(JS::GCPtr<DOM::Node> dom_node)
|
||||
{
|
||||
m_dom_node = dom_node;
|
||||
|
|
|
@ -56,12 +56,12 @@ class Paintable
|
|||
public:
|
||||
virtual ~Paintable();
|
||||
|
||||
[[nodiscard]] bool is_visible() const;
|
||||
[[nodiscard]] bool is_positioned() const;
|
||||
[[nodiscard]] bool is_fixed_position() const { return layout_node().is_fixed_position(); }
|
||||
[[nodiscard]] bool is_absolutely_positioned() const { return layout_node().is_absolutely_positioned(); }
|
||||
[[nodiscard]] bool is_floating() const { return layout_node().is_floating(); }
|
||||
[[nodiscard]] bool is_inline() const { return layout_node().is_inline(); }
|
||||
[[nodiscard]] bool is_visible() const { return m_visible; }
|
||||
[[nodiscard]] bool is_positioned() const { return m_positioned; }
|
||||
[[nodiscard]] bool is_fixed_position() const { return m_fixed_position; }
|
||||
[[nodiscard]] bool is_absolutely_positioned() const { return m_absolutely_positioned; }
|
||||
[[nodiscard]] bool is_floating() const { return m_floating; }
|
||||
[[nodiscard]] bool is_inline() const { return m_inline; }
|
||||
[[nodiscard]] CSS::Display display() const { return layout_node().display(); }
|
||||
|
||||
template<typename U, typename Callback>
|
||||
|
@ -217,6 +217,13 @@ private:
|
|||
Optional<JS::GCPtr<PaintableBox>> mutable m_containing_block;
|
||||
|
||||
OwnPtr<StackingContext> m_stacking_context;
|
||||
|
||||
bool m_visible : 1 { false };
|
||||
bool m_positioned : 1 { false };
|
||||
bool m_fixed_position : 1 { false };
|
||||
bool m_absolutely_positioned : 1 { false };
|
||||
bool m_floating : 1 { false };
|
||||
bool m_inline : 1 { false };
|
||||
};
|
||||
|
||||
inline DOM::Node* HitTestResult::dom_node()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue