CommonMetadata.h (7945B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef DOM_QUOTA_COMMONMETADATA_H_ 8 #define DOM_QUOTA_COMMONMETADATA_H_ 9 10 #include <utility> 11 12 #include "mozilla/dom/quota/Client.h" 13 #include "mozilla/dom/quota/ClientUsageArray.h" 14 #include "mozilla/dom/quota/Constants.h" 15 #include "mozilla/dom/quota/PersistenceType.h" 16 #include "nsString.h" 17 18 namespace mozilla::dom::quota { 19 20 struct PrincipalMetadata { 21 nsCString mSuffix; 22 nsCString mGroup; 23 nsCString mOrigin; 24 nsCString mStorageOrigin; 25 bool mIsPrivate = false; 26 27 // These explicit constructors exist to prevent accidental aggregate 28 // initialization which could for example initialize mSuffix as group and 29 // mGroup as origin (if only two string arguments are used). 30 PrincipalMetadata() = default; 31 32 PrincipalMetadata(nsCString aSuffix, nsCString aGroup, nsCString aOrigin, 33 nsCString aStorageOrigin, bool aIsPrivate) 34 : mSuffix{std::move(aSuffix)}, 35 mGroup{std::move(aGroup)}, 36 mOrigin{std::move(aOrigin)}, 37 mStorageOrigin{std::move(aStorageOrigin)}, 38 mIsPrivate{aIsPrivate} { 39 AssertInvariants(); 40 } 41 42 void AssertInvariants() const { 43 MOZ_ASSERT(!StringBeginsWith(mOrigin, kUUIDOriginScheme)); 44 MOZ_ASSERT_IF(!mIsPrivate, mOrigin == mStorageOrigin); 45 MOZ_ASSERT_IF(mIsPrivate, mOrigin != mStorageOrigin); 46 } 47 48 // Templated to restrict Equals() to exactly PrincipalMetadata. Prevents 49 // derived types from accidentally inheriting Equals() and comparing only 50 // base fields without their own fields. 51 template <typename T, typename = std::enable_if_t< 52 std::is_same<T, PrincipalMetadata>::value>> 53 bool Equals(const T& aOther) const { 54 return mSuffix == aOther.mSuffix && mGroup == aOther.mGroup && 55 mOrigin == aOther.mOrigin && 56 mStorageOrigin == aOther.mStorageOrigin && 57 mIsPrivate == aOther.mIsPrivate; 58 } 59 }; 60 61 struct OriginMetadata : public PrincipalMetadata { 62 PersistenceType mPersistenceType; 63 64 OriginMetadata() = default; 65 66 OriginMetadata(nsCString aSuffix, nsCString aGroup, nsCString aOrigin, 67 nsCString aStorageOrigin, bool aIsPrivate, 68 PersistenceType aPersistenceType) 69 : PrincipalMetadata(std::move(aSuffix), std::move(aGroup), 70 std::move(aOrigin), std::move(aStorageOrigin), 71 aIsPrivate), 72 mPersistenceType(aPersistenceType) {} 73 74 OriginMetadata(PrincipalMetadata aPrincipalMetadata, 75 PersistenceType aPersistenceType) 76 : PrincipalMetadata(std::move(aPrincipalMetadata)), 77 mPersistenceType(aPersistenceType) {} 78 79 // Templated to restrict Equals() to exactly OriginMetadata. Prevents 80 // derived types from accidentally inheriting Equals() and comparing only 81 // base fields without their own fields. 82 template <typename T, 83 typename = std::enable_if_t<std::is_same<T, OriginMetadata>::value>> 84 bool Equals(const T& aOther) const { 85 return static_cast<const PrincipalMetadata&>(*this).Equals( 86 static_cast<const PrincipalMetadata&>(aOther)) && 87 mPersistenceType == aOther.mPersistenceType; 88 } 89 90 // Returns a composite string key in the form "<persistence>*<origin>". 91 // Useful for flat hash maps keyed by both persistence type and origin, 92 // as an alternative to using structured keys or nested maps. 93 // Suitable when tree-based representation is unnecessary. 94 nsCString GetCompositeKey() const { 95 nsCString result; 96 97 result.AppendInt(mPersistenceType); 98 result.Append("*"); 99 result.Append(mOrigin); 100 101 return result; 102 } 103 }; 104 105 struct OriginStateMetadata { 106 int64_t mLastAccessTime; 107 int32_t mLastMaintenanceDate; 108 bool mAccessed; 109 bool mPersisted; 110 111 OriginStateMetadata() = default; 112 113 OriginStateMetadata(int64_t aLastAccessTime, int32_t aLastMaintenanceDate, 114 bool aAccessed, bool aPersisted) 115 : mLastAccessTime(aLastAccessTime), 116 mLastMaintenanceDate(aLastMaintenanceDate), 117 mAccessed(aAccessed), 118 mPersisted(aPersisted) {} 119 120 // Templated to restrict Equals() to exactly OriginStateMetadata. Prevents 121 // derived types from accidentally inheriting Equals() and comparing only 122 // base fields without their own fields. 123 template <typename T, typename = std::enable_if_t< 124 std::is_same<T, OriginStateMetadata>::value>> 125 bool Equals(const T& aOther) const { 126 return mLastAccessTime == aOther.mLastAccessTime && 127 mLastMaintenanceDate == aOther.mLastMaintenanceDate && 128 mAccessed == aOther.mAccessed && mPersisted == aOther.mPersisted; 129 } 130 }; 131 132 struct FullOriginMetadata : OriginMetadata, OriginStateMetadata { 133 ClientUsageArray mClientUsages; 134 uint64_t mOriginUsage; 135 uint32_t mQuotaVersion; 136 137 FullOriginMetadata() = default; 138 139 FullOriginMetadata(OriginMetadata aOriginMetadata, 140 OriginStateMetadata aOriginStateMetadata, 141 const ClientUsageArray& aClientUsages, uint64_t aUsage, 142 uint32_t aQuotaVersion) 143 : OriginMetadata(std::move(aOriginMetadata)), 144 OriginStateMetadata(aOriginStateMetadata), 145 mClientUsages(aClientUsages), 146 mOriginUsage(aUsage), 147 mQuotaVersion(aQuotaVersion) {} 148 149 // Templated to restrict Equals() to exactly FullOriginMetadata. Prevents 150 // derived types from accidentally inheriting Equals() and comparing only 151 // base fields without their own fields. 152 template <typename T, typename = std::enable_if_t< 153 std::is_same<T, FullOriginMetadata>::value>> 154 bool Equals(const T& aOther) const { 155 return static_cast<const OriginMetadata&>(*this).Equals( 156 static_cast<const OriginMetadata&>(aOther)) && 157 static_cast<const OriginStateMetadata&>(*this).Equals( 158 static_cast<const OriginStateMetadata&>(aOther)) && 159 mClientUsages == aOther.mClientUsages && 160 mOriginUsage == aOther.mOriginUsage && 161 mQuotaVersion == aOther.mQuotaVersion; 162 } 163 164 // Compares all fields of this FullOriginMetadata instance with another, 165 // except for the fields inherited from OriginStateMetadata. 166 template <typename T, typename = std::enable_if_t< 167 std::is_same<T, FullOriginMetadata>::value>> 168 bool EqualsIgnoringOriginState(const T& aOther) const { 169 return static_cast<const OriginMetadata&>(*this).Equals( 170 static_cast<const OriginMetadata&>(aOther)) && 171 mClientUsages == aOther.mClientUsages && 172 mOriginUsage == aOther.mOriginUsage && 173 mQuotaVersion == aOther.mQuotaVersion; 174 } 175 176 // Convenient method for duplicating a FullOriginMetadata instance. Creates 177 // a new object by copying both the OriginMetadata and OriginStateMetadata 178 // parts of this instance. 179 FullOriginMetadata Clone() const { 180 return {static_cast<const OriginMetadata&>(*this), 181 static_cast<const OriginStateMetadata&>(*this), mClientUsages, 182 mOriginUsage, mQuotaVersion}; 183 } 184 }; 185 186 struct OriginUsageMetadata : FullOriginMetadata { 187 uint64_t mUsage; 188 189 OriginUsageMetadata() = default; 190 191 OriginUsageMetadata(FullOriginMetadata aFullOriginMetadata, uint64_t aUsage) 192 : FullOriginMetadata(std::move(aFullOriginMetadata)), mUsage(aUsage) {} 193 }; 194 195 struct ClientMetadata : OriginMetadata { 196 Client::Type mClientType; 197 198 ClientMetadata() = default; 199 200 ClientMetadata(OriginMetadata aOriginMetadata, Client::Type aClientType) 201 : OriginMetadata(std::move(aOriginMetadata)), mClientType(aClientType) {} 202 }; 203 204 } // namespace mozilla::dom::quota 205 206 #endif // DOM_QUOTA_COMMONMETADATA_H_