OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 10 matching lines...) Expand all Loading... |
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | 30 |
31 #ifndef NewSVGListPropertyHelper_h | 31 #ifndef SVGListPropertyHelper_h |
32 #define NewSVGListPropertyHelper_h | 32 #define SVGListPropertyHelper_h |
33 | 33 |
34 #include "bindings/v8/ExceptionMessages.h" | 34 #include "bindings/v8/ExceptionMessages.h" |
35 #include "bindings/v8/ExceptionStatePlaceholder.h" | 35 #include "bindings/v8/ExceptionStatePlaceholder.h" |
36 #include "core/dom/ExceptionCode.h" | 36 #include "core/dom/ExceptionCode.h" |
37 #include "core/svg/properties/NewSVGProperty.h" | 37 #include "core/svg/properties/SVGProperty.h" |
38 #include "wtf/PassRefPtr.h" | 38 #include "wtf/PassRefPtr.h" |
39 #include "wtf/Vector.h" | 39 #include "wtf/Vector.h" |
40 | 40 |
41 namespace WebCore { | 41 namespace WebCore { |
42 | 42 |
43 // This is an implementation of the SVG*List property spec: | 43 // This is an implementation of the SVG*List property spec: |
44 // http://www.w3.org/TR/SVG/single-page.html#types-InterfaceSVGLengthList | 44 // http://www.w3.org/TR/SVG/single-page.html#types-InterfaceSVGLengthList |
45 template<typename Derived, typename ItemProperty> | 45 template<typename Derived, typename ItemProperty> |
46 class NewSVGListPropertyHelper : public NewSVGPropertyBase { | 46 class SVGListPropertyHelper : public SVGPropertyBase { |
47 public: | 47 public: |
48 typedef ItemProperty ItemPropertyType; | 48 typedef ItemProperty ItemPropertyType; |
49 | 49 |
50 NewSVGListPropertyHelper() | 50 SVGListPropertyHelper() |
51 : NewSVGPropertyBase(Derived::classType()) | 51 : SVGPropertyBase(Derived::classType()) |
52 { | 52 { |
53 } | 53 } |
54 | 54 |
55 ~NewSVGListPropertyHelper() | 55 ~SVGListPropertyHelper() |
56 { | 56 { |
57 clear(); | 57 clear(); |
58 } | 58 } |
59 | 59 |
60 // used from Blink C++ code: | 60 // used from Blink C++ code: |
61 | 61 |
62 ItemPropertyType* at(size_t index) | 62 ItemPropertyType* at(size_t index) |
63 { | 63 { |
64 ASSERT(index < m_values.size()); | 64 ASSERT(index < m_values.size()); |
65 ASSERT(m_values.at(index)->ownerList() == this); | 65 ASSERT(m_values.at(index)->ownerList() == this); |
66 return m_values.at(index).get(); | 66 return m_values.at(index).get(); |
67 } | 67 } |
68 | 68 |
69 const ItemPropertyType* at(size_t index) const | 69 const ItemPropertyType* at(size_t index) const |
70 { | 70 { |
71 return const_cast<NewSVGListPropertyHelper<Derived, ItemProperty>*>(this
)->at(index); | 71 return const_cast<SVGListPropertyHelper<Derived, ItemProperty>*>(this)->
at(index); |
72 } | 72 } |
73 | 73 |
74 class ConstIterator { | 74 class ConstIterator { |
75 private: | 75 private: |
76 typedef typename Vector<RefPtr<ItemPropertyType> >::const_iterator Wrapp
edType; | 76 typedef typename Vector<RefPtr<ItemPropertyType> >::const_iterator Wrapp
edType; |
77 | 77 |
78 public: | 78 public: |
79 ConstIterator(WrappedType it) | 79 ConstIterator(WrappedType it) |
80 : m_it(it) | 80 : m_it(it) |
81 { | 81 { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 protected: | 147 protected: |
148 void deepCopy(PassRefPtr<Derived>); | 148 void deepCopy(PassRefPtr<Derived>); |
149 | 149 |
150 private: | 150 private: |
151 inline bool checkIndexBound(size_t, ExceptionState&); | 151 inline bool checkIndexBound(size_t, ExceptionState&); |
152 bool removeFromOldOwnerListAndAdjustIndex(PassRefPtr<ItemPropertyType>, size
_t* indexToModify); | 152 bool removeFromOldOwnerListAndAdjustIndex(PassRefPtr<ItemPropertyType>, size
_t* indexToModify); |
153 size_t findItem(PassRefPtr<ItemPropertyType>); | 153 size_t findItem(PassRefPtr<ItemPropertyType>); |
154 | 154 |
155 Vector<RefPtr<ItemPropertyType> > m_values; | 155 Vector<RefPtr<ItemPropertyType> > m_values; |
156 | 156 |
157 static PassRefPtr<Derived> toDerived(PassRefPtr<NewSVGPropertyBase> passBase
) | 157 static PassRefPtr<Derived> toDerived(PassRefPtr<SVGPropertyBase> passBase) |
158 { | 158 { |
159 if (!passBase) | 159 if (!passBase) |
160 return nullptr; | 160 return nullptr; |
161 | 161 |
162 RefPtr<NewSVGPropertyBase> base = passBase; | 162 RefPtr<SVGPropertyBase> base = passBase; |
163 ASSERT(base->type() == Derived::classType()); | 163 ASSERT(base->type() == Derived::classType()); |
164 return static_pointer_cast<Derived>(base); | 164 return static_pointer_cast<Derived>(base); |
165 } | 165 } |
166 }; | 166 }; |
167 | 167 |
168 template<typename Derived, typename ItemProperty> | 168 template<typename Derived, typename ItemProperty> |
169 bool NewSVGListPropertyHelper<Derived, ItemProperty>::operator==(const Derived&
other) const | 169 bool SVGListPropertyHelper<Derived, ItemProperty>::operator==(const Derived& oth
er) const |
170 { | 170 { |
171 if (length() != other.length()) | 171 if (length() != other.length()) |
172 return false; | 172 return false; |
173 | 173 |
174 size_t size = length(); | 174 size_t size = length(); |
175 for (size_t i = 0; i < size; ++i) { | 175 for (size_t i = 0; i < size; ++i) { |
176 if (*at(i) != *other.at(i)) | 176 if (*at(i) != *other.at(i)) |
177 return false; | 177 return false; |
178 } | 178 } |
179 | 179 |
180 return true; | 180 return true; |
181 } | 181 } |
182 | 182 |
183 template<typename Derived, typename ItemProperty> | 183 template<typename Derived, typename ItemProperty> |
184 void NewSVGListPropertyHelper<Derived, ItemProperty>::clear() | 184 void SVGListPropertyHelper<Derived, ItemProperty>::clear() |
185 { | 185 { |
186 // detach all list items as they are no longer part of this list | 186 // detach all list items as they are no longer part of this list |
187 typename Vector<RefPtr<ItemPropertyType> >::const_iterator it = m_values.beg
in(); | 187 typename Vector<RefPtr<ItemPropertyType> >::const_iterator it = m_values.beg
in(); |
188 typename Vector<RefPtr<ItemPropertyType> >::const_iterator itEnd = m_values.
end(); | 188 typename Vector<RefPtr<ItemPropertyType> >::const_iterator itEnd = m_values.
end(); |
189 for (; it != itEnd; ++it) { | 189 for (; it != itEnd; ++it) { |
190 ASSERT((*it)->ownerList() == this); | 190 ASSERT((*it)->ownerList() == this); |
191 (*it)->setOwnerList(0); | 191 (*it)->setOwnerList(0); |
192 } | 192 } |
193 | 193 |
194 m_values.clear(); | 194 m_values.clear(); |
195 } | 195 } |
196 | 196 |
197 template<typename Derived, typename ItemProperty> | 197 template<typename Derived, typename ItemProperty> |
198 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::initia
lize(PassRefPtr<ItemProperty> passNewItem) | 198 PassRefPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty>::initializ
e(PassRefPtr<ItemProperty> passNewItem) |
199 { | 199 { |
200 RefPtr<ItemPropertyType> newItem = passNewItem; | 200 RefPtr<ItemPropertyType> newItem = passNewItem; |
201 | 201 |
202 // Spec: If the inserted item is already in a list, it is removed from its p
revious list before it is inserted into this list. | 202 // Spec: If the inserted item is already in a list, it is removed from its p
revious list before it is inserted into this list. |
203 removeFromOldOwnerListAndAdjustIndex(newItem, 0); | 203 removeFromOldOwnerListAndAdjustIndex(newItem, 0); |
204 | 204 |
205 // Spec: Clears all existing current items from the list and re-initializes
the list to hold the single item specified by the parameter. | 205 // Spec: Clears all existing current items from the list and re-initializes
the list to hold the single item specified by the parameter. |
206 clear(); | 206 clear(); |
207 append(newItem); | 207 append(newItem); |
208 return newItem.release(); | 208 return newItem.release(); |
209 } | 209 } |
210 | 210 |
211 template<typename Derived, typename ItemProperty> | 211 template<typename Derived, typename ItemProperty> |
212 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::getIte
m(size_t index, ExceptionState& exceptionState) | 212 PassRefPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty>::getItem(s
ize_t index, ExceptionState& exceptionState) |
213 { | 213 { |
214 if (!checkIndexBound(index, exceptionState)) | 214 if (!checkIndexBound(index, exceptionState)) |
215 return nullptr; | 215 return nullptr; |
216 | 216 |
217 ASSERT(index < m_values.size()); | 217 ASSERT(index < m_values.size()); |
218 ASSERT(m_values.at(index)->ownerList() == this); | 218 ASSERT(m_values.at(index)->ownerList() == this); |
219 return m_values.at(index); | 219 return m_values.at(index); |
220 } | 220 } |
221 | 221 |
222 template<typename Derived, typename ItemProperty> | 222 template<typename Derived, typename ItemProperty> |
223 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::insert
ItemBefore(PassRefPtr<ItemProperty> passNewItem, size_t index) | 223 PassRefPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty>::insertIte
mBefore(PassRefPtr<ItemProperty> passNewItem, size_t index) |
224 { | 224 { |
225 // Spec: If the index is greater than or equal to length, then the new item
is appended to the end of the list. | 225 // Spec: If the index is greater than or equal to length, then the new item
is appended to the end of the list. |
226 if (index > m_values.size()) | 226 if (index > m_values.size()) |
227 index = m_values.size(); | 227 index = m_values.size(); |
228 | 228 |
229 RefPtr<ItemPropertyType> newItem = passNewItem; | 229 RefPtr<ItemPropertyType> newItem = passNewItem; |
230 | 230 |
231 // Spec: If newItem is already in a list, it is removed from its previous li
st before it is inserted into this list. | 231 // Spec: If newItem is already in a list, it is removed from its previous li
st before it is inserted into this list. |
232 if (!removeFromOldOwnerListAndAdjustIndex(newItem, &index)) { | 232 if (!removeFromOldOwnerListAndAdjustIndex(newItem, &index)) { |
233 // Inserting the item before itself is a no-op. | 233 // Inserting the item before itself is a no-op. |
234 return newItem.release(); | 234 return newItem.release(); |
235 } | 235 } |
236 | 236 |
237 // Spec: Inserts a new item into the list at the specified position. The ind
ex of the item before which the new item is to be | 237 // Spec: Inserts a new item into the list at the specified position. The ind
ex of the item before which the new item is to be |
238 // inserted. The first item is number 0. If the index is equal to 0, then th
e new item is inserted at the front of the list. | 238 // inserted. The first item is number 0. If the index is equal to 0, then th
e new item is inserted at the front of the list. |
239 m_values.insert(index, newItem); | 239 m_values.insert(index, newItem); |
240 newItem->setOwnerList(this); | 240 newItem->setOwnerList(this); |
241 | 241 |
242 return newItem.release(); | 242 return newItem.release(); |
243 } | 243 } |
244 | 244 |
245 template<typename Derived, typename ItemProperty> | 245 template<typename Derived, typename ItemProperty> |
246 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::remove
Item(size_t index, ExceptionState& exceptionState) | 246 PassRefPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty>::removeIte
m(size_t index, ExceptionState& exceptionState) |
247 { | 247 { |
248 if (index >= m_values.size()) { | 248 if (index >= m_values.size()) { |
249 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde
xExceedsMaximumBound("index", index, m_values.size())); | 249 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde
xExceedsMaximumBound("index", index, m_values.size())); |
250 return nullptr; | 250 return nullptr; |
251 } | 251 } |
252 ASSERT(m_values.at(index)->ownerList() == this); | 252 ASSERT(m_values.at(index)->ownerList() == this); |
253 RefPtr<ItemPropertyType> oldItem = m_values.at(index); | 253 RefPtr<ItemPropertyType> oldItem = m_values.at(index); |
254 m_values.remove(index); | 254 m_values.remove(index); |
255 oldItem->setOwnerList(0); | 255 oldItem->setOwnerList(0); |
256 return oldItem.release(); | 256 return oldItem.release(); |
257 } | 257 } |
258 | 258 |
259 template<typename Derived, typename ItemProperty> | 259 template<typename Derived, typename ItemProperty> |
260 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::append
Item(PassRefPtr<ItemProperty> passNewItem) | 260 PassRefPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty>::appendIte
m(PassRefPtr<ItemProperty> passNewItem) |
261 { | 261 { |
262 RefPtr<ItemPropertyType> newItem = passNewItem; | 262 RefPtr<ItemPropertyType> newItem = passNewItem; |
263 | 263 |
264 // Spec: If newItem is already in a list, it is removed from its previous li
st before it is inserted into this list. | 264 // Spec: If newItem is already in a list, it is removed from its previous li
st before it is inserted into this list. |
265 removeFromOldOwnerListAndAdjustIndex(newItem, 0); | 265 removeFromOldOwnerListAndAdjustIndex(newItem, 0); |
266 | 266 |
267 // Append the value and wrapper at the end of the list. | 267 // Append the value and wrapper at the end of the list. |
268 append(newItem); | 268 append(newItem); |
269 | 269 |
270 return newItem.release(); | 270 return newItem.release(); |
271 } | 271 } |
272 | 272 |
273 template<typename Derived, typename ItemProperty> | 273 template<typename Derived, typename ItemProperty> |
274 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::replac
eItem(PassRefPtr<ItemProperty> passNewItem, size_t index, ExceptionState& except
ionState) | 274 PassRefPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty>::replaceIt
em(PassRefPtr<ItemProperty> passNewItem, size_t index, ExceptionState& exception
State) |
275 { | 275 { |
276 if (!checkIndexBound(index, exceptionState)) | 276 if (!checkIndexBound(index, exceptionState)) |
277 return nullptr; | 277 return nullptr; |
278 | 278 |
279 RefPtr<ItemPropertyType> newItem = passNewItem; | 279 RefPtr<ItemPropertyType> newItem = passNewItem; |
280 | 280 |
281 // Spec: If newItem is already in a list, it is removed from its previous li
st before it is inserted into this list. | 281 // Spec: If newItem is already in a list, it is removed from its previous li
st before it is inserted into this list. |
282 // Spec: If the item is already in this list, note that the index of the ite
m to replace is before the removal of the item. | 282 // Spec: If the item is already in this list, note that the index of the ite
m to replace is before the removal of the item. |
283 if (!removeFromOldOwnerListAndAdjustIndex(newItem, &index)) { | 283 if (!removeFromOldOwnerListAndAdjustIndex(newItem, &index)) { |
284 // Replacing the item with itself is a no-op. | 284 // Replacing the item with itself is a no-op. |
(...skipping 10 matching lines...) Expand all Loading... |
295 RefPtr<ItemPropertyType>& position = m_values[index]; | 295 RefPtr<ItemPropertyType>& position = m_values[index]; |
296 ASSERT(position->ownerList() == this); | 296 ASSERT(position->ownerList() == this); |
297 position->setOwnerList(0); | 297 position->setOwnerList(0); |
298 position = newItem; | 298 position = newItem; |
299 newItem->setOwnerList(this); | 299 newItem->setOwnerList(this); |
300 | 300 |
301 return newItem.release(); | 301 return newItem.release(); |
302 } | 302 } |
303 | 303 |
304 template<typename Derived, typename ItemProperty> | 304 template<typename Derived, typename ItemProperty> |
305 bool NewSVGListPropertyHelper<Derived, ItemProperty>::checkIndexBound(size_t ind
ex, ExceptionState& exceptionState) | 305 bool SVGListPropertyHelper<Derived, ItemProperty>::checkIndexBound(size_t index,
ExceptionState& exceptionState) |
306 { | 306 { |
307 if (index >= m_values.size()) { | 307 if (index >= m_values.size()) { |
308 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde
xExceedsMaximumBound("index", index, m_values.size())); | 308 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde
xExceedsMaximumBound("index", index, m_values.size())); |
309 return false; | 309 return false; |
310 } | 310 } |
311 | 311 |
312 return true; | 312 return true; |
313 } | 313 } |
314 | 314 |
315 template<typename Derived, typename ItemProperty> | 315 template<typename Derived, typename ItemProperty> |
316 bool NewSVGListPropertyHelper<Derived, ItemProperty>::removeFromOldOwnerListAndA
djustIndex(PassRefPtr<ItemPropertyType> passItem, size_t* indexToModify) | 316 bool SVGListPropertyHelper<Derived, ItemProperty>::removeFromOldOwnerListAndAdju
stIndex(PassRefPtr<ItemPropertyType> passItem, size_t* indexToModify) |
317 { | 317 { |
318 RefPtr<ItemPropertyType> item = passItem; | 318 RefPtr<ItemPropertyType> item = passItem; |
319 ASSERT(item); | 319 ASSERT(item); |
320 RefPtr<Derived> ownerList = toDerived(item->ownerList()); | 320 RefPtr<Derived> ownerList = toDerived(item->ownerList()); |
321 if (!ownerList) | 321 if (!ownerList) |
322 return true; | 322 return true; |
323 | 323 |
324 // Spec: If newItem is already in a list, it is removed from its previous li
st before it is inserted into this list. | 324 // Spec: If newItem is already in a list, it is removed from its previous li
st before it is inserted into this list. |
325 // 'newItem' is already living in another list. If it's not our list, synchr
onize the other lists wrappers after the removal. | 325 // 'newItem' is already living in another list. If it's not our list, synchr
onize the other lists wrappers after the removal. |
326 bool livesInOtherList = ownerList.get() != this; | 326 bool livesInOtherList = ownerList.get() != this; |
(...skipping 14 matching lines...) Expand all Loading... |
341 size_t& index = *indexToModify; | 341 size_t& index = *indexToModify; |
342 // Spec: If the item is already in this list, note that the index of the
item to (replace|insert before) is before the removal of the item. | 342 // Spec: If the item is already in this list, note that the index of the
item to (replace|insert before) is before the removal of the item. |
343 if (static_cast<size_t>(indexToRemove) < index) | 343 if (static_cast<size_t>(indexToRemove) < index) |
344 --index; | 344 --index; |
345 } | 345 } |
346 | 346 |
347 return true; | 347 return true; |
348 } | 348 } |
349 | 349 |
350 template<typename Derived, typename ItemProperty> | 350 template<typename Derived, typename ItemProperty> |
351 size_t NewSVGListPropertyHelper<Derived, ItemProperty>::findItem(PassRefPtr<Item
PropertyType> item) | 351 size_t SVGListPropertyHelper<Derived, ItemProperty>::findItem(PassRefPtr<ItemPro
pertyType> item) |
352 { | 352 { |
353 return m_values.find(item); | 353 return m_values.find(item); |
354 } | 354 } |
355 | 355 |
356 template<typename Derived, typename ItemProperty> | 356 template<typename Derived, typename ItemProperty> |
357 void NewSVGListPropertyHelper<Derived, ItemProperty>::deepCopy(PassRefPtr<Derive
d> passFrom) | 357 void SVGListPropertyHelper<Derived, ItemProperty>::deepCopy(PassRefPtr<Derived>
passFrom) |
358 { | 358 { |
359 RefPtr<Derived> from = passFrom; | 359 RefPtr<Derived> from = passFrom; |
360 | 360 |
361 clear(); | 361 clear(); |
362 typename Vector<RefPtr<ItemPropertyType> >::const_iterator it = from->m_valu
es.begin(); | 362 typename Vector<RefPtr<ItemPropertyType> >::const_iterator it = from->m_valu
es.begin(); |
363 typename Vector<RefPtr<ItemPropertyType> >::const_iterator itEnd = from->m_v
alues.end(); | 363 typename Vector<RefPtr<ItemPropertyType> >::const_iterator itEnd = from->m_v
alues.end(); |
364 for (; it != itEnd; ++it) { | 364 for (; it != itEnd; ++it) { |
365 append((*it)->clone()); | 365 append((*it)->clone()); |
366 } | 366 } |
367 } | 367 } |
368 | 368 |
369 } | 369 } |
370 | 370 |
371 #endif // NewSVGListPropertyHelper_h | 371 #endif // SVGListPropertyHelper_h |
OLD | NEW |