XPathExpression.cpp [plain text]
#include "config.h"
#include "XPathExpression.h"
#include "Document.h"
#include "XPathNSResolver.h"
#include "XPathParser.h"
#include "XPathResult.h"
#include "XPathUtil.h"
namespace WebCore {
using namespace XPath;
inline XPathExpression::XPathExpression(std::unique_ptr<XPath::Expression> expression)
: m_topExpression(WTFMove(expression))
{
}
ExceptionOr<Ref<XPathExpression>> XPathExpression::createExpression(const String& expression, RefPtr<XPathNSResolver>&& resolver)
{
auto parseResult = Parser::parseStatement(expression, WTFMove(resolver));
if (parseResult.hasException())
return parseResult.releaseException();
return adoptRef(*new XPathExpression(parseResult.releaseReturnValue()));
}
XPathExpression::~XPathExpression() = default;
ExceptionOr<Ref<XPathResult>> XPathExpression::evaluate(Node* contextNode, unsigned short type, XPathResult*)
{
if (!isValidContextNode(contextNode))
return Exception { NotSupportedError };
EvaluationContext& evaluationContext = Expression::evaluationContext();
evaluationContext.node = contextNode;
evaluationContext.size = 1;
evaluationContext.position = 1;
evaluationContext.hadTypeConversionError = false;
auto result = XPathResult::create(contextNode->document(), m_topExpression->evaluate());
evaluationContext.node = nullptr;
if (evaluationContext.hadTypeConversionError)
return Exception { SyntaxError };
if (type != XPathResult::ANY_TYPE) {
auto convertToResult = result->convertTo(type);
if (convertToResult.hasException())
return convertToResult.releaseException();
}
return WTFMove(result);
}
}