Changeset 161288 in webkit


Ignore:
Timestamp:
Jan 3, 2014, 3:19:40 PM (12 years ago)
Author:
akling@apple.com
Message:

Add lineageOfType renderer iterator and start using it.
<https://webkit.org/b/126456>

Add a convenient way to iterate over a renderers ancestry *including*
the starting point renderer (if it meets the type criteria.)

This works just like lineageOfType for Elements.

Reviewed by Geoffrey Garen.

  • rendering/RenderAncestorIterator.h:

(WebCore::lineageOfType):

Added. Returns an adapter for walking a renderer's entire lineage
matching any renderer of the given type.

  • rendering/RenderBoxModelObject.h:
  • rendering/RenderLayerModelObject.h:

Add the requisite isRendererOfType<T> helpers.

  • rendering/RenderBox.cpp:

(WebCore::RenderBox::enclosingFloatPaintingLayer):

  • rendering/RenderObject.cpp:

(WebCore::RenderObject::enclosingLayer):
(WebCore::RenderObject::enclosingBox):
(WebCore::RenderObject::enclosingBoxModelObject):

Simplify with lineageOfType. Added some FIXMEs about functions
that should return references instead of pointers.

Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r161287 r161288  
     12014-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
    1342014-01-03  Martin Robinson  <mrobinson@igalia.com>
    235
  • trunk/Source/WebCore/rendering/RenderAncestorIterator.h

    r158598 r161288  
    7373template <typename T> RenderAncestorIteratorAdapter<T> ancestorsOfType(RenderObject&);
    7474template <typename T> RenderAncestorConstIteratorAdapter<T> ancestorsOfType(const RenderObject&);
     75template <typename T> RenderAncestorIteratorAdapter<T> lineageOfType(RenderObject&);
     76template <typename T> RenderAncestorConstIteratorAdapter<T> lineageOfType(const RenderObject&);
    7577
    7678// RenderAncestorIterator
     
    182184}
    183185
     186template <typename T>
     187inline 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
     194template <typename T>
     195inline 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
    184202}
    185203
  • trunk/Source/WebCore/rendering/RenderBox.cpp

    r161028 r161288  
    44864486RenderLayer* RenderBox::enclosingFloatPaintingLayer() const
    44874487{
    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;
    44964493}
    44974494
  • trunk/Source/WebCore/rendering/RenderBoxModelObject.h

    r159609 r161288  
    346346};
    347347
     348template <> inline bool isRendererOfType<const RenderBoxModelObject>(const RenderObject& renderer) { return renderer.isBoxModelObject(); }
     349
    348350RENDER_OBJECT_TYPE_CASTS(RenderBoxModelObject, isBoxModelObject())
    349351
  • trunk/Source/WebCore/rendering/RenderLayerModelObject.h

    r158097 r161288  
    6868};
    6969
     70template <> inline bool isRendererOfType<const RenderLayerModelObject>(const RenderObject& renderer) { return renderer.isRenderLayerModelObject(); }
     71
    7072RENDER_OBJECT_TYPE_CASTS(RenderLayerModelObject, isRenderLayerModelObject())
    7173
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r160966 r161288  
    5050#include "RenderGeometryMap.h"
    5151#include "RenderInline.h"
     52#include "RenderIterator.h"
    5253#include "RenderLayer.h"
    5354#include "RenderLayerBacking.h"
     
    473474RenderLayer* RenderObject::enclosingLayer() const
    474475{
    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;
    483481}
    484482
     
    495493RenderBox* RenderObject::enclosingBox() const
    496494{
    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();
    506497}
    507498
    508499RenderBoxModelObject* RenderObject::enclosingBoxModelObject() const
    509500{
    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();
    519503}
    520504
Note: See TracChangeset for help on using the changeset viewer.