GroupInfo.cpp (2705B)
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 "GroupInfo.h" 8 9 #include "OriginInfo.h" 10 #include "mozilla/dom/quota/AssertionsImpl.h" 11 12 namespace mozilla::dom::quota { 13 14 already_AddRefed<OriginInfo> GroupInfo::LockedGetOriginInfo( 15 const nsACString& aOrigin) { 16 AssertCurrentThreadOwnsQuotaMutex(); 17 18 for (const auto& originInfo : mOriginInfos) { 19 if (originInfo->mOrigin == aOrigin) { 20 RefPtr<OriginInfo> result = originInfo; 21 return result.forget(); 22 } 23 } 24 25 return nullptr; 26 } 27 28 void GroupInfo::LockedAddOriginInfo(NotNull<RefPtr<OriginInfo>>&& aOriginInfo) { 29 AssertCurrentThreadOwnsQuotaMutex(); 30 31 NS_ASSERTION(!mOriginInfos.Contains(aOriginInfo), 32 "Replacing an existing entry!"); 33 mOriginInfos.AppendElement(std::move(aOriginInfo)); 34 35 uint64_t usage = aOriginInfo->LockedUsage(); 36 37 if (!aOriginInfo->LockedPersisted()) { 38 AssertNoOverflow(mUsage, usage); 39 mUsage += usage; 40 } 41 42 QuotaManager* quotaManager = QuotaManager::Get(); 43 MOZ_ASSERT(quotaManager); 44 45 AssertNoOverflow(quotaManager->mTemporaryStorageUsage, usage); 46 quotaManager->mTemporaryStorageUsage += usage; 47 } 48 49 void GroupInfo::LockedAdjustUsageForRemovedOriginInfo( 50 const OriginInfo& aOriginInfo) { 51 const uint64_t usage = aOriginInfo.LockedUsage(); 52 53 if (!aOriginInfo.LockedPersisted()) { 54 AssertNoUnderflow(mUsage, usage); 55 mUsage -= usage; 56 } 57 58 QuotaManager* const quotaManager = QuotaManager::Get(); 59 MOZ_ASSERT(quotaManager); 60 61 AssertNoUnderflow(quotaManager->mTemporaryStorageUsage, usage); 62 quotaManager->mTemporaryStorageUsage -= usage; 63 } 64 65 void GroupInfo::LockedRemoveOriginInfo(const nsACString& aOrigin) { 66 AssertCurrentThreadOwnsQuotaMutex(); 67 68 const auto foundIt = std::find_if(mOriginInfos.cbegin(), mOriginInfos.cend(), 69 [&aOrigin](const auto& originInfo) { 70 return originInfo->mOrigin == aOrigin; 71 }); 72 73 // XXX Or can we MOZ_ASSERT(foundIt != mOriginInfos.cend()) ? 74 if (foundIt != mOriginInfos.cend()) { 75 LockedAdjustUsageForRemovedOriginInfo(**foundIt); 76 77 mOriginInfos.RemoveElementAt(foundIt); 78 } 79 } 80 81 void GroupInfo::LockedRemoveOriginInfos() { 82 AssertCurrentThreadOwnsQuotaMutex(); 83 84 for (const auto& originInfo : std::exchange(mOriginInfos, {})) { 85 LockedAdjustUsageForRemovedOriginInfo(*originInfo); 86 } 87 } 88 89 } // namespace mozilla::dom::quota