OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) | 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) |
4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) | 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) |
5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights
reserved. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights
reserved. |
6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> |
8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. | 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. |
10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. |
(...skipping 12 matching lines...) Expand all Loading... |
23 * You should have received a copy of the GNU Library General Public License | 23 * You should have received a copy of the GNU Library General Public License |
24 * along with this library; see the file COPYING.LIB. If not, write to | 24 * along with this library; see the file COPYING.LIB. If not, write to |
25 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 25 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
26 * Boston, MA 02110-1301, USA. | 26 * Boston, MA 02110-1301, USA. |
27 */ | 27 */ |
28 | 28 |
29 #ifndef SiblingTraversalStrategies_h | 29 #ifndef SiblingTraversalStrategies_h |
30 #define SiblingTraversalStrategies_h | 30 #define SiblingTraversalStrategies_h |
31 | 31 |
32 #include "core/dom/Element.h" | 32 #include "core/dom/Element.h" |
| 33 #include "core/dom/ElementTraversal.h" |
33 #include "core/rendering/style/RenderStyle.h" | 34 #include "core/rendering/style/RenderStyle.h" |
34 | 35 |
35 namespace WebCore { | 36 namespace WebCore { |
36 | 37 |
37 struct DOMSiblingTraversalStrategy { | 38 struct DOMSiblingTraversalStrategy { |
38 bool isFirstChild(Element*) const; | 39 bool isFirstChild(Element&) const; |
39 bool isLastChild(Element*) const; | 40 bool isLastChild(Element&) const; |
40 bool isFirstOfType(Element*, const QualifiedName&) const; | 41 bool isFirstOfType(Element&, const QualifiedName&) const; |
41 bool isLastOfType(Element*, const QualifiedName&) const; | 42 bool isLastOfType(Element&, const QualifiedName&) const; |
42 | 43 |
43 int countElementsBefore(Element*) const; | 44 int countElementsBefore(Element&) const; |
44 int countElementsAfter(Element*) const; | 45 int countElementsAfter(Element&) const; |
45 int countElementsOfTypeBefore(Element*, const QualifiedName&) const; | 46 int countElementsOfTypeBefore(Element&, const QualifiedName&) const; |
46 int countElementsOfTypeAfter(Element*, const QualifiedName&) const; | 47 int countElementsOfTypeAfter(Element&, const QualifiedName&) const; |
47 }; | 48 }; |
48 | 49 |
49 inline bool DOMSiblingTraversalStrategy::isFirstChild(Element* element) const | 50 inline bool DOMSiblingTraversalStrategy::isFirstChild(Element& element) const |
50 { | 51 { |
51 return !element->previousElementSibling(); | 52 return !ElementTraversal::previousSibling(element); |
52 } | 53 } |
53 | 54 |
54 inline bool DOMSiblingTraversalStrategy::isLastChild(Element* element) const | 55 inline bool DOMSiblingTraversalStrategy::isLastChild(Element& element) const |
55 { | 56 { |
56 return !element->nextElementSibling(); | 57 return !ElementTraversal::nextSibling(element); |
57 } | 58 } |
58 | 59 |
59 inline bool DOMSiblingTraversalStrategy::isFirstOfType(Element* element, const Q
ualifiedName& type) const | 60 inline bool DOMSiblingTraversalStrategy::isFirstOfType(Element& element, const Q
ualifiedName& type) const |
60 { | 61 { |
61 for (const Element* sibling = element->previousElementSibling(); sibling; si
bling = sibling->previousElementSibling()) { | 62 for (const Element* sibling = ElementTraversal::previousSibling(element); si
bling; sibling = ElementTraversal::previousSibling(*sibling)) { |
62 if (sibling->hasTagName(type)) | 63 if (sibling->hasTagName(type)) |
63 return false; | 64 return false; |
64 } | 65 } |
65 return true; | 66 return true; |
66 } | 67 } |
67 | 68 |
68 inline bool DOMSiblingTraversalStrategy::isLastOfType(Element* element, const Qu
alifiedName& type) const | 69 inline bool DOMSiblingTraversalStrategy::isLastOfType(Element& element, const Qu
alifiedName& type) const |
69 { | 70 { |
70 for (const Element* sibling = element->nextElementSibling(); sibling; siblin
g = sibling->nextElementSibling()) { | 71 for (const Element* sibling = ElementTraversal::nextSibling(element); siblin
g; sibling = ElementTraversal::nextSibling(*sibling)) { |
71 if (sibling->hasTagName(type)) | 72 if (sibling->hasTagName(type)) |
72 return false; | 73 return false; |
73 } | 74 } |
74 return true; | 75 return true; |
75 } | 76 } |
76 | 77 |
77 inline int DOMSiblingTraversalStrategy::countElementsBefore(Element* element) co
nst | 78 inline int DOMSiblingTraversalStrategy::countElementsBefore(Element& element) co
nst |
78 { | 79 { |
79 int count = 0; | 80 int count = 0; |
80 for (const Element* sibling = element->previousElementSibling(); sibling; si
bling = sibling->previousElementSibling()) | 81 for (const Element* sibling = ElementTraversal::previousSibling(element); si
bling; sibling = ElementTraversal::previousSibling(*sibling)) |
81 count++; | 82 count++; |
82 | 83 |
83 return count; | 84 return count; |
84 } | 85 } |
85 | 86 |
86 inline int DOMSiblingTraversalStrategy::countElementsOfTypeBefore(Element* eleme
nt, const QualifiedName& type) const | 87 inline int DOMSiblingTraversalStrategy::countElementsOfTypeBefore(Element& eleme
nt, const QualifiedName& type) const |
87 { | 88 { |
88 int count = 0; | 89 int count = 0; |
89 for (const Element* sibling = element->previousElementSibling(); sibling; si
bling = sibling->previousElementSibling()) { | 90 for (const Element* sibling = ElementTraversal::previousSibling(element); si
bling; sibling = ElementTraversal::previousSibling(*sibling)) { |
90 if (sibling->hasTagName(type)) | 91 if (sibling->hasTagName(type)) |
91 ++count; | 92 ++count; |
92 } | 93 } |
93 | 94 |
94 return count; | 95 return count; |
95 } | 96 } |
96 | 97 |
97 inline int DOMSiblingTraversalStrategy::countElementsAfter(Element* element) con
st | 98 inline int DOMSiblingTraversalStrategy::countElementsAfter(Element& element) con
st |
98 { | 99 { |
99 int count = 0; | 100 int count = 0; |
100 for (const Element* sibling = element->nextElementSibling(); sibling; siblin
g = sibling->nextElementSibling()) | 101 for (const Element* sibling = ElementTraversal::nextSibling(element); siblin
g; sibling = ElementTraversal::nextSibling(*sibling)) |
101 ++count; | 102 ++count; |
102 | 103 |
103 return count; | 104 return count; |
104 } | 105 } |
105 | 106 |
106 inline int DOMSiblingTraversalStrategy::countElementsOfTypeAfter(Element* elemen
t, const QualifiedName& type) const | 107 inline int DOMSiblingTraversalStrategy::countElementsOfTypeAfter(Element& elemen
t, const QualifiedName& type) const |
107 { | 108 { |
108 int count = 0; | 109 int count = 0; |
109 for (const Element* sibling = element->nextElementSibling(); sibling; siblin
g = sibling->nextElementSibling()) { | 110 for (const Element* sibling = ElementTraversal::nextSibling(element); siblin
g; sibling = ElementTraversal::nextSibling(*sibling)) { |
110 if (sibling->hasTagName(type)) | 111 if (sibling->hasTagName(type)) |
111 ++count; | 112 ++count; |
112 } | 113 } |
113 | 114 |
114 return count; | 115 return count; |
115 } | 116 } |
116 | 117 |
117 struct ShadowDOMSiblingTraversalStrategy { | 118 struct ShadowDOMSiblingTraversalStrategy { |
118 ShadowDOMSiblingTraversalStrategy(const Vector<Node*, 32>& siblings, int nth
) | 119 ShadowDOMSiblingTraversalStrategy(const Vector<Node*, 32>& siblings, int nth
) |
119 : m_siblings(siblings) | 120 : m_siblings(siblings) |
120 , m_nth(nth) | 121 , m_nth(nth) |
121 { | 122 { |
122 } | 123 } |
123 | 124 |
124 bool isFirstChild(Element*) const; | 125 bool isFirstChild(Element&) const; |
125 bool isLastChild(Element*) const; | 126 bool isLastChild(Element&) const; |
126 bool isFirstOfType(Element*, const QualifiedName&) const; | 127 bool isFirstOfType(Element&, const QualifiedName&) const; |
127 bool isLastOfType(Element*, const QualifiedName&) const; | 128 bool isLastOfType(Element&, const QualifiedName&) const; |
128 | 129 |
129 int countElementsBefore(Element*) const; | 130 int countElementsBefore(Element&) const; |
130 int countElementsAfter(Element*) const; | 131 int countElementsAfter(Element&) const; |
131 int countElementsOfTypeBefore(Element*, const QualifiedName&) const; | 132 int countElementsOfTypeBefore(Element&, const QualifiedName&) const; |
132 int countElementsOfTypeAfter(Element*, const QualifiedName&) const; | 133 int countElementsOfTypeAfter(Element&, const QualifiedName&) const; |
133 | 134 |
134 private: | 135 private: |
135 const Vector<Node*, 32>& m_siblings; | 136 const Vector<Node*, 32>& m_siblings; |
136 int m_nth; | 137 int m_nth; |
137 }; | 138 }; |
138 | 139 |
139 inline bool ShadowDOMSiblingTraversalStrategy::isFirstChild(Element* element) co
nst | 140 inline bool ShadowDOMSiblingTraversalStrategy::isFirstChild(Element& element) co
nst |
140 { | 141 { |
141 ASSERT(element == toElement(m_siblings[m_nth])); | 142 ASSERT(element == toElement(m_siblings[m_nth])); |
142 | 143 |
143 for (int i = m_nth - 1; i >= 0; --i) { | 144 for (int i = m_nth - 1; i >= 0; --i) { |
144 if (m_siblings[i]->isElementNode()) | 145 if (m_siblings[i]->isElementNode()) |
145 return false; | 146 return false; |
146 } | 147 } |
147 | 148 |
148 return true; | 149 return true; |
149 } | 150 } |
150 | 151 |
151 inline bool ShadowDOMSiblingTraversalStrategy::isLastChild(Element* element) con
st | 152 inline bool ShadowDOMSiblingTraversalStrategy::isLastChild(Element& element) con
st |
152 { | 153 { |
153 ASSERT(element == toElement(m_siblings[m_nth])); | 154 ASSERT(element == toElement(m_siblings[m_nth])); |
154 | 155 |
155 for (size_t i = m_nth + 1; i < m_siblings.size(); ++i) { | 156 for (size_t i = m_nth + 1; i < m_siblings.size(); ++i) { |
156 if (m_siblings[i]->isElementNode()) | 157 if (m_siblings[i]->isElementNode()) |
157 return false; | 158 return false; |
158 } | 159 } |
159 | 160 |
160 return true; | 161 return true; |
161 } | 162 } |
162 | 163 |
163 inline bool ShadowDOMSiblingTraversalStrategy::isFirstOfType(Element* element, c
onst QualifiedName& type) const | 164 inline bool ShadowDOMSiblingTraversalStrategy::isFirstOfType(Element& element, c
onst QualifiedName& type) const |
164 { | 165 { |
165 ASSERT(element == toElement(m_siblings[m_nth])); | 166 ASSERT(element == toElement(m_siblings[m_nth])); |
166 | 167 |
167 for (int i = m_nth - 1; i >= 0; --i) { | 168 for (int i = m_nth - 1; i >= 0; --i) { |
168 if (m_siblings[i]->hasTagName(type)) | 169 if (m_siblings[i]->hasTagName(type)) |
169 return false; | 170 return false; |
170 } | 171 } |
171 | 172 |
172 return true; | 173 return true; |
173 } | 174 } |
174 | 175 |
175 inline bool ShadowDOMSiblingTraversalStrategy::isLastOfType(Element* element, co
nst QualifiedName& type) const | 176 inline bool ShadowDOMSiblingTraversalStrategy::isLastOfType(Element& element, co
nst QualifiedName& type) const |
176 { | 177 { |
177 ASSERT(element == toElement(m_siblings[m_nth])); | 178 ASSERT(element == toElement(m_siblings[m_nth])); |
178 | 179 |
179 for (size_t i = m_nth + 1; i < m_siblings.size(); ++i) { | 180 for (size_t i = m_nth + 1; i < m_siblings.size(); ++i) { |
180 if (m_siblings[i]->hasTagName(type)) | 181 if (m_siblings[i]->hasTagName(type)) |
181 return false; | 182 return false; |
182 } | 183 } |
183 | 184 |
184 return true; | 185 return true; |
185 } | 186 } |
186 | 187 |
187 inline int ShadowDOMSiblingTraversalStrategy::countElementsBefore(Element* eleme
nt) const | 188 inline int ShadowDOMSiblingTraversalStrategy::countElementsBefore(Element& eleme
nt) const |
188 { | 189 { |
189 ASSERT(element == toElement(m_siblings[m_nth])); | 190 ASSERT(element == toElement(m_siblings[m_nth])); |
190 | 191 |
191 int count = 0; | 192 int count = 0; |
192 for (int i = m_nth - 1; i >= 0; --i) { | 193 for (int i = m_nth - 1; i >= 0; --i) { |
193 if (m_siblings[i]->isElementNode()) | 194 if (m_siblings[i]->isElementNode()) |
194 ++count; | 195 ++count; |
195 } | 196 } |
196 | 197 |
197 return count; | 198 return count; |
198 } | 199 } |
199 | 200 |
200 inline int ShadowDOMSiblingTraversalStrategy::countElementsAfter(Element* elemen
t) const | 201 inline int ShadowDOMSiblingTraversalStrategy::countElementsAfter(Element& elemen
t) const |
201 { | 202 { |
202 ASSERT(element == toElement(m_siblings[m_nth])); | 203 ASSERT(element == toElement(m_siblings[m_nth])); |
203 | 204 |
204 int count = 0; | 205 int count = 0; |
205 for (size_t i = m_nth + 1; i < m_siblings.size(); ++i) { | 206 for (size_t i = m_nth + 1; i < m_siblings.size(); ++i) { |
206 if (m_siblings[i]->isElementNode()) | 207 if (m_siblings[i]->isElementNode()) |
207 return ++count; | 208 return ++count; |
208 } | 209 } |
209 | 210 |
210 return count; | 211 return count; |
211 } | 212 } |
212 | 213 |
213 inline int ShadowDOMSiblingTraversalStrategy::countElementsOfTypeBefore(Element*
element, const QualifiedName& type) const | 214 inline int ShadowDOMSiblingTraversalStrategy::countElementsOfTypeBefore(Element&
element, const QualifiedName& type) const |
214 { | 215 { |
215 ASSERT(element == toElement(m_siblings[m_nth])); | 216 ASSERT(element == toElement(m_siblings[m_nth])); |
216 | 217 |
217 int count = 0; | 218 int count = 0; |
218 for (int i = m_nth - 1; i >= 0; --i) { | 219 for (int i = m_nth - 1; i >= 0; --i) { |
219 if (m_siblings[i]->hasTagName(type)) | 220 if (m_siblings[i]->hasTagName(type)) |
220 ++count; | 221 ++count; |
221 } | 222 } |
222 | 223 |
223 return count; | 224 return count; |
224 } | 225 } |
225 | 226 |
226 inline int ShadowDOMSiblingTraversalStrategy::countElementsOfTypeAfter(Element*
element, const QualifiedName& type) const | 227 inline int ShadowDOMSiblingTraversalStrategy::countElementsOfTypeAfter(Element&
element, const QualifiedName& type) const |
227 { | 228 { |
228 ASSERT(element == toElement(m_siblings[m_nth])); | 229 ASSERT(element == toElement(m_siblings[m_nth])); |
229 | 230 |
230 int count = 0; | 231 int count = 0; |
231 for (size_t i = m_nth + 1; i < m_siblings.size(); ++i) { | 232 for (size_t i = m_nth + 1; i < m_siblings.size(); ++i) { |
232 if (m_siblings[i]->hasTagName(type)) | 233 if (m_siblings[i]->hasTagName(type)) |
233 return ++count; | 234 return ++count; |
234 } | 235 } |
235 | 236 |
236 return count; | 237 return count; |
237 } | 238 } |
238 | 239 |
239 } | 240 } |
240 | 241 |
241 #endif | 242 #endif |
OLD | NEW |