NodeRenderingTraversal.cpp [plain text]
#include "config.h"
#include "NodeRenderingTraversal.h"
#include "ComposedShadowTreeWalker.h"
#include "PseudoElement.h"
namespace WebCore {
namespace NodeRenderingTraversal {
void ParentDetails::didTraverseInsertionPoint(InsertionPoint* insertionPoint)
{
if (!m_insertionPoint) {
m_insertionPoint = insertionPoint;
m_resetStyleInheritance = m_resetStyleInheritance || insertionPoint->resetStyleInheritance();
}
}
void ParentDetails::didTraverseShadowRoot(const ShadowRoot* root)
{
m_resetStyleInheritance = m_resetStyleInheritance || root->resetStyleInheritance();
}
ContainerNode* parentSlow(const Node* node, ParentDetails* details)
{
ComposedShadowTreeWalker walker(node, ComposedShadowTreeWalker::CrossUpperBoundary, ComposedShadowTreeWalker::CanStartFromShadowBoundary);
ContainerNode* found = toContainerNode(walker.traverseParent(walker.get(), details));
return details->outOfComposition() ? 0 : found;
}
Node* nextSiblingSlow(const Node* node)
{
ComposedShadowTreeWalker walker(node);
if (node->isBeforePseudoElement()) {
walker.parent();
walker.firstChild();
} else
walker.nextSibling();
if (walker.get() || node->isAfterPseudoElement())
return walker.get();
Node* parent = walker.traverseParent(node);
if (parent && parent->isElementNode())
return toElement(parent)->pseudoElement(AFTER);
return 0;
}
Node* previousSiblingSlow(const Node* node)
{
ComposedShadowTreeWalker walker(node);
if (node->isAfterPseudoElement()) {
walker.parent();
walker.lastChild();
} else
walker.previousSibling();
if (walker.get() || node->isBeforePseudoElement())
return walker.get();
Node* parent = walker.traverseParent(node);
if (parent && parent->isElementNode())
return toElement(parent)->pseudoElement(BEFORE);
return 0;
}
Node* nextInScope(const Node* node)
{
ComposedShadowTreeWalker walker = ComposedShadowTreeWalker(node, ComposedShadowTreeWalker::DoNotCrossUpperBoundary);
walker.next();
return walker.get();
}
Node* previousInScope(const Node* node)
{
ComposedShadowTreeWalker walker = ComposedShadowTreeWalker(node, ComposedShadowTreeWalker::DoNotCrossUpperBoundary);
walker.previous();
return walker.get();
}
Node* parentInScope(const Node* node)
{
ComposedShadowTreeWalker walker = ComposedShadowTreeWalker(node, ComposedShadowTreeWalker::DoNotCrossUpperBoundary);
walker.parent();
return walker.get();
}
Node* lastChildInScope(const Node* node)
{
ComposedShadowTreeWalker walker = ComposedShadowTreeWalker(node, ComposedShadowTreeWalker::DoNotCrossUpperBoundary);
walker.lastChild();
return walker.get();
}
}
}