summaryrefslogtreecommitdiff
path: root/Source/WebCore/dom/NodeIterator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/dom/NodeIterator.cpp')
-rw-r--r--Source/WebCore/dom/NodeIterator.cpp106
1 files changed, 41 insertions, 65 deletions
diff --git a/Source/WebCore/dom/NodeIterator.cpp b/Source/WebCore/dom/NodeIterator.cpp
index 082fdc6f7..cd6957a1e 100644
--- a/Source/WebCore/dom/NodeIterator.cpp
+++ b/Source/WebCore/dom/NodeIterator.cpp
@@ -26,27 +26,23 @@
#include "NodeIterator.h"
#include "Document.h"
-#include "ExceptionCode.h"
#include "NodeTraversal.h"
+#include <runtime/JSCJSValueInlines.h>
namespace WebCore {
-NodeIterator::NodePointer::NodePointer()
+inline NodeIterator::NodePointer::NodePointer(Node& node, bool isPointerBeforeNode)
+ : node(&node)
+ , isPointerBeforeNode(isPointerBeforeNode)
{
}
-NodeIterator::NodePointer::NodePointer(PassRefPtr<Node> n, bool b)
- : node(n)
- , isPointerBeforeNode(b)
+inline void NodeIterator::NodePointer::clear()
{
+ node = nullptr;
}
-void NodeIterator::NodePointer::clear()
-{
- node.clear();
-}
-
-bool NodeIterator::NodePointer::moveToNext(Node* root)
+inline bool NodeIterator::NodePointer::moveToNext(Node& root)
{
if (!node)
return false;
@@ -54,11 +50,11 @@ bool NodeIterator::NodePointer::moveToNext(Node* root)
isPointerBeforeNode = false;
return true;
}
- node = NodeTraversal::next(node.get(), root);
+ node = NodeTraversal::next(*node, &root);
return node;
}
-bool NodeIterator::NodePointer::moveToPrevious(Node* root)
+inline bool NodeIterator::NodePointer::moveToPrevious(Node& root)
{
if (!node)
return false;
@@ -66,34 +62,33 @@ bool NodeIterator::NodePointer::moveToPrevious(Node* root)
isPointerBeforeNode = true;
return true;
}
- if (node == root) {
+ if (node == &root) {
node = nullptr;
return false;
}
- node = NodeTraversal::previous(node.get());
+ node = NodeTraversal::previous(*node);
return node;
}
-NodeIterator::NodeIterator(PassRefPtr<Node> rootNode, unsigned whatToShow, PassRefPtr<NodeFilter> filter, bool expandEntityReferences)
- : NodeIteratorBase(rootNode, whatToShow, filter, expandEntityReferences)
- , m_referenceNode(root(), true)
- , m_detached(false)
+inline NodeIterator::NodeIterator(Node& rootNode, unsigned whatToShow, RefPtr<NodeFilter>&& filter)
+ : NodeIteratorBase(rootNode, whatToShow, WTFMove(filter))
+ , m_referenceNode(rootNode, true)
{
- root()->document().attachNodeIterator(this);
+ root().document().attachNodeIterator(this);
}
-NodeIterator::~NodeIterator()
+Ref<NodeIterator> NodeIterator::create(Node& rootNode, unsigned whatToShow, RefPtr<NodeFilter>&& filter)
{
- root()->document().detachNodeIterator(this);
+ return adoptRef(*new NodeIterator(rootNode, whatToShow, WTFMove(filter)));
}
-PassRefPtr<Node> NodeIterator::nextNode(JSC::ExecState* state, ExceptionCode& ec)
+NodeIterator::~NodeIterator()
{
- if (m_detached) {
- ec = INVALID_STATE_ERR;
- return 0;
- }
+ root().document().detachNodeIterator(this);
+}
+RefPtr<Node> NodeIterator::nextNode()
+{
RefPtr<Node> result;
m_candidateNode = m_referenceNode;
@@ -102,27 +97,20 @@ PassRefPtr<Node> NodeIterator::nextNode(JSC::ExecState* state, ExceptionCode& ec
// In other words, FILTER_REJECT does not pass over descendants
// of the rejected node. Hence, FILTER_REJECT is the same as FILTER_SKIP.
RefPtr<Node> provisionalResult = m_candidateNode.node;
- bool nodeWasAccepted = acceptNode(state, provisionalResult.get()) == NodeFilter::FILTER_ACCEPT;
- if (state && state->hadException())
- break;
+ bool nodeWasAccepted = acceptNode(provisionalResult.get()) == NodeFilter::FILTER_ACCEPT;
if (nodeWasAccepted) {
m_referenceNode = m_candidateNode;
- result = provisionalResult.release();
+ result = WTFMove(provisionalResult);
break;
}
}
m_candidateNode.clear();
- return result.release();
+ return result;
}
-PassRefPtr<Node> NodeIterator::previousNode(JSC::ExecState* state, ExceptionCode& ec)
+RefPtr<Node> NodeIterator::previousNode()
{
- if (m_detached) {
- ec = INVALID_STATE_ERR;
- return 0;
- }
-
RefPtr<Node> result;
m_candidateNode = m_referenceNode;
@@ -131,55 +119,44 @@ PassRefPtr<Node> NodeIterator::previousNode(JSC::ExecState* state, ExceptionCode
// In other words, FILTER_REJECT does not pass over descendants
// of the rejected node. Hence, FILTER_REJECT is the same as FILTER_SKIP.
RefPtr<Node> provisionalResult = m_candidateNode.node;
- bool nodeWasAccepted = acceptNode(state, provisionalResult.get()) == NodeFilter::FILTER_ACCEPT;
- if (state && state->hadException())
- break;
+ bool nodeWasAccepted = acceptNode(provisionalResult.get()) == NodeFilter::FILTER_ACCEPT;
if (nodeWasAccepted) {
m_referenceNode = m_candidateNode;
- result = provisionalResult.release();
+ result = WTFMove(provisionalResult);
break;
}
}
m_candidateNode.clear();
- return result.release();
+ return result;
}
-void NodeIterator::detach()
-{
- root()->document().detachNodeIterator(this);
- m_detached = true;
- m_referenceNode.node.clear();
-}
-
-void NodeIterator::nodeWillBeRemoved(Node* removedNode)
+void NodeIterator::nodeWillBeRemoved(Node& removedNode)
{
updateForNodeRemoval(removedNode, m_candidateNode);
updateForNodeRemoval(removedNode, m_referenceNode);
}
-void NodeIterator::updateForNodeRemoval(Node* removedNode, NodePointer& referenceNode) const
+void NodeIterator::updateForNodeRemoval(Node& removedNode, NodePointer& referenceNode) const
{
- ASSERT(!m_detached);
- ASSERT(removedNode);
- ASSERT(&root()->document() == &removedNode->document());
+ ASSERT(&root().document() == &removedNode.document());
// Iterator is not affected if the removed node is the reference node and is the root.
// or if removed node is not the reference node, or the ancestor of the reference node.
- if (!removedNode->isDescendantOf(root()))
+ if (!removedNode.isDescendantOf(root()))
return;
- bool willRemoveReferenceNode = removedNode == referenceNode.node;
+ bool willRemoveReferenceNode = &removedNode == referenceNode.node;
bool willRemoveReferenceNodeAncestor = referenceNode.node && referenceNode.node->isDescendantOf(removedNode);
if (!willRemoveReferenceNode && !willRemoveReferenceNodeAncestor)
return;
if (referenceNode.isPointerBeforeNode) {
- Node* node = NodeTraversal::next(removedNode, root());
+ Node* node = NodeTraversal::next(removedNode, &root());
if (node) {
// Move out from under the node being removed if the new reference
// node is a descendant of the node being removed.
while (node && node->isDescendantOf(removedNode))
- node = NodeTraversal::next(node, root());
+ node = NodeTraversal::next(*node, &root());
if (node)
referenceNode.node = node;
} else {
@@ -188,8 +165,8 @@ void NodeIterator::updateForNodeRemoval(Node* removedNode, NodePointer& referenc
// Move out from under the node being removed if the reference node is
// a descendant of the node being removed.
if (willRemoveReferenceNodeAncestor) {
- while (node && node->isDescendantOf(removedNode))
- node = NodeTraversal::previous(node);
+ while (node && node->isDescendantOf(&removedNode))
+ node = NodeTraversal::previous(*node);
}
if (node) {
// Removing last node.
@@ -207,18 +184,18 @@ void NodeIterator::updateForNodeRemoval(Node* removedNode, NodePointer& referenc
// a descendant of the node being removed.
if (willRemoveReferenceNodeAncestor) {
while (node && node->isDescendantOf(removedNode))
- node = NodeTraversal::previous(node);
+ node = NodeTraversal::previous(*node);
}
if (node)
referenceNode.node = node;
} else {
// FIXME: This branch doesn't appear to have any LayoutTests.
- node = NodeTraversal::next(removedNode, root());
+ node = NodeTraversal::next(removedNode, &root());
// Move out from under the node being removed if the reference node is
// a descendant of the node being removed.
if (willRemoveReferenceNodeAncestor) {
while (node && node->isDescendantOf(removedNode))
- node = NodeTraversal::previous(node);
+ node = NodeTraversal::previous(*node);
}
if (node)
referenceNode.node = node;
@@ -226,5 +203,4 @@ void NodeIterator::updateForNodeRemoval(Node* removedNode, NodePointer& referenc
}
}
-
} // namespace WebCore