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