blob: 7508c021cad490e39eb2964b2afc627a56b4c119 [file] [log] [blame]
andersca75fd42c2006-05-08 21:27:25 +00001/*
ap@webkit.org35c006d2009-06-01 08:27:25 +00002 * Copyright (C) 2005 Frerich Raabe <raabe@kde.org>
3 * Copyright (C) 2006, 2009 Apple Inc. All rights reserved.
andersca75fd42c2006-05-08 21:27:25 +00004 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
darina9406af2006-06-04 23:03:41 +000026
andersca75fd42c2006-05-08 21:27:25 +000027#include "config.h"
darina9406af2006-06-04 23:03:41 +000028#include "XPathResult.h"
andersca75fd42c2006-05-08 21:27:25 +000029
ap@webkit.org35c006d2009-06-01 08:27:25 +000030#include "Document.h"
andersca75fd42c2006-05-08 21:27:25 +000031#include "ExceptionCode.h"
darina9406af2006-06-04 23:03:41 +000032#include "XPathEvaluator.h"
weinig@apple.com97b2d1e2008-01-02 05:46:41 +000033#include "XPathException.h"
andersca75fd42c2006-05-08 21:27:25 +000034
35namespace WebCore {
36
37using namespace XPath;
38
darin@apple.com4b47a4d2016-10-19 16:57:31 +000039XPathResult::XPathResult(Document& document, const Value& value)
andersca@apple.comc442c152008-02-20 01:55:42 +000040 : m_value(value)
andersca75fd42c2006-05-08 21:27:25 +000041{
andersca75fd42c2006-05-08 21:27:25 +000042 switch (m_value.type()) {
darina9406af2006-06-04 23:03:41 +000043 case Value::BooleanValue:
andersca75fd42c2006-05-08 21:27:25 +000044 m_resultType = BOOLEAN_TYPE;
darina9406af2006-06-04 23:03:41 +000045 return;
46 case Value::NumberValue:
andersca75fd42c2006-05-08 21:27:25 +000047 m_resultType = NUMBER_TYPE;
darina9406af2006-06-04 23:03:41 +000048 return;
49 case Value::StringValue:
andersca75fd42c2006-05-08 21:27:25 +000050 m_resultType = STRING_TYPE;
darina9406af2006-06-04 23:03:41 +000051 return;
apce79f362007-03-20 17:21:07 +000052 case Value::NodeSetValue:
andersca75fd42c2006-05-08 21:27:25 +000053 m_resultType = UNORDERED_NODE_ITERATOR_TYPE;
54 m_nodeSetPosition = 0;
apce79f362007-03-20 17:21:07 +000055 m_nodeSet = m_value.toNodeSet();
darin@apple.com4b47a4d2016-10-19 16:57:31 +000056 m_document = &document;
57 m_domTreeVersion = document.domTreeVersion();
darina9406af2006-06-04 23:03:41 +000058 return;
andersca75fd42c2006-05-08 21:27:25 +000059 }
darina9406af2006-06-04 23:03:41 +000060 ASSERT_NOT_REACHED();
andersca75fd42c2006-05-08 21:27:25 +000061}
62
63XPathResult::~XPathResult()
64{
andersca75fd42c2006-05-08 21:27:25 +000065}
66
darin@apple.com4b47a4d2016-10-19 16:57:31 +000067ExceptionOr<void> XPathResult::convertTo(unsigned short type)
andersca75fd42c2006-05-08 21:27:25 +000068{
69 switch (type) {
darin@apple.com4b47a4d2016-10-19 16:57:31 +000070 case ANY_TYPE:
71 break;
72 case NUMBER_TYPE:
73 m_resultType = type;
74 m_value = m_value.toNumber();
75 break;
76 case STRING_TYPE:
77 m_resultType = type;
78 m_value = m_value.toString();
79 break;
80 case BOOLEAN_TYPE:
81 m_resultType = type;
82 m_value = m_value.toBoolean();
83 break;
84 case UNORDERED_NODE_ITERATOR_TYPE:
85 case UNORDERED_NODE_SNAPSHOT_TYPE:
86 case ANY_UNORDERED_NODE_TYPE:
87 case FIRST_ORDERED_NODE_TYPE: // This is correct - singleNodeValue() will take care of ordering.
88 if (!m_value.isNodeSet())
89 return Exception { XPathException::TYPE_ERR };
90 m_resultType = type;
91 break;
92 case ORDERED_NODE_ITERATOR_TYPE:
93 if (!m_value.isNodeSet())
94 return Exception { XPathException::TYPE_ERR };
95 m_nodeSet.sort();
96 m_resultType = type;
97 break;
98 case ORDERED_NODE_SNAPSHOT_TYPE:
99 if (!m_value.isNodeSet())
100 return Exception { XPathException::TYPE_ERR };
101 m_value.toNodeSet().sort();
102 m_resultType = type;
103 break;
andersca75fd42c2006-05-08 21:27:25 +0000104 }
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000105 return { };
andersca75fd42c2006-05-08 21:27:25 +0000106}
107
108unsigned short XPathResult::resultType() const
109{
110 return m_resultType;
111}
112
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000113ExceptionOr<double> XPathResult::numberValue() const
andersca75fd42c2006-05-08 21:27:25 +0000114{
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000115 if (resultType() != NUMBER_TYPE)
116 return Exception { XPathException::TYPE_ERR };
andersca75fd42c2006-05-08 21:27:25 +0000117 return m_value.toNumber();
118}
119
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000120ExceptionOr<String> XPathResult::stringValue() const
andersca75fd42c2006-05-08 21:27:25 +0000121{
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000122 if (resultType() != STRING_TYPE)
123 return Exception { XPathException::TYPE_ERR };
andersca75fd42c2006-05-08 21:27:25 +0000124 return m_value.toString();
125}
126
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000127ExceptionOr<bool> XPathResult::booleanValue() const
andersca75fd42c2006-05-08 21:27:25 +0000128{
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000129 if (resultType() != BOOLEAN_TYPE)
130 return Exception { XPathException::TYPE_ERR };
andersca75fd42c2006-05-08 21:27:25 +0000131 return m_value.toBoolean();
132}
133
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000134ExceptionOr<Node*> XPathResult::singleNodeValue() const
andersca75fd42c2006-05-08 21:27:25 +0000135{
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000136 if (resultType() != ANY_UNORDERED_NODE_TYPE && resultType() != FIRST_ORDERED_NODE_TYPE)
137 return Exception { XPathException::TYPE_ERR };
138
139 auto& nodes = m_value.toNodeSet();
apce79f362007-03-20 17:21:07 +0000140 if (resultType() == FIRST_ORDERED_NODE_TYPE)
141 return nodes.firstNode();
142 else
143 return nodes.anyNode();
andersca75fd42c2006-05-08 21:27:25 +0000144}
145
andersca75fd42c2006-05-08 21:27:25 +0000146bool XPathResult::invalidIteratorState() const
147{
darina9406af2006-06-04 23:03:41 +0000148 if (resultType() != UNORDERED_NODE_ITERATOR_TYPE && resultType() != ORDERED_NODE_ITERATOR_TYPE)
andersca75fd42c2006-05-08 21:27:25 +0000149 return false;
ap@webkit.org35c006d2009-06-01 08:27:25 +0000150
151 ASSERT(m_document);
152 return m_document->domTreeVersion() != m_domTreeVersion;
andersca75fd42c2006-05-08 21:27:25 +0000153}
154
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000155ExceptionOr<unsigned> XPathResult::snapshotLength() const
andersca75fd42c2006-05-08 21:27:25 +0000156{
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000157 if (resultType() != UNORDERED_NODE_SNAPSHOT_TYPE && resultType() != ORDERED_NODE_SNAPSHOT_TYPE)
158 return Exception { XPathException::TYPE_ERR };
andersca75fd42c2006-05-08 21:27:25 +0000159
apce79f362007-03-20 17:21:07 +0000160 return m_value.toNodeSet().size();
andersca75fd42c2006-05-08 21:27:25 +0000161}
162
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000163ExceptionOr<Node*> XPathResult::iterateNext()
andersca75fd42c2006-05-08 21:27:25 +0000164{
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000165 if (resultType() != UNORDERED_NODE_ITERATOR_TYPE && resultType() != ORDERED_NODE_ITERATOR_TYPE)
166 return Exception { XPathException::TYPE_ERR };
andersca75fd42c2006-05-08 21:27:25 +0000167
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000168 if (invalidIteratorState())
169 return Exception { INVALID_STATE_ERR };
andersca75fd42c2006-05-08 21:27:25 +0000170
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000171 if (m_nodeSetPosition >= m_nodeSet.size())
172 return nullptr;
173
174 return m_nodeSet[m_nodeSetPosition++];
andersca75fd42c2006-05-08 21:27:25 +0000175}
176
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000177ExceptionOr<Node*> XPathResult::snapshotItem(unsigned index)
andersca75fd42c2006-05-08 21:27:25 +0000178{
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000179 if (resultType() != UNORDERED_NODE_SNAPSHOT_TYPE && resultType() != ORDERED_NODE_SNAPSHOT_TYPE)
180 return Exception { XPathException::TYPE_ERR };
181
182 auto& nodes = m_value.toNodeSet();
andersca75fd42c2006-05-08 21:27:25 +0000183 if (index >= nodes.size())
darin@apple.com4b47a4d2016-10-19 16:57:31 +0000184 return nullptr;
185
apce79f362007-03-20 17:21:07 +0000186 return nodes[index];
andersca75fd42c2006-05-08 21:27:25 +0000187}
188
189}