Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(732)

Side by Side Diff: Source/core/svg/properties/SVGListPropertyHelper.h

Issue 1177303004: Updated SVGListPropertyHelper as per SVG2 Spec (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: small nits Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 164
165 bool adjustFromToListValues(PassRefPtrWillBeRawPtr<Derived> fromList, PassRe fPtrWillBeRawPtr<Derived> toList, float percentage, AnimationMode); 165 bool adjustFromToListValues(PassRefPtrWillBeRawPtr<Derived> fromList, PassRe fPtrWillBeRawPtr<Derived> toList, float percentage, AnimationMode);
166 166
167 virtual PassRefPtrWillBeRawPtr<ItemPropertyType> createPaddingItem() const 167 virtual PassRefPtrWillBeRawPtr<ItemPropertyType> createPaddingItem() const
168 { 168 {
169 return ItemPropertyType::create(); 169 return ItemPropertyType::create();
170 } 170 }
171 171
172 private: 172 private:
173 inline bool checkIndexBound(size_t, ExceptionState&); 173 inline bool checkIndexBound(size_t, ExceptionState&);
174 bool removeFromOldOwnerListAndAdjustIndex(PassRefPtrWillBeRawPtr<ItemPropert yType>, size_t* indexToModify);
175 size_t findItem(PassRefPtrWillBeRawPtr<ItemPropertyType>); 174 size_t findItem(PassRefPtrWillBeRawPtr<ItemPropertyType>);
176 175
177 WillBeHeapVector<RefPtrWillBeMember<ItemPropertyType>> m_values; 176 WillBeHeapVector<RefPtrWillBeMember<ItemPropertyType>> m_values;
178 177
179 static PassRefPtrWillBeRawPtr<Derived> toDerived(PassRefPtrWillBeRawPtr<SVGP ropertyBase> passBase) 178 static PassRefPtrWillBeRawPtr<Derived> toDerived(PassRefPtrWillBeRawPtr<SVGP ropertyBase> passBase)
180 { 179 {
181 if (!passBase) 180 if (!passBase)
182 return nullptr; 181 return nullptr;
183 182
184 RefPtrWillBeRawPtr<SVGPropertyBase> base = passBase; 183 RefPtrWillBeRawPtr<SVGPropertyBase> base = passBase;
(...skipping 29 matching lines...) Expand all
214 } 213 }
215 214
216 m_values.clear(); 215 m_values.clear();
217 } 216 }
218 217
219 template<typename Derived, typename ItemProperty> 218 template<typename Derived, typename ItemProperty>
220 PassRefPtrWillBeRawPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty >::initialize(PassRefPtrWillBeRawPtr<ItemProperty> passNewItem) 219 PassRefPtrWillBeRawPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty >::initialize(PassRefPtrWillBeRawPtr<ItemProperty> passNewItem)
221 { 220 {
222 RefPtrWillBeRawPtr<ItemPropertyType> newItem = passNewItem; 221 RefPtrWillBeRawPtr<ItemPropertyType> newItem = passNewItem;
223 222
224 // 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. 223 // SVG2-Draft Spec: If newItem is already in a list, then a new object is cr eated with the same values as newItem and this item is inserted into the list.
225 removeFromOldOwnerListAndAdjustIndex(newItem, 0); 224 // Otherwise, newItem itself is inserted into the list.
225 if (newItem->ownerList())
226 newItem = newItem->clone();
fs 2015/06/17 16:02:05 Should we handle this in the generic ListItemPrope
Shanmuga Pandi 2015/06/18 11:30:45 Done
226 227
227 // Spec: Clears all existing current items from the list and re-initializes the list to hold the single item specified by the parameter. 228 // Spec: Clears all existing current items from the list and re-initializes the list to hold the single item specified by the parameter.
228 clear(); 229 clear();
229 append(newItem); 230 append(newItem);
230 return newItem.release(); 231 return newItem.release();
231 } 232 }
232 233
233 template<typename Derived, typename ItemProperty> 234 template<typename Derived, typename ItemProperty>
234 PassRefPtrWillBeRawPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty >::getItem(size_t index, ExceptionState& exceptionState) 235 PassRefPtrWillBeRawPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty >::getItem(size_t index, ExceptionState& exceptionState)
235 { 236 {
236 if (!checkIndexBound(index, exceptionState)) 237 if (!checkIndexBound(index, exceptionState))
237 return nullptr; 238 return nullptr;
238 239
239 ASSERT(index < m_values.size()); 240 ASSERT(index < m_values.size());
240 ASSERT(m_values.at(index)->ownerList() == this); 241 ASSERT(m_values.at(index)->ownerList() == this);
241 return m_values.at(index); 242 return m_values.at(index);
242 } 243 }
243 244
244 template<typename Derived, typename ItemProperty> 245 template<typename Derived, typename ItemProperty>
245 PassRefPtrWillBeRawPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty >::insertItemBefore(PassRefPtrWillBeRawPtr<ItemProperty> passNewItem, size_t ind ex) 246 PassRefPtrWillBeRawPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty >::insertItemBefore(PassRefPtrWillBeRawPtr<ItemProperty> passNewItem, size_t ind ex)
246 { 247 {
247 // Spec: If the index is greater than or equal to length, then the new item is appended to the end of the list. 248 // Spec: If the index is greater than or equal to length, then the new item is appended to the end of the list.
248 if (index > m_values.size()) 249 if (index > m_values.size())
249 index = m_values.size(); 250 index = m_values.size();
250 251
251 RefPtrWillBeRawPtr<ItemPropertyType> newItem = passNewItem; 252 RefPtrWillBeRawPtr<ItemPropertyType> newItem = passNewItem;
252 253
253 // Spec: If newItem is already in a list, it is removed from its previous li st before it is inserted into this list. 254 // SVG2-Draft Spec: If newItem is already in a list, then a new object is cr eated with the same values as newItem and this item is inserted into the list.
254 if (!removeFromOldOwnerListAndAdjustIndex(newItem, &index)) { 255 // Otherwise, newItem itself is inserted into the list.
255 // Inserting the item before itself is a no-op. 256 if (newItem->ownerList())
256 return newItem.release(); 257 newItem = newItem->clone();
257 }
258 258
259 // 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 259 // 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
260 // 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. 260 // 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.
261 m_values.insert(index, newItem); 261 m_values.insert(index, newItem);
262 newItem->setOwnerList(this); 262 newItem->setOwnerList(this);
263 263
264 return newItem.release(); 264 return newItem.release();
265 } 265 }
266 266
267 template<typename Derived, typename ItemProperty> 267 template<typename Derived, typename ItemProperty>
268 PassRefPtrWillBeRawPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty >::removeItem(size_t index, ExceptionState& exceptionState) 268 PassRefPtrWillBeRawPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty >::removeItem(size_t index, ExceptionState& exceptionState)
269 { 269 {
270 if (index >= m_values.size()) { 270 if (index >= m_values.size()) {
271 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde xExceedsMaximumBound("index", index, m_values.size())); 271 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde xExceedsMaximumBound("index", index, m_values.size()));
272 return nullptr; 272 return nullptr;
273 } 273 }
274 ASSERT(m_values.at(index)->ownerList() == this); 274 ASSERT(m_values.at(index)->ownerList() == this);
275 RefPtrWillBeRawPtr<ItemPropertyType> oldItem = m_values.at(index); 275 RefPtrWillBeRawPtr<ItemPropertyType> oldItem = m_values.at(index);
276 m_values.remove(index); 276 m_values.remove(index);
277 oldItem->setOwnerList(0); 277 oldItem->setOwnerList(0);
278 return oldItem.release(); 278 return oldItem.release();
279 } 279 }
280 280
281 template<typename Derived, typename ItemProperty> 281 template<typename Derived, typename ItemProperty>
282 PassRefPtrWillBeRawPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty >::appendItem(PassRefPtrWillBeRawPtr<ItemProperty> passNewItem) 282 PassRefPtrWillBeRawPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty >::appendItem(PassRefPtrWillBeRawPtr<ItemProperty> passNewItem)
283 { 283 {
284 RefPtrWillBeRawPtr<ItemPropertyType> newItem = passNewItem; 284 RefPtrWillBeRawPtr<ItemPropertyType> newItem = passNewItem;
285 285
286 // Spec: If newItem is already in a list, it is removed from its previous li st before it is inserted into this list. 286 // SVG2-Draft Spec: If newItem is already in a list, then a new object is cr eated with the same values as newItem and this item is inserted into the list.
287 removeFromOldOwnerListAndAdjustIndex(newItem, 0); 287 // Otherwise, newItem itself is inserted into the list.
288 if (newItem->ownerList())
289 newItem = newItem->clone();
288 290
289 // Append the value and wrapper at the end of the list. 291 // Append the value and wrapper at the end of the list.
290 append(newItem); 292 append(newItem);
291 293
292 return newItem.release(); 294 return newItem.release();
293 } 295 }
294 296
295 template<typename Derived, typename ItemProperty> 297 template<typename Derived, typename ItemProperty>
296 PassRefPtrWillBeRawPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty >::replaceItem(PassRefPtrWillBeRawPtr<ItemProperty> passNewItem, size_t index, E xceptionState& exceptionState) 298 PassRefPtrWillBeRawPtr<ItemProperty> SVGListPropertyHelper<Derived, ItemProperty >::replaceItem(PassRefPtrWillBeRawPtr<ItemProperty> passNewItem, size_t index, E xceptionState& exceptionState)
297 { 299 {
298 if (!checkIndexBound(index, exceptionState)) 300 if (!checkIndexBound(index, exceptionState))
299 return nullptr; 301 return nullptr;
300 302
301 RefPtrWillBeRawPtr<ItemPropertyType> newItem = passNewItem; 303 RefPtrWillBeRawPtr<ItemPropertyType> newItem = passNewItem;
302 304
303 // Spec: If newItem is already in a list, it is removed from its previous li st before it is inserted into this list. 305 // SVG2-Draft Spec: If newItem is already in a list, then a new object is cr eated with the same values as newItem and this item is inserted into the list.
304 // 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. 306 // Otherwise, newItem itself is inserted into the list.
305 if (!removeFromOldOwnerListAndAdjustIndex(newItem, &index)) { 307 if (newItem->ownerList())
306 // Replacing the item with itself is a no-op. 308 newItem = newItem->clone();
307 return newItem.release();
308 }
309 309
310 if (m_values.isEmpty()) { 310 if (m_values.isEmpty()) {
311 // 'newItem' already lived in our list, we removed it, and now we're emp ty, which means there's nothing to replace. 311 // 'newItem' already lived in our list, we removed it, and now we're emp ty, which means there's nothing to replace.
312 exceptionState.throwDOMException(IndexSizeError, String::format("Failed to replace the provided item at index %zu.", index)); 312 exceptionState.throwDOMException(IndexSizeError, String::format("Failed to replace the provided item at index %zu.", index));
313 return nullptr; 313 return nullptr;
314 } 314 }
315 315
316 // Update the value at the desired position 'index'. 316 // Update the value at the desired position 'index'.
317 RefPtrWillBeMember<ItemPropertyType>& position = m_values[index]; 317 RefPtrWillBeMember<ItemPropertyType>& position = m_values[index];
318 ASSERT(position->ownerList() == this); 318 ASSERT(position->ownerList() == this);
319 position->setOwnerList(0); 319 position->setOwnerList(0);
320 position = newItem; 320 position = newItem;
321 newItem->setOwnerList(this); 321 newItem->setOwnerList(this);
322 322
323 return newItem.release(); 323 return newItem.release();
324 } 324 }
325 325
326 template<typename Derived, typename ItemProperty> 326 template<typename Derived, typename ItemProperty>
327 bool SVGListPropertyHelper<Derived, ItemProperty>::checkIndexBound(size_t index, ExceptionState& exceptionState) 327 bool SVGListPropertyHelper<Derived, ItemProperty>::checkIndexBound(size_t index, ExceptionState& exceptionState)
328 { 328 {
329 if (index >= m_values.size()) { 329 if (index >= m_values.size()) {
330 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde xExceedsMaximumBound("index", index, m_values.size())); 330 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde xExceedsMaximumBound("index", index, m_values.size()));
331 return false; 331 return false;
332 } 332 }
333 333
334 return true; 334 return true;
335 } 335 }
336 336
337 template<typename Derived, typename ItemProperty> 337 template<typename Derived, typename ItemProperty>
338 bool SVGListPropertyHelper<Derived, ItemProperty>::removeFromOldOwnerListAndAdju stIndex(PassRefPtrWillBeRawPtr<ItemPropertyType> passItem, size_t* indexToModify )
339 {
340 RefPtrWillBeRawPtr<ItemPropertyType> item = passItem;
341 ASSERT(item);
342 RefPtrWillBeRawPtr<Derived> ownerList = toDerived(item->ownerList());
343 if (!ownerList)
344 return true;
345
346 // Spec: If newItem is already in a list, it is removed from its previous li st before it is inserted into this list.
347 // 'newItem' is already living in another list. If it's not our list, synchr onize the other lists wrappers after the removal.
348 bool livesInOtherList = ownerList.get() != this;
349 size_t indexToRemove = ownerList->findItem(item);
350 ASSERT(indexToRemove != WTF::kNotFound);
351
352 // Do not remove newItem if already in this list at the target index.
353 if (!livesInOtherList && indexToModify && indexToRemove == *indexToModify)
354 return false;
355
356 ownerList->removeItem(indexToRemove, ASSERT_NO_EXCEPTION);
357
358 if (!indexToModify)
359 return true;
360
361 // If the item lived in our list, adjust the insertion index.
362 if (!livesInOtherList) {
363 size_t& index = *indexToModify;
364 // 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.
365 if (static_cast<size_t>(indexToRemove) < index)
366 --index;
367 }
368
369 return true;
370 }
371
372 template<typename Derived, typename ItemProperty>
373 size_t SVGListPropertyHelper<Derived, ItemProperty>::findItem(PassRefPtrWillBeRa wPtr<ItemPropertyType> item) 338 size_t SVGListPropertyHelper<Derived, ItemProperty>::findItem(PassRefPtrWillBeRa wPtr<ItemPropertyType> item)
374 { 339 {
375 return m_values.find(item); 340 return m_values.find(item);
376 } 341 }
377 342
378 template<typename Derived, typename ItemProperty> 343 template<typename Derived, typename ItemProperty>
379 void SVGListPropertyHelper<Derived, ItemProperty>::deepCopy(PassRefPtrWillBeRawP tr<Derived> passFrom) 344 void SVGListPropertyHelper<Derived, ItemProperty>::deepCopy(PassRefPtrWillBeRawP tr<Derived> passFrom)
380 { 345 {
381 RefPtrWillBeRawPtr<Derived> from = passFrom; 346 RefPtrWillBeRawPtr<Derived> from = passFrom;
382 347
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 for (size_t i = 0; i < paddingCount; ++i) 383 for (size_t i = 0; i < paddingCount; ++i)
419 append(createPaddingItem()); 384 append(createPaddingItem());
420 } 385 }
421 386
422 return true; 387 return true;
423 } 388 }
424 389
425 } 390 }
426 391
427 #endif // SVGListPropertyHelper_h 392 #endif // SVGListPropertyHelper_h
OLDNEW
« Source/core/svg/SVGPathSegListTearOff.h ('K') | « Source/core/svg/SVGPathSegMovetoRel.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698