diff --git a/content/xul/templates/src/nsXULTemplateQueryProcessorXML.cpp b/content/xul/templates/src/nsXULTemplateQueryProcessorXML.cpp index 0b3fc8fff77e..ef5c2d4c9f89 100644 --- a/content/xul/templates/src/nsXULTemplateQueryProcessorXML.cpp +++ b/content/xul/templates/src/nsXULTemplateQueryProcessorXML.cpp @@ -9,7 +9,6 @@ #include "nsIDOMNode.h" #include "nsIDOMElement.h" #include "nsIDOMEvent.h" -#include "nsIDOMXPathNSResolver.h" #include "nsIDocument.h" #include "nsIContent.h" #include "nsComponentManagerUtils.h" @@ -428,13 +427,7 @@ nsXULTemplateQueryProcessorXML::CreateExpression(const nsAString& aExpr, nsINode* aNode, ErrorResult& aRv) { - nsCOMPtr nsResolver = - aNode->OwnerDoc()->CreateNSResolver(aNode, aRv); - if (aRv.Failed()) { - return nullptr; - } - - return mEvaluator->CreateExpression(aExpr, nsResolver, aRv); + return mEvaluator->CreateExpression(aExpr, aNode, aRv); } NS_IMETHODIMP diff --git a/dom/xslt/xpath/XPathEvaluator.cpp b/dom/xslt/xpath/XPathEvaluator.cpp index 895ae37cb7e1..f4f88137cb7f 100644 --- a/dom/xslt/xpath/XPathEvaluator.cpp +++ b/dom/xslt/xpath/XPathEvaluator.cpp @@ -39,6 +39,15 @@ public: XPathEvaluatorParseContext(nsIDOMXPathNSResolver* aResolver, bool aIsCaseSensitive) : mResolver(aResolver), + mResolverNode(nullptr), + mLastError(NS_OK), + mIsCaseSensitive(aIsCaseSensitive) + { + } + XPathEvaluatorParseContext(nsINode* aResolver, + bool aIsCaseSensitive) + : mResolver(nullptr), + mResolverNode(aResolver), mLastError(NS_OK), mIsCaseSensitive(aIsCaseSensitive) { @@ -57,6 +66,7 @@ public: private: nsIDOMXPathNSResolver* mResolver; + nsINode* mResolverNode; nsresult mLastError; bool mIsCaseSensitive; }; @@ -120,21 +130,36 @@ XPathEvaluator::Evaluate(const nsAString & aExpression, return NS_OK; } +XPathExpression* +XPathEvaluator::CreateExpression(const nsAString& aExpression, + nsIDOMXPathNSResolver* aResolver, ErrorResult& aRv) +{ + nsCOMPtr doc = do_QueryReferent(mDocument); + XPathEvaluatorParseContext pContext(aResolver, !(doc && doc->IsHTML())); + return CreateExpression(aExpression, &pContext, doc, aRv); +} + +XPathExpression* +XPathEvaluator::CreateExpression(const nsAString& aExpression, + nsINode* aResolver, ErrorResult& aRv) +{ + nsCOMPtr doc = do_QueryReferent(mDocument); + XPathEvaluatorParseContext pContext(aResolver, !(doc && doc->IsHTML())); + return CreateExpression(aExpression, &pContext, doc, aRv); +} XPathExpression* XPathEvaluator::CreateExpression(const nsAString & aExpression, - nsIDOMXPathNSResolver *aResolver, + txIParseContext* aContext, + nsIDocument* aDocument, ErrorResult& aRv) { if (!mRecycler) { mRecycler = new txResultRecycler; } - nsCOMPtr doc = do_QueryReferent(mDocument); - XPathEvaluatorParseContext pContext(aResolver, !(doc && doc->IsHTML())); - nsAutoPtr expression; - aRv = txExprParser::createExpr(PromiseFlatString(aExpression), &pContext, + aRv = txExprParser::createExpr(PromiseFlatString(aExpression), aContext, getter_Transfers(expression)); if (aRv.Failed()) { if (aRv.ErrorCode() != NS_ERROR_DOM_NAMESPACE_ERR) { @@ -144,7 +169,7 @@ XPathEvaluator::CreateExpression(const nsAString & aExpression, return nullptr; } - return new XPathExpression(Move(expression), mRecycler, doc); + return new XPathExpression(Move(expression), mRecycler, aDocument); } JSObject* @@ -197,7 +222,7 @@ nsresult XPathEvaluatorParseContext::resolveNamespacePrefix { aID = kNameSpaceID_Unknown; - if (!mResolver) { + if (!mResolver && !mResolverNode) { return NS_ERROR_DOM_NAMESPACE_ERR; } @@ -207,8 +232,12 @@ nsresult XPathEvaluatorParseContext::resolveNamespacePrefix } nsVoidableString ns; - nsresult rv = mResolver->LookupNamespaceURI(prefix, ns); - NS_ENSURE_SUCCESS(rv, rv); + if (mResolver) { + nsresult rv = mResolver->LookupNamespaceURI(prefix, ns); + NS_ENSURE_SUCCESS(rv, rv); + } else { + mResolverNode->LookupNamespaceURI(prefix, ns); + } if (DOMStringIsNull(ns)) { return NS_ERROR_DOM_NAMESPACE_ERR; diff --git a/dom/xslt/xpath/XPathEvaluator.h b/dom/xslt/xpath/XPathEvaluator.h index b1dc8cf03c6a..0aae535f6f36 100644 --- a/dom/xslt/xpath/XPathEvaluator.h +++ b/dom/xslt/xpath/XPathEvaluator.h @@ -15,6 +15,7 @@ #include "nsIDocument.h" class nsINode; +class txIParseContext; class txResultRecycler; namespace mozilla { @@ -54,12 +55,22 @@ public: ErrorResult& rv); already_AddRefed CreateNSResolver(nsINode* aNodeResolver, ErrorResult& rv); + XPathExpression* + CreateExpression(const nsAString& aExpression, + nsINode* aResolver, + ErrorResult& aRv); already_AddRefed Evaluate(JSContext* aCx, const nsAString& aExpression, nsINode* aContextNode, nsIDOMXPathNSResolver* aResolver, uint16_t aType, JS::Handle aResult, ErrorResult& rv); private: + XPathExpression* + CreateExpression(const nsAString& aExpression, + txIParseContext* aContext, + nsIDocument* aDocument, + ErrorResult& aRv); + nsWeakPtr mDocument; nsRefPtr mRecycler; };