tor-browser

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

QuotaParent.cpp (38584B)


      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 #include "QuotaParent.h"
      8 
      9 #include <mozilla/Assertions.h>
     10 
     11 #include "OriginOperations.h"
     12 #include "QuotaRequestBase.h"
     13 #include "mozilla/RefPtr.h"
     14 #include "mozilla/dom/quota/ErrorHandling.h"
     15 #include "mozilla/dom/quota/PQuota.h"
     16 #include "mozilla/dom/quota/PQuotaRequestParent.h"
     17 #include "mozilla/dom/quota/PQuotaUsageRequestParent.h"
     18 #include "mozilla/dom/quota/PrincipalUtils.h"
     19 #include "mozilla/dom/quota/QuotaManager.h"
     20 #include "mozilla/dom/quota/QuotaUsageRequestParent.h"
     21 #include "mozilla/dom/quota/ResultExtensions.h"
     22 #include "mozilla/ipc/BackgroundParent.h"
     23 #include "nsDebug.h"
     24 #include "nsError.h"
     25 
     26 // CUF == CRASH_UNLESS_FUZZING
     27 #define QM_CUF_AND_IPC_FAIL(actor)                           \
     28  [&_actor = *actor](const auto& aFunc, const auto& aExpr) { \
     29    MOZ_CRASH_UNLESS_FUZZING();                              \
     30    return QM_IPC_FAIL(&_actor)(aFunc, aExpr);               \
     31  }
     32 
     33 namespace mozilla::dom::quota {
     34 
     35 using namespace mozilla::ipc;
     36 
     37 namespace {
     38 
     39 template <typename PromiseType, typename ResolverType, bool MoveOnly>
     40 class PromiseResolveOrRejectCallbackBase {
     41 public:
     42  PromiseResolveOrRejectCallbackBase(RefPtr<Quota> aQuota,
     43                                     ResolverType&& aResolver)
     44      : mResolver(std::move(aResolver)), mQuota(std::move(aQuota)) {}
     45 
     46 protected:
     47  bool CanSend() const { return mQuota->CanSend(); }
     48 
     49  ResolverType mResolver;
     50 
     51 private:
     52  RefPtr<Quota> mQuota;
     53 };
     54 
     55 template <typename PromiseType, typename ResolverType, bool MoveOnly>
     56 class PromiseResolveOrRejectCallback
     57    : public PromiseResolveOrRejectCallbackBase<PromiseType, ResolverType,
     58                                                MoveOnly> {};
     59 
     60 template <typename PromiseType, typename ResolverType>
     61 class PromiseResolveOrRejectCallback<PromiseType, ResolverType, true>
     62    : public PromiseResolveOrRejectCallbackBase<PromiseType, ResolverType,
     63                                                true> {
     64  using Base =
     65      PromiseResolveOrRejectCallbackBase<PromiseType, ResolverType, true>;
     66 
     67  using Base::CanSend;
     68  using Base::mResolver;
     69 
     70 public:
     71  PromiseResolveOrRejectCallback(RefPtr<Quota> aQuota, ResolverType&& aResolver)
     72      : Base(std::move(aQuota), std::move(aResolver)) {}
     73 
     74  void operator()(typename PromiseType::ResolveOrRejectValue&& aValue) {
     75    if (!CanSend()) {
     76      return;
     77    }
     78    if (aValue.IsResolve()) {
     79      mResolver(std::move(aValue.ResolveValue()));
     80    } else {
     81      mResolver(aValue.RejectValue());
     82    }
     83  }
     84 };
     85 
     86 template <typename PromiseType, typename ResolverType>
     87 class PromiseResolveOrRejectCallback<PromiseType, ResolverType, false>
     88    : public PromiseResolveOrRejectCallbackBase<PromiseType, ResolverType,
     89                                                false> {
     90  using Base =
     91      PromiseResolveOrRejectCallbackBase<PromiseType, ResolverType, false>;
     92 
     93  using Base::CanSend;
     94  using Base::mResolver;
     95 
     96 public:
     97  PromiseResolveOrRejectCallback(RefPtr<Quota> aQuota, ResolverType&& aResolver)
     98      : Base(std::move(aQuota), std::move(aResolver)) {}
     99 
    100  void operator()(const typename PromiseType::ResolveOrRejectValue& aValue) {
    101    if (!CanSend()) {
    102      return;
    103    }
    104 
    105    if (aValue.IsResolve()) {
    106      mResolver(aValue.ResolveValue());
    107    } else {
    108      mResolver(aValue.RejectValue());
    109    }
    110  }
    111 };
    112 
    113 using BoolPromiseResolveOrRejectCallback =
    114    PromiseResolveOrRejectCallback<BoolPromise, BoolResponseResolver, false>;
    115 using UInt64PromiseResolveOrRejectCallback =
    116    PromiseResolveOrRejectCallback<UInt64Promise, UInt64ResponseResolver,
    117                                   false>;
    118 using CStringArrayPromiseResolveOrRejectCallback =
    119    PromiseResolveOrRejectCallback<CStringArrayPromise,
    120                                   CStringArrayResponseResolver, true>;
    121 using OriginUsageMetadataArrayPromiseResolveOrRejectCallback =
    122    PromiseResolveOrRejectCallback<OriginUsageMetadataArrayPromise,
    123                                   OriginUsageMetadataArrayResponseResolver,
    124                                   true>;
    125 using UsageInfoPromiseResolveOrRejectCallback =
    126    PromiseResolveOrRejectCallback<UsageInfoPromise, UsageInfoResponseResolver,
    127                                   false>;
    128 
    129 }  // namespace
    130 
    131 already_AddRefed<PQuotaParent> AllocPQuotaParent() {
    132  AssertIsOnBackgroundThread();
    133 
    134  if (NS_WARN_IF(QuotaManager::IsShuttingDown())) {
    135    return nullptr;
    136  }
    137 
    138  auto actor = MakeRefPtr<Quota>();
    139 
    140  return actor.forget();
    141 }
    142 
    143 Quota::Quota()
    144 #ifdef DEBUG
    145    : mActorDestroyed(false)
    146 #endif
    147 {
    148 }
    149 
    150 Quota::~Quota() { MOZ_ASSERT(mActorDestroyed); }
    151 
    152 bool Quota::TrustParams() const {
    153 #ifdef DEBUG
    154  // Never trust parameters in DEBUG builds!
    155  bool trustParams = false;
    156 #else
    157  bool trustParams = !BackgroundParent::IsOtherProcessActor(Manager());
    158 #endif
    159 
    160  return trustParams;
    161 }
    162 
    163 bool Quota::VerifyRequestParams(const RequestParams& aParams) const {
    164  AssertIsOnBackgroundThread();
    165  MOZ_ASSERT(aParams.type() != RequestParams::T__None);
    166 
    167  switch (aParams.type()) {
    168    case RequestParams::TStorageNameParams:
    169      break;
    170 
    171    case RequestParams::TGetFullOriginMetadataParams: {
    172      const GetFullOriginMetadataParams& params =
    173          aParams.get_GetFullOriginMetadataParams();
    174      if (NS_WARN_IF(!IsBestEffortPersistenceType(params.persistenceType()))) {
    175        MOZ_CRASH_UNLESS_FUZZING();
    176        return false;
    177      }
    178 
    179      if (NS_WARN_IF(!IsPrincipalInfoValid(params.principalInfo()))) {
    180        MOZ_CRASH_UNLESS_FUZZING();
    181        return false;
    182      }
    183 
    184      break;
    185    }
    186 
    187    case RequestParams::TPersistedParams: {
    188      const PersistedParams& params = aParams.get_PersistedParams();
    189 
    190      if (NS_WARN_IF(!IsPrincipalInfoValid(params.principalInfo()))) {
    191        MOZ_CRASH_UNLESS_FUZZING();
    192        return false;
    193      }
    194 
    195      break;
    196    }
    197 
    198    case RequestParams::TPersistParams: {
    199      const PersistParams& params = aParams.get_PersistParams();
    200 
    201      if (NS_WARN_IF(!IsPrincipalInfoValid(params.principalInfo()))) {
    202        MOZ_CRASH_UNLESS_FUZZING();
    203        return false;
    204      }
    205 
    206      break;
    207    }
    208 
    209    case RequestParams::TEstimateParams: {
    210      const EstimateParams& params = aParams.get_EstimateParams();
    211 
    212      if (NS_WARN_IF(!IsPrincipalInfoValid(params.principalInfo()))) {
    213        MOZ_CRASH_UNLESS_FUZZING();
    214        return false;
    215      }
    216 
    217      break;
    218    }
    219 
    220    default:
    221      MOZ_CRASH("Should never get here!");
    222  }
    223 
    224  return true;
    225 }
    226 
    227 void Quota::ActorDestroy(ActorDestroyReason aWhy) {
    228  AssertIsOnBackgroundThread();
    229 #ifdef DEBUG
    230  MOZ_ASSERT(!mActorDestroyed);
    231  mActorDestroyed = true;
    232 #endif
    233 }
    234 
    235 PQuotaRequestParent* Quota::AllocPQuotaRequestParent(
    236    const RequestParams& aParams) {
    237  AssertIsOnBackgroundThread();
    238  MOZ_ASSERT(aParams.type() != RequestParams::T__None);
    239 
    240  if (NS_WARN_IF(QuotaManager::IsShuttingDown())) {
    241    return nullptr;
    242  }
    243 
    244  if (!TrustParams() && NS_WARN_IF(!VerifyRequestParams(aParams))) {
    245    MOZ_CRASH_UNLESS_FUZZING();
    246    return nullptr;
    247  }
    248 
    249  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    250                QuotaManager::GetOrCreate(), nullptr);
    251 
    252  auto actor = [&]() -> RefPtr<QuotaRequestBase> {
    253    switch (aParams.type()) {
    254      case RequestParams::TStorageNameParams:
    255        return CreateStorageNameOp(quotaManager);
    256 
    257      case RequestParams::TGetFullOriginMetadataParams:
    258        return CreateGetFullOriginMetadataOp(
    259            quotaManager, aParams.get_GetFullOriginMetadataParams());
    260 
    261      case RequestParams::TPersistedParams:
    262        return CreatePersistedOp(quotaManager, aParams);
    263 
    264      case RequestParams::TPersistParams:
    265        return CreatePersistOp(quotaManager, aParams);
    266 
    267      case RequestParams::TEstimateParams:
    268        return CreateEstimateOp(quotaManager, aParams.get_EstimateParams());
    269 
    270      default:
    271        MOZ_CRASH("Should never get here!");
    272    }
    273  }();
    274 
    275  MOZ_ASSERT(actor);
    276 
    277  quotaManager->RegisterNormalOriginOp(*actor);
    278 
    279  // Transfer ownership to IPDL.
    280  return actor.forget().take();
    281 }
    282 
    283 mozilla::ipc::IPCResult Quota::RecvPQuotaRequestConstructor(
    284    PQuotaRequestParent* aActor, const RequestParams& aParams) {
    285  AssertIsOnBackgroundThread();
    286  MOZ_ASSERT(aActor);
    287  MOZ_ASSERT(aParams.type() != RequestParams::T__None);
    288  MOZ_ASSERT(!QuotaManager::IsShuttingDown());
    289 
    290  auto* op = static_cast<QuotaRequestBase*>(aActor);
    291 
    292  op->RunImmediately();
    293  return IPC_OK();
    294 }
    295 
    296 bool Quota::DeallocPQuotaRequestParent(PQuotaRequestParent* aActor) {
    297  AssertIsOnBackgroundThread();
    298  MOZ_ASSERT(aActor);
    299 
    300  // Transfer ownership back from IPDL.
    301  RefPtr<QuotaRequestBase> actor =
    302      dont_AddRef(static_cast<QuotaRequestBase*>(aActor));
    303  return true;
    304 }
    305 
    306 mozilla::ipc::IPCResult Quota::RecvStorageInitialized(
    307    StorageInitializedResolver&& aResolver) {
    308  AssertIsOnBackgroundThread();
    309 
    310  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    311         ResolveBoolResponseAndReturn(aResolver));
    312 
    313  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    314                QuotaManager::GetOrCreate(),
    315                ResolveBoolResponseAndReturn(aResolver));
    316 
    317  quotaManager->StorageInitialized()->Then(
    318      GetCurrentSerialEventTarget(), __func__,
    319      BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    320 
    321  return IPC_OK();
    322 }
    323 
    324 mozilla::ipc::IPCResult Quota::RecvPersistentStorageInitialized(
    325    TemporaryStorageInitializedResolver&& aResolver) {
    326  AssertIsOnBackgroundThread();
    327 
    328  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    329         ResolveBoolResponseAndReturn(aResolver));
    330 
    331  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    332                QuotaManager::GetOrCreate(),
    333                ResolveBoolResponseAndReturn(aResolver));
    334 
    335  quotaManager->PersistentStorageInitialized()->Then(
    336      GetCurrentSerialEventTarget(), __func__,
    337      BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    338 
    339  return IPC_OK();
    340 }
    341 
    342 mozilla::ipc::IPCResult Quota::RecvTemporaryStorageInitialized(
    343    TemporaryStorageInitializedResolver&& aResolver) {
    344  AssertIsOnBackgroundThread();
    345 
    346  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    347         ResolveBoolResponseAndReturn(aResolver));
    348 
    349  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    350                QuotaManager::GetOrCreate(),
    351                ResolveBoolResponseAndReturn(aResolver));
    352 
    353  quotaManager->TemporaryStorageInitialized()->Then(
    354      GetCurrentSerialEventTarget(), __func__,
    355      BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    356 
    357  return IPC_OK();
    358 }
    359 
    360 mozilla::ipc::IPCResult Quota::RecvTemporaryGroupInitialized(
    361    const PrincipalInfo& aPrincipalInfo,
    362    TemporaryOriginInitializedResolver&& aResolve) {
    363  AssertIsOnBackgroundThread();
    364 
    365  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    366         ResolveBoolResponseAndReturn(aResolve));
    367 
    368  if (!TrustParams()) {
    369    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
    370           QM_CUF_AND_IPC_FAIL(this));
    371  }
    372 
    373  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    374                QuotaManager::GetOrCreate(),
    375                ResolveBoolResponseAndReturn(aResolve));
    376 
    377  QM_TRY_UNWRAP(
    378      PrincipalMetadata principalMetadata,
    379      GetInfoFromValidatedPrincipalInfo(*quotaManager, aPrincipalInfo),
    380      ResolveBoolResponseAndReturn(aResolve));
    381 
    382  quotaManager->TemporaryGroupInitialized(principalMetadata)
    383      ->Then(GetCurrentSerialEventTarget(), __func__,
    384             BoolPromiseResolveOrRejectCallback(this, std::move(aResolve)));
    385 
    386  return IPC_OK();
    387 }
    388 
    389 mozilla::ipc::IPCResult Quota::RecvPersistentOriginInitialized(
    390    const PrincipalInfo& aPrincipalInfo,
    391    PersistentOriginInitializedResolver&& aResolve) {
    392  AssertIsOnBackgroundThread();
    393 
    394  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    395         ResolveBoolResponseAndReturn(aResolve));
    396 
    397  if (!TrustParams()) {
    398    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
    399           QM_CUF_AND_IPC_FAIL(this));
    400  }
    401 
    402  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    403                QuotaManager::GetOrCreate(),
    404                ResolveBoolResponseAndReturn(aResolve));
    405 
    406  QM_TRY_UNWRAP(
    407      PrincipalMetadata principalMetadata,
    408      GetInfoFromValidatedPrincipalInfo(*quotaManager, aPrincipalInfo),
    409      ResolveBoolResponseAndReturn(aResolve));
    410 
    411  quotaManager
    412      ->PersistentOriginInitialized(OriginMetadata{std::move(principalMetadata),
    413                                                   PERSISTENCE_TYPE_PERSISTENT})
    414      ->Then(GetCurrentSerialEventTarget(), __func__,
    415             BoolPromiseResolveOrRejectCallback(this, std::move(aResolve)));
    416 
    417  return IPC_OK();
    418 }
    419 
    420 mozilla::ipc::IPCResult Quota::RecvTemporaryOriginInitialized(
    421    const PersistenceType& aPersistenceType,
    422    const PrincipalInfo& aPrincipalInfo,
    423    TemporaryOriginInitializedResolver&& aResolve) {
    424  AssertIsOnBackgroundThread();
    425 
    426  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    427         ResolveBoolResponseAndReturn(aResolve));
    428 
    429  if (!TrustParams()) {
    430    QM_TRY(MOZ_TO_RESULT(IsValidPersistenceType(aPersistenceType)),
    431           QM_CUF_AND_IPC_FAIL(this));
    432 
    433    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
    434           QM_CUF_AND_IPC_FAIL(this));
    435  }
    436 
    437  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    438                QuotaManager::GetOrCreate(),
    439                ResolveBoolResponseAndReturn(aResolve));
    440 
    441  QM_TRY_UNWRAP(
    442      PrincipalMetadata principalMetadata,
    443      GetInfoFromValidatedPrincipalInfo(*quotaManager, aPrincipalInfo),
    444      ResolveBoolResponseAndReturn(aResolve));
    445 
    446  quotaManager
    447      ->TemporaryOriginInitialized(
    448          OriginMetadata{std::move(principalMetadata), aPersistenceType})
    449      ->Then(GetCurrentSerialEventTarget(), __func__,
    450             BoolPromiseResolveOrRejectCallback(this, std::move(aResolve)));
    451 
    452  return IPC_OK();
    453 }
    454 
    455 mozilla::ipc::IPCResult Quota::RecvInitializeStorage(
    456    InitializeStorageResolver&& aResolver) {
    457  AssertIsOnBackgroundThread();
    458 
    459  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    460         ResolveBoolResponseAndReturn(aResolver));
    461 
    462  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    463                QuotaManager::GetOrCreate(),
    464                ResolveBoolResponseAndReturn(aResolver));
    465 
    466  quotaManager->InitializeStorage()->Then(
    467      GetCurrentSerialEventTarget(), __func__,
    468      BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    469 
    470  return IPC_OK();
    471 }
    472 
    473 mozilla::ipc::IPCResult Quota::RecvInitializePersistentStorage(
    474    InitializeStorageResolver&& aResolver) {
    475  AssertIsOnBackgroundThread();
    476 
    477  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    478         ResolveBoolResponseAndReturn(aResolver));
    479 
    480  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    481                QuotaManager::GetOrCreate(),
    482                ResolveBoolResponseAndReturn(aResolver));
    483 
    484  quotaManager->InitializePersistentStorage()->Then(
    485      GetCurrentSerialEventTarget(), __func__,
    486      BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    487 
    488  return IPC_OK();
    489 }
    490 
    491 mozilla::ipc::IPCResult Quota::RecvInitializeAllTemporaryOrigins(
    492    InitializeAllTemporaryOriginsResolver&& aResolver) {
    493  AssertIsOnBackgroundThread();
    494 
    495  if (NS_WARN_IF(!StaticPrefs::dom_quotaManager_testing())) {
    496    return IPC_FAIL(this, "QuotaManager is not in testing mode!");
    497  }
    498 
    499  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    500         ResolveBoolResponseAndReturn(aResolver));
    501 
    502  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    503                QuotaManager::GetOrCreate(),
    504                ResolveBoolResponseAndReturn(aResolver));
    505 
    506  quotaManager->InitializeAllTemporaryOrigins()->Then(
    507      GetCurrentSerialEventTarget(), __func__,
    508      BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    509 
    510  return IPC_OK();
    511 }
    512 
    513 mozilla::ipc::IPCResult Quota::RecvInitializeTemporaryGroup(
    514    const PrincipalInfo& aPrincipalInfo,
    515    InitializeTemporaryOriginResolver&& aResolve) {
    516  AssertIsOnBackgroundThread();
    517 
    518  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    519         ResolveBoolResponseAndReturn(aResolve));
    520 
    521  if (!TrustParams()) {
    522    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
    523           QM_CUF_AND_IPC_FAIL(this));
    524  }
    525 
    526  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    527                QuotaManager::GetOrCreate(),
    528                ResolveBoolResponseAndReturn(aResolve));
    529 
    530  QM_TRY_UNWRAP(
    531      PrincipalMetadata principalMetadata,
    532      GetInfoFromValidatedPrincipalInfo(*quotaManager, aPrincipalInfo),
    533      ResolveBoolResponseAndReturn(aResolve));
    534 
    535  quotaManager->InitializeTemporaryGroup(principalMetadata)
    536      ->Then(GetCurrentSerialEventTarget(), __func__,
    537             BoolPromiseResolveOrRejectCallback(this, std::move(aResolve)));
    538 
    539  return IPC_OK();
    540 }
    541 
    542 mozilla::ipc::IPCResult Quota::RecvInitializePersistentOrigin(
    543    const PrincipalInfo& aPrincipalInfo,
    544    InitializePersistentOriginResolver&& aResolve) {
    545  AssertIsOnBackgroundThread();
    546 
    547  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    548         ResolveBoolResponseAndReturn(aResolve));
    549 
    550  if (!TrustParams()) {
    551    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
    552           QM_CUF_AND_IPC_FAIL(this));
    553  }
    554 
    555  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    556                QuotaManager::GetOrCreate(),
    557                ResolveBoolResponseAndReturn(aResolve));
    558 
    559  QM_TRY_UNWRAP(
    560      PrincipalMetadata principalMetadata,
    561      GetInfoFromValidatedPrincipalInfo(*quotaManager, aPrincipalInfo),
    562      ResolveBoolResponseAndReturn(aResolve));
    563 
    564  quotaManager
    565      ->InitializePersistentOrigin(OriginMetadata{std::move(principalMetadata),
    566                                                  PERSISTENCE_TYPE_PERSISTENT})
    567      ->Then(GetCurrentSerialEventTarget(), __func__,
    568             BoolPromiseResolveOrRejectCallback(this, std::move(aResolve)));
    569 
    570  return IPC_OK();
    571 }
    572 
    573 mozilla::ipc::IPCResult Quota::RecvInitializeTemporaryOrigin(
    574    const PersistenceType& aPersistenceType,
    575    const PrincipalInfo& aPrincipalInfo, const bool& aCreateIfNonExistent,
    576    InitializeTemporaryOriginResolver&& aResolve) {
    577  AssertIsOnBackgroundThread();
    578 
    579  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    580         ResolveBoolResponseAndReturn(aResolve));
    581 
    582  if (!TrustParams()) {
    583    QM_TRY(MOZ_TO_RESULT(IsValidPersistenceType(aPersistenceType)),
    584           QM_CUF_AND_IPC_FAIL(this));
    585 
    586    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
    587           QM_CUF_AND_IPC_FAIL(this));
    588  }
    589 
    590  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    591                QuotaManager::GetOrCreate(),
    592                ResolveBoolResponseAndReturn(aResolve));
    593 
    594  QM_TRY_UNWRAP(
    595      PrincipalMetadata principalMetadata,
    596      GetInfoFromValidatedPrincipalInfo(*quotaManager, aPrincipalInfo),
    597      ResolveBoolResponseAndReturn(aResolve));
    598 
    599  quotaManager
    600      ->InitializeTemporaryOrigin(
    601          OriginMetadata{std::move(principalMetadata), aPersistenceType},
    602          aCreateIfNonExistent)
    603      ->Then(GetCurrentSerialEventTarget(), __func__,
    604             BoolPromiseResolveOrRejectCallback(this, std::move(aResolve)));
    605 
    606  return IPC_OK();
    607 }
    608 
    609 mozilla::ipc::IPCResult Quota::RecvInitializePersistentClient(
    610    const PrincipalInfo& aPrincipalInfo, const Type& aClientType,
    611    InitializeTemporaryClientResolver&& aResolve) {
    612  AssertIsOnBackgroundThread();
    613 
    614  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    615         ResolveBoolResponseAndReturn(aResolve));
    616 
    617  if (!TrustParams()) {
    618    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
    619           QM_CUF_AND_IPC_FAIL(this));
    620 
    621    QM_TRY(MOZ_TO_RESULT(Client::IsValidType(aClientType)),
    622           QM_CUF_AND_IPC_FAIL(this));
    623  }
    624 
    625  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    626                QuotaManager::GetOrCreate(),
    627                ResolveBoolResponseAndReturn(aResolve));
    628 
    629  QM_TRY_UNWRAP(
    630      PrincipalMetadata principalMetadata,
    631      GetInfoFromValidatedPrincipalInfo(*quotaManager, aPrincipalInfo),
    632      ResolveBoolResponseAndReturn(aResolve));
    633 
    634  OriginMetadata originMetadata{std::move(principalMetadata),
    635                                PERSISTENCE_TYPE_PERSISTENT};
    636 
    637  ClientMetadata clientMetadata{std::move(originMetadata), aClientType};
    638 
    639  quotaManager->InitializePersistentClient(clientMetadata)
    640      ->Then(GetCurrentSerialEventTarget(), __func__,
    641             BoolPromiseResolveOrRejectCallback(this, std::move(aResolve)));
    642 
    643  return IPC_OK();
    644 }
    645 
    646 mozilla::ipc::IPCResult Quota::RecvInitializeTemporaryClient(
    647    const PersistenceType& aPersistenceType,
    648    const PrincipalInfo& aPrincipalInfo, const Type& aClientType,
    649    const bool& aCreateIfNonExistent,
    650    InitializeTemporaryClientResolver&& aResolve) {
    651  AssertIsOnBackgroundThread();
    652 
    653  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    654         ResolveBoolResponseAndReturn(aResolve));
    655 
    656  if (!TrustParams()) {
    657    QM_TRY(MOZ_TO_RESULT(IsValidPersistenceType(aPersistenceType)),
    658           QM_CUF_AND_IPC_FAIL(this));
    659 
    660    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
    661           QM_CUF_AND_IPC_FAIL(this));
    662 
    663    QM_TRY(MOZ_TO_RESULT(Client::IsValidType(aClientType)),
    664           QM_CUF_AND_IPC_FAIL(this));
    665  }
    666 
    667  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    668                QuotaManager::GetOrCreate(),
    669                ResolveBoolResponseAndReturn(aResolve));
    670 
    671  QM_TRY_UNWRAP(
    672      PrincipalMetadata principalMetadata,
    673      GetInfoFromValidatedPrincipalInfo(*quotaManager, aPrincipalInfo),
    674      ResolveBoolResponseAndReturn(aResolve));
    675 
    676  OriginMetadata originMetadata{std::move(principalMetadata), aPersistenceType};
    677 
    678  ClientMetadata clientMetadata{std::move(originMetadata), aClientType};
    679 
    680  quotaManager->InitializeTemporaryClient(clientMetadata, aCreateIfNonExistent)
    681      ->Then(GetCurrentSerialEventTarget(), __func__,
    682             BoolPromiseResolveOrRejectCallback(this, std::move(aResolve)));
    683 
    684  return IPC_OK();
    685 }
    686 
    687 mozilla::ipc::IPCResult Quota::RecvInitializeTemporaryStorage(
    688    InitializeTemporaryStorageResolver&& aResolver) {
    689  AssertIsOnBackgroundThread();
    690 
    691  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    692         ResolveBoolResponseAndReturn(aResolver));
    693 
    694  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    695                QuotaManager::GetOrCreate(),
    696                ResolveBoolResponseAndReturn(aResolver));
    697 
    698  quotaManager->InitializeTemporaryStorage()->Then(
    699      GetCurrentSerialEventTarget(), __func__,
    700      BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    701 
    702  return IPC_OK();
    703 }
    704 
    705 mozilla::ipc::IPCResult Quota::RecvGetUsage(
    706    const bool& aGetAll,
    707    ManagedEndpoint<PQuotaUsageRequestParent>&& aParentEndpoint,
    708    GetUsageResolver&& aResolve) {
    709  AssertIsOnBackgroundThread();
    710 
    711  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    712         ResolveOriginUsageMetadataArrayResponseAndReturn(aResolve));
    713 
    714  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    715                QuotaManager::GetOrCreate(),
    716                ResolveOriginUsageMetadataArrayResponseAndReturn(aResolve));
    717 
    718  auto parentActor = MakeRefPtr<QuotaUsageRequestParent>();
    719 
    720  auto cancelPromise = parentActor->OnCancel();
    721 
    722  QM_TRY(MOZ_TO_RESULT(BindPQuotaUsageRequestEndpoint(
    723             std::move(aParentEndpoint), parentActor)),
    724         ResolveOriginUsageMetadataArrayResponseAndReturn(aResolve));
    725 
    726  quotaManager->GetUsage(aGetAll, std::move(cancelPromise))
    727      ->Then(
    728          GetCurrentSerialEventTarget(), __func__,
    729          [parentActor](
    730              OriginUsageMetadataArrayPromise::ResolveOrRejectValue&& aValue) {
    731            parentActor->Destroy();
    732 
    733            return OriginUsageMetadataArrayPromise::CreateAndResolveOrReject(
    734                std::move(aValue), __func__);
    735          })
    736      ->Then(GetCurrentSerialEventTarget(), __func__,
    737             OriginUsageMetadataArrayPromiseResolveOrRejectCallback(
    738                 this, std::move(aResolve)));
    739 
    740  return IPC_OK();
    741 }
    742 
    743 mozilla::ipc::IPCResult Quota::RecvGetOriginUsage(
    744    const PrincipalInfo& aPrincipalInfo,
    745    ManagedEndpoint<PQuotaUsageRequestParent>&& aParentEndpoint,
    746    GetOriginUsageResolver&& aResolve) {
    747  AssertIsOnBackgroundThread();
    748 
    749  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    750         ResolveUsageInfoResponseAndReturn(aResolve));
    751 
    752  if (!TrustParams()) {
    753    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
    754           QM_CUF_AND_IPC_FAIL(this));
    755  }
    756 
    757  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    758                QuotaManager::GetOrCreate(),
    759                ResolveUsageInfoResponseAndReturn(aResolve));
    760 
    761  auto parentActor = MakeRefPtr<QuotaUsageRequestParent>();
    762 
    763  auto cancelPromise = parentActor->OnCancel();
    764 
    765  QM_TRY(MOZ_TO_RESULT(BindPQuotaUsageRequestEndpoint(
    766             std::move(aParentEndpoint), parentActor)),
    767         ResolveUsageInfoResponseAndReturn(aResolve));
    768 
    769  quotaManager->GetOriginUsage(aPrincipalInfo, std::move(cancelPromise))
    770      ->Then(
    771          GetCurrentSerialEventTarget(), __func__,
    772          [parentActor](const UsageInfoPromise::ResolveOrRejectValue& aValue) {
    773            parentActor->Destroy();
    774 
    775            return UsageInfoPromise::CreateAndResolveOrReject(aValue, __func__);
    776          })
    777      ->Then(
    778          GetCurrentSerialEventTarget(), __func__,
    779          UsageInfoPromiseResolveOrRejectCallback(this, std::move(aResolve)));
    780 
    781  return IPC_OK();
    782 }
    783 
    784 mozilla::ipc::IPCResult Quota::RecvGetCachedOriginUsage(
    785    const PrincipalInfo& aPrincipalInfo,
    786    GetCachedOriginUsageResolver&& aResolver) {
    787  AssertIsOnBackgroundThread();
    788 
    789  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    790         ResolveUInt64ResponseAndReturn(aResolver));
    791 
    792  if (!TrustParams()) {
    793    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
    794           QM_CUF_AND_IPC_FAIL(this));
    795  }
    796 
    797  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    798                QuotaManager::GetOrCreate(),
    799                ResolveUInt64ResponseAndReturn(aResolver));
    800 
    801  quotaManager->GetCachedOriginUsage(aPrincipalInfo)
    802      ->Then(GetCurrentSerialEventTarget(), __func__,
    803             UInt64PromiseResolveOrRejectCallback(this, std::move(aResolver)));
    804 
    805  return IPC_OK();
    806 }
    807 
    808 mozilla::ipc::IPCResult Quota::RecvListOrigins(
    809    ListCachedOriginsResolver&& aResolver) {
    810  AssertIsOnBackgroundThread();
    811 
    812  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    813         ResolveCStringArrayResponseAndReturn(aResolver));
    814 
    815  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    816                QuotaManager::GetOrCreate(),
    817                ResolveCStringArrayResponseAndReturn(aResolver));
    818 
    819  quotaManager->ListOrigins()->Then(
    820      GetCurrentSerialEventTarget(), __func__,
    821      CStringArrayPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    822 
    823  return IPC_OK();
    824 }
    825 
    826 mozilla::ipc::IPCResult Quota::RecvListCachedOrigins(
    827    ListCachedOriginsResolver&& aResolver) {
    828  AssertIsOnBackgroundThread();
    829 
    830  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    831         ResolveCStringArrayResponseAndReturn(aResolver));
    832 
    833  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    834                QuotaManager::GetOrCreate(),
    835                ResolveCStringArrayResponseAndReturn(aResolver));
    836 
    837  quotaManager->ListCachedOrigins()->Then(
    838      GetCurrentSerialEventTarget(), __func__,
    839      CStringArrayPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    840 
    841  return IPC_OK();
    842 }
    843 
    844 mozilla::ipc::IPCResult Quota::RecvClearStoragesForOrigin(
    845    const Maybe<PersistenceType>& aPersistenceType,
    846    const PrincipalInfo& aPrincipalInfo,
    847    ClearStoragesForOriginResolver&& aResolver) {
    848  AssertIsOnBackgroundThread();
    849 
    850  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    851         ResolveBoolResponseAndReturn(aResolver));
    852 
    853  if (!TrustParams()) {
    854    if (aPersistenceType) {
    855      QM_TRY(MOZ_TO_RESULT(IsValidPersistenceType(*aPersistenceType)),
    856             QM_CUF_AND_IPC_FAIL(this));
    857    }
    858 
    859    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
    860           QM_CUF_AND_IPC_FAIL(this));
    861  }
    862 
    863  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    864                QuotaManager::GetOrCreate(),
    865                ResolveBoolResponseAndReturn(aResolver));
    866 
    867  quotaManager->ClearStoragesForOrigin(aPersistenceType, aPrincipalInfo)
    868      ->Then(GetCurrentSerialEventTarget(), __func__,
    869             BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    870 
    871  return IPC_OK();
    872 }
    873 
    874 mozilla::ipc::IPCResult Quota::RecvClearStoragesForClient(
    875    const Maybe<PersistenceType>& aPersistenceType,
    876    const PrincipalInfo& aPrincipalInfo, const Type& aClientType,
    877    ClearStoragesForClientResolver&& aResolver) {
    878  AssertIsOnBackgroundThread();
    879 
    880  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    881         ResolveBoolResponseAndReturn(aResolver));
    882 
    883  if (!TrustParams()) {
    884    if (aPersistenceType) {
    885      QM_TRY(MOZ_TO_RESULT(IsValidPersistenceType(*aPersistenceType)),
    886             QM_CUF_AND_IPC_FAIL(this));
    887    }
    888 
    889    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
    890           QM_CUF_AND_IPC_FAIL(this));
    891 
    892    QM_TRY(MOZ_TO_RESULT(Client::IsValidType(aClientType)),
    893           QM_CUF_AND_IPC_FAIL(this));
    894  }
    895 
    896  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    897                QuotaManager::GetOrCreate(),
    898                ResolveBoolResponseAndReturn(aResolver));
    899 
    900  quotaManager
    901      ->ClearStoragesForClient(aPersistenceType, aPrincipalInfo, aClientType)
    902      ->Then(GetCurrentSerialEventTarget(), __func__,
    903             BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    904 
    905  return IPC_OK();
    906 }
    907 
    908 mozilla::ipc::IPCResult Quota::RecvClearStoragesForOriginPrefix(
    909    const Maybe<PersistenceType>& aPersistenceType,
    910    const PrincipalInfo& aPrincipalInfo,
    911    ClearStoragesForOriginResolver&& aResolver) {
    912  AssertIsOnBackgroundThread();
    913 
    914  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    915         ResolveBoolResponseAndReturn(aResolver));
    916 
    917  if (!TrustParams()) {
    918    if (aPersistenceType) {
    919      QM_TRY(MOZ_TO_RESULT(IsValidPersistenceType(*aPersistenceType)),
    920             QM_CUF_AND_IPC_FAIL(this));
    921    }
    922 
    923    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
    924           QM_CUF_AND_IPC_FAIL(this));
    925  }
    926 
    927  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    928                QuotaManager::GetOrCreate(),
    929                ResolveBoolResponseAndReturn(aResolver));
    930 
    931  quotaManager->ClearStoragesForOriginPrefix(aPersistenceType, aPrincipalInfo)
    932      ->Then(GetCurrentSerialEventTarget(), __func__,
    933             BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    934 
    935  return IPC_OK();
    936 }
    937 
    938 mozilla::ipc::IPCResult Quota::RecvClearStoragesForOriginAttributesPattern(
    939    const OriginAttributesPattern& aPattern,
    940    ClearStoragesForOriginAttributesPatternResolver&& aResolver) {
    941  AssertIsOnBackgroundThread();
    942 
    943  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    944         ResolveBoolResponseAndReturn(aResolver));
    945 
    946  if (!TrustParams()) {
    947    QM_TRY(MOZ_TO_RESULT(!BackgroundParent::IsOtherProcessActor(Manager())),
    948           QM_CUF_AND_IPC_FAIL(this));
    949  }
    950 
    951  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    952                QuotaManager::GetOrCreate(),
    953                ResolveBoolResponseAndReturn(aResolver));
    954 
    955  quotaManager->ClearStoragesForOriginAttributesPattern(aPattern)->Then(
    956      GetCurrentSerialEventTarget(), __func__,
    957      BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    958 
    959  return IPC_OK();
    960 }
    961 
    962 mozilla::ipc::IPCResult Quota::RecvClearStoragesForPrivateBrowsing(
    963    ClearStoragesForPrivateBrowsingResolver&& aResolver) {
    964  AssertIsOnBackgroundThread();
    965 
    966  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    967         ResolveBoolResponseAndReturn(aResolver));
    968 
    969  if (!TrustParams()) {
    970    QM_TRY(MOZ_TO_RESULT(!BackgroundParent::IsOtherProcessActor(Manager())),
    971           QM_CUF_AND_IPC_FAIL(this));
    972  }
    973 
    974  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    975                QuotaManager::GetOrCreate(),
    976                ResolveBoolResponseAndReturn(aResolver));
    977 
    978  quotaManager->ClearPrivateRepository()->Then(
    979      GetCurrentSerialEventTarget(), __func__,
    980      BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    981 
    982  return IPC_OK();
    983 }
    984 
    985 mozilla::ipc::IPCResult Quota::RecvClearStorage(
    986    ShutdownStorageResolver&& aResolver) {
    987  AssertIsOnBackgroundThread();
    988 
    989  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
    990         ResolveBoolResponseAndReturn(aResolver));
    991 
    992  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
    993                QuotaManager::GetOrCreate(),
    994                ResolveBoolResponseAndReturn(aResolver));
    995 
    996  quotaManager->ClearStorage()->Then(
    997      GetCurrentSerialEventTarget(), __func__,
    998      BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
    999 
   1000  return IPC_OK();
   1001 }
   1002 
   1003 mozilla::ipc::IPCResult Quota::RecvShutdownStoragesForOrigin(
   1004    const Maybe<PersistenceType>& aPersistenceType,
   1005    const PrincipalInfo& aPrincipalInfo,
   1006    ShutdownStoragesForOriginResolver&& aResolver) {
   1007  AssertIsOnBackgroundThread();
   1008 
   1009  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
   1010         ResolveBoolResponseAndReturn(aResolver));
   1011 
   1012  if (!TrustParams()) {
   1013    if (aPersistenceType) {
   1014      QM_TRY(MOZ_TO_RESULT(IsValidPersistenceType(*aPersistenceType)),
   1015             QM_CUF_AND_IPC_FAIL(this));
   1016    }
   1017 
   1018    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
   1019           QM_CUF_AND_IPC_FAIL(this));
   1020  }
   1021 
   1022  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
   1023                QuotaManager::GetOrCreate(),
   1024                ResolveBoolResponseAndReturn(aResolver));
   1025 
   1026  quotaManager->ShutdownStoragesForOrigin(aPersistenceType, aPrincipalInfo)
   1027      ->Then(GetCurrentSerialEventTarget(), __func__,
   1028             BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
   1029 
   1030  return IPC_OK();
   1031 }
   1032 
   1033 mozilla::ipc::IPCResult Quota::RecvShutdownStoragesForClient(
   1034    const Maybe<PersistenceType>& aPersistenceType,
   1035    const PrincipalInfo& aPrincipalInfo, const Type& aClientType,
   1036    ShutdownStoragesForClientResolver&& aResolver) {
   1037  AssertIsOnBackgroundThread();
   1038 
   1039  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
   1040         ResolveBoolResponseAndReturn(aResolver));
   1041 
   1042  if (!TrustParams()) {
   1043    if (aPersistenceType) {
   1044      QM_TRY(MOZ_TO_RESULT(IsValidPersistenceType(*aPersistenceType)),
   1045             QM_CUF_AND_IPC_FAIL(this));
   1046    }
   1047 
   1048    QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
   1049           QM_CUF_AND_IPC_FAIL(this));
   1050 
   1051    QM_TRY(MOZ_TO_RESULT(Client::IsValidType(aClientType)),
   1052           QM_CUF_AND_IPC_FAIL(this));
   1053  }
   1054 
   1055  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
   1056                QuotaManager::GetOrCreate(),
   1057                ResolveBoolResponseAndReturn(aResolver));
   1058 
   1059  quotaManager
   1060      ->ShutdownStoragesForClient(aPersistenceType, aPrincipalInfo, aClientType)
   1061      ->Then(GetCurrentSerialEventTarget(), __func__,
   1062             BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
   1063 
   1064  return IPC_OK();
   1065 }
   1066 
   1067 mozilla::ipc::IPCResult Quota::RecvShutdownStorage(
   1068    ShutdownStorageResolver&& aResolver) {
   1069  AssertIsOnBackgroundThread();
   1070 
   1071  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()),
   1072         ResolveBoolResponseAndReturn(aResolver));
   1073 
   1074  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
   1075                QuotaManager::GetOrCreate(),
   1076                ResolveBoolResponseAndReturn(aResolver));
   1077 
   1078  quotaManager->ShutdownStorage()->Then(
   1079      GetCurrentSerialEventTarget(), __func__,
   1080      BoolPromiseResolveOrRejectCallback(this, std::move(aResolver)));
   1081 
   1082  return IPC_OK();
   1083 }
   1084 
   1085 mozilla::ipc::IPCResult Quota::RecvStartIdleMaintenance() {
   1086  AssertIsOnBackgroundThread();
   1087 
   1088  PBackgroundParent* actor = Manager();
   1089  MOZ_ASSERT(actor);
   1090 
   1091  if (BackgroundParent::IsOtherProcessActor(actor)) {
   1092    MOZ_CRASH_UNLESS_FUZZING();
   1093    return IPC_FAIL(this, "Wrong actor");
   1094  }
   1095 
   1096  if (QuotaManager::IsShuttingDown()) {
   1097    return IPC_OK();
   1098  }
   1099 
   1100  QM_TRY(QuotaManager::EnsureCreated(), IPC_OK());
   1101 
   1102  QuotaManager* quotaManager = QuotaManager::Get();
   1103  MOZ_ASSERT(quotaManager);
   1104 
   1105  quotaManager->StartIdleMaintenance();
   1106 
   1107  return IPC_OK();
   1108 }
   1109 
   1110 mozilla::ipc::IPCResult Quota::RecvStopIdleMaintenance() {
   1111  AssertIsOnBackgroundThread();
   1112 
   1113  PBackgroundParent* actor = Manager();
   1114  MOZ_ASSERT(actor);
   1115 
   1116  if (BackgroundParent::IsOtherProcessActor(actor)) {
   1117    MOZ_CRASH_UNLESS_FUZZING();
   1118    return IPC_FAIL(this, "Wrong actor");
   1119  }
   1120 
   1121  if (QuotaManager::IsShuttingDown()) {
   1122    return IPC_OK();
   1123  }
   1124 
   1125  QuotaManager* quotaManager = QuotaManager::Get();
   1126  if (!quotaManager) {
   1127    return IPC_OK();
   1128  }
   1129 
   1130  quotaManager->StopIdleMaintenance();
   1131 
   1132  return IPC_OK();
   1133 }
   1134 
   1135 mozilla::ipc::IPCResult Quota::RecvAbortOperationsForProcess(
   1136    const ContentParentId& aContentParentId) {
   1137  AssertIsOnBackgroundThread();
   1138 
   1139  PBackgroundParent* actor = Manager();
   1140  MOZ_ASSERT(actor);
   1141 
   1142  if (BackgroundParent::IsOtherProcessActor(actor)) {
   1143    MOZ_CRASH_UNLESS_FUZZING();
   1144    return IPC_FAIL(this, "Wrong actor");
   1145  }
   1146 
   1147  if (QuotaManager::IsShuttingDown()) {
   1148    return IPC_OK();
   1149  }
   1150 
   1151  QuotaManager* quotaManager = QuotaManager::Get();
   1152  if (!quotaManager) {
   1153    return IPC_OK();
   1154  }
   1155 
   1156  quotaManager->AbortOperationsForProcess(aContentParentId);
   1157 
   1158  return IPC_OK();
   1159 }
   1160 
   1161 mozilla::ipc::IPCResult Quota::RecvSetThumbnailPrivateIdentityId(
   1162    const uint32_t& aThumbnailPrivateIdentityId) {
   1163  AssertIsOnBackgroundThread();
   1164 
   1165  QM_TRY(MOZ_TO_RESULT(!QuotaManager::IsShuttingDown()), IPC_OK());
   1166 
   1167  if (!TrustParams()) {
   1168    QM_TRY(MOZ_TO_RESULT(!BackgroundParent::IsOtherProcessActor(Manager())),
   1169           QM_CUF_AND_IPC_FAIL(this));
   1170  }
   1171 
   1172  QM_TRY_UNWRAP(const NotNull<RefPtr<QuotaManager>> quotaManager,
   1173                QuotaManager::GetOrCreate(), IPC_OK());
   1174 
   1175  MOZ_ALWAYS_SUCCEEDS(quotaManager->IOThread()->Dispatch(
   1176      NS_NewRunnableFunction(
   1177          "dom::quota::Quota::RecvSetThumbnailPrivateIdentityId",
   1178          [aThumbnailPrivateIdentityId]() {
   1179            QuotaManager* quotaManager = QuotaManager::Get();
   1180            MOZ_ASSERT(quotaManager);
   1181 
   1182            quotaManager->SetThumbnailPrivateIdentityId(
   1183                aThumbnailPrivateIdentityId);
   1184          }),
   1185      NS_DISPATCH_NORMAL));
   1186 
   1187  return IPC_OK();
   1188 }
   1189 
   1190 }  // namespace mozilla::dom::quota