OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2000 Frederik Holljen (frederik.holljen@hig.no) | 3 * Copyright (C) 2000 Frederik Holljen (frederik.holljen@hig.no) |
4 * Copyright (C) 2001 Peter Kelly (pmk@post.com) | 4 * Copyright (C) 2001 Peter Kelly (pmk@post.com) |
5 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) | 5 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) |
6 * Copyright (C) 2004, 2008 Apple Inc. All rights reserved. | 6 * Copyright (C) 2004, 2008 Apple Inc. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 11 matching lines...) Expand all Loading... |
22 * | 22 * |
23 */ | 23 */ |
24 | 24 |
25 #include "config.h" | 25 #include "config.h" |
26 #include "core/dom/NodeIterator.h" | 26 #include "core/dom/NodeIterator.h" |
27 | 27 |
28 #include "bindings/v8/ExceptionState.h" | 28 #include "bindings/v8/ExceptionState.h" |
29 #include "core/dom/Document.h" | 29 #include "core/dom/Document.h" |
30 #include "core/dom/ExceptionCode.h" | 30 #include "core/dom/ExceptionCode.h" |
31 #include "core/dom/NodeTraversal.h" | 31 #include "core/dom/NodeTraversal.h" |
32 #include "core/frame/UseCounter.h" | |
33 | 32 |
34 namespace WebCore { | 33 namespace WebCore { |
35 | 34 |
36 NodeIterator::NodePointer::NodePointer() | 35 NodeIterator::NodePointer::NodePointer() |
37 { | 36 { |
38 } | 37 } |
39 | 38 |
40 NodeIterator::NodePointer::NodePointer(PassRefPtr<Node> n, bool b) | 39 NodeIterator::NodePointer::NodePointer(PassRefPtrWillBeRawPtr<Node> n, bool b) |
41 : node(n) | 40 : node(n) |
42 , isPointerBeforeNode(b) | 41 , isPointerBeforeNode(b) |
43 { | 42 { |
44 } | 43 } |
45 | 44 |
46 void NodeIterator::NodePointer::clear() | 45 void NodeIterator::NodePointer::clear() |
47 { | 46 { |
48 node.clear(); | 47 node.clear(); |
49 } | 48 } |
50 | 49 |
(...skipping 14 matching lines...) Expand all Loading... |
65 if (!node) | 64 if (!node) |
66 return false; | 65 return false; |
67 if (!isPointerBeforeNode) { | 66 if (!isPointerBeforeNode) { |
68 isPointerBeforeNode = true; | 67 isPointerBeforeNode = true; |
69 return true; | 68 return true; |
70 } | 69 } |
71 node = NodeTraversal::previous(*node, root); | 70 node = NodeTraversal::previous(*node, root); |
72 return node; | 71 return node; |
73 } | 72 } |
74 | 73 |
75 NodeIterator::NodeIterator(PassRefPtr<Node> rootNode, unsigned whatToShow, PassR
efPtr<NodeFilter> filter) | 74 NodeIterator::NodeIterator(PassRefPtrWillBeRawPtr<Node> rootNode, unsigned whatT
oShow, PassRefPtrWillBeRawPtr<NodeFilter> filter) |
76 : NodeIteratorBase(rootNode, whatToShow, filter) | 75 : NodeIteratorBase(rootNode, whatToShow, filter) |
77 , m_referenceNode(root(), true) | 76 , m_referenceNode(root(), true) |
78 { | 77 { |
79 ScriptWrappable::init(this); | 78 ScriptWrappable::init(this); |
80 root()->document().attachNodeIterator(this); | 79 root()->document().attachNodeIterator(this); |
81 } | 80 } |
82 | 81 |
83 NodeIterator::~NodeIterator() | 82 NodeIterator::~NodeIterator() |
84 { | 83 { |
| 84 #if !ENABLE(OILPAN) |
85 root()->document().detachNodeIterator(this); | 85 root()->document().detachNodeIterator(this); |
| 86 #endif |
86 } | 87 } |
87 | 88 |
88 PassRefPtr<Node> NodeIterator::nextNode(ExceptionState& exceptionState) | 89 PassRefPtrWillBeRawPtr<Node> NodeIterator::nextNode(ExceptionState& exceptionSta
te) |
89 { | 90 { |
90 RefPtr<Node> result; | 91 RefPtrWillBeRawPtr<Node> result = nullptr; |
91 | 92 |
92 m_candidateNode = m_referenceNode; | 93 m_candidateNode = m_referenceNode; |
93 while (m_candidateNode.moveToNext(root())) { | 94 while (m_candidateNode.moveToNext(root())) { |
94 // NodeIterators treat the DOM tree as a flat list of nodes. | 95 // NodeIterators treat the DOM tree as a flat list of nodes. |
95 // In other words, FILTER_REJECT does not pass over descendants | 96 // In other words, FILTER_REJECT does not pass over descendants |
96 // of the rejected node. Hence, FILTER_REJECT is the same as FILTER_SKIP
. | 97 // of the rejected node. Hence, FILTER_REJECT is the same as FILTER_SKIP
. |
97 RefPtr<Node> provisionalResult = m_candidateNode.node; | 98 RefPtrWillBeRawPtr<Node> provisionalResult = m_candidateNode.node; |
98 bool nodeWasAccepted = acceptNode(provisionalResult.get(), exceptionStat
e) == NodeFilter::FILTER_ACCEPT; | 99 bool nodeWasAccepted = acceptNode(provisionalResult.get(), exceptionStat
e) == NodeFilter::FILTER_ACCEPT; |
99 if (exceptionState.hadException()) | 100 if (exceptionState.hadException()) |
100 break; | 101 break; |
101 if (nodeWasAccepted) { | 102 if (nodeWasAccepted) { |
102 m_referenceNode = m_candidateNode; | 103 m_referenceNode = m_candidateNode; |
103 result = provisionalResult.release(); | 104 result = provisionalResult.release(); |
104 break; | 105 break; |
105 } | 106 } |
106 } | 107 } |
107 | 108 |
108 m_candidateNode.clear(); | 109 m_candidateNode.clear(); |
109 return result.release(); | 110 return result.release(); |
110 } | 111 } |
111 | 112 |
112 PassRefPtr<Node> NodeIterator::previousNode(ExceptionState& exceptionState) | 113 PassRefPtrWillBeRawPtr<Node> NodeIterator::previousNode(ExceptionState& exceptio
nState) |
113 { | 114 { |
114 RefPtr<Node> result; | 115 RefPtrWillBeRawPtr<Node> result = nullptr; |
115 | 116 |
116 m_candidateNode = m_referenceNode; | 117 m_candidateNode = m_referenceNode; |
117 while (m_candidateNode.moveToPrevious(root())) { | 118 while (m_candidateNode.moveToPrevious(root())) { |
118 // NodeIterators treat the DOM tree as a flat list of nodes. | 119 // NodeIterators treat the DOM tree as a flat list of nodes. |
119 // In other words, FILTER_REJECT does not pass over descendants | 120 // In other words, FILTER_REJECT does not pass over descendants |
120 // of the rejected node. Hence, FILTER_REJECT is the same as FILTER_SKIP
. | 121 // of the rejected node. Hence, FILTER_REJECT is the same as FILTER_SKIP
. |
121 RefPtr<Node> provisionalResult = m_candidateNode.node; | 122 RefPtrWillBeRawPtr<Node> provisionalResult = m_candidateNode.node; |
122 bool nodeWasAccepted = acceptNode(provisionalResult.get(), exceptionStat
e) == NodeFilter::FILTER_ACCEPT; | 123 bool nodeWasAccepted = acceptNode(provisionalResult.get(), exceptionStat
e) == NodeFilter::FILTER_ACCEPT; |
123 if (exceptionState.hadException()) | 124 if (exceptionState.hadException()) |
124 break; | 125 break; |
125 if (nodeWasAccepted) { | 126 if (nodeWasAccepted) { |
126 m_referenceNode = m_candidateNode; | 127 m_referenceNode = m_candidateNode; |
127 result = provisionalResult.release(); | 128 result = provisionalResult.release(); |
128 break; | 129 break; |
129 } | 130 } |
130 } | 131 } |
131 | 132 |
(...skipping 13 matching lines...) Expand all Loading... |
145 } | 146 } |
146 | 147 |
147 void NodeIterator::updateForNodeRemoval(Node& removedNode, NodePointer& referenc
eNode) const | 148 void NodeIterator::updateForNodeRemoval(Node& removedNode, NodePointer& referenc
eNode) const |
148 { | 149 { |
149 ASSERT(root()->document() == removedNode.document()); | 150 ASSERT(root()->document() == removedNode.document()); |
150 | 151 |
151 // Iterator is not affected if the removed node is the reference node and is
the root. | 152 // Iterator is not affected if the removed node is the reference node and is
the root. |
152 // or if removed node is not the reference node, or the ancestor of the refe
rence node. | 153 // or if removed node is not the reference node, or the ancestor of the refe
rence node. |
153 if (!removedNode.isDescendantOf(root())) | 154 if (!removedNode.isDescendantOf(root())) |
154 return; | 155 return; |
155 bool willRemoveReferenceNode = removedNode == referenceNode.node; | 156 bool willRemoveReferenceNode = removedNode == referenceNode.node.get(); |
156 bool willRemoveReferenceNodeAncestor = referenceNode.node && referenceNode.n
ode->isDescendantOf(&removedNode); | 157 bool willRemoveReferenceNodeAncestor = referenceNode.node && referenceNode.n
ode->isDescendantOf(&removedNode); |
157 if (!willRemoveReferenceNode && !willRemoveReferenceNodeAncestor) | 158 if (!willRemoveReferenceNode && !willRemoveReferenceNodeAncestor) |
158 return; | 159 return; |
159 | 160 |
160 if (referenceNode.isPointerBeforeNode) { | 161 if (referenceNode.isPointerBeforeNode) { |
161 Node* node = NodeTraversal::next(removedNode, root()); | 162 Node* node = NodeTraversal::next(removedNode, root()); |
162 if (node) { | 163 if (node) { |
163 // Move out from under the node being removed if the new reference | 164 // Move out from under the node being removed if the new reference |
164 // node is a descendant of the node being removed. | 165 // node is a descendant of the node being removed. |
165 while (node && node->isDescendantOf(&removedNode)) | 166 while (node && node->isDescendantOf(&removedNode)) |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 if (willRemoveReferenceNodeAncestor) { | 204 if (willRemoveReferenceNodeAncestor) { |
204 while (node && node->isDescendantOf(&removedNode)) | 205 while (node && node->isDescendantOf(&removedNode)) |
205 node = NodeTraversal::previous(*node, root()); | 206 node = NodeTraversal::previous(*node, root()); |
206 } | 207 } |
207 if (node) | 208 if (node) |
208 referenceNode.node = node; | 209 referenceNode.node = node; |
209 } | 210 } |
210 } | 211 } |
211 } | 212 } |
212 | 213 |
| 214 void NodeIterator::trace(Visitor* visitor) |
| 215 { |
| 216 visitor->trace(m_referenceNode); |
| 217 visitor->trace(m_candidateNode); |
| 218 NodeIteratorBase::trace(visitor); |
| 219 } |
213 | 220 |
214 } // namespace WebCore | 221 } // namespace WebCore |
OLD | NEW |