mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 23:17:45 +00:00
LibWeb: Add info about pseudo element type in Layout::Node
This commit is contained in:
parent
74636ccb57
commit
b6ea4b002b
3 changed files with 44 additions and 5 deletions
|
@ -915,6 +915,18 @@ DOM::Node* Node::dom_node()
|
|||
return m_dom_node.ptr();
|
||||
}
|
||||
|
||||
DOM::Element const* Node::pseudo_element_generator() const
|
||||
{
|
||||
VERIFY(m_generated_for != GeneratedFor::NotGenerated);
|
||||
return m_pseudo_element_generator.ptr();
|
||||
}
|
||||
|
||||
DOM::Element* Node::pseudo_element_generator()
|
||||
{
|
||||
VERIFY(m_generated_for != GeneratedFor::NotGenerated);
|
||||
return m_pseudo_element_generator.ptr();
|
||||
}
|
||||
|
||||
DOM::Document& Node::document()
|
||||
{
|
||||
return m_dom_node->document();
|
||||
|
|
|
@ -46,8 +46,22 @@ public:
|
|||
DOM::Node const* dom_node() const;
|
||||
DOM::Node* dom_node();
|
||||
|
||||
bool is_generated() const { return m_generated; }
|
||||
void set_generated(bool b) { m_generated = b; }
|
||||
DOM::Element const* pseudo_element_generator() const;
|
||||
DOM::Element* pseudo_element_generator();
|
||||
|
||||
enum class GeneratedFor {
|
||||
NotGenerated,
|
||||
PseudoBefore,
|
||||
PseudoAfter
|
||||
};
|
||||
bool is_generated() const { return m_generated_for != GeneratedFor::NotGenerated; }
|
||||
bool is_generated_for_before_pseudo_element() const { return m_generated_for == GeneratedFor::PseudoBefore; }
|
||||
bool is_generated_for_after_pseudo_element() const { return m_generated_for == GeneratedFor::PseudoAfter; }
|
||||
void set_generated_for(GeneratedFor type, DOM::Element& element)
|
||||
{
|
||||
m_generated_for = type;
|
||||
m_pseudo_element_generator = &element;
|
||||
}
|
||||
|
||||
Painting::Paintable* paintable() { return m_paintable; }
|
||||
Painting::Paintable const* paintable() const { return m_paintable; }
|
||||
|
@ -169,6 +183,8 @@ private:
|
|||
|
||||
JS::NonnullGCPtr<HTML::BrowsingContext> m_browsing_context;
|
||||
|
||||
JS::GCPtr<DOM::Element> m_pseudo_element_generator;
|
||||
|
||||
bool m_anonymous { false };
|
||||
bool m_has_style { false };
|
||||
bool m_visible { true };
|
||||
|
@ -176,7 +192,7 @@ private:
|
|||
SelectionState m_selection_state { SelectionState::None };
|
||||
|
||||
bool m_is_flex_item { false };
|
||||
bool m_generated { false };
|
||||
GeneratedFor m_generated_for { GeneratedFor::NotGenerated };
|
||||
};
|
||||
|
||||
class NodeWithStyle : public Node {
|
||||
|
|
|
@ -189,12 +189,23 @@ ErrorOr<void> TreeBuilder::create_pseudo_element_if_needed(DOM::Element& element
|
|||
if (!pseudo_element_node)
|
||||
return {};
|
||||
|
||||
pseudo_element_node->set_generated(true);
|
||||
auto generated_for = Node::GeneratedFor::NotGenerated;
|
||||
if (pseudo_element == CSS::Selector::PseudoElement::Before) {
|
||||
generated_for = Node::GeneratedFor::PseudoBefore;
|
||||
} else if (pseudo_element == CSS::Selector::PseudoElement::After) {
|
||||
generated_for = Node::GeneratedFor::PseudoAfter;
|
||||
} else {
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
pseudo_element_node->set_generated_for(generated_for, element);
|
||||
|
||||
// FIXME: Handle images, and multiple values
|
||||
if (pseudo_element_content.type == CSS::ContentData::Type::String) {
|
||||
auto text = document.heap().allocate<DOM::Text>(document.realm(), document, pseudo_element_content.data.to_deprecated_string()).release_allocated_value_but_fixme_should_propagate_errors();
|
||||
auto text_node = document.heap().allocate_without_realm<Layout::TextNode>(document, *text);
|
||||
text_node->set_generated(true);
|
||||
text_node->set_generated_for(generated_for, element);
|
||||
|
||||
push_parent(verify_cast<NodeWithStyle>(*pseudo_element_node));
|
||||
insert_node_into_inline_or_block_ancestor(*text_node, text_node->display(), AppendOrPrepend::Append);
|
||||
pop_parent();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue