NodeRenderingTraversal.h [plain text]
#ifndef NodeRenderingTraversal_h
#define NodeRenderingTraversal_h
#include "Element.h"
namespace WebCore {
class InsertionPoint;
namespace NodeRenderingTraversal {
class ParentDetails {
public:
ParentDetails()
: m_insertionPoint(0)
, m_resetStyleInheritance(false)
, m_outOfComposition(false)
{ }
InsertionPoint* insertionPoint() const { return m_insertionPoint; }
bool resetStyleInheritance() const { return m_resetStyleInheritance; }
bool outOfComposition() const { return m_outOfComposition; }
void didTraverseInsertionPoint(InsertionPoint*);
void didTraverseShadowRoot(const ShadowRoot*);
void childWasOutOfComposition() { m_outOfComposition = true; }
bool operator==(const ParentDetails& other)
{
return m_insertionPoint == other.m_insertionPoint
&& m_resetStyleInheritance == other.m_resetStyleInheritance
&& m_outOfComposition == other.m_outOfComposition;
}
private:
InsertionPoint* m_insertionPoint;
bool m_resetStyleInheritance;
bool m_outOfComposition;
};
ContainerNode* parent(const Node*, ParentDetails*);
ContainerNode* parentSlow(const Node*, ParentDetails*);
Node* nextSibling(const Node*);
Node* nextSiblingSlow(const Node*);
Node* previousSibling(const Node*);
Node* previousSiblingSlow(const Node*);
Node* nextInScope(const Node*);
Node* previousInScope(const Node*);
Node* parentInScope(const Node*);
Node* lastChildInScope(const Node*);
inline ContainerNode* parent(const Node* node, ParentDetails* details)
{
if (!node->needsShadowTreeWalker()) {
#ifndef NDEBUG
ParentDetails slowDetails;
ASSERT(node->parentNode() == parentSlow(node, &slowDetails));
ASSERT(slowDetails == *details);
#endif
return node->parentNodeGuaranteedHostFree();
}
return parentSlow(node, details);
}
inline Node* nextSibling(const Node* node)
{
if (!node->needsShadowTreeWalker()) {
ASSERT(nextSiblingSlow(node) == node->nextSibling());
return node->nextSibling();
}
return nextSiblingSlow(node);
}
inline Node* previousSibling(const Node* node)
{
if (!node->needsShadowTreeWalker()) {
ASSERT(previousSiblingSlow(node) == node->previousSibling());
return node->previousSibling();
}
return previousSiblingSlow(node);
}
}
}
#endif