15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2000 Frederik Holljen (frederik.holljen@hig.no)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2001 Peter Kelly (pmk@post.com)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2008 Apple Inc. All rights reserved.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/TreeWalker.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionMessages.h"
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ContainerNode.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeTraversal.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)TreeWalker::TreeWalker(PassRefPtrWillBeRawPtr<Node> rootNode, unsigned whatToShow, PassRefPtrWillBeRawPtr<NodeFilter> filter)
37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : NodeIteratorBase(rootNode, whatToShow, filter)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_current(root())
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void TreeWalker::setCurrentNode(PassRefPtrWillBeRawPtr<Node> node, ExceptionState& exceptionState)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node) {
45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        exceptionState.throwDOMException(NotSupportedError, ExceptionMessages::argumentNullOrIncorrectType(1, "Node"));
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_current = node;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)inline Node* TreeWalker::setCurrent(PassRefPtrWillBeRawPtr<Node> node)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_current = node;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_current.get();
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochNode* TreeWalker::parentNode(ExceptionState& exceptionState)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
59d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Node> node = m_current;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (node != root()) {
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node = node->parentNode();
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!node)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
64a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        short acceptNodeResult = acceptNode(node.get(), exceptionState);
65a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (exceptionState.hadException())
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (acceptNodeResult == NodeFilter::FILTER_ACCEPT)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return setCurrent(node.release());
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
73a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochNode* TreeWalker::firstChild(ExceptionState& exceptionState)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
75d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    for (RefPtrWillBeRawPtr<Node> node = m_current->firstChild(); node; ) {
76a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        short acceptNodeResult = acceptNode(node.get(), exceptionState);
77a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (exceptionState.hadException())
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (acceptNodeResult) {
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case NodeFilter::FILTER_ACCEPT:
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_current = node.release();
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return m_current.get();
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case NodeFilter::FILTER_SKIP:
84c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                if (node->hasChildren()) {
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    node = node->firstChild();
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    continue;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case NodeFilter::FILTER_REJECT:
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        do {
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (node->nextSibling()) {
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                node = node->nextSibling();
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ContainerNode* parent = node->parentNode();
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!parent || parent == root() || parent == m_current)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return 0;
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            node = parent;
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } while (node);
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
106a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochNode* TreeWalker::lastChild(ExceptionState& exceptionState)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
108d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    for (RefPtrWillBeRawPtr<Node> node = m_current->lastChild(); node; ) {
109a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        short acceptNodeResult = acceptNode(node.get(), exceptionState);
110a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (exceptionState.hadException())
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (acceptNodeResult) {
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case NodeFilter::FILTER_ACCEPT:
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_current = node.release();
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return m_current.get();
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case NodeFilter::FILTER_SKIP:
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (node->lastChild()) {
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    node = node->lastChild();
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    continue;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case NodeFilter::FILTER_REJECT:
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        do {
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (node->previousSibling()) {
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                node = node->previousSibling();
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ContainerNode* parent = node->parentNode();
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!parent || parent == root() || parent == m_current)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return 0;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            node = parent;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } while (node);
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
139a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochNode* TreeWalker::previousSibling(ExceptionState& exceptionState)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
141d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Node> node = m_current;
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (node == root())
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (1) {
145d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        for (RefPtrWillBeRawPtr<Node> sibling = node->previousSibling(); sibling; ) {
146a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            short acceptNodeResult = acceptNode(sibling.get(), exceptionState);
147a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            if (exceptionState.hadException())
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return 0;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            switch (acceptNodeResult) {
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                case NodeFilter::FILTER_ACCEPT:
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    m_current = sibling.release();
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    return m_current.get();
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                case NodeFilter::FILTER_SKIP:
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (sibling->lastChild()) {
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        sibling = sibling->lastChild();
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        node = sibling;
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        continue;
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    }
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    break;
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                case NodeFilter::FILTER_REJECT:
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    break;
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            sibling = sibling->previousSibling();
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node = node->parentNode();
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!node || node == root())
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
168a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        short acceptNodeResult = acceptNode(node.get(), exceptionState);
169a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (exceptionState.hadException())
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (acceptNodeResult == NodeFilter::FILTER_ACCEPT)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
176a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochNode* TreeWalker::nextSibling(ExceptionState& exceptionState)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
178d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Node> node = m_current;
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (node == root())
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (1) {
182d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        for (RefPtrWillBeRawPtr<Node> sibling = node->nextSibling(); sibling; ) {
183a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            short acceptNodeResult = acceptNode(sibling.get(), exceptionState);
184a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            if (exceptionState.hadException())
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return 0;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            switch (acceptNodeResult) {
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                case NodeFilter::FILTER_ACCEPT:
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    m_current = sibling.release();
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    return m_current.get();
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                case NodeFilter::FILTER_SKIP:
191c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                    if (sibling->hasChildren()) {
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        sibling = sibling->firstChild();
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        node = sibling;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        continue;
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    }
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    break;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                case NodeFilter::FILTER_REJECT:
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    break;
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            sibling = sibling->nextSibling();
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node = node->parentNode();
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!node || node == root())
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
205a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        short acceptNodeResult = acceptNode(node.get(), exceptionState);
206a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (exceptionState.hadException())
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (acceptNodeResult == NodeFilter::FILTER_ACCEPT)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
213a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochNode* TreeWalker::previousNode(ExceptionState& exceptionState)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
215d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Node> node = m_current;
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (node != root()) {
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (Node* previousSibling = node->previousSibling()) {
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            node = previousSibling;
219a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            short acceptNodeResult = acceptNode(node.get(), exceptionState);
220a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            if (exceptionState.hadException())
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return 0;
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (acceptNodeResult == NodeFilter::FILTER_REJECT)
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                continue;
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            while (Node* lastChild = node->lastChild()) {
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                node = lastChild;
226a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                acceptNodeResult = acceptNode(node.get(), exceptionState);
227a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                if (exceptionState.hadException())
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    return 0;
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (acceptNodeResult == NodeFilter::FILTER_REJECT)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    break;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (acceptNodeResult == NodeFilter::FILTER_ACCEPT) {
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_current = node.release();
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return m_current.get();
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node == root())
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ContainerNode* parent = node->parentNode();
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!parent)
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node = parent;
243a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        short acceptNodeResult = acceptNode(node.get(), exceptionState);
244a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (exceptionState.hadException())
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (acceptNodeResult == NodeFilter::FILTER_ACCEPT)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return setCurrent(node.release());
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
252a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochNode* TreeWalker::nextNode(ExceptionState& exceptionState)
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
254d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Node> node = m_current;
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Children:
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (Node* firstChild = node->firstChild()) {
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node = firstChild;
258a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        short acceptNodeResult = acceptNode(node.get(), exceptionState);
259a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (exceptionState.hadException())
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (acceptNodeResult == NodeFilter::FILTER_ACCEPT)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return setCurrent(node.release());
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (acceptNodeResult == NodeFilter::FILTER_REJECT)
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    while (Node* nextSibling = NodeTraversal::nextSkippingChildren(*node, root())) {
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node = nextSibling;
268a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        short acceptNodeResult = acceptNode(node.get(), exceptionState);
269a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (exceptionState.hadException())
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (acceptNodeResult == NodeFilter::FILTER_ACCEPT)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return setCurrent(node.release());
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (acceptNodeResult == NodeFilter::FILTER_SKIP)
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            goto Children;
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
279d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void TreeWalker::trace(Visitor* visitor)
280d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
281d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    visitor->trace(m_current);
282d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    NodeIteratorBase::trace(visitor);
283d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
284d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
285c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
286