Changeset 161288 in webkit
- Timestamp:
- Jan 3, 2014, 3:19:40 PM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r161287 r161288 1 2014-01-03 Andreas Kling <akling@apple.com> 2 3 Add lineageOfType renderer iterator and start using it. 4 <https://webkit.org/b/126456> 5 6 Add a convenient way to iterate over a renderers ancestry *including* 7 the starting point renderer (if it meets the type criteria.) 8 9 This works just like lineageOfType for Elements. 10 11 Reviewed by Geoffrey Garen. 12 13 * rendering/RenderAncestorIterator.h: 14 (WebCore::lineageOfType): 15 16 Added. Returns an adapter for walking a renderer's entire lineage 17 matching any renderer of the given type. 18 19 * rendering/RenderBoxModelObject.h: 20 * rendering/RenderLayerModelObject.h: 21 22 Add the requisite isRendererOfType<T> helpers. 23 24 * rendering/RenderBox.cpp: 25 (WebCore::RenderBox::enclosingFloatPaintingLayer): 26 * rendering/RenderObject.cpp: 27 (WebCore::RenderObject::enclosingLayer): 28 (WebCore::RenderObject::enclosingBox): 29 (WebCore::RenderObject::enclosingBoxModelObject): 30 31 Simplify with lineageOfType. Added some FIXMEs about functions 32 that should return references instead of pointers. 33 1 34 2014-01-03 Martin Robinson <mrobinson@igalia.com> 2 35 -
trunk/Source/WebCore/rendering/RenderAncestorIterator.h
r158598 r161288 73 73 template <typename T> RenderAncestorIteratorAdapter<T> ancestorsOfType(RenderObject&); 74 74 template <typename T> RenderAncestorConstIteratorAdapter<T> ancestorsOfType(const RenderObject&); 75 template <typename T> RenderAncestorIteratorAdapter<T> lineageOfType(RenderObject&); 76 template <typename T> RenderAncestorConstIteratorAdapter<T> lineageOfType(const RenderObject&); 75 77 76 78 // RenderAncestorIterator … … 182 184 } 183 185 186 template <typename T> 187 inline RenderAncestorIteratorAdapter<T> lineageOfType(RenderObject& first) 188 { 189 if (isRendererOfType<const T>(first)) 190 return RenderAncestorIteratorAdapter<T>(static_cast<T*>(&first)); 191 return ancestorsOfType<T>(first); 192 } 193 194 template <typename T> 195 inline RenderAncestorConstIteratorAdapter<T> lineageOfType(const RenderObject& first) 196 { 197 if (isRendererOfType<const T>(first)) 198 return RenderAncestorConstIteratorAdapter<T>(static_cast<const T*>(&first)); 199 return ancestorsOfType<T>(first); 200 } 201 184 202 } 185 203 -
trunk/Source/WebCore/rendering/RenderBox.cpp
r161028 r161288 4486 4486 RenderLayer* RenderBox::enclosingFloatPaintingLayer() const 4487 4487 { 4488 const RenderElement* curr = this; 4489 while (curr) { 4490 RenderLayer* layer = curr->hasLayer() && curr->isBox() ? toRenderBox(curr)->layer() : 0; 4491 if (layer && layer->isSelfPaintingLayer()) 4492 return layer; 4493 curr = curr->parent(); 4494 } 4495 return 0; 4488 for (auto& box : lineageOfType<RenderBox>(*this)) { 4489 if (box.layer() && box.layer()->isSelfPaintingLayer()) 4490 return box.layer(); 4491 } 4492 return nullptr; 4496 4493 } 4497 4494 -
trunk/Source/WebCore/rendering/RenderBoxModelObject.h
r159609 r161288 346 346 }; 347 347 348 template <> inline bool isRendererOfType<const RenderBoxModelObject>(const RenderObject& renderer) { return renderer.isBoxModelObject(); } 349 348 350 RENDER_OBJECT_TYPE_CASTS(RenderBoxModelObject, isBoxModelObject()) 349 351 -
trunk/Source/WebCore/rendering/RenderLayerModelObject.h
r158097 r161288 68 68 }; 69 69 70 template <> inline bool isRendererOfType<const RenderLayerModelObject>(const RenderObject& renderer) { return renderer.isRenderLayerModelObject(); } 71 70 72 RENDER_OBJECT_TYPE_CASTS(RenderLayerModelObject, isRenderLayerModelObject()) 71 73 -
trunk/Source/WebCore/rendering/RenderObject.cpp
r160966 r161288 50 50 #include "RenderGeometryMap.h" 51 51 #include "RenderInline.h" 52 #include "RenderIterator.h" 52 53 #include "RenderLayer.h" 53 54 #include "RenderLayerBacking.h" … … 473 474 RenderLayer* RenderObject::enclosingLayer() const 474 475 { 475 const RenderObject* curr = this; 476 while (curr) { 477 RenderLayer* layer = curr->hasLayer() ? toRenderLayerModelObject(curr)->layer() : 0; 478 if (layer) 479 return layer; 480 curr = curr->parent(); 481 } 482 return 0; 476 for (auto& renderer : lineageOfType<RenderLayerModelObject>(*this)) { 477 if (renderer.layer()) 478 return renderer.layer(); 479 } 480 return nullptr; 483 481 } 484 482 … … 495 493 RenderBox* RenderObject::enclosingBox() const 496 494 { 497 RenderObject* curr = const_cast<RenderObject*>(this); 498 while (curr) { 499 if (curr->isBox()) 500 return toRenderBox(curr); 501 curr = curr->parent(); 502 } 503 504 ASSERT_NOT_REACHED(); 505 return 0; 495 // FIXME: This should return a reference; it can always find the root RenderView. 496 return lineageOfType<RenderBox>(const_cast<RenderObject&>(*this)).first(); 506 497 } 507 498 508 499 RenderBoxModelObject* RenderObject::enclosingBoxModelObject() const 509 500 { 510 RenderObject* curr = const_cast<RenderObject*>(this); 511 while (curr) { 512 if (curr->isBoxModelObject()) 513 return toRenderBoxModelObject(curr); 514 curr = curr->parent(); 515 } 516 517 ASSERT_NOT_REACHED(); 518 return 0; 501 // FIXME: This should return a reference; it can always find the root RenderView. 502 return lineageOfType<RenderBoxModelObject>(const_cast<RenderObject&>(*this)).first(); 519 503 } 520 504
Note:
See TracChangeset
for help on using the changeset viewer.