tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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_