From 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Tue, 27 Jun 2017 06:07:23 +0000 Subject: webkitgtk-2.16.5 --- Source/WebCore/rendering/RenderIterator.h | 120 ++++++++++++++++++++++++++---- 1 file changed, 107 insertions(+), 13 deletions(-) (limited to 'Source/WebCore/rendering/RenderIterator.h') diff --git a/Source/WebCore/rendering/RenderIterator.h b/Source/WebCore/rendering/RenderIterator.h index b50a344b9..ba172e72a 100644 --- a/Source/WebCore/rendering/RenderIterator.h +++ b/Source/WebCore/rendering/RenderIterator.h @@ -23,10 +23,9 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef RenderIterator_h -#define RenderIterator_h +#pragma once -#include "RenderObject.h" +#include "RenderElement.h" namespace WebCore { @@ -42,6 +41,7 @@ public: bool operator==(const RenderIterator& other) const; bool operator!=(const RenderIterator& other) const; + RenderIterator& traverseNext(); RenderIterator& traverseNextSibling(); RenderIterator& traversePreviousSibling(); RenderIterator& traverseAncestor(); @@ -63,6 +63,7 @@ public: bool operator==(const RenderConstIterator& other) const; bool operator!=(const RenderConstIterator& other) const; + RenderConstIterator& traverseNext(); RenderConstIterator& traverseNextSibling(); RenderConstIterator& traversePreviousSibling(); RenderConstIterator& traverseAncestor(); @@ -72,15 +73,76 @@ private: const T* m_current; }; +// Similar to WTF::is<>() but without the static_assert() making sure the check is necessary. +template +inline bool isRendererOfType(const U& renderer) { return TypeCastTraits::isOfType(renderer); } + // Traversal helpers +namespace RenderObjectTraversal { + +template +inline RenderObject* firstChild(U& object) +{ + return object.firstChild(); +} + +inline RenderObject* firstChild(RenderObject& object) +{ + return object.firstChildSlow(); +} + +inline RenderObject* firstChild(RenderText&) +{ + return nullptr; +} + +inline RenderObject* nextAncestorSibling(RenderObject& current, const RenderObject* stayWithin) +{ + for (auto* ancestor = current.parent(); ancestor; ancestor = ancestor->parent()) { + if (ancestor == stayWithin) + return nullptr; + if (auto* sibling = ancestor->nextSibling()) + return sibling; + } + return nullptr; +} + +template +inline RenderObject* next(U& current, const RenderObject* stayWithin) +{ + if (auto* child = firstChild(current)) + return child; + + if (¤t == stayWithin) + return nullptr; + + if (auto* sibling = current.nextSibling()) + return sibling; + + return nextAncestorSibling(current, stayWithin); +} + +inline RenderObject* nextSkippingChildren(RenderObject& current, const RenderObject* stayWithin) +{ + if (¤t == stayWithin) + return nullptr; + + if (auto* sibling = current.nextSibling()) + return sibling; + + return nextAncestorSibling(current, stayWithin); +} + +} + namespace RenderTraversal { template inline T* firstChild(U& current) { - RenderObject* object = current.firstChild(); - while (object && !isRendererOfType(*object)) + RenderObject* object = RenderObjectTraversal::firstChild(current); + while (object && !isRendererOfType(*object)) object = object->nextSibling(); return static_cast(object); } @@ -89,7 +151,7 @@ template inline T* lastChild(U& current) { RenderObject* object = current.lastChild(); - while (object && !isRendererOfType(*object)) + while (object && !isRendererOfType(*object)) object = object->previousSibling(); return static_cast(object); } @@ -98,7 +160,7 @@ template inline T* nextSibling(U& current) { RenderObject* object = current.nextSibling(); - while (object && !isRendererOfType(*object)) + while (object && !isRendererOfType(*object)) object = object->nextSibling(); return static_cast(object); } @@ -107,7 +169,7 @@ template inline T* previousSibling(U& current) { RenderObject* object = current.previousSibling(); - while (object && !isRendererOfType(*object)) + while (object && !isRendererOfType(*object)) object = object->previousSibling(); return static_cast(object); } @@ -115,13 +177,31 @@ inline T* previousSibling(U& current) template inline T* findAncestorOfType(const RenderObject& current) { - for (auto ancestor = current.parent(); ancestor; ancestor = ancestor->parent()) { - if (isRendererOfType(*ancestor)) + for (auto* ancestor = current.parent(); ancestor; ancestor = ancestor->parent()) { + if (isRendererOfType(*ancestor)) return static_cast(ancestor); } return nullptr; } +template +inline T* firstWithin(U& current) +{ + auto* descendant = RenderObjectTraversal::firstChild(current); + while (descendant && !isRendererOfType(*descendant)) + descendant = RenderObjectTraversal::next(*descendant, ¤t); + return static_cast(descendant); +} + +template +inline T* next(U& current, const RenderObject* stayWithin) +{ + auto* descendant = RenderObjectTraversal::next(current, stayWithin); + while (descendant && !isRendererOfType(*descendant)) + descendant = RenderObjectTraversal::next(*descendant, stayWithin); + return static_cast(descendant); +} + } // namespace WebCore::RenderTraversal // RenderIterator @@ -148,6 +228,14 @@ inline RenderIterator& RenderIterator::traverseNextSibling() return *this; } +template +inline RenderIterator& RenderIterator::traverseNext() +{ + ASSERT(m_current); + m_current = RenderTraversal::next(*m_current, m_root); + return *this; +} + template inline RenderIterator& RenderIterator::traversePreviousSibling() { @@ -216,6 +304,14 @@ inline RenderConstIterator& RenderConstIterator::traverseNextSibling() return *this; } +template +inline RenderConstIterator& RenderConstIterator::traverseNext() +{ + ASSERT(m_current); + m_current = RenderTraversal::next(*m_current, m_root); + return *this; +} + template inline RenderConstIterator& RenderConstIterator::traversePreviousSibling() { @@ -261,9 +357,7 @@ inline bool RenderConstIterator::operator!=(const RenderConstIterator& other) return !(*this == other); } -} +} // namespace WebCore #include "RenderAncestorIterator.h" #include "RenderChildIterator.h" - -#endif -- cgit v1.2.1