2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public License
17 * along with this library; see the file COPYING.LIB. If not, write to
18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
23 #ifndef HTMLCollection_h
24 #define HTMLCollection_h
26 #include <wtf/RefCounted.h>
27 #include <wtf/Forward.h>
28 #include <wtf/HashMap.h>
29 #include <wtf/Vector.h>
34 class AtomicStringImpl
;
40 class HTMLCollection
: public RefCounted
<HTMLCollection
> {
43 // unnamed collection types cached in the document
45 DocImages
, // all <img> elements in the document
46 DocApplets
, // all <object> and <applet> elements
47 DocEmbeds
, // all <embed> elements
48 DocObjects
, // all <object> elements
49 DocForms
, // all <form> elements
50 DocLinks
, // all <a> _and_ <area> elements with a value for href
51 DocAnchors
, // all <a> elements with a value for name
52 DocScripts
, // all <script> elements
54 DocAll
, // "all" elements (IE)
55 NodeChildren
, // first-level children (IE)
57 // named collection types cached in the document
62 // types not cached in the document; these are types that can't be used on a document
64 TableTBodies
, // all <tbody> elements in this table
65 TSectionRows
, // all row elements in this table section
66 TRCells
, // all cells in this row
73 static const Type FirstUnnamedDocumentCachedType
= DocImages
;
74 static const unsigned NumUnnamedDocumentCachedTypes
= NodeChildren
- DocImages
+ 1;
76 static const Type FirstNamedDocumentCachedType
= WindowNamedItems
;
77 static const unsigned NumNamedDocumentCachedTypes
= DocumentNamedItems
- WindowNamedItems
+ 1;
79 static PassRefPtr
<HTMLCollection
> create(PassRefPtr
<Node
> base
, Type
);
80 virtual ~HTMLCollection();
82 unsigned length() const;
84 virtual Node
* item(unsigned index
) const;
85 virtual Node
* nextItem() const;
87 virtual Node
* namedItem(const AtomicString
& name
) const;
88 virtual Node
* nextNamedItem(const AtomicString
& name
) const; // In case of multiple items named the same way
90 Node
* firstItem() const;
92 void namedItems(const AtomicString
& name
, Vector
<RefPtr
<Node
> >&) const;
94 PassRefPtr
<NodeList
> tags(const String
&);
96 Node
* base() const { return m_base
.get(); }
97 Type
type() const { return m_type
; }
99 // FIXME: This class name is a bad in two ways. First, "info" is much too vague,
100 // and doesn't convey the job of this class (caching collection state).
101 // Second, since this is a member of HTMLCollection, it doesn't need "collection"
103 struct CollectionInfo
{
105 CollectionInfo(const CollectionInfo
&);
106 CollectionInfo
& operator=(const CollectionInfo
& other
)
108 CollectionInfo
tmp(other
);
115 void swap(CollectionInfo
&);
117 typedef HashMap
<AtomicStringImpl
*, Vector
<Element
*>*> NodeCacheMap
;
123 int elementsArrayPosition
;
124 NodeCacheMap idCache
;
125 NodeCacheMap nameCache
;
130 static void copyCacheMap(NodeCacheMap
&, const NodeCacheMap
&);
134 HTMLCollection(PassRefPtr
<Node
> base
, Type
, CollectionInfo
*);
136 CollectionInfo
* info() const { return m_info
; }
137 virtual void resetCollectionInfo() const;
139 mutable bool m_idsDone
; // for nextNamedItem()
142 HTMLCollection(PassRefPtr
<Node
> base
, Type
);
144 virtual Element
* itemAfter(Element
*) const;
145 virtual unsigned calcLength() const;
146 virtual void updateNameCache() const;
148 bool checkForNameMatch(Element
*, bool checkName
, const AtomicString
& name
) const;
153 mutable CollectionInfo
* m_info
;
154 mutable bool m_ownsInfo
;