• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2001 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  *
22  */
23 
24 #ifndef DynamicNodeList_h
25 #define DynamicNodeList_h
26 
27 #include "NodeList.h"
28 #include <wtf/RefCounted.h>
29 #include <wtf/Forward.h>
30 #include <wtf/RefPtr.h>
31 
32 namespace WebCore {
33 
34     class AtomicString;
35     class Element;
36     class Node;
37 
38     class DynamicNodeList : public NodeList {
39     public:
40         struct Caches : RefCounted<Caches> {
41             static PassRefPtr<Caches> create();
42             void reset();
43 
44             unsigned cachedLength;
45             Node* lastItem;
46             unsigned lastItemOffset;
47             bool isLengthCacheValid : 1;
48             bool isItemCacheValid : 1;
49         protected:
50             Caches();
51         };
52 
53         virtual ~DynamicNodeList();
54 
hasOwnCaches()55         bool hasOwnCaches() const { return m_ownsCaches; }
56 
57         // DOM methods & attributes for NodeList
58         virtual unsigned length() const;
59         virtual Node* item(unsigned index) const;
60         virtual Node* itemWithName(const AtomicString&) const;
61 
62         // Other methods (not part of DOM)
63         void invalidateCache();
64 
65     protected:
66         DynamicNodeList(PassRefPtr<Node> rootNode);
67         DynamicNodeList(PassRefPtr<Node> rootNode, Caches*);
68 
69         virtual bool nodeMatches(Element*) const = 0;
70 
71         RefPtr<Node> m_rootNode;
72         mutable RefPtr<Caches> m_caches;
73         bool m_ownsCaches;
74 
75     private:
76         Node* itemForwardsFromCurrent(Node* start, unsigned offset, int remainingOffset) const;
77         Node* itemBackwardsFromCurrent(Node* start, unsigned offset, int remainingOffset) const;
78     };
79 
80 } // namespace WebCore
81 
82 #endif // DynamicNodeList_h
83