Bug 1947732 - Provide nsIPrincipal to GetTrustedTypesCompliantAttributeValue. r=smaug

Differential Revision: https://phabricator.services.mozilla.com/D246745
This commit is contained in:
Tom Schuster
2025-04-30 11:09:08 +00:00
parent edaa914b45
commit 8487400e45
9 changed files with 40 additions and 34 deletions

View File

@@ -160,7 +160,7 @@ void Attr::SetValue(const nsAString& aValue, nsIPrincipal* aTriggeringPrincipal,
const nsAString* compliantString =
TrustedTypeUtils::GetTrustedTypesCompliantAttributeValue(
*element, nameAtom, mNodeInfo->NamespaceID(), aValue,
compliantStringHolder, aRv);
aTriggeringPrincipal, compliantStringHolder, aRv);
if (aRv.Failed()) {
return;
}

View File

@@ -1636,10 +1636,10 @@ Attr* Element::GetAttributeNode(const nsAString& aName) {
return Attributes()->GetNamedItem(aName);
}
already_AddRefed<Attr> Element::SetAttributeNode(Attr& aNewAttr,
ErrorResult& aError) {
already_AddRefed<Attr> Element::SetAttributeNode(
Attr& aNewAttr, nsIPrincipal* aSubjectPrincipal, ErrorResult& aError) {
RefPtr<nsDOMAttributeMap> attrMap = Attributes();
return attrMap->SetNamedItemNS(aNewAttr, aError);
return attrMap->SetNamedItemNS(aNewAttr, aSubjectPrincipal, aError);
}
already_AddRefed<Attr> Element::RemoveAttributeNode(Attr& aAttribute,
@@ -1726,8 +1726,8 @@ void Element::SetAttribute(
Maybe<nsAutoString> compliantStringHolder;
const nsAString* compliantString =
TrustedTypeUtils::GetTrustedTypesCompliantAttributeValue(
*this, nameAtom, kNameSpaceID_None, aValue, compliantStringHolder,
aError);
*this, nameAtom, kNameSpaceID_None, aValue, aTriggeringPrincipal,
compliantStringHolder, aError);
if (aError.Failed()) {
return;
}
@@ -1742,7 +1742,7 @@ void Element::SetAttribute(
const nsAString* compliantString =
TrustedTypeUtils::GetTrustedTypesCompliantAttributeValue(
*this, attributeName, name->NamespaceID(), aValue,
compliantStringHolder, aError);
aTriggeringPrincipal, compliantStringHolder, aError);
if (aError.Failed()) {
return;
}
@@ -1775,7 +1775,7 @@ void Element::SetAttributeNS(
RefPtr<nsAtom> attributeName = ni->NameAtom();
const nsAString* compliantString =
TrustedTypeUtils::GetTrustedTypesCompliantAttributeValue(
*this, attributeName, ni->NamespaceID(), aValue,
*this, attributeName, ni->NamespaceID(), aValue, aTriggeringPrincipal,
compliantStringHolder, aError);
if (aError.Failed()) {
return;
@@ -1828,10 +1828,10 @@ Attr* Element::GetAttributeNodeNSInternal(const nsAString& aNamespaceURI,
return Attributes()->GetNamedItemNS(aNamespaceURI, aLocalName);
}
already_AddRefed<Attr> Element::SetAttributeNodeNS(Attr& aNewAttr,
ErrorResult& aError) {
already_AddRefed<Attr> Element::SetAttributeNodeNS(
Attr& aNewAttr, nsIPrincipal* aSubjectPrincipal, ErrorResult& aError) {
RefPtr<nsDOMAttributeMap> attrMap = Attributes();
return attrMap->SetNamedItemNS(aNewAttr, aError);
return attrMap->SetNamedItemNS(aNewAttr, aSubjectPrincipal, aError);
}
already_AddRefed<nsIHTMLCollection> Element::GetElementsByTagNameNS(

View File

@@ -1439,13 +1439,13 @@ class Element : public FragmentOrElement {
void RequestPointerLock(CallerType aCallerType);
Attr* GetAttributeNode(const nsAString& aName);
MOZ_CAN_RUN_SCRIPT already_AddRefed<Attr> SetAttributeNode(
Attr& aNewAttr, ErrorResult& aError);
Attr& aNewAttr, nsIPrincipal* aSubjectPrincipal, ErrorResult& aError);
already_AddRefed<Attr> RemoveAttributeNode(Attr& aOldAttr,
ErrorResult& aError);
Attr* GetAttributeNodeNS(const nsAString& aNamespaceURI,
const nsAString& aLocalName);
MOZ_CAN_RUN_SCRIPT already_AddRefed<Attr> SetAttributeNodeNS(
Attr& aNewAttr, ErrorResult& aError);
Attr& aNewAttr, nsIPrincipal* aSubjectPrincipal, ErrorResult& aError);
MOZ_CAN_RUN_SCRIPT already_AddRefed<DOMRectList> GetClientRects();
MOZ_CAN_RUN_SCRIPT already_AddRefed<DOMRect> GetBoundingClientRect();

View File

@@ -176,8 +176,8 @@ Attr* nsDOMAttributeMap::GetNamedItem(const nsAString& aAttrName) {
return NamedGetter(aAttrName, dummy);
}
already_AddRefed<Attr> nsDOMAttributeMap::SetNamedItemNS(Attr& aAttr,
ErrorResult& aError) {
already_AddRefed<Attr> nsDOMAttributeMap::SetNamedItemNS(
Attr& aAttr, nsIPrincipal* aSubjectPrincipal, ErrorResult& aError) {
NS_ENSURE_TRUE(mContent, nullptr);
// XXX should check same-origin between mContent and aAttr however
@@ -207,8 +207,8 @@ already_AddRefed<Attr> nsDOMAttributeMap::SetNamedItemNS(Attr& aAttr,
nsCOMPtr<Element> element = mContent;
const nsAString* compliantString =
TrustedTypeUtils::GetTrustedTypesCompliantAttributeValue(
*element, nameAtom, ni->NamespaceID(), value, compliantStringHolder,
aError);
*element, nameAtom, ni->NamespaceID(), value, aSubjectPrincipal,
compliantStringHolder, aError);
if (aError.Failed()) {
return nullptr;
}

View File

@@ -19,6 +19,7 @@
class nsAtom;
class nsINode;
class nsIPrincipal;
namespace mozilla {
class ErrorResult;
@@ -147,8 +148,8 @@ class nsDOMAttributeMap final : public nsISupports, public nsWrapperCache {
Attr* GetNamedItemNS(const nsAString& aNamespaceURI,
const nsAString& aLocalName);
MOZ_CAN_RUN_SCRIPT already_AddRefed<Attr> SetNamedItemNS(Attr& aNode,
ErrorResult& aError);
MOZ_CAN_RUN_SCRIPT already_AddRefed<Attr> SetNamedItemNS(
Attr& aNode, nsIPrincipal* aSubjectPrincipal, ErrorResult& aError);
already_AddRefed<Attr> RemoveNamedItemNS(const nsAString& aNamespaceURI,
const nsAString& aLocalName,
ErrorResult& aError);

View File

@@ -666,7 +666,8 @@ template <typename TrustedTypeOrStringArg>
MOZ_CAN_RUN_SCRIPT const nsAString* GetTrustedTypesCompliantAttributeValue(
const nsINode& aElement, nsAtom* aAttributeName,
int32_t aAttributeNamespaceID, const TrustedTypeOrStringArg& aNewValue,
Maybe<nsAutoString>& aResultHolder, ErrorResult& aError) {
nsIPrincipal* aPrincipalOrNull, Maybe<nsAutoString>& aResultHolder,
ErrorResult& aError) {
if (!StaticPrefs::dom_security_trusted_types_enabled()) {
// A trusted type might've been created before the pref was set to `false`,
// so we cannot assume aNewValue.IsString().
@@ -710,15 +711,15 @@ MOZ_CAN_RUN_SCRIPT const nsAString* GetTrustedTypesCompliantAttributeValue(
switch (expectedType) {
case TrustedType::TrustedHTML:
return GetTrustedTypesCompliantString<TrustedHTML>(
input, sink, kTrustedTypesOnlySinkGroup, aElement, nullptr,
input, sink, kTrustedTypesOnlySinkGroup, aElement, aPrincipalOrNull,
aResultHolder, aError);
case TrustedType::TrustedScript:
return GetTrustedTypesCompliantString<TrustedScript>(
input, sink, kTrustedTypesOnlySinkGroup, aElement, nullptr,
input, sink, kTrustedTypesOnlySinkGroup, aElement, aPrincipalOrNull,
aResultHolder, aError);
case TrustedType::TrustedScriptURL:
return GetTrustedTypesCompliantString<TrustedScriptURL>(
input, sink, kTrustedTypesOnlySinkGroup, aElement, nullptr,
input, sink, kTrustedTypesOnlySinkGroup, aElement, aPrincipalOrNull,
aResultHolder, aError);
}
MOZ_ASSERT_UNREACHABLE();
@@ -729,20 +730,22 @@ MOZ_CAN_RUN_SCRIPT const nsAString* GetTrustedTypesCompliantAttributeValue(
const nsINode& aElement, nsAtom* aAttributeName,
int32_t aAttributeNamespaceID,
const TrustedHTMLOrTrustedScriptOrTrustedScriptURLOrString& aNewValue,
Maybe<nsAutoString>& aResultHolder, ErrorResult& aError) {
nsIPrincipal* aPrincipalOrNull, Maybe<nsAutoString>& aResultHolder,
ErrorResult& aError) {
return GetTrustedTypesCompliantAttributeValue<
TrustedHTMLOrTrustedScriptOrTrustedScriptURLOrString>(
aElement, aAttributeName, aAttributeNamespaceID, aNewValue, aResultHolder,
aError);
aElement, aAttributeName, aAttributeNamespaceID, aNewValue,
aPrincipalOrNull, aResultHolder, aError);
}
MOZ_CAN_RUN_SCRIPT const nsAString* GetTrustedTypesCompliantAttributeValue(
const nsINode& aElement, nsAtom* aAttributeName,
int32_t aAttributeNamespaceID, const nsAString& aNewValue,
Maybe<nsAutoString>& aResultHolder, ErrorResult& aError) {
nsIPrincipal* aPrincipalOrNull, Maybe<nsAutoString>& aResultHolder,
ErrorResult& aError) {
return GetTrustedTypesCompliantAttributeValue<const nsAString*>(
aElement, aAttributeName, aAttributeNamespaceID, &aNewValue,
aResultHolder, aError);
aPrincipalOrNull, aResultHolder, aError);
}
bool HostGetCodeForEval(JSContext* aCx, JS::Handle<JSObject*> aCode,

View File

@@ -145,11 +145,13 @@ MOZ_CAN_RUN_SCRIPT const nsAString* GetTrustedTypesCompliantAttributeValue(
const nsINode& aElement, nsAtom* aAttributeName,
int32_t aAttributeNamespaceID,
const TrustedHTMLOrTrustedScriptOrTrustedScriptURLOrString& aNewValue,
Maybe<nsAutoString>& aResultHolder, ErrorResult& aError);
nsIPrincipal* aPrincipalOrNull, Maybe<nsAutoString>& aResultHolder,
ErrorResult& aError);
MOZ_CAN_RUN_SCRIPT const nsAString* GetTrustedTypesCompliantAttributeValue(
const nsINode& aElement, nsAtom* aAttributeName,
int32_t aAttributeNamespaceID, const nsAString& aNewValue,
Maybe<nsAutoString>& aResultHolder, ErrorResult& aError);
nsIPrincipal* aPrincipalOrNull, Maybe<nsAutoString>& aResultHolder,
ErrorResult& aError);
// https://html.spec.whatwg.org/multipage/webappapis.html#hostgetcodeforeval(argument)
bool HostGetCodeForEval(JSContext* aCx, JS::Handle<JSObject*> aCode,

View File

@@ -151,12 +151,12 @@ interface Element : Node {
// Obsolete methods.
Attr? getAttributeNode(DOMString name);
[CEReactions, Throws]
[CEReactions, NeedsSubjectPrincipal=NonSystem, Throws]
Attr? setAttributeNode(Attr newAttr);
[CEReactions, Throws]
Attr? removeAttributeNode(Attr oldAttr);
Attr? getAttributeNodeNS(DOMString? namespaceURI, DOMString localName);
[CEReactions, Throws]
[CEReactions, NeedsSubjectPrincipal=NonSystem, Throws]
Attr? setAttributeNodeNS(Attr newAttr);
[Func="nsContentUtils::IsCallerChromeOrElementTransformGettersEnabled"]

View File

@@ -7,7 +7,7 @@
Exposed=Window]
interface NamedNodeMap {
getter Attr? getNamedItem(DOMString name);
[CEReactions, Throws, BinaryName="setNamedItemNS"]
[CEReactions, NeedsSubjectPrincipal=NonSystem, Throws, BinaryName="setNamedItemNS"]
Attr? setNamedItem(Attr arg);
[CEReactions, Throws]
Attr removeNamedItem(DOMString name);
@@ -16,7 +16,7 @@ interface NamedNodeMap {
readonly attribute unsigned long length;
Attr? getNamedItemNS(DOMString? namespaceURI, DOMString localName);
[CEReactions, Throws]
[CEReactions, NeedsSubjectPrincipal=NonSystem, Throws]
Attr? setNamedItemNS(Attr arg);
[CEReactions, Throws]
Attr removeNamedItemNS(DOMString? namespaceURI, DOMString localName);