Chromium Code Reviews| Index: third_party/WebKit/Source/core/dom/NodeTraversal.h |
| diff --git a/third_party/WebKit/Source/core/dom/NodeTraversal.h b/third_party/WebKit/Source/core/dom/NodeTraversal.h |
| index 99bf817d9564a3b74b1ad6eb9e3039a38ae2f8b9..70c6c1d1dbbb533d7b72d9cda0bb540bedb88560 100644 |
| --- a/third_party/WebKit/Source/core/dom/NodeTraversal.h |
| +++ b/third_party/WebKit/Source/core/dom/NodeTraversal.h |
| @@ -34,6 +34,8 @@ |
| namespace blink { |
| template <class Iterator> class TraversalRange; |
| +template <class TraversalNext> class TraversalAncestorsIterator; |
| +template <class TraversalNext> class TraversalAncestorsOrSelfIterator; |
| template <class TraversalNext> class TraversalChildrenIterator; |
| template <class TraversalNext> class TraversalDescendantIterator; |
| template <class TraversalNext> class TraversalInclusiveDescendantIterator; |
| @@ -100,6 +102,9 @@ public: |
| static unsigned countChildren(const Node& parent) { return parent.countChildren(); } |
| static ContainerNode* parentOrShadowHostNode(const Node& node) { return node.parentOrShadowHostNode(); } |
| + static TraversalRange<TraversalAncestorsIterator<NodeTraversal>> ancestorsOf(const Node&); |
| + static TraversalRange<TraversalAncestorsOrSelfIterator<NodeTraversal>> ancestorsOrSelfOf(const Node*); |
|
fs
2016/04/28 08:18:52
Drive-by: ancestorsOrSelfOf is kind of a weird nam
yosin_UTC9
2016/04/28 08:59:05
Done.
|
| + static TraversalRange<TraversalAncestorsOrSelfIterator<NodeTraversal>> ancestorsOrSelfOf(const Node&); |
| static TraversalRange<TraversalChildrenIterator<NodeTraversal>> childrenOf(const Node&); |
| static TraversalRange<TraversalDescendantIterator<NodeTraversal>> descendantsOf(const Node&); |
| static TraversalRange<TraversalInclusiveDescendantIterator<NodeTraversal>> inclusiveDescendantsOf(const Node&); |
| @@ -141,6 +146,32 @@ protected: |
| }; |
| template <class TraversalNext> |
| +class TraversalAncestorsIterator : public TraversalIteratorBase<TraversalNext> { |
| + STACK_ALLOCATED(); |
| +public: |
| + using StartNodeType = Node; |
| + using TraversalIteratorBase<TraversalNext>::m_current; |
| + explicit TraversalAncestorsIterator(const StartNodeType* start) : TraversalIteratorBase<TraversalNext>(TraversalNext::parent(*start)) { } |
| + void operator++() { m_current = TraversalNext::parent(*m_current); } |
| + static TraversalAncestorsIterator end() { return TraversalAncestorsIterator(); } |
| +private: |
| + TraversalAncestorsIterator() : TraversalIteratorBase<TraversalNext>(nullptr) { } |
| +}; |
| + |
| +template <class TraversalNext> |
| +class TraversalAncestorsOrSelfIterator : public TraversalIteratorBase<TraversalNext> { |
| + STACK_ALLOCATED(); |
| +public: |
| + using StartNodeType = Node; |
| + using TraversalIteratorBase<TraversalNext>::m_current; |
| + explicit TraversalAncestorsOrSelfIterator(const StartNodeType* start) : TraversalIteratorBase<TraversalNext>(const_cast<StartNodeType*>(start)) { } |
| + void operator++() { m_current = TraversalNext::parent(*m_current); } |
| + static TraversalAncestorsOrSelfIterator end() { return TraversalAncestorsOrSelfIterator(); } |
| +private: |
| + TraversalAncestorsOrSelfIterator() : TraversalIteratorBase<TraversalNext>(nullptr) { } |
| +}; |
| + |
| +template <class TraversalNext> |
| class TraversalChildrenIterator : public TraversalIteratorBase<TraversalNext> { |
| STACK_ALLOCATED(); |
| public: |
| @@ -192,6 +223,21 @@ private: |
| Member<const StartNodeType> m_root; |
| }; |
| +inline TraversalRange<TraversalAncestorsIterator<NodeTraversal>> NodeTraversal::ancestorsOf(const Node& node) |
| +{ |
| + return TraversalRange<TraversalAncestorsIterator<NodeTraversal>>(&node); |
| +} |
| + |
| +inline TraversalRange<TraversalAncestorsOrSelfIterator<NodeTraversal>> NodeTraversal::ancestorsOrSelfOf(const Node& node) |
| +{ |
| + return TraversalRange<TraversalAncestorsOrSelfIterator<NodeTraversal>>(&node); |
| +} |
| + |
| +inline TraversalRange<TraversalAncestorsOrSelfIterator<NodeTraversal>> NodeTraversal::ancestorsOrSelfOf(const Node* node) |
|
hayato
2016/04/28 08:38:20
It might be better that we do not provide a pointe
yosin_UTC9
2016/04/28 08:59:04
I don't agree, pointer version is useful and safe
yosin_UTC9
2016/04/28 09:01:29
Actually, I introduced reference version only then
|
| +{ |
| + return TraversalRange<TraversalAncestorsOrSelfIterator<NodeTraversal>>(node); |
| +} |
| + |
| inline TraversalRange<TraversalChildrenIterator<NodeTraversal>> NodeTraversal::childrenOf(const Node& parent) |
| { |
| return TraversalRange<TraversalChildrenIterator<NodeTraversal>>(&parent); |