This source file includes following definitions.
- previousIncludingPseudo
- nextIncludingPseudo
- nextIncludingPseudoSkippingChildren
- nextAncestorSibling
- nextAncestorSibling
- previous
- previousSkippingChildren
- nextPostOrder
- previousAncestorSiblingPostOrder
- previousPostOrder
#include "config.h"
#include "core/dom/NodeTraversal.h"
#include "core/dom/ContainerNode.h"
namespace WebCore {
Node* NodeTraversal::previousIncludingPseudo(const Node& current, const Node* stayWithin)
{
if (current == stayWithin)
return 0;
if (Node* previous = current.pseudoAwarePreviousSibling()) {
while (previous->pseudoAwareLastChild())
previous = previous->pseudoAwareLastChild();
return previous;
}
return current.parentNode();
}
Node* NodeTraversal::nextIncludingPseudo(const Node& current, const Node* stayWithin)
{
if (Node* next = current.pseudoAwareFirstChild())
return next;
if (current == stayWithin)
return 0;
if (Node* next = current.pseudoAwareNextSibling())
return next;
for (Node* parent = current.parentNode(); parent; parent = parent->parentNode()) {
if (parent == stayWithin)
return 0;
if (Node* next = parent->pseudoAwareNextSibling())
return next;
}
return 0;
}
Node* NodeTraversal::nextIncludingPseudoSkippingChildren(const Node& current, const Node* stayWithin)
{
if (current == stayWithin)
return 0;
if (Node* next = current.pseudoAwareNextSibling())
return next;
for (Node* parent = current.parentNode(); parent; parent = parent->parentNode()) {
if (parent == stayWithin)
return 0;
if (Node* next = parent->pseudoAwareNextSibling())
return next;
}
return 0;
}
Node* NodeTraversal::nextAncestorSibling(const Node& current)
{
ASSERT(!current.nextSibling());
for (Node* parent = current.parentNode(); parent; parent = parent->parentNode()) {
if (parent->nextSibling())
return parent->nextSibling();
}
return 0;
}
Node* NodeTraversal::nextAncestorSibling(const Node& current, const Node* stayWithin)
{
ASSERT(!current.nextSibling());
ASSERT(current != stayWithin);
for (Node* parent = current.parentNode(); parent; parent = parent->parentNode()) {
if (parent == stayWithin)
return 0;
if (parent->nextSibling())
return parent->nextSibling();
}
return 0;
}
Node* NodeTraversal::previous(const Node& current, const Node* stayWithin)
{
if (current == stayWithin)
return 0;
if (current.previousSibling()) {
Node* previous = current.previousSibling();
while (previous->lastChild())
previous = previous->lastChild();
return previous;
}
return current.parentNode();
}
Node* NodeTraversal::previousSkippingChildren(const Node& current, const Node* stayWithin)
{
if (current == stayWithin)
return 0;
if (current.previousSibling())
return current.previousSibling();
for (Node* parent = current.parentNode(); parent; parent = parent->parentNode()) {
if (parent == stayWithin)
return 0;
if (parent->previousSibling())
return parent->previousSibling();
}
return 0;
}
Node* NodeTraversal::nextPostOrder(const Node& current, const Node* stayWithin)
{
if (current == stayWithin)
return 0;
if (!current.nextSibling())
return current.parentNode();
Node* next = current.nextSibling();
while (next->firstChild())
next = next->firstChild();
return next;
}
static Node* previousAncestorSiblingPostOrder(const Node& current, const Node* stayWithin)
{
ASSERT(!current.previousSibling());
for (Node* parent = current.parentNode(); parent; parent = parent->parentNode()) {
if (parent == stayWithin)
return 0;
if (parent->previousSibling())
return parent->previousSibling();
}
return 0;
}
Node* NodeTraversal::previousPostOrder(const Node& current, const Node* stayWithin)
{
if (current.lastChild())
return current.lastChild();
if (current == stayWithin)
return 0;
if (current.previousSibling())
return current.previousSibling();
return previousAncestorSiblingPostOrder(current, stayWithin);
}
}