Bug 1874684 - Part 6: Limit day length calculations to safe integers. r=mgaudet
[gecko.git] / dom / quota / GroupInfo.cpp
blob96f4f806f6e67a77914334f79493dc86eb6d48c9
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/. */
7 #include "GroupInfo.h"
9 #include "mozilla/dom/quota/AssertionsImpl.h"
10 #include "OriginInfo.h"
12 namespace mozilla::dom::quota {
14 already_AddRefed<OriginInfo> GroupInfo::LockedGetOriginInfo(
15 const nsACString& aOrigin) {
16 AssertCurrentThreadOwnsQuotaMutex();
18 for (const auto& originInfo : mOriginInfos) {
19 if (originInfo->mOrigin == aOrigin) {
20 RefPtr<OriginInfo> result = originInfo;
21 return result.forget();
25 return nullptr;
28 void GroupInfo::LockedAddOriginInfo(NotNull<RefPtr<OriginInfo>>&& aOriginInfo) {
29 AssertCurrentThreadOwnsQuotaMutex();
31 NS_ASSERTION(!mOriginInfos.Contains(aOriginInfo),
32 "Replacing an existing entry!");
33 mOriginInfos.AppendElement(std::move(aOriginInfo));
35 uint64_t usage = aOriginInfo->LockedUsage();
37 if (!aOriginInfo->LockedPersisted()) {
38 AssertNoOverflow(mUsage, usage);
39 mUsage += usage;
42 QuotaManager* quotaManager = QuotaManager::Get();
43 MOZ_ASSERT(quotaManager);
45 AssertNoOverflow(quotaManager->mTemporaryStorageUsage, usage);
46 quotaManager->mTemporaryStorageUsage += usage;
49 void GroupInfo::LockedAdjustUsageForRemovedOriginInfo(
50 const OriginInfo& aOriginInfo) {
51 const uint64_t usage = aOriginInfo.LockedUsage();
53 if (!aOriginInfo.LockedPersisted()) {
54 AssertNoUnderflow(mUsage, usage);
55 mUsage -= usage;
58 QuotaManager* const quotaManager = QuotaManager::Get();
59 MOZ_ASSERT(quotaManager);
61 AssertNoUnderflow(quotaManager->mTemporaryStorageUsage, usage);
62 quotaManager->mTemporaryStorageUsage -= usage;
65 void GroupInfo::LockedRemoveOriginInfo(const nsACString& aOrigin) {
66 AssertCurrentThreadOwnsQuotaMutex();
68 const auto foundIt = std::find_if(mOriginInfos.cbegin(), mOriginInfos.cend(),
69 [&aOrigin](const auto& originInfo) {
70 return originInfo->mOrigin == aOrigin;
71 });
73 // XXX Or can we MOZ_ASSERT(foundIt != mOriginInfos.cend()) ?
74 if (foundIt != mOriginInfos.cend()) {
75 LockedAdjustUsageForRemovedOriginInfo(**foundIt);
77 mOriginInfos.RemoveElementAt(foundIt);
81 void GroupInfo::LockedRemoveOriginInfos() {
82 AssertCurrentThreadOwnsQuotaMutex();
84 for (const auto& originInfo : std::exchange(mOriginInfos, {})) {
85 LockedAdjustUsageForRemovedOriginInfo(*originInfo);
89 } // namespace mozilla::dom::quota