SanitizerTypes.cpp (3840B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #include "SanitizerTypes.h" 6 7 namespace mozilla::dom::sanitizer { 8 9 template <typename CanonicalName, typename SanitizerName> 10 static void SetSanitizerName(const CanonicalName& aName, 11 SanitizerName& aSanitizerName) { 12 aName->LocalName()->ToString(aSanitizerName.mName); 13 if (nsAtom* ns = aName->GetNamespace()) { 14 ns->ToString(aSanitizerName.mNamespace); 15 } else { 16 aSanitizerName.mNamespace.SetIsVoid(true); 17 } 18 } 19 20 bool CanonicalAttribute::IsDataAttribute() const { 21 return StringBeginsWith(nsDependentAtomString(mLocalName), u"data-"_ns) && 22 !mNamespace; 23 } 24 25 SanitizerAttributeNamespace CanonicalAttribute::ToSanitizerAttributeNamespace() 26 const { 27 SanitizerAttributeNamespace result; 28 SetSanitizerName(this, result); 29 return result; 30 } 31 32 SanitizerElementNamespace CanonicalElement::ToSanitizerElementNamespace() 33 const { 34 SanitizerElementNamespace result; 35 SetSanitizerName(this, result); 36 return result; 37 } 38 39 SanitizerElementNamespaceWithAttributes 40 CanonicalElement::ToSanitizerElementNamespaceWithAttributes( 41 const CanonicalElementAttributes& aElementAttributes) const { 42 SanitizerElementNamespaceWithAttributes result; 43 SetSanitizerName(this, result); 44 if (aElementAttributes.mAttributes) { 45 result.mAttributes.Construct( 46 ToSanitizerAttributes(*aElementAttributes.mAttributes)); 47 } 48 if (aElementAttributes.mRemoveAttributes) { 49 result.mRemoveAttributes.Construct( 50 ToSanitizerAttributes(*aElementAttributes.mRemoveAttributes)); 51 } 52 return result; 53 } 54 55 template <typename CanonicalName> 56 static std::ostream& Write(std::ostream& aStream, const CanonicalName& aName) { 57 nsAutoCString localName; 58 aName.LocalName()->ToUTF8String(localName); 59 aStream << '"' << localName << '"'; 60 if (nsAtom* ns = aName.GetNamespace()) { 61 nsAutoCString nameSpace; 62 ns->ToUTF8String(nameSpace); 63 return aStream << " (namespace: \"" << nameSpace << "\")"; 64 } 65 return aStream << " (namespace: null)"; 66 } 67 68 std::ostream& operator<<(std::ostream& aStream, 69 const CanonicalAttribute& aName) { 70 return Write(aStream, aName); 71 } 72 73 std::ostream& operator<<(std::ostream& aStream, const CanonicalElement& aName) { 74 return Write(aStream, aName); 75 } 76 77 bool CanonicalElementAttributes::Equals( 78 const CanonicalElementAttributes& aOther) const { 79 if (mAttributes.isSome() != aOther.mAttributes.isSome() || 80 mRemoveAttributes.isSome() != aOther.mRemoveAttributes.isSome()) { 81 return false; 82 } 83 84 if (mAttributes) { 85 if (mAttributes->Count() != aOther.mAttributes->Count()) { 86 return false; 87 } 88 89 for (const CanonicalAttribute& attr : *mAttributes) { 90 if (!aOther.mAttributes->Contains(attr)) { 91 return false; 92 } 93 } 94 } 95 96 if (mRemoveAttributes) { 97 if (mRemoveAttributes->Count() != aOther.mRemoveAttributes->Count()) { 98 return false; 99 } 100 101 for (const CanonicalAttribute& attr : *mRemoveAttributes) { 102 if (!aOther.mRemoveAttributes->Contains(attr)) { 103 return false; 104 } 105 } 106 } 107 108 return true; 109 } 110 111 nsTArray<OwningStringOrSanitizerAttributeNamespace> ToSanitizerAttributes( 112 const CanonicalAttributeSet& aSet) { 113 nsTArray<OwningStringOrSanitizerAttributeNamespace> attributes; 114 for (const CanonicalAttribute& canonical : aSet) { 115 OwningStringOrSanitizerAttributeNamespace owning; 116 owning.SetAsSanitizerAttributeNamespace() = 117 canonical.ToSanitizerAttributeNamespace(); 118 attributes.InsertElementSorted(owning, 119 SanitizerComparator<decltype(owning)>()); 120 } 121 return attributes; 122 } 123 124 } // namespace mozilla::dom::sanitizer