15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2005 Frerich Raabe <raabe@kde.org> 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2009 Apple Inc. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 1402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef XPathStep_h 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define XPathStep_h 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathExpressionNode.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathNodeSet.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Node; 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace XPath { 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Predicate; 4002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 4109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class Step FINAL : public ParseNode { 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(Step); 43d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum Axis { 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AncestorAxis, AncestorOrSelfAxis, AttributeAxis, 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ChildAxis, DescendantAxis, DescendantOrSelfAxis, 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FollowingAxis, FollowingSiblingAxis, NamespaceAxis, 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ParentAxis, PrecedingAxis, PrecedingSiblingAxis, 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SelfAxis 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 5202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 53d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) class NodeTest : public NoBaseWillBeGarbageCollectedFinalized<NodeTest> { 54d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum Kind { 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TextNodeTest, CommentNodeTest, ProcessingInstructionNodeTest, AnyNodeTest, NameTest 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeTest(Kind kind) : m_kind(kind) { } 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeTest(Kind kind, const String& data) : m_kind(kind), m_data(data) { } 62a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) NodeTest(Kind kind, const AtomicString& data, const AtomicString& namespaceURI) : m_kind(kind), m_data(data), m_namespaceURI(namespaceURI) { } 6302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 64bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) NodeTest(const NodeTest& o) 65bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) : m_kind(o.m_kind) 66bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) , m_data(o.m_data) 67bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) , m_namespaceURI(o.m_namespaceURI) 68bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) { 69bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) ASSERT(o.m_mergedPredicates.isEmpty()); 70bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } 71bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) NodeTest& operator=(const NodeTest& o) 72bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) { 73bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) m_kind = o.m_kind; 74bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) m_data = o.m_data; 75bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) m_namespaceURI = o.m_namespaceURI; 76bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) ASSERT(o.m_mergedPredicates.isEmpty()); 77bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return *this; 78bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } 79d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) void trace(Visitor* visitor) { visitor->trace(m_mergedPredicates); } 80bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Kind kind() const { return m_kind; } 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const AtomicString& data() const { return m_data; } 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const AtomicString& namespaceURI() const { return m_namespaceURI; } 84d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WillBeHeapVector<OwnPtrWillBeMember<Predicate> >& mergedPredicates() { return m_mergedPredicates; } 85d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) const WillBeHeapVector<OwnPtrWillBeMember<Predicate> >& mergedPredicates() const { return m_mergedPredicates; } 8602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private: 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Kind m_kind; 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AtomicString m_data; 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AtomicString m_namespaceURI; 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When possible, we merge some or all predicates with node test for better performance. 93d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WillBeHeapVector<OwnPtrWillBeMember<Predicate> > m_mergedPredicates; 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) Step(Axis, const NodeTest&); 97d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) Step(Axis, const NodeTest&, WillBeHeapVector<OwnPtrWillBeMember<Predicate> >&); 9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual ~Step(); 99d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) virtual void trace(Visitor*) OVERRIDE; 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void optimize(); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch void evaluate(EvaluationContext&, Node* context, NodeSet&) const; 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Axis axis() const { return m_axis; } 106d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) const NodeTest& nodeTest() const { return *m_nodeTest; } 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend void optimizeStepPair(Step*, Step*, bool&); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool predicatesAreContextListInsensitive() const; 111d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) NodeTest& nodeTest() { return *m_nodeTest; } 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void parseNodeTest(const String&); 114197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch void nodesInAxis(EvaluationContext&, Node* context, NodeSet&) const; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String namespaceFromNodetest(const String& nodeTest) const; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Axis m_axis; 118d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) OwnPtrWillBeMember<NodeTest> m_nodeTest; 119d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) WillBeHeapVector<OwnPtrWillBeMember<Predicate> > m_predicates; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void optimizeStepPair(Step*, Step*, bool& dropSecondStep); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace XPath 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 126c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // XPathStep_h 129