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/ContainerNode.h" 29 #include "core/dom/NodeList.h" 30 #include "core/html/CollectionIndexCache.h" 31 #include "wtf/PassRefPtr.h" 32 33 namespace blink { 34 35 class ChildNodeList FINAL : public NodeList { 36 public: 37 static PassRefPtrWillBeRawPtr<ChildNodeList> create(ContainerNode& rootNode) 38 { 39 return adoptRefWillBeNoop(new ChildNodeList(rootNode)); 40 } 41 42 virtual ~ChildNodeList(); 43 44 // DOM API. 45 virtual unsigned length() const OVERRIDE { return m_collectionIndexCache.nodeCount(*this); } 46 virtual Node* item(unsigned index) const OVERRIDE { return m_collectionIndexCache.nodeAt(*this, index); } 47 48 // Non-DOM API. 49 void invalidateCache() { m_collectionIndexCache.invalidate(); } 50 ContainerNode& ownerNode() const { return *m_parent; } 51 52 ContainerNode& rootNode() const { return ownerNode(); } 53 54 // CollectionIndexCache API. 55 bool canTraverseBackward() const { return true; } 56 Node* traverseToFirst() const { return rootNode().firstChild(); } 57 Node* traverseToLast() const { return rootNode().lastChild(); } 58 Node* traverseForwardToOffset(unsigned offset, Node& currentNode, unsigned& currentOffset) const; 59 Node* traverseBackwardToOffset(unsigned offset, Node& currentNode, unsigned& currentOffset) const; 60 61 virtual void trace(Visitor*) OVERRIDE; 62 63 private: 64 explicit ChildNodeList(ContainerNode& rootNode); 65 66 virtual bool isChildNodeList() const OVERRIDE { return true; } 67 virtual Node* virtualOwnerNode() const OVERRIDE; 68 69 RefPtrWillBeMember<ContainerNode> m_parent; 70 mutable CollectionIndexCache<ChildNodeList, Node> m_collectionIndexCache; 71 }; 72 73 DEFINE_TYPE_CASTS(ChildNodeList, NodeList, nodeList, nodeList->isChildNodeList(), nodeList.isChildNodeList()); 74 75 } // namespace blink 76 77 #endif // ChildNodeList_h 78