190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (C) 2005 Frerich Raabe <raabe@kde.org> 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Copyright (C) 2006, 2009 Apple Inc. 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * Redistribution and use in source and binary forms, with or without 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * modification, are permitted provided that the following conditions 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * are met: 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 1. Redistributions of source code must retain the above copyright 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * notice, this list of conditions and the following disclaimer. 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 2. Redistributions in binary form must reproduce the above copyright 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * notice, this list of conditions and the following disclaimer in the 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * documentation and/or other materials provided with the distribution. 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef XPathStep_h 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define XPathStep_h 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if ENABLE(XPATH) 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "Node.h" 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "XPathExpressionNode.h" 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "XPathNodeSet.h" 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubernamespace WebCore { 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber namespace XPath { 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber class Predicate; 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber class Step : public ParseNode, public Noncopyable { 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber public: 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber enum Axis { 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber AncestorAxis, AncestorOrSelfAxis, AttributeAxis, 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ChildAxis, DescendantAxis, DescendantOrSelfAxis, 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber FollowingAxis, FollowingSiblingAxis, NamespaceAxis, 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ParentAxis, PrecedingAxis, PrecedingSiblingAxis, 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber SelfAxis 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber }; 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber class NodeTest : public FastAllocBase { 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber public: 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber enum Kind { 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber TextNodeTest, CommentNodeTest, ProcessingInstructionNodeTest, AnyNodeTest, NameTest 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber }; 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber NodeTest(Kind kind) : m_kind(kind) {} 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber NodeTest(Kind kind, const String& data) : m_kind(kind), m_data(data) {} 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber NodeTest(Kind kind, const String& data, const String& namespaceURI) : m_kind(kind), m_data(data), m_namespaceURI(namespaceURI) {} 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Kind kind() const { return m_kind; } 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const AtomicString& data() const { return m_data; } 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const AtomicString& namespaceURI() const { return m_namespaceURI; } 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Vector<Predicate*>& mergedPredicates() { return m_mergedPredicates; } 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const Vector<Predicate*>& mergedPredicates() const { return m_mergedPredicates; } 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber private: 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Kind m_kind; 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber AtomicString m_data; 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber AtomicString m_namespaceURI; 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // When possible, we merge some or all predicates with node test for better performance. 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Vector<Predicate*> m_mergedPredicates; 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber }; 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Step(Axis, const NodeTest& nodeTest, const Vector<Predicate*>& predicates = Vector<Predicate*>()); 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ~Step(); 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber void optimize(); 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber void evaluate(Node* context, NodeSet&) const; 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Axis axis() const { return m_axis; } 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const NodeTest& nodeTest() const { return m_nodeTest; } 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber private: 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber friend void optimizeStepPair(Step*, Step*, bool&); 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bool predicatesAreContextListInsensitive() const; 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber void parseNodeTest(const String&); 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber void nodesInAxis(Node* context, NodeSet&) const; 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber String namespaceFromNodetest(const String& nodeTest) const; 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Axis m_axis; 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber NodeTest m_nodeTest; 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Vector<Predicate*> m_predicates; 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber }; 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber void optimizeStepPair(Step*, Step*, bool& dropSecondStep); 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif // ENABLE(XPATH) 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif // XPathStep_h 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber