1 /* 2 * Copyright (C) 2005 Frerich Raabe <raabe (at) kde.org> 3 * Copyright (C) 2006, 2009 Apple Inc. 4 * 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 */ 26 27 #ifndef XPathExpressionNode_h 28 #define XPathExpressionNode_h 29 30 #include "core/dom/Node.h" 31 #include "core/xml/XPathValue.h" 32 #include "wtf/HashMap.h" 33 #include "wtf/Vector.h" 34 #include "wtf/text/StringHash.h" 35 36 namespace blink { 37 38 namespace XPath { 39 40 struct EvaluationContext { 41 STACK_ALLOCATED(); 42 public: 43 explicit EvaluationContext(Node&); 44 45 RefPtrWillBeMember<Node> node; 46 unsigned long size; 47 unsigned long position; 48 HashMap<String, String> variableBindings; 49 50 bool hadTypeConversionError; 51 }; 52 53 class ParseNode : public NoBaseWillBeGarbageCollectedFinalized<ParseNode> { 54 public: 55 virtual ~ParseNode() { } 56 virtual void trace(Visitor*) { } 57 }; 58 59 class Expression : public ParseNode { 60 WTF_MAKE_NONCOPYABLE(Expression); WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; 61 public: 62 Expression(); 63 virtual ~Expression(); 64 virtual void trace(Visitor*) OVERRIDE; 65 66 virtual Value evaluate(EvaluationContext&) const = 0; 67 68 void addSubExpression(PassOwnPtrWillBeRawPtr<Expression> expr) 69 { 70 m_isContextNodeSensitive |= expr->m_isContextNodeSensitive; 71 m_isContextPositionSensitive |= expr->m_isContextPositionSensitive; 72 m_isContextSizeSensitive |= expr->m_isContextSizeSensitive; 73 m_subExpressions.append(expr); 74 } 75 76 bool isContextNodeSensitive() const { return m_isContextNodeSensitive; } 77 bool isContextPositionSensitive() const { return m_isContextPositionSensitive; } 78 bool isContextSizeSensitive() const { return m_isContextSizeSensitive; } 79 void setIsContextNodeSensitive(bool value) { m_isContextNodeSensitive = value; } 80 void setIsContextPositionSensitive(bool value) { m_isContextPositionSensitive = value; } 81 void setIsContextSizeSensitive(bool value) { m_isContextSizeSensitive = value; } 82 83 virtual Value::Type resultType() const = 0; 84 85 protected: 86 unsigned subExprCount() const { return m_subExpressions.size(); } 87 Expression* subExpr(unsigned i) { return m_subExpressions[i].get(); } 88 const Expression* subExpr(unsigned i) const { return m_subExpressions[i].get(); } 89 90 private: 91 WillBeHeapVector<OwnPtrWillBeMember<Expression> > m_subExpressions; 92 93 // Evaluation details that can be used for optimization. 94 bool m_isContextNodeSensitive; 95 bool m_isContextPositionSensitive; 96 bool m_isContextSizeSensitive; 97 }; 98 99 } 100 101 } 102 103 #endif // XPathExpressionNode_h 104