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