Title: [161288] trunk/Source/WebCore
Revision
161288
Author
[email protected]
Date
2014-01-03 15:19:40 -0800 (Fri, 03 Jan 2014)

Log 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.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (161287 => 161288)


--- trunk/Source/WebCore/ChangeLog	2014-01-03 23:05:38 UTC (rev 161287)
+++ trunk/Source/WebCore/ChangeLog	2014-01-03 23:19:40 UTC (rev 161288)
@@ -1,3 +1,36 @@
+2014-01-03  Andreas Kling  <[email protected]>
+
+        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.
+
 2014-01-03  Martin Robinson  <[email protected]>
 
         Small build fix for the GTK+ CMake port

Modified: trunk/Source/WebCore/rendering/RenderAncestorIterator.h (161287 => 161288)


--- trunk/Source/WebCore/rendering/RenderAncestorIterator.h	2014-01-03 23:05:38 UTC (rev 161287)
+++ trunk/Source/WebCore/rendering/RenderAncestorIterator.h	2014-01-03 23:19:40 UTC (rev 161288)
@@ -72,6 +72,8 @@
 
 template <typename T> RenderAncestorIteratorAdapter<T> ancestorsOfType(RenderObject&);
 template <typename T> RenderAncestorConstIteratorAdapter<T> ancestorsOfType(const RenderObject&);
+template <typename T> RenderAncestorIteratorAdapter<T> lineageOfType(RenderObject&);
+template <typename T> RenderAncestorConstIteratorAdapter<T> lineageOfType(const RenderObject&);
 
 // RenderAncestorIterator
 
@@ -181,6 +183,22 @@
     return RenderAncestorConstIteratorAdapter<T>(first);
 }
 
+template <typename T>
+inline RenderAncestorIteratorAdapter<T> lineageOfType(RenderObject& first)
+{
+    if (isRendererOfType<const T>(first))
+        return RenderAncestorIteratorAdapter<T>(static_cast<T*>(&first));
+    return ancestorsOfType<T>(first);
 }
 
+template <typename T>
+inline RenderAncestorConstIteratorAdapter<T> lineageOfType(const RenderObject& first)
+{
+    if (isRendererOfType<const T>(first))
+        return RenderAncestorConstIteratorAdapter<T>(static_cast<const T*>(&first));
+    return ancestorsOfType<T>(first);
+}
+
+}
+
 #endif

Modified: trunk/Source/WebCore/rendering/RenderBox.cpp (161287 => 161288)


--- trunk/Source/WebCore/rendering/RenderBox.cpp	2014-01-03 23:05:38 UTC (rev 161287)
+++ trunk/Source/WebCore/rendering/RenderBox.cpp	2014-01-03 23:19:40 UTC (rev 161288)
@@ -4485,14 +4485,11 @@
 
 RenderLayer* RenderBox::enclosingFloatPaintingLayer() const
 {
-    const RenderElement* curr = this;
-    while (curr) {
-        RenderLayer* layer = curr->hasLayer() && curr->isBox() ? toRenderBox(curr)->layer() : 0;
-        if (layer && layer->isSelfPaintingLayer())
-            return layer;
-        curr = curr->parent();
+    for (auto& box : lineageOfType<RenderBox>(*this)) {
+        if (box.layer() && box.layer()->isSelfPaintingLayer())
+            return box.layer();
     }
-    return 0;
+    return nullptr;
 }
 
 LayoutRect RenderBox::logicalVisualOverflowRectForPropagation(RenderStyle* parentStyle) const

Modified: trunk/Source/WebCore/rendering/RenderBoxModelObject.h (161287 => 161288)


--- trunk/Source/WebCore/rendering/RenderBoxModelObject.h	2014-01-03 23:05:38 UTC (rev 161287)
+++ trunk/Source/WebCore/rendering/RenderBoxModelObject.h	2014-01-03 23:19:40 UTC (rev 161288)
@@ -345,6 +345,8 @@
     void paintMaskForTextFillBox(ImageBuffer*, const IntRect&, InlineFlowBox*, const LayoutRect&, RenderRegion*);
 };
 
+template <> inline bool isRendererOfType<const RenderBoxModelObject>(const RenderObject& renderer) { return renderer.isBoxModelObject(); }
+
 RENDER_OBJECT_TYPE_CASTS(RenderBoxModelObject, isBoxModelObject())
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/rendering/RenderLayerModelObject.h (161287 => 161288)


--- trunk/Source/WebCore/rendering/RenderLayerModelObject.h	2014-01-03 23:05:38 UTC (rev 161287)
+++ trunk/Source/WebCore/rendering/RenderLayerModelObject.h	2014-01-03 23:19:40 UTC (rev 161288)
@@ -67,6 +67,8 @@
     static bool s_layerWasSelfPainting;
 };
 
+template <> inline bool isRendererOfType<const RenderLayerModelObject>(const RenderObject& renderer) { return renderer.isRenderLayerModelObject(); }
+
 RENDER_OBJECT_TYPE_CASTS(RenderLayerModelObject, isRenderLayerModelObject())
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (161287 => 161288)


--- trunk/Source/WebCore/rendering/RenderObject.cpp	2014-01-03 23:05:38 UTC (rev 161287)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp	2014-01-03 23:19:40 UTC (rev 161288)
@@ -49,6 +49,7 @@
 #include "RenderFlowThread.h"
 #include "RenderGeometryMap.h"
 #include "RenderInline.h"
+#include "RenderIterator.h"
 #include "RenderLayer.h"
 #include "RenderLayerBacking.h"
 #include "RenderNamedFlowThread.h"
@@ -472,14 +473,11 @@
 
 RenderLayer* RenderObject::enclosingLayer() const
 {
-    const RenderObject* curr = this;
-    while (curr) {
-        RenderLayer* layer = curr->hasLayer() ? toRenderLayerModelObject(curr)->layer() : 0;
-        if (layer)
-            return layer;
-        curr = curr->parent();
+    for (auto& renderer : lineageOfType<RenderLayerModelObject>(*this)) {
+        if (renderer.layer())
+            return renderer.layer();
     }
-    return 0;
+    return nullptr;
 }
 
 bool RenderObject::scrollRectToVisible(const LayoutRect& rect, const ScrollAlignment& alignX, const ScrollAlignment& alignY)
@@ -494,28 +492,14 @@
 
 RenderBox* RenderObject::enclosingBox() const
 {
-    RenderObject* curr = const_cast<RenderObject*>(this);
-    while (curr) {
-        if (curr->isBox())
-            return toRenderBox(curr);
-        curr = curr->parent();
-    }
-    
-    ASSERT_NOT_REACHED();
-    return 0;
+    // FIXME: This should return a reference; it can always find the root RenderView.
+    return lineageOfType<RenderBox>(const_cast<RenderObject&>(*this)).first();
 }
 
 RenderBoxModelObject* RenderObject::enclosingBoxModelObject() const
 {
-    RenderObject* curr = const_cast<RenderObject*>(this);
-    while (curr) {
-        if (curr->isBoxModelObject())
-            return toRenderBoxModelObject(curr);
-        curr = curr->parent();
-    }
-
-    ASSERT_NOT_REACHED();
-    return 0;
+    // FIXME: This should return a reference; it can always find the root RenderView.
+    return lineageOfType<RenderBoxModelObject>(const_cast<RenderObject&>(*this)).first();
 }
 
 bool RenderObject::fixedPositionedWithNamedFlowContainingBlock() const
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to