Bug 1895572 - Throw correct exception when resolving namespaces for XPath. r=dom-core,mccr8,farre

Differential Revision: https://phabricator.services.mozilla.com/D209728
This commit is contained in:
Peter Van der Beken 2024-05-24 13:40:04 +00:00
parent 4ca30b8884
commit 249ac98ffe
10 changed files with 32 additions and 83 deletions

View file

@ -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<XPathResult> 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,

View file

@ -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;
}

View file

@ -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

View file

@ -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 {

View file

@ -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);
}
/**

View file

@ -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;

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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,