1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef __TX_I_XPATH_CONTEXT 7 #define __TX_I_XPATH_CONTEXT 8 9 #include "nscore.h" 10 #include "nsISupportsImpl.h" 11 #include "nsStringFwd.h" 12 13 class FunctionCall; 14 class nsAtom; 15 class txAExprResult; 16 class txResultRecycler; 17 class txXPathNode; 18 19 /* 20 * txIParseContext 21 * 22 * This interface describes the context needed to create 23 * XPath Expressions and XSLT Patters. 24 * (not completely though. key() requires the ProcessorState, which is 25 * not part of this interface.) 26 */ 27 28 class txIParseContext { 29 public: 30 virtual ~txIParseContext() = default; 31 32 /* 33 * Return a namespaceID for a given prefix. 34 */ 35 virtual nsresult resolveNamespacePrefix(nsAtom* aPrefix, int32_t& aID) = 0; 36 37 /* 38 * Create a FunctionCall, needed for extension function calls and 39 * XSLT. XPath function calls are resolved by the Parser. 40 */ 41 virtual nsresult resolveFunctionCall(nsAtom* aName, int32_t aID, 42 FunctionCall** aFunction) = 0; 43 44 /** 45 * Should nametests parsed in this context be case-sensitive 46 */ 47 virtual bool caseInsensitiveNameTests() = 0; 48 49 /* 50 * Callback to be used by the Parser if errors are detected. 51 */ 52 virtual void SetErrorOffset(uint32_t aOffset) = 0; 53 54 enum Allowed { KEY_FUNCTION = 1 << 0 }; allowed(Allowed aAllowed)55 virtual bool allowed(Allowed aAllowed) { return true; } 56 }; 57 58 /* 59 * txIMatchContext 60 * 61 * Interface used for matching XSLT Patters. 62 * This is the part of txIEvalContext (see below), that is independent 63 * of the context node when evaluating a XPath expression, too. 64 * When evaluating a XPath expression, |txIMatchContext|s are used 65 * to transport the information from Step to Step. 66 */ 67 class txIMatchContext { 68 public: 69 virtual ~txIMatchContext() = default; 70 71 /* 72 * Return the ExprResult associated with the variable with the 73 * given namespace and local name. 74 */ 75 virtual nsresult getVariable(int32_t aNamespace, nsAtom* aLName, 76 txAExprResult*& aResult) = 0; 77 78 /* 79 * Is whitespace stripping allowed for the given node? 80 * See http://www.w3.org/TR/xslt#strip 81 */ 82 virtual nsresult isStripSpaceAllowed(const txXPathNode& aNode, 83 bool& aAllowed) = 0; 84 85 /** 86 * Returns a pointer to the private context 87 */ 88 virtual void* getPrivateContext() = 0; 89 90 virtual txResultRecycler* recycler() = 0; 91 92 /* 93 * Callback to be used by the expression/pattern if errors are detected. 94 */ 95 virtual void receiveError(const nsAString& aMsg, nsresult aRes) = 0; 96 }; 97 98 #define TX_DECL_MATCH_CONTEXT \ 99 nsresult getVariable(int32_t aNamespace, nsAtom* aLName, \ 100 txAExprResult*& aResult) override; \ 101 nsresult isStripSpaceAllowed(const txXPathNode& aNode, bool& aAllowed) \ 102 override; \ 103 void* getPrivateContext() override; \ 104 txResultRecycler* recycler() override; \ 105 void receiveError(const nsAString& aMsg, nsresult aRes) override 106 107 class txIEvalContext : public txIMatchContext { 108 public: 109 /* 110 * Get the context node. 111 */ 112 virtual const txXPathNode& getContextNode() = 0; 113 114 /* 115 * Get the size of the context node set. 116 */ 117 virtual uint32_t size() = 0; 118 119 /* 120 * Get the position of the context node in the context node set, 121 * starting with 1. 122 */ 123 virtual uint32_t position() = 0; 124 }; 125 126 #define TX_DECL_EVAL_CONTEXT \ 127 TX_DECL_MATCH_CONTEXT; \ 128 const txXPathNode& getContextNode() override; \ 129 uint32_t size() override; \ 130 uint32_t position() override 131 132 #endif // __TX_I_XPATH_CONTEXT 133