mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 19:07:34 +00:00
LibWeb: Make pseudo-elements inspectable
This makes it possible to set a pseudo-element as the inspected node using Document::set_inspected_node(), Document then provides inspected_layout_node() for the painting related functions.
This commit is contained in:
parent
5e3e9b2f61
commit
ee7282cbe4
6 changed files with 28 additions and 15 deletions
|
@ -985,18 +985,29 @@ Layout::Viewport* Document::layout_node()
|
|||
return static_cast<Layout::Viewport*>(Node::layout_node());
|
||||
}
|
||||
|
||||
void Document::set_inspected_node(Node* node)
|
||||
void Document::set_inspected_node(Node* node, Optional<CSS::Selector::PseudoElement> pseudo_element)
|
||||
{
|
||||
if (m_inspected_node.ptr() == node)
|
||||
if (m_inspected_node.ptr() == node && m_inspected_pseudo_element == pseudo_element)
|
||||
return;
|
||||
|
||||
if (m_inspected_node && m_inspected_node->layout_node())
|
||||
m_inspected_node->layout_node()->set_needs_display();
|
||||
if (auto layout_node = inspected_layout_node())
|
||||
layout_node->set_needs_display();
|
||||
|
||||
m_inspected_node = node;
|
||||
m_inspected_pseudo_element = pseudo_element;
|
||||
|
||||
if (m_inspected_node && m_inspected_node->layout_node())
|
||||
m_inspected_node->layout_node()->set_needs_display();
|
||||
if (auto layout_node = inspected_layout_node())
|
||||
layout_node->set_needs_display();
|
||||
}
|
||||
|
||||
Layout::Node* Document::inspected_layout_node()
|
||||
{
|
||||
if (!m_inspected_node)
|
||||
return nullptr;
|
||||
if (!m_inspected_pseudo_element.has_value() || !m_inspected_node->is_element())
|
||||
return m_inspected_node->layout_node();
|
||||
auto& element = static_cast<Element&>(*m_inspected_node);
|
||||
return element.get_pseudo_element_node(m_inspected_pseudo_element.value());
|
||||
}
|
||||
|
||||
static Node* find_common_ancestor(Node* a, Node* b)
|
||||
|
|
|
@ -136,9 +136,11 @@ public:
|
|||
Node* hovered_node() { return m_hovered_node.ptr(); }
|
||||
Node const* hovered_node() const { return m_hovered_node.ptr(); }
|
||||
|
||||
void set_inspected_node(Node*);
|
||||
void set_inspected_node(Node*, Optional<CSS::Selector::PseudoElement>);
|
||||
Node* inspected_node() { return m_inspected_node.ptr(); }
|
||||
Node const* inspected_node() const { return m_inspected_node.ptr(); }
|
||||
Layout::Node* inspected_layout_node();
|
||||
Layout::Node const* inspected_layout_node() const { return const_cast<Document*>(this)->inspected_layout_node(); }
|
||||
|
||||
Element* document_element();
|
||||
Element const* document_element() const;
|
||||
|
@ -494,6 +496,7 @@ private:
|
|||
JS::GCPtr<CSS::StyleSheetList> m_style_sheets;
|
||||
JS::GCPtr<Node> m_hovered_node;
|
||||
JS::GCPtr<Node> m_inspected_node;
|
||||
Optional<CSS::Selector::PseudoElement> m_inspected_pseudo_element;
|
||||
JS::GCPtr<Node> m_active_favicon;
|
||||
WeakPtr<HTML::BrowsingContext> m_browsing_context;
|
||||
AK::URL m_url;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue