Skip to content

Commit ca55d7b

Browse files
committed
Eliminate virtual function call in Node::pseudoId()
https://bugs.webkit.org/show_bug.cgi?id=292099 Reviewed by Anne van Kesteren. Devirtualize Node::pseudoId() by storing a bit for IsPseudoElement. * Source/WebCore/dom/Node.h: (WebCore::Node::isPseudoElement const): (WebCore::Node::isBeforePseudoElement const): Moved to NodeInlines.h (WebCore::Node::isAfterPseudoElement const): Ditto. (WebCore::Node::pseudoId const): Ditto. (WebCore::Node::customPseudoId const): Deleted. * Source/WebCore/dom/NodeInlines.h: (WebCore::Node::isBeforePseudoElement const): (WebCore::Node::isAfterPseudoElement const): (WebCore::Node::pseudoId const): * Source/WebCore/dom/PseudoElement.cpp: (WebCore::PseudoElement::PseudoElement): * Source/WebCore/dom/PseudoElement.h: * Source/WebCore/style/Styleable.h: Canonical link: https://commits.webkit.org/294168@main
1 parent ae26773 commit ca55d7b

File tree

5 files changed

+28
-13
lines changed

5 files changed

+28
-13
lines changed

Source/WebCore/dom/Node.h

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -234,10 +234,10 @@ class Node : public EventTarget, public CanMakeCheckedPtr<Node> {
234234

235235
bool isFormControlElement() const { return hasTypeFlag(TypeFlag::IsFormControlElement); }
236236

237-
bool isPseudoElement() const { return pseudoId() != PseudoId::None; }
238-
bool isBeforePseudoElement() const { return pseudoId() == PseudoId::Before; }
239-
bool isAfterPseudoElement() const { return pseudoId() == PseudoId::After; }
240-
PseudoId pseudoId() const { return (isElementNode() && hasCustomStyleResolveCallbacks()) ? customPseudoId() : PseudoId::None; }
237+
bool isPseudoElement() const { return hasStateFlag(StateFlag::IsPseudoElement); }
238+
inline bool isBeforePseudoElement() const;
239+
inline bool isAfterPseudoElement() const;
240+
inline PseudoId pseudoId() const;
241241

242242
#if ENABLE(VIDEO)
243243
virtual bool isWebVTTElement() const { return false; }
@@ -645,8 +645,9 @@ class Node : public EventTarget, public CanMakeCheckedPtr<Node> {
645645
#endif
646646
ContainsSelectionEndPoint = 1 << 11,
647647
IsSpecialInternalNode = 1 << 12, // DocumentFragment node for innerHTML/outerHTML or EditingText node.
648+
IsPseudoElement = 1 << 13, // FIXME: This belongs to TypeFlag.
648649

649-
// 3 bits free.
650+
// 2 bits free.
650651
};
651652

652653
enum class ElementStateFlag : uint16_t {
@@ -778,12 +779,6 @@ class Node : public EventTarget, public CanMakeCheckedPtr<Node> {
778779
ExceptionOr<NodeVector> convertNodesOrStringsIntoNodeVector(FixedVector<NodeOrString>&&);
779780

780781
private:
781-
virtual PseudoId customPseudoId() const
782-
{
783-
ASSERT(hasCustomStyleResolveCallbacks());
784-
return PseudoId::None;
785-
}
786-
787782
WEBCORE_EXPORT void removedLastRef();
788783

789784
void refEventTarget() final;

Source/WebCore/dom/NodeInlines.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "Document.h"
2525
#include "Element.h"
2626
#include "Node.h"
27+
#include "PseudoElement.h"
2728
#include "WebCoreOpaqueRoot.h"
2829

2930
namespace WebCore {
@@ -70,6 +71,23 @@ inline RefPtr<Element> Node::protectedParentElement() const
7071
return parentElement();
7172
}
7273

74+
bool Node::isBeforePseudoElement() const
75+
{
76+
return pseudoId() == PseudoId::Before;
77+
}
78+
79+
bool Node::isAfterPseudoElement() const
80+
{
81+
return pseudoId() == PseudoId::After;
82+
}
83+
84+
PseudoId Node::pseudoId() const
85+
{
86+
if (auto* pseudoElement = dynamicDowncast<PseudoElement>(*this))
87+
return pseudoElement->pseudoId();
88+
return PseudoId::None;
89+
}
90+
7391
inline void Node::setTabIndexState(TabIndexState state)
7492
{
7593
auto bitfields = rareDataBitfields();

Source/WebCore/dom/PseudoElement.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ PseudoElement::PseudoElement(Element& host, PseudoId pseudoId)
5454
, m_pseudoId(pseudoId)
5555
{
5656
setEventTargetFlag(EventTargetFlag::IsConnected);
57+
setStateFlag(StateFlag::IsPseudoElement);
5758
ASSERT(pseudoId == PseudoId::Before || pseudoId == PseudoId::After);
5859
}
5960

Source/WebCore/dom/PseudoElement.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ class PseudoElement final : public Element {
4141
Element* hostElement() const { return m_hostElement.get(); }
4242
void clearHostElement();
4343

44+
PseudoId pseudoId() const { return m_pseudoId; }
45+
4446
bool rendererIsNeeded(const RenderStyle&) override;
4547

4648
bool canStartSelection() const override { return false; }
@@ -49,8 +51,6 @@ class PseudoElement final : public Element {
4951
private:
5052
PseudoElement(Element&, PseudoId);
5153

52-
PseudoId customPseudoId() const override { return m_pseudoId; }
53-
5454
WeakPtr<Element, WeakPtrImplWithEventTargetData> m_hostElement;
5555
PseudoId m_pseudoId;
5656
};

Source/WebCore/style/Styleable.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#pragma once
2727

2828
#include "Element.h"
29+
#include "NodeInlines.h"
2930
#include "PseudoElement.h"
3031
#include "PseudoElementIdentifier.h"
3132
#include "RenderStyleConstants.h"

0 commit comments

Comments
 (0)