Build fix after r122115 and some cleanups.
[WebKit-https.git] / Source / WebCore / html / HTMLPropertiesCollection.h
1 /*
2  * Copyright (c) 2011 Motorola Mobility, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without modification,
5  * are permitted provided that the following conditions are met:
6  *
7  * Redistributions of source code must retain the above copyright notice,
8  * this list of conditions and the following disclaimer.
9  *
10  * Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation and/or
12  * other materials provided with the distribution.
13  *
14  * Neither the name of Motorola Mobility, Inc. nor the names of its contributors may
15  * be used to endorse or promote products derived from this software without
16  * specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
20  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
26  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #ifndef HTMLPropertiesCollection_h
32 #define HTMLPropertiesCollection_h
33
34 #if ENABLE(MICRODATA)
35
36 #include "DOMStringList.h"
37 #include "HTMLCollection.h"
38
39 namespace WebCore {
40
41 class DOMStringList;
42
43 class HTMLPropertiesCollection : public HTMLCollection {
44 public:
45     static PassRefPtr<HTMLPropertiesCollection> create(Node*);
46     virtual ~HTMLPropertiesCollection();
47
48     unsigned length() const OVERRIDE;
49
50     virtual Node* item(unsigned) const OVERRIDE;
51
52     PassRefPtr<DOMStringList> names() const;
53
54     virtual PassRefPtr<NodeList> namedItem(const String&) const OVERRIDE;
55     virtual bool hasNamedItem(const AtomicString&) const OVERRIDE;
56
57 private:
58     HTMLPropertiesCollection(Node*);
59
60     unsigned calcLength() const;
61     void findProperties(Element* base) const;
62
63     Node* findRefElements(Node* previous) const;
64
65     Element* firstProperty() const;
66     Element* itemAfter(Element* base, Element* previous) const;
67
68     void updateNameCache() const;
69     void updateRefElements() const;
70
71     void invalidateCacheIfNeeded() const;
72
73     mutable struct {
74         uint64_t version;
75         Element* current;
76         unsigned position;
77         unsigned length;
78         bool hasLength;
79         bool hasNameCache;
80         NodeCacheMap propertyCache;
81         Vector<Element*> itemRefElements;
82         RefPtr<DOMStringList> propertyNames;
83         unsigned itemRefElementPosition;
84         bool hasItemRefElements;
85
86         void clear()
87         {
88             version = 0;
89             current = 0;
90             position = 0;
91             length = 0;
92             hasLength = false;
93             hasNameCache = false;
94             propertyCache.clear();
95             itemRefElements.clear();
96             propertyNames.clear();
97             itemRefElementPosition = 0;
98             hasItemRefElements = false;
99         }
100
101         void setItemRefElements(const Vector<Element*>& elements)
102         {
103             itemRefElements = elements;
104             hasItemRefElements = true;
105         }
106
107         const Vector<Element*>& getItemRefElements()
108         {
109             return itemRefElements;
110         }
111
112         void updateLength(unsigned len)
113         {
114             length = len;
115             hasLength = true;
116         }
117
118         void updatePropertyCache(Element* element, const AtomicString& propertyName)
119         {
120             if (!propertyNames)
121                 propertyNames = DOMStringList::create();
122
123             if (!propertyNames->contains(propertyName))
124                 propertyNames->append(propertyName);
125
126             Vector<Element*>* propertyResults = propertyCache.get(propertyName.impl());
127             if (!propertyResults || !propertyResults->contains(element))
128                 append(propertyCache, propertyName, element);
129         }
130
131         void updateCurrentItem(Element* element, unsigned pos, unsigned itemRefElementPos)
132         {
133             current = element;
134             position = pos;
135             itemRefElementPosition = itemRefElementPos;
136         }
137
138         void resetPosition()
139         {
140             current = 0;
141             position = 0;
142             itemRefElementPosition = 0;
143         }
144
145     } m_cache;
146
147 };
148
149 } // namespace WebCore
150
151 #endif // ENABLE(MICRODATA)
152
153 #endif // HTMLPropertiesCollection_h