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