diff options
Diffstat (limited to 'Userland/Libraries/LibWeb/DOM')
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Document.cpp | 23 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Document.h | 5 |
2 files changed, 21 insertions, 7 deletions
diff --git a/Userland/Libraries/LibWeb/DOM/Document.cpp b/Userland/Libraries/LibWeb/DOM/Document.cpp index 321525d278..3ed261fd9d 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.cpp +++ b/Userland/Libraries/LibWeb/DOM/Document.cpp @@ -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) diff --git a/Userland/Libraries/LibWeb/DOM/Document.h b/Userland/Libraries/LibWeb/DOM/Document.h index 86aa2c6ba3..cacf78351a 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.h +++ b/Userland/Libraries/LibWeb/DOM/Document.h @@ -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; |