15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2005 Frerich Raabe <raabe@kde.org>
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2009 Apple Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
1402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathResult.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathEvaluator.h"
34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/xml/XPathExpressionNode.h"
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace XPath;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40197021e6b966cfb06891637935ef33fff06433d1Ben MurdochDEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(XPathResult);
41197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
42197021e6b966cfb06891637935ef33fff06433d1Ben MurdochXPathResult::XPathResult(EvaluationContext& context, const Value& value)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_value(value)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_nodeSetPosition(0)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_domTreeVersion(0)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (m_value.type()) {
485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    case Value::BooleanValue:
495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_resultType = BOOLEAN_TYPE;
505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return;
515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    case Value::NumberValue:
525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_resultType = NUMBER_TYPE;
535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return;
545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    case Value::StringValue:
555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_resultType = STRING_TYPE;
565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return;
575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    case Value::NodeSetValue:
585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_resultType = UNORDERED_NODE_ITERATOR_TYPE;
595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_nodeSetPosition = 0;
60197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_nodeSet = NodeSet::create(m_value.toNodeSet(&context));
61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_document = &context.node->document();
62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_domTreeVersion = m_document->domTreeVersion();
635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return;
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
68d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void XPathResult::trace(Visitor* visitor)
69d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
70d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    visitor->trace(m_value);
71d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    visitor->trace(m_nodeSet);
72d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    visitor->trace(m_document);
73d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
74d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
7551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void XPathResult::convertTo(unsigned short type, ExceptionState& exceptionState)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (type) {
785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    case ANY_TYPE:
795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        break;
805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    case NUMBER_TYPE:
815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_resultType = type;
825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_value = m_value.toNumber();
835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        break;
845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    case STRING_TYPE:
855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_resultType = type;
865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_value = m_value.toString();
875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        break;
885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    case BOOLEAN_TYPE:
895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_resultType = type;
905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_value = m_value.toBoolean();
915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        break;
925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    case UNORDERED_NODE_ITERATOR_TYPE:
935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    case UNORDERED_NODE_SNAPSHOT_TYPE:
945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    case ANY_UNORDERED_NODE_TYPE:
955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // This is correct - singleNodeValue() will take care of ordering.
965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    case FIRST_ORDERED_NODE_TYPE:
975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!m_value.isNodeSet()) {
985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            exceptionState.throwTypeError("The result is not a node set, and therefore cannot be converted to the desired type.");
995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return;
1005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
1015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_resultType = type;
1025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        break;
1035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    case ORDERED_NODE_ITERATOR_TYPE:
1045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!m_value.isNodeSet()) {
1055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            exceptionState.throwTypeError("The result is not a node set, and therefore cannot be converted to the desired type.");
1065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return;
1075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
1085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        nodeSet().sort();
1095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_resultType = type;
1105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        break;
1115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    case ORDERED_NODE_SNAPSHOT_TYPE:
1125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!m_value.isNodeSet()) {
1135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            exceptionState.throwTypeError("The result is not a node set, and therefore cannot be converted to the desired type.");
1145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return;
1155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
116197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_value.toNodeSet(0).sort();
1175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_resultType = type;
1185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        break;
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned short XPathResult::resultType() const
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_resultType;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)double XPathResult::numberValue(ExceptionState& exceptionState) const
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resultType() != NUMBER_TYPE) {
130a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwTypeError("The result type is not a number.");
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0.0;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_value.toNumber();
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String XPathResult::stringValue(ExceptionState& exceptionState) const
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resultType() != STRING_TYPE) {
139a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwTypeError("The result type is not a string.");
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_value.toString();
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool XPathResult::booleanValue(ExceptionState& exceptionState) const
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resultType() != BOOLEAN_TYPE) {
148a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwTypeError("The result type is not a boolean.");
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_value.toBoolean();
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)Node* XPathResult::singleNodeValue(ExceptionState& exceptionState) const
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resultType() != ANY_UNORDERED_NODE_TYPE && resultType() != FIRST_ORDERED_NODE_TYPE) {
157a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwTypeError("The result type is not a single node.");
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
161197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    const NodeSet& nodes = m_value.toNodeSet(0);
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resultType() == FIRST_ORDERED_NODE_TYPE)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return nodes.firstNode();
1645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return nodes.anyNode();
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool XPathResult::invalidIteratorState() const
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resultType() != UNORDERED_NODE_ITERATOR_TYPE && resultType() != ORDERED_NODE_ITERATOR_TYPE)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_document);
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_document->domTreeVersion() != m_domTreeVersion;
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)unsigned long XPathResult::snapshotLength(ExceptionState& exceptionState) const
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resultType() != UNORDERED_NODE_SNAPSHOT_TYPE && resultType() != ORDERED_NODE_SNAPSHOT_TYPE) {
179a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwTypeError("The result type is not a snapshot.");
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
183197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return m_value.toNodeSet(0).size();
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)Node* XPathResult::iterateNext(ExceptionState& exceptionState)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resultType() != UNORDERED_NODE_ITERATOR_TYPE && resultType() != ORDERED_NODE_ITERATOR_TYPE) {
189a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwTypeError("The result type is not an iterator.");
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (invalidIteratorState()) {
194a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The document has mutated since the result was returned.");
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
198d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (m_nodeSetPosition + 1 > nodeSet().size())
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
201d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    Node* node = nodeSet()[m_nodeSetPosition];
20202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nodeSetPosition++;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return node;
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)Node* XPathResult::snapshotItem(unsigned long index, ExceptionState& exceptionState)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resultType() != UNORDERED_NODE_SNAPSHOT_TYPE && resultType() != ORDERED_NODE_SNAPSHOT_TYPE) {
211a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwTypeError("The result type is not a snapshot.");
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
215197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    const NodeSet& nodes = m_value.toNodeSet(0);
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (index >= nodes.size())
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
21802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return nodes[index];
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
223