From 249ac98ffe742b3b66d952a622f93221dd6e91c7 Mon Sep 17 00:00:00 2001 From: Peter Van der Beken Date: Fri, 24 May 2024 13:40:04 +0000 Subject: [PATCH] Bug 1895572 - Throw correct exception when resolving namespaces for XPath. r=dom-core,mccr8,farre Differential Revision: https://phabricator.services.mozilla.com/D209728 --- dom/xslt/xpath/XPathEvaluator.cpp | 24 ++++++++--------- dom/xslt/xpath/txExprParser.cpp | 26 +++++++------------ dom/xslt/xpath/txIXPathContext.h | 2 +- dom/xslt/xslt/txMozillaXSLTProcessor.cpp | 5 ++-- dom/xslt/xslt/txStylesheetCompiler.cpp | 6 ++--- dom/xslt/xslt/txStylesheetCompiler.h | 2 +- ...k-interface-cross-realm.tentative.html.ini | 17 ------------ .../resolver-callback-interface.html.ini | 14 ---------- .../resolver-non-string-result.html.ini | 8 ------ .../sessionstore/SessionStoreUtils.cpp | 11 ++++---- 10 files changed, 32 insertions(+), 83 deletions(-) delete mode 100644 testing/web-platform/meta/domxpath/resolver-callback-interface-cross-realm.tentative.html.ini delete mode 100644 testing/web-platform/meta/domxpath/resolver-callback-interface.html.ini delete mode 100644 testing/web-platform/meta/domxpath/resolver-non-string-result.html.ini diff --git a/dom/xslt/xpath/XPathEvaluator.cpp b/dom/xslt/xpath/XPathEvaluator.cpp index 14889462fb13..8989c9b4ed60 100644 --- a/dom/xslt/xpath/XPathEvaluator.cpp +++ b/dom/xslt/xpath/XPathEvaluator.cpp @@ -43,7 +43,7 @@ class XPathEvaluatorParseContext : public txIParseContext { nsresult getError() { return mLastError; } - nsresult resolveNamespacePrefix(nsAtom* aPrefix, int32_t& aID) override; + int32_t resolveNamespacePrefix(nsAtom* aPrefix) override; nsresult resolveFunctionCall(nsAtom* aName, int32_t aID, FunctionCall** aFunction) override; bool caseInsensitiveNameTests() override; @@ -129,12 +129,9 @@ already_AddRefed XPathEvaluator::Evaluate( * XPathNSResolver */ -nsresult XPathEvaluatorParseContext::resolveNamespacePrefix(nsAtom* aPrefix, - int32_t& aID) { - aID = kNameSpaceID_Unknown; - +int32_t XPathEvaluatorParseContext::resolveNamespacePrefix(nsAtom* aPrefix) { if (!mResolver && !mResolverNode) { - return NS_ERROR_DOM_NAMESPACE_ERR; + return kNameSpaceID_Unknown; } nsAutoString prefix; @@ -147,7 +144,8 @@ nsresult XPathEvaluatorParseContext::resolveNamespacePrefix(nsAtom* aPrefix, ErrorResult rv; mResolver->LookupNamespaceURI(prefix, ns, rv); if (rv.Failed()) { - return rv.StealNSResult(); + rv.SuppressException(); + return kNameSpaceID_Unknown; } } else { if (aPrefix == nsGkAtoms::xml) { @@ -158,17 +156,19 @@ nsresult XPathEvaluatorParseContext::resolveNamespacePrefix(nsAtom* aPrefix, } if (DOMStringIsNull(ns)) { - return NS_ERROR_DOM_NAMESPACE_ERR; + return kNameSpaceID_Unknown; } if (ns.IsEmpty()) { - aID = kNameSpaceID_None; - - return NS_OK; + return kNameSpaceID_None; } // get the namespaceID for the URI - return nsNameSpaceManager::GetInstance()->RegisterNameSpace(ns, aID); + int32_t id; + return NS_SUCCEEDED( + nsNameSpaceManager::GetInstance()->RegisterNameSpace(ns, id)) + ? id + : kNameSpaceID_Unknown; } nsresult XPathEvaluatorParseContext::resolveFunctionCall(nsAtom* aName, diff --git a/dom/xslt/xpath/txExprParser.cpp b/dom/xslt/xpath/txExprParser.cpp index 47f142d023df..93d22bdafd5d 100644 --- a/dom/xslt/xpath/txExprParser.cpp +++ b/dom/xslt/xpath/txExprParser.cpp @@ -823,33 +823,25 @@ nsresult txExprParser::resolveQName(const nsAString& aQName, nsAtom** aPrefix, txIParseContext* aContext, nsAtom** aLocalName, int32_t& aNamespace, bool aIsNameTest) { - aNamespace = kNameSpaceID_None; int32_t idx = aQName.FindChar(':'); if (idx > 0) { - *aPrefix = NS_Atomize(StringHead(aQName, (uint32_t)idx)).take(); - if (!*aPrefix) { - return NS_ERROR_OUT_OF_MEMORY; - } - *aLocalName = NS_Atomize(Substring(aQName, (uint32_t)idx + 1, - aQName.Length() - (idx + 1))) + *aPrefix = NS_AtomizeMainThread(StringHead(aQName, (uint32_t)idx)).take(); + *aLocalName = NS_AtomizeMainThread(Substring(aQName, (uint32_t)idx + 1, + aQName.Length() - (idx + 1))) .take(); - if (!*aLocalName) { - NS_RELEASE(*aPrefix); - return NS_ERROR_OUT_OF_MEMORY; - } - return aContext->resolveNamespacePrefix(*aPrefix, aNamespace); + aNamespace = aContext->resolveNamespacePrefix(*aPrefix); + return aNamespace != kNameSpaceID_Unknown ? NS_OK + : NS_ERROR_DOM_NAMESPACE_ERR; } + aNamespace = kNameSpaceID_None; // the lexer dealt with idx == 0 *aPrefix = 0; if (aIsNameTest && aContext->caseInsensitiveNameTests()) { nsAutoString lcname; nsContentUtils::ASCIIToLower(aQName, lcname); - *aLocalName = NS_Atomize(lcname).take(); + *aLocalName = NS_AtomizeMainThread(lcname).take(); } else { - *aLocalName = NS_Atomize(aQName).take(); - } - if (!*aLocalName) { - return NS_ERROR_OUT_OF_MEMORY; + *aLocalName = NS_AtomizeMainThread(aQName).take(); } return NS_OK; } diff --git a/dom/xslt/xpath/txIXPathContext.h b/dom/xslt/xpath/txIXPathContext.h index 8d5b5df4bece..fa42a6c22b77 100644 --- a/dom/xslt/xpath/txIXPathContext.h +++ b/dom/xslt/xpath/txIXPathContext.h @@ -32,7 +32,7 @@ class txIParseContext { /* * Return a namespaceID for a given prefix. */ - virtual nsresult resolveNamespacePrefix(nsAtom* aPrefix, int32_t& aID) = 0; + virtual int32_t resolveNamespacePrefix(nsAtom* aPrefix) = 0; /* * Create a FunctionCall, needed for extension function calls and diff --git a/dom/xslt/xslt/txMozillaXSLTProcessor.cpp b/dom/xslt/xslt/txMozillaXSLTProcessor.cpp index c26aea1bb9a3..c5231e922168 100644 --- a/dom/xslt/xslt/txMozillaXSLTProcessor.cpp +++ b/dom/xslt/xslt/txMozillaXSLTProcessor.cpp @@ -330,9 +330,8 @@ class txXSLTParamContext : public txIParseContext, public txIEvalContext { : mResolver(aResolver), mContext(aContext), mRecycler(aRecycler) {} // txIParseContext - nsresult resolveNamespacePrefix(nsAtom* aPrefix, int32_t& aID) override { - aID = mResolver->lookupNamespace(aPrefix); - return aID == kNameSpaceID_Unknown ? NS_ERROR_DOM_NAMESPACE_ERR : NS_OK; + int32_t resolveNamespacePrefix(nsAtom* aPrefix) override { + return mResolver->lookupNamespace(aPrefix); } nsresult resolveFunctionCall(nsAtom* aName, int32_t aID, FunctionCall** aFunction) override { diff --git a/dom/xslt/xslt/txStylesheetCompiler.cpp b/dom/xslt/xslt/txStylesheetCompiler.cpp index 82b6de4c79c7..6267e660d8c7 100644 --- a/dom/xslt/xslt/txStylesheetCompiler.cpp +++ b/dom/xslt/xslt/txStylesheetCompiler.cpp @@ -689,12 +689,10 @@ void txStylesheetCompilerState::addVariable(const txExpandedName& aName) { mInScopeVariables.AppendElement(aName); } -nsresult txStylesheetCompilerState::resolveNamespacePrefix(nsAtom* aPrefix, - int32_t& aID) { +int32_t txStylesheetCompilerState::resolveNamespacePrefix(nsAtom* aPrefix) { NS_ASSERTION(aPrefix && aPrefix != nsGkAtoms::_empty, "caller should handle default namespace ''"); - aID = mElementContext->mMappings->lookupNamespace(aPrefix); - return (aID != kNameSpaceID_Unknown) ? NS_OK : NS_ERROR_FAILURE; + return mElementContext->mMappings->lookupNamespace(aPrefix); } /** diff --git a/dom/xslt/xslt/txStylesheetCompiler.h b/dom/xslt/xslt/txStylesheetCompiler.h index 759219ced647..9309d6987aef 100644 --- a/dom/xslt/xslt/txStylesheetCompiler.h +++ b/dom/xslt/xslt/txStylesheetCompiler.h @@ -125,7 +125,7 @@ class txStylesheetCompilerState : public txIParseContext { void addVariable(const txExpandedName& aName); // txIParseContext - nsresult resolveNamespacePrefix(nsAtom* aPrefix, int32_t& aID) override; + int32_t resolveNamespacePrefix(nsAtom* aPrefix) override; nsresult resolveFunctionCall(nsAtom* aName, int32_t aID, FunctionCall** aFunction) override; bool caseInsensitiveNameTests() override; diff --git a/testing/web-platform/meta/domxpath/resolver-callback-interface-cross-realm.tentative.html.ini b/testing/web-platform/meta/domxpath/resolver-callback-interface-cross-realm.tentative.html.ini deleted file mode 100644 index af11ff8e74c7..000000000000 --- a/testing/web-platform/meta/domxpath/resolver-callback-interface-cross-realm.tentative.html.ini +++ /dev/null @@ -1,17 +0,0 @@ -[resolver-callback-interface-cross-realm.tentative.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] - [XPathNSResolver is cross-realm plain object without 'lookupNamespaceURI' property] - expected: FAIL - - [XPathNSResolver is cross-realm plain object with non-callable 'lookupNamespaceURI' property] - expected: FAIL - - [XPathNSResolver is cross-realm non-callable revoked Proxy] - expected: FAIL - - [XPathNSResolver is cross-realm callable revoked Proxy] - expected: FAIL - - [XPathNSResolver is cross-realm plain object with revoked Proxy as 'lookupNamespaceURI' property] - expected: FAIL diff --git a/testing/web-platform/meta/domxpath/resolver-callback-interface.html.ini b/testing/web-platform/meta/domxpath/resolver-callback-interface.html.ini deleted file mode 100644 index d8daafa41772..000000000000 --- a/testing/web-platform/meta/domxpath/resolver-callback-interface.html.ini +++ /dev/null @@ -1,14 +0,0 @@ -[resolver-callback-interface.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] - [object resolver: abrupt completion from Get] - expected: FAIL - - [object resolver: 'lookupNamespaceURI' is falsy and not callable] - expected: FAIL - - [object resolver: 'lookupNamespaceURI' is thruthy and not callable] - expected: FAIL - - [callable resolver: abrupt completion from Call] - expected: FAIL diff --git a/testing/web-platform/meta/domxpath/resolver-non-string-result.html.ini b/testing/web-platform/meta/domxpath/resolver-non-string-result.html.ini deleted file mode 100644 index 673b64d2b241..000000000000 --- a/testing/web-platform/meta/domxpath/resolver-non-string-result.html.ini +++ /dev/null @@ -1,8 +0,0 @@ -[resolver-non-string-result.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] - [symbol] - expected: FAIL - - [object coercion (abrupt completion)] - expected: FAIL diff --git a/toolkit/components/sessionstore/SessionStoreUtils.cpp b/toolkit/components/sessionstore/SessionStoreUtils.cpp index 3c94a54261a1..3c0eaa00e4d4 100644 --- a/toolkit/components/sessionstore/SessionStoreUtils.cpp +++ b/toolkit/components/sessionstore/SessionStoreUtils.cpp @@ -1317,14 +1317,13 @@ class FormDataParseContext : public txIParseContext { explicit FormDataParseContext(bool aCaseInsensitive) : mIsCaseInsensitive(aCaseInsensitive) {} - nsresult resolveNamespacePrefix(nsAtom* aPrefix, int32_t& aID) override { + int32_t resolveNamespacePrefix(nsAtom* aPrefix) override { if (aPrefix == nsGkAtoms::xul) { - aID = kNameSpaceID_XUL; - } else { - MOZ_ASSERT(nsDependentAtomString(aPrefix).EqualsLiteral("xhtml")); - aID = kNameSpaceID_XHTML; + return kNameSpaceID_XUL; } - return NS_OK; + + MOZ_ASSERT(nsDependentAtomString(aPrefix).EqualsLiteral("xhtml")); + return kNameSpaceID_XHTML; } nsresult resolveFunctionCall(nsAtom* aName, int32_t aID,