18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 25f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (C) 2005 Frerich Raabe <raabe@kde.org> 35f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (C) 2006, 2009 Apple Inc. 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef XPathStep_h 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define XPathStep_h 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(XPATH) 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Node.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XPathExpressionNode.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XPathNodeSet.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project namespace XPath { 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class Predicate; 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 42ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch class Step : public ParseNode { 43ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch WTF_MAKE_NONCOPYABLE(Step); WTF_MAKE_FAST_ALLOCATED; 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project enum Axis { 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project AncestorAxis, AncestorOrSelfAxis, AttributeAxis, 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ChildAxis, DescendantAxis, DescendantOrSelfAxis, 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FollowingAxis, FollowingSiblingAxis, NamespaceAxis, 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ParentAxis, PrecedingAxis, PrecedingSiblingAxis, 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SelfAxis 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 53ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch class NodeTest { 54ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch WTF_MAKE_FAST_ALLOCATED; 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project enum Kind { 575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian TextNodeTest, CommentNodeTest, ProcessingInstructionNodeTest, AnyNodeTest, NameTest 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeTest(Kind kind) : m_kind(kind) {} 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeTest(Kind kind, const String& data) : m_kind(kind), m_data(data) {} 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeTest(Kind kind, const String& data, const String& namespaceURI) : m_kind(kind), m_data(data), m_namespaceURI(namespaceURI) {} 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Kind kind() const { return m_kind; } 655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian const AtomicString& data() const { return m_data; } 665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian const AtomicString& namespaceURI() const { return m_namespaceURI; } 675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Vector<Predicate*>& mergedPredicates() { return m_mergedPredicates; } 685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian const Vector<Predicate*>& mergedPredicates() const { return m_mergedPredicates; } 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project private: 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Kind m_kind; 725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian AtomicString m_data; 735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian AtomicString m_namespaceURI; 745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // When possible, we merge some or all predicates with node test for better performance. 765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Vector<Predicate*> m_mergedPredicates; 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Step(Axis, const NodeTest& nodeTest, const Vector<Predicate*>& predicates = Vector<Predicate*>()); 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ~Step(); 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void optimize(); 835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void evaluate(Node* context, NodeSet&) const; 855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Axis axis() const { return m_axis; } 875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian const NodeTest& nodeTest() const { return m_nodeTest; } 885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project private: 905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian friend void optimizeStepPair(Step*, Step*, bool&); 915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian bool predicatesAreContextListInsensitive() const; 925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void parseNodeTest(const String&); 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void nodesInAxis(Node* context, NodeSet&) const; 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String namespaceFromNodetest(const String& nodeTest) const; 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Axis m_axis; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeTest m_nodeTest; 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<Predicate*> m_predicates; 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void optimizeStepPair(Step*, Step*, bool& dropSecondStep); 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(XPATH) 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif // XPathStep_h 110