1 /* 2 * Copyright (C) 1999 Lars Knoll (knoll (at) kde.org) 3 * (C) 1999 Antti Koivisto (koivisto (at) kde.org) 4 * (C) 2001 Dirk Mueller (mueller (at) kde.org) 5 * Copyright (C) 2004, 2007 Apple Inc. All rights reserved. 6 * Copyright (C) 2014 Samsung Electronics. All rights reserved. 7 * 8 * This library is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Library General Public 10 * License as published by the Free Software Foundation; either 11 * version 2 of the License, or (at your option) any later version. 12 * 13 * This library is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Library General Public License for more details. 17 * 18 * You should have received a copy of the GNU Library General Public License 19 * along with this library; see the file COPYING.LIB. If not, write to 20 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 21 * Boston, MA 02110-1301, USA. 22 * 23 */ 24 25 #ifndef ChildNodeList_h 26 #define ChildNodeList_h 27 28 #include "core/dom/NodeList.h" 29 #include "core/html/CollectionIndexCache.h" 30 #include "wtf/PassRefPtr.h" 31 32 namespace WebCore { 33 34 class ChildNodeList FINAL : public NodeList { 35 public: 36 static PassRefPtrWillBeRawPtr<ChildNodeList> create(ContainerNode& rootNode) 37 { 38 return adoptRefWillBeNoop(new ChildNodeList(rootNode)); 39 } 40 41 virtual ~ChildNodeList(); 42 43 // DOM API. 44 virtual unsigned length() const OVERRIDE { return m_collectionIndexCache.nodeCount(*this); } 45 virtual Node* item(unsigned index) const OVERRIDE { return m_collectionIndexCache.nodeAt(*this, index); } 46 47 // Non-DOM API. 48 void invalidateCache() { m_collectionIndexCache.invalidate(); } 49 ContainerNode& ownerNode() const { return *m_parent; } 50 51 ContainerNode& rootNode() const { return ownerNode(); } 52 53 // CollectionIndexCache API. 54 bool canTraverseBackward() const { return true; } 55 Node* traverseToFirstElement() const { return rootNode().firstChild(); } 56 Node* traverseToLastElement() const { return rootNode().lastChild(); } 57 Node* traverseForwardToOffset(unsigned offset, Node& currentNode, unsigned& currentOffset) const; 58 Node* traverseBackwardToOffset(unsigned offset, Node& currentNode, unsigned& currentOffset) const; 59 60 virtual void trace(Visitor*) OVERRIDE; 61 62 private: 63 explicit ChildNodeList(ContainerNode& rootNode); 64 65 virtual bool isChildNodeList() const OVERRIDE { return true; } 66 virtual Node* virtualOwnerNode() const OVERRIDE; 67 68 RefPtrWillBeMember<ContainerNode> m_parent; 69 mutable CollectionIndexCache<ChildNodeList, Node> m_collectionIndexCache; 70 }; 71 72 DEFINE_TYPE_CASTS(ChildNodeList, NodeList, nodeList, nodeList->isChildNodeList(), nodeList.isChildNodeList()); 73 74 } // namespace WebCore 75 76 #endif // ChildNodeList_h 77