Bug Summary

File:root/firefox-clang/obj-x86_64-pc-linux-gnu/dom/quota/./../../../dom/quota/OriginInfo.cpp
Warning:line 345, column 11
Value stored to 'newTemporaryStorageUsage' during its initialization is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -O2 -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name Unified_cpp_dom_quota1.cpp -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -relaxed-aliasing -ffp-contract=off -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/dom/quota -fcoverage-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/dom/quota -resource-dir /usr/lib/llvm-23/lib/clang/23 -include /root/firefox-clang/config/gcc_hidden.h -include /root/firefox-clang/obj-x86_64-pc-linux-gnu/mozilla-config.h -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/stl_wrappers -D _GLIBCXX_ASSERTIONS=1 -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/system_wrappers -U _FORTIFY_SOURCE -D _FORTIFY_SOURCE=2 -D DEBUG=1 -D MOZ_HAS_MOZGLUE -D MOZILLA_INTERNAL_API -D IMPL_LIBXUL -D MOZ_SUPPORT_LEAKCHECKING -D STATIC_EXPORTABLE_JS_API -I /root/firefox-clang/dom/quota -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dom/quota -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/ipc/ipdl/_ipdlheaders -I /root/firefox-clang/ipc/chromium/src -I /root/firefox-clang/third_party/abseil-cpp -I /root/firefox-clang/caps -I /root/firefox-clang/dom/fs/include -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nspr -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nss -D MOZILLA_CLIENT -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../include/c++/16 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../include/x86_64-linux-gnu/c++/16 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../include/c++/16/backward -internal-isystem /usr/lib/llvm-23/lib/clang/23/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -Wno-error=pessimizing-move -Wno-error=large-by-value-copy=128 -Wno-error=implicit-int-float-conversion -Wno-error=thread-safety-analysis -Wno-error=tautological-type-limit-compare -Wno-invalid-offsetof -Wno-range-loop-analysis -Wno-deprecated-anon-enum-enum-conversion -Wno-deprecated-enum-enum-conversion -Wno-inline-new-delete -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=free-nonheap-object -Wno-error=atomic-alignment -Wno-error=deprecated-builtins -Wno-psabi -Wno-error=builtin-macro-redefined -Wno-vla-cxx-extension -Wno-unknown-warning-option -Wno-character-conversion -std=gnu++20 -fdeprecated-macro -ferror-limit 19 -fstrict-flex-arrays=1 -stack-protector 2 -fstack-clash-protection -ftrivial-auto-var-init=pattern -fno-rtti -fgnuc-version=4.2.1 -fno-implicit-modules -fskip-odr-check-in-gmf -fno-sized-deallocation -fno-aligned-allocation -fdiagnostics-absolute-paths -vectorize-loops -vectorize-slp -analyzer-checker optin.performance.Padding -analyzer-output=html -analyzer-config stable-report-filename=true -mllvm -dwarf-linkage-names=Abstract -faddrsig -fdwarf2-cfi-asm -o /tmp/scan-build-2026-10-17-231001-351276-1 -x c++ Unified_cpp_dom_quota1.cpp
1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5#include "OriginInfo.h"
6
7#include "DirtyTrackingAutoLock.h"
8#include "GroupInfo.h"
9#include "GroupInfoPair.h"
10#include "OriginUpserter.h"
11#include "mozIStorageConnection.h"
12#include "mozIStorageStatement.h"
13#include "mozilla/dom/quota/AssertionsImpl.h"
14#include "mozilla/dom/quota/QuotaCommon.h"
15#include "mozilla/dom/quota/ResultExtensions.h"
16#include "mozilla/dom/quota/UsageInfo.h"
17
18#if defined(NIGHTLY_BUILD1) || defined(DEBUG1)
19# define CHECK_USAGE() \
20 CheckIfUsageIsConsistent("OriginInfo::"_ns + nsDependentCString(__func__))
21#else
22# define CHECK_USAGE()
23#endif
24
25namespace mozilla::dom::quota {
26
27// This constructor is called from the "QuotaManager IO" thread and so we
28// can't check if the principal has a WebExtensionPolicy instance associated
29// to it, and even besides that if the extension is currently disabled (and so
30// no WebExtensionPolicy instance would actually exist) its stored data
31// shouldn't be cleared until the extension is uninstalled and so here we
32// resort to check the origin scheme instead to initialize mIsExtension.
33OriginInfo::OriginInfo(GroupInfo* aGroupInfo, const nsACString& aOrigin,
34 const nsACString& aStorageOrigin, bool aIsPrivate,
35 const ClientUsageArray& aClientUsages, int64_t aUsage,
36 int64_t aAccessTime, int32_t aMaintenanceDate,
37 bool aPersisted, bool aDirectoryExists)
38 : mGroupInfo(aGroupInfo),
39 mOrigin(aOrigin),
40 mStorageOrigin(aStorageOrigin),
41 mAccessTime(aAccessTime),
42 mMaintenanceDate(aMaintenanceDate),
43 mIsPrivate(aIsPrivate),
44 mAccessed(false),
45 mPersisted(aPersisted),
46 mIsExtension(StringBeginsWith(aOrigin, "moz-extension://"_ns)),
47 mDirectoryExists(aDirectoryExists),
48 mClientUsages(aClientUsages),
49 mUsage(aUsage) {
50 MOZ_ASSERT(aGroupInfo)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(aGroupInfo)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(aGroupInfo))), 0))) { do { }
while (false); MOZ_ReportAssertionFailure("aGroupInfo", "./../../../dom/quota/OriginInfo.cpp"
, 50); AnnotateMozCrashReason("MOZ_ASSERT" "(" "aGroupInfo" ")"
); do { MOZ_CrashSequence(__null, 50); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
51 MOZ_ASSERT_IF(!aIsPrivate, aOrigin == aStorageOrigin)do { if (!aIsPrivate) { do { static_assert( mozilla::detail::
AssertionConditionType<decltype(aOrigin == aStorageOrigin)
>::isValid, "invalid assertion condition"); if ((__builtin_expect
(!!(!(!!(aOrigin == aStorageOrigin))), 0))) { do { } while (false
); MOZ_ReportAssertionFailure("aOrigin == aStorageOrigin", "./../../../dom/quota/OriginInfo.cpp"
, 51); AnnotateMozCrashReason("MOZ_ASSERT" "(" "aOrigin == aStorageOrigin"
")"); do { MOZ_CrashSequence(__null, 51); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false); } } while (
false)
;
52 MOZ_ASSERT_IF(aIsPrivate, aOrigin != aStorageOrigin)do { if (aIsPrivate) { do { static_assert( mozilla::detail::AssertionConditionType
<decltype(aOrigin != aStorageOrigin)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(aOrigin != aStorageOrigin)))
, 0))) { do { } while (false); MOZ_ReportAssertionFailure("aOrigin != aStorageOrigin"
, "./../../../dom/quota/OriginInfo.cpp", 52); AnnotateMozCrashReason
("MOZ_ASSERT" "(" "aOrigin != aStorageOrigin" ")"); do { MOZ_CrashSequence
(__null, 52); __attribute__((nomerge)) ::abort(); } while (false
); } } while (false); } } while (false)
;
53 MOZ_ASSERT(aClientUsages.Length() == Client::TypeMax())do { static_assert( mozilla::detail::AssertionConditionType<
decltype(aClientUsages.Length() == Client::TypeMax())>::isValid
, "invalid assertion condition"); if ((__builtin_expect(!!(!(
!!(aClientUsages.Length() == Client::TypeMax()))), 0))) { do {
} while (false); MOZ_ReportAssertionFailure("aClientUsages.Length() == Client::TypeMax()"
, "./../../../dom/quota/OriginInfo.cpp", 53); AnnotateMozCrashReason
("MOZ_ASSERT" "(" "aClientUsages.Length() == Client::TypeMax()"
")"); do { MOZ_CrashSequence(__null, 53); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
54 MOZ_ASSERT_IF(aPersisted,do { if (aPersisted) { do { static_assert( mozilla::detail::AssertionConditionType
<decltype(aGroupInfo->mPersistenceType == PERSISTENCE_TYPE_DEFAULT
)>::isValid, "invalid assertion condition"); if ((__builtin_expect
(!!(!(!!(aGroupInfo->mPersistenceType == PERSISTENCE_TYPE_DEFAULT
))), 0))) { do { } while (false); MOZ_ReportAssertionFailure(
"aGroupInfo->mPersistenceType == PERSISTENCE_TYPE_DEFAULT"
, "./../../../dom/quota/OriginInfo.cpp", 55); AnnotateMozCrashReason
("MOZ_ASSERT" "(" "aGroupInfo->mPersistenceType == PERSISTENCE_TYPE_DEFAULT"
")"); do { MOZ_CrashSequence(__null, 55); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false); } } while (
false)
55 aGroupInfo->mPersistenceType == PERSISTENCE_TYPE_DEFAULT)do { if (aPersisted) { do { static_assert( mozilla::detail::AssertionConditionType
<decltype(aGroupInfo->mPersistenceType == PERSISTENCE_TYPE_DEFAULT
)>::isValid, "invalid assertion condition"); if ((__builtin_expect
(!!(!(!!(aGroupInfo->mPersistenceType == PERSISTENCE_TYPE_DEFAULT
))), 0))) { do { } while (false); MOZ_ReportAssertionFailure(
"aGroupInfo->mPersistenceType == PERSISTENCE_TYPE_DEFAULT"
, "./../../../dom/quota/OriginInfo.cpp", 55); AnnotateMozCrashReason
("MOZ_ASSERT" "(" "aGroupInfo->mPersistenceType == PERSISTENCE_TYPE_DEFAULT"
")"); do { MOZ_CrashSequence(__null, 55); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false); } } while (
false)
;
56 CHECK_USAGE();
57 MOZ_COUNT_CTOR(OriginInfo)do { static_assert(std::is_class_v<OriginInfo>, "Token '"
"OriginInfo" "' is not a class type."); static_assert(!std::
is_base_of_v<nsISupports, OriginInfo>, "nsISupports classes don't need to call MOZ_COUNT_CTOR or "
"MOZ_COUNT_DTOR");; NS_LogCtor((void*)this, "OriginInfo", sizeof
(*this)); } while (0)
;
58}
59
60#if defined(NIGHTLY_BUILD1) || defined(DEBUG1)
61bool OriginInfo::CheckIfUsageIsConsistent(const nsACString& context) const {
62 return CheckClientUsagesConsistency(mClientUsages, mUsage, context);
63}
64#endif // defined(NIGHTLY_BUILD) || defined(DEBUG)
65
66int64_t OriginInfo::LockedUsage() const {
67 AssertCurrentThreadOwnsQuotaMutex();
68 CHECK_USAGE();
69 return mUsage;
70}
71
72OriginMetadata OriginInfo::FlattenToOriginMetadata() const {
73 MOZ_ASSERT(mGroupInfo)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(mGroupInfo)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(mGroupInfo))), 0))) { do { }
while (false); MOZ_ReportAssertionFailure("mGroupInfo", "./../../../dom/quota/OriginInfo.cpp"
, 73); AnnotateMozCrashReason("MOZ_ASSERT" "(" "mGroupInfo" ")"
); do { MOZ_CrashSequence(__null, 73); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
74 return {mGroupInfo->mGroupInfoPair->Suffix(),
75 mGroupInfo->mGroupInfoPair->Group(),
76 mOrigin,
77 mStorageOrigin,
78 mIsPrivate,
79 mGroupInfo->mPersistenceType};
80}
81
82OriginStateMetadata OriginInfo::LockedFlattenToOriginStateMetadata() const {
83 AssertCurrentThreadOwnsQuotaMutex();
84
85 return {mAccessTime, mMaintenanceDate, mAccessed, mPersisted, LockedDirty()};
86}
87
88FullOriginMetadata OriginInfo::LockedFlattenToFullOriginMetadata() const {
89 AssertCurrentThreadOwnsQuotaMutex();
90
91 return {FlattenToOriginMetadata(), LockedFlattenToOriginStateMetadata(),
92 mClientUsages, mUsage, kCurrentQuotaVersion};
93}
94
95nsresult OriginInfo::LockedBindToStatement(
96 mozIStorageStatement* aStatement) const {
97 AssertCurrentThreadOwnsQuotaMutex();
98 MOZ_ASSERT(mGroupInfo)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(mGroupInfo)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(mGroupInfo))), 0))) { do { }
while (false); MOZ_ReportAssertionFailure("mGroupInfo", "./../../../dom/quota/OriginInfo.cpp"
, 98); AnnotateMozCrashReason("MOZ_ASSERT" "(" "mGroupInfo" ")"
); do { MOZ_CrashSequence(__null, 98); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
99
100 QM_TRY(MOZ_TO_RESULT(aStatement->BindInt32ByName({auto tryResult46 = (ToResult(aStatement->BindInt32ByName(
"repository_id"_ns, mGroupInfo->mPersistenceType))); static_assert
(std::is_empty_v<typename decltype(tryResult46)::ok_type>
); if ((__builtin_expect(!!(tryResult46.isErr()), 0))) { mozilla
::dom::quota::HandleError("ToResult(aStatement->BindInt32ByName( \"repository_id\"_ns, mGroupInfo->mPersistenceType))"
, tryResult46.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 101, mozilla::dom::quota::Severity::Error); return tryResult46
.propagateErr(); }}
101 "repository_id"_ns, mGroupInfo->mPersistenceType))){auto tryResult46 = (ToResult(aStatement->BindInt32ByName(
"repository_id"_ns, mGroupInfo->mPersistenceType))); static_assert
(std::is_empty_v<typename decltype(tryResult46)::ok_type>
); if ((__builtin_expect(!!(tryResult46.isErr()), 0))) { mozilla
::dom::quota::HandleError("ToResult(aStatement->BindInt32ByName( \"repository_id\"_ns, mGroupInfo->mPersistenceType))"
, tryResult46.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 101, mozilla::dom::quota::Severity::Error); return tryResult46
.propagateErr(); }}
;
102
103 QM_TRY(MOZ_TO_RESULT(aStatement->BindUTF8StringByName({auto tryResult47 = (ToResult(aStatement->BindUTF8StringByName
( "suffix"_ns, mGroupInfo->mGroupInfoPair->Suffix())));
static_assert(std::is_empty_v<typename decltype(tryResult47
)::ok_type>); if ((__builtin_expect(!!(tryResult47.isErr()
), 0))) { mozilla::dom::quota::HandleError("ToResult(aStatement->BindUTF8StringByName( \"suffix\"_ns, mGroupInfo->mGroupInfoPair->Suffix()))"
, tryResult47.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 104, mozilla::dom::quota::Severity::Error); return tryResult47
.propagateErr(); }}
104 "suffix"_ns, mGroupInfo->mGroupInfoPair->Suffix()))){auto tryResult47 = (ToResult(aStatement->BindUTF8StringByName
( "suffix"_ns, mGroupInfo->mGroupInfoPair->Suffix())));
static_assert(std::is_empty_v<typename decltype(tryResult47
)::ok_type>); if ((__builtin_expect(!!(tryResult47.isErr()
), 0))) { mozilla::dom::quota::HandleError("ToResult(aStatement->BindUTF8StringByName( \"suffix\"_ns, mGroupInfo->mGroupInfoPair->Suffix()))"
, tryResult47.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 104, mozilla::dom::quota::Severity::Error); return tryResult47
.propagateErr(); }}
;
105 QM_TRY(MOZ_TO_RESULT(aStatement->BindUTF8StringByName({auto tryResult48 = (ToResult(aStatement->BindUTF8StringByName
( "group_"_ns, mGroupInfo->mGroupInfoPair->Group()))); static_assert
(std::is_empty_v<typename decltype(tryResult48)::ok_type>
); if ((__builtin_expect(!!(tryResult48.isErr()), 0))) { mozilla
::dom::quota::HandleError("ToResult(aStatement->BindUTF8StringByName( \"group_\"_ns, mGroupInfo->mGroupInfoPair->Group()))"
, tryResult48.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 106, mozilla::dom::quota::Severity::Error); return tryResult48
.propagateErr(); }}
106 "group_"_ns, mGroupInfo->mGroupInfoPair->Group()))){auto tryResult48 = (ToResult(aStatement->BindUTF8StringByName
( "group_"_ns, mGroupInfo->mGroupInfoPair->Group()))); static_assert
(std::is_empty_v<typename decltype(tryResult48)::ok_type>
); if ((__builtin_expect(!!(tryResult48.isErr()), 0))) { mozilla
::dom::quota::HandleError("ToResult(aStatement->BindUTF8StringByName( \"group_\"_ns, mGroupInfo->mGroupInfoPair->Group()))"
, tryResult48.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 106, mozilla::dom::quota::Severity::Error); return tryResult48
.propagateErr(); }}
;
107 QM_TRY(MOZ_TO_RESULT(aStatement->BindUTF8StringByName("origin"_ns, mOrigin))){auto tryResult49 = (ToResult(aStatement->BindUTF8StringByName
("origin"_ns, mOrigin))); static_assert(std::is_empty_v<typename
decltype(tryResult49)::ok_type>); if ((__builtin_expect(!
!(tryResult49.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(aStatement->BindUTF8StringByName(\"origin\"_ns, mOrigin))"
, tryResult49.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 107, mozilla::dom::quota::Severity::Error); return tryResult49
.propagateErr(); }}
;
108
109 MOZ_ASSERT(!mIsPrivate)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(!mIsPrivate)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(!mIsPrivate))), 0))) { do { }
while (false); MOZ_ReportAssertionFailure("!mIsPrivate", "./../../../dom/quota/OriginInfo.cpp"
, 109); AnnotateMozCrashReason("MOZ_ASSERT" "(" "!mIsPrivate"
")"); do { MOZ_CrashSequence(__null, 109); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
110
111 nsCString clientUsagesText;
112 mClientUsages.Serialize(clientUsagesText);
113
114 QM_TRY(MOZ_TO_RESULT({auto tryResult50 = (ToResult(aStatement->BindUTF8StringByName
("client_usages"_ns, clientUsagesText))); static_assert(std::
is_empty_v<typename decltype(tryResult50)::ok_type>); if
((__builtin_expect(!!(tryResult50.isErr()), 0))) { mozilla::
dom::quota::HandleError("ToResult(aStatement->BindUTF8StringByName(\"client_usages\"_ns, clientUsagesText))"
, tryResult50.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 115, mozilla::dom::quota::Severity::Error); return tryResult50
.propagateErr(); }}
115 aStatement->BindUTF8StringByName("client_usages"_ns, clientUsagesText))){auto tryResult50 = (ToResult(aStatement->BindUTF8StringByName
("client_usages"_ns, clientUsagesText))); static_assert(std::
is_empty_v<typename decltype(tryResult50)::ok_type>); if
((__builtin_expect(!!(tryResult50.isErr()), 0))) { mozilla::
dom::quota::HandleError("ToResult(aStatement->BindUTF8StringByName(\"client_usages\"_ns, clientUsagesText))"
, tryResult50.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 115, mozilla::dom::quota::Severity::Error); return tryResult50
.propagateErr(); }}
;
116 QM_TRY(MOZ_TO_RESULT(aStatement->BindInt64ByName("usage"_ns, mUsage))){auto tryResult51 = (ToResult(aStatement->BindInt64ByName(
"usage"_ns, mUsage))); static_assert(std::is_empty_v<typename
decltype(tryResult51)::ok_type>); if ((__builtin_expect(!
!(tryResult51.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(aStatement->BindInt64ByName(\"usage\"_ns, mUsage))"
, tryResult51.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 116, mozilla::dom::quota::Severity::Error); return tryResult51
.propagateErr(); }}
;
117 QM_TRY(MOZ_TO_RESULT({auto tryResult52 = (ToResult(aStatement->BindInt64ByName(
"last_access_time"_ns, mAccessTime))); static_assert(std::is_empty_v
<typename decltype(tryResult52)::ok_type>); if ((__builtin_expect
(!!(tryResult52.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(aStatement->BindInt64ByName(\"last_access_time\"_ns, mAccessTime))"
, tryResult52.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 118, mozilla::dom::quota::Severity::Error); return tryResult52
.propagateErr(); }}
118 aStatement->BindInt64ByName("last_access_time"_ns, mAccessTime))){auto tryResult52 = (ToResult(aStatement->BindInt64ByName(
"last_access_time"_ns, mAccessTime))); static_assert(std::is_empty_v
<typename decltype(tryResult52)::ok_type>); if ((__builtin_expect
(!!(tryResult52.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(aStatement->BindInt64ByName(\"last_access_time\"_ns, mAccessTime))"
, tryResult52.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 118, mozilla::dom::quota::Severity::Error); return tryResult52
.propagateErr(); }}
;
119 QM_TRY(MOZ_TO_RESULT(aStatement->BindInt32ByName("last_maintenance_date"_ns,{auto tryResult53 = (ToResult(aStatement->BindInt32ByName(
"last_maintenance_date"_ns, mMaintenanceDate))); static_assert
(std::is_empty_v<typename decltype(tryResult53)::ok_type>
); if ((__builtin_expect(!!(tryResult53.isErr()), 0))) { mozilla
::dom::quota::HandleError("ToResult(aStatement->BindInt32ByName(\"last_maintenance_date\"_ns, mMaintenanceDate))"
, tryResult53.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 120, mozilla::dom::quota::Severity::Error); return tryResult53
.propagateErr(); }}
120 mMaintenanceDate))){auto tryResult53 = (ToResult(aStatement->BindInt32ByName(
"last_maintenance_date"_ns, mMaintenanceDate))); static_assert
(std::is_empty_v<typename decltype(tryResult53)::ok_type>
); if ((__builtin_expect(!!(tryResult53.isErr()), 0))) { mozilla
::dom::quota::HandleError("ToResult(aStatement->BindInt32ByName(\"last_maintenance_date\"_ns, mMaintenanceDate))"
, tryResult53.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 120, mozilla::dom::quota::Severity::Error); return tryResult53
.propagateErr(); }}
;
121 OriginStateMetadata stateMetadata = LockedFlattenToOriginStateMetadata();
122 QM_TRY(MOZ_TO_RESULT(aStatement->BindInt32ByName({auto tryResult54 = (ToResult(aStatement->BindInt32ByName(
"metadata_flags"_ns, stateMetadata.ToMetadataFlags()))); static_assert
(std::is_empty_v<typename decltype(tryResult54)::ok_type>
); if ((__builtin_expect(!!(tryResult54.isErr()), 0))) { mozilla
::dom::quota::HandleError("ToResult(aStatement->BindInt32ByName( \"metadata_flags\"_ns, stateMetadata.ToMetadataFlags()))"
, tryResult54.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 123, mozilla::dom::quota::Severity::Error); return tryResult54
.propagateErr(); }}
123 "metadata_flags"_ns, stateMetadata.ToMetadataFlags()))){auto tryResult54 = (ToResult(aStatement->BindInt32ByName(
"metadata_flags"_ns, stateMetadata.ToMetadataFlags()))); static_assert
(std::is_empty_v<typename decltype(tryResult54)::ok_type>
); if ((__builtin_expect(!!(tryResult54.isErr()), 0))) { mozilla
::dom::quota::HandleError("ToResult(aStatement->BindInt32ByName( \"metadata_flags\"_ns, stateMetadata.ToMetadataFlags()))"
, tryResult54.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 123, mozilla::dom::quota::Severity::Error); return tryResult54
.propagateErr(); }}
;
124
125 return NS_OK;
126}
127
128nsresult OriginInfo::UpdateDirtyMetadata(mozIStorageConnection* aConnection,
129 uint32_t aMetadataFlags,
130 int64_t aLastAccessTime) const {
131 MOZ_ASSERT(aConnection)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(aConnection)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(aConnection))), 0))) { do { }
while (false); MOZ_ReportAssertionFailure("aConnection", "./../../../dom/quota/OriginInfo.cpp"
, 131); AnnotateMozCrashReason("MOZ_ASSERT" "(" "aConnection"
")"); do { MOZ_CrashSequence(__null, 131); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
132
133 nsCOMPtr<mozIStorageStatement> stmt;
134 QM_TRY(MOZ_TO_RESULT(aConnection->CreateStatement({auto tryResult55 = (ToResult(aConnection->CreateStatement
( "UPDATE origin SET metadata_flags = :metadata_flags, " "last_access_time = :last_access_time "
"WHERE repository_id = :repository_id " "AND origin = :origin;"_ns
, getter_AddRefs(stmt)))); static_assert(std::is_empty_v<typename
decltype(tryResult55)::ok_type>); if ((__builtin_expect(!
!(tryResult55.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(aConnection->CreateStatement( \"UPDATE origin SET metadata_flags = :metadata_flags, \" \"last_access_time = :last_access_time \" \"WHERE repository_id = :repository_id \" \"AND origin = :origin;\"_ns, getter_AddRefs(stmt)))"
, tryResult55.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 139, mozilla::dom::quota::Severity::Error); return tryResult55
.propagateErr(); }}
135 "UPDATE origin SET metadata_flags = :metadata_flags, "{auto tryResult55 = (ToResult(aConnection->CreateStatement
( "UPDATE origin SET metadata_flags = :metadata_flags, " "last_access_time = :last_access_time "
"WHERE repository_id = :repository_id " "AND origin = :origin;"_ns
, getter_AddRefs(stmt)))); static_assert(std::is_empty_v<typename
decltype(tryResult55)::ok_type>); if ((__builtin_expect(!
!(tryResult55.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(aConnection->CreateStatement( \"UPDATE origin SET metadata_flags = :metadata_flags, \" \"last_access_time = :last_access_time \" \"WHERE repository_id = :repository_id \" \"AND origin = :origin;\"_ns, getter_AddRefs(stmt)))"
, tryResult55.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 139, mozilla::dom::quota::Severity::Error); return tryResult55
.propagateErr(); }}
136 "last_access_time = :last_access_time "{auto tryResult55 = (ToResult(aConnection->CreateStatement
( "UPDATE origin SET metadata_flags = :metadata_flags, " "last_access_time = :last_access_time "
"WHERE repository_id = :repository_id " "AND origin = :origin;"_ns
, getter_AddRefs(stmt)))); static_assert(std::is_empty_v<typename
decltype(tryResult55)::ok_type>); if ((__builtin_expect(!
!(tryResult55.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(aConnection->CreateStatement( \"UPDATE origin SET metadata_flags = :metadata_flags, \" \"last_access_time = :last_access_time \" \"WHERE repository_id = :repository_id \" \"AND origin = :origin;\"_ns, getter_AddRefs(stmt)))"
, tryResult55.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 139, mozilla::dom::quota::Severity::Error); return tryResult55
.propagateErr(); }}
137 "WHERE repository_id = :repository_id "{auto tryResult55 = (ToResult(aConnection->CreateStatement
( "UPDATE origin SET metadata_flags = :metadata_flags, " "last_access_time = :last_access_time "
"WHERE repository_id = :repository_id " "AND origin = :origin;"_ns
, getter_AddRefs(stmt)))); static_assert(std::is_empty_v<typename
decltype(tryResult55)::ok_type>); if ((__builtin_expect(!
!(tryResult55.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(aConnection->CreateStatement( \"UPDATE origin SET metadata_flags = :metadata_flags, \" \"last_access_time = :last_access_time \" \"WHERE repository_id = :repository_id \" \"AND origin = :origin;\"_ns, getter_AddRefs(stmt)))"
, tryResult55.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 139, mozilla::dom::quota::Severity::Error); return tryResult55
.propagateErr(); }}
138 "AND origin = :origin;"_ns,{auto tryResult55 = (ToResult(aConnection->CreateStatement
( "UPDATE origin SET metadata_flags = :metadata_flags, " "last_access_time = :last_access_time "
"WHERE repository_id = :repository_id " "AND origin = :origin;"_ns
, getter_AddRefs(stmt)))); static_assert(std::is_empty_v<typename
decltype(tryResult55)::ok_type>); if ((__builtin_expect(!
!(tryResult55.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(aConnection->CreateStatement( \"UPDATE origin SET metadata_flags = :metadata_flags, \" \"last_access_time = :last_access_time \" \"WHERE repository_id = :repository_id \" \"AND origin = :origin;\"_ns, getter_AddRefs(stmt)))"
, tryResult55.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 139, mozilla::dom::quota::Severity::Error); return tryResult55
.propagateErr(); }}
139 getter_AddRefs(stmt)))){auto tryResult55 = (ToResult(aConnection->CreateStatement
( "UPDATE origin SET metadata_flags = :metadata_flags, " "last_access_time = :last_access_time "
"WHERE repository_id = :repository_id " "AND origin = :origin;"_ns
, getter_AddRefs(stmt)))); static_assert(std::is_empty_v<typename
decltype(tryResult55)::ok_type>); if ((__builtin_expect(!
!(tryResult55.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(aConnection->CreateStatement( \"UPDATE origin SET metadata_flags = :metadata_flags, \" \"last_access_time = :last_access_time \" \"WHERE repository_id = :repository_id \" \"AND origin = :origin;\"_ns, getter_AddRefs(stmt)))"
, tryResult55.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 139, mozilla::dom::quota::Severity::Error); return tryResult55
.propagateErr(); }}
;
140
141 QM_TRY(MOZ_TO_RESULT({auto tryResult56 = (ToResult(stmt->BindInt32ByName("metadata_flags"_ns
, aMetadataFlags))); static_assert(std::is_empty_v<typename
decltype(tryResult56)::ok_type>); if ((__builtin_expect(!
!(tryResult56.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(stmt->BindInt32ByName(\"metadata_flags\"_ns, aMetadataFlags))"
, tryResult56.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 142, mozilla::dom::quota::Severity::Error); return tryResult56
.propagateErr(); }}
142 stmt->BindInt32ByName("metadata_flags"_ns, aMetadataFlags))){auto tryResult56 = (ToResult(stmt->BindInt32ByName("metadata_flags"_ns
, aMetadataFlags))); static_assert(std::is_empty_v<typename
decltype(tryResult56)::ok_type>); if ((__builtin_expect(!
!(tryResult56.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(stmt->BindInt32ByName(\"metadata_flags\"_ns, aMetadataFlags))"
, tryResult56.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 142, mozilla::dom::quota::Severity::Error); return tryResult56
.propagateErr(); }}
;
143 QM_TRY(MOZ_TO_RESULT({auto tryResult57 = (ToResult(stmt->BindInt64ByName("last_access_time"_ns
, aLastAccessTime))); static_assert(std::is_empty_v<typename
decltype(tryResult57)::ok_type>); if ((__builtin_expect(!
!(tryResult57.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(stmt->BindInt64ByName(\"last_access_time\"_ns, aLastAccessTime))"
, tryResult57.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 144, mozilla::dom::quota::Severity::Error); return tryResult57
.propagateErr(); }}
144 stmt->BindInt64ByName("last_access_time"_ns, aLastAccessTime))){auto tryResult57 = (ToResult(stmt->BindInt64ByName("last_access_time"_ns
, aLastAccessTime))); static_assert(std::is_empty_v<typename
decltype(tryResult57)::ok_type>); if ((__builtin_expect(!
!(tryResult57.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(stmt->BindInt64ByName(\"last_access_time\"_ns, aLastAccessTime))"
, tryResult57.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 144, mozilla::dom::quota::Severity::Error); return tryResult57
.propagateErr(); }}
;
145 QM_TRY(MOZ_TO_RESULT({auto tryResult58 = (ToResult(stmt->BindInt32ByName("repository_id"_ns
, mGroupInfo->mPersistenceType))); static_assert(std::is_empty_v
<typename decltype(tryResult58)::ok_type>); if ((__builtin_expect
(!!(tryResult58.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(stmt->BindInt32ByName(\"repository_id\"_ns, mGroupInfo->mPersistenceType))"
, tryResult58.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 146, mozilla::dom::quota::Severity::Error); return tryResult58
.propagateErr(); }}
146 stmt->BindInt32ByName("repository_id"_ns, mGroupInfo->mPersistenceType))){auto tryResult58 = (ToResult(stmt->BindInt32ByName("repository_id"_ns
, mGroupInfo->mPersistenceType))); static_assert(std::is_empty_v
<typename decltype(tryResult58)::ok_type>); if ((__builtin_expect
(!!(tryResult58.isErr()), 0))) { mozilla::dom::quota::HandleError
("ToResult(stmt->BindInt32ByName(\"repository_id\"_ns, mGroupInfo->mPersistenceType))"
, tryResult58.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 146, mozilla::dom::quota::Severity::Error); return tryResult58
.propagateErr(); }}
;
147 QM_TRY(MOZ_TO_RESULT(stmt->BindUTF8StringByName("origin"_ns, mOrigin))){auto tryResult59 = (ToResult(stmt->BindUTF8StringByName("origin"_ns
, mOrigin))); static_assert(std::is_empty_v<typename decltype
(tryResult59)::ok_type>); if ((__builtin_expect(!!(tryResult59
.isErr()), 0))) { mozilla::dom::quota::HandleError("ToResult(stmt->BindUTF8StringByName(\"origin\"_ns, mOrigin))"
, tryResult59.inspectErr(), "./../../../dom/quota/OriginInfo.cpp"
, 147, mozilla::dom::quota::Severity::Error); return tryResult59
.propagateErr(); }}
;
148
149 QM_TRY(MOZ_TO_RESULT(stmt->Execute())){auto tryResult60 = (ToResult(stmt->Execute())); static_assert
(std::is_empty_v<typename decltype(tryResult60)::ok_type>
); if ((__builtin_expect(!!(tryResult60.isErr()), 0))) { mozilla
::dom::quota::HandleError("ToResult(stmt->Execute())", tryResult60
.inspectErr(), "./../../../dom/quota/OriginInfo.cpp", 149, mozilla
::dom::quota::Severity::Error); return tryResult60.propagateErr
(); }}
;
150
151 return NS_OK;
152}
153
154void OriginInfo::LockedDecreaseUsage(Client::Type aClientType, int64_t aSize,
155 DirtyTrackingAutoLock& aProofOfLock) {
156 AssertCurrentThreadOwnsQuotaMutex();
157
158 if (mClientUsages[aClientType].isNothing()) {
159 return;
160 }
161 mClientUsages[aClientType] = Some(mClientUsages[aClientType].value() - aSize);
162 QM_ASSERT_NOT_NEGATIVE_2(mozilla::dom::quota::AssertNotNegative( mClientUsages[aClientType
].value(), nsDependentCString(__func__) + "::"_ns + nsAutoCString
("mClientUsages["_ns + Client::TypeToText(aClientType) + "]"_ns
))
163 mClientUsages[aClientType].value(),mozilla::dom::quota::AssertNotNegative( mClientUsages[aClientType
].value(), nsDependentCString(__func__) + "::"_ns + nsAutoCString
("mClientUsages["_ns + Client::TypeToText(aClientType) + "]"_ns
))
164 "mClientUsages["_ns + Client::TypeToText(aClientType) + "]"_ns)mozilla::dom::quota::AssertNotNegative( mClientUsages[aClientType
].value(), nsDependentCString(__func__) + "::"_ns + nsAutoCString
("mClientUsages["_ns + Client::TypeToText(aClientType) + "]"_ns
))
;
165
166 mUsage -= aSize;
167 QM_ASSERT_NOT_NEGATIVE(mUsage)mozilla::dom::quota::AssertNotNegative( mUsage, nsDependentCString
(__func__) + "::"_ns + nsDependentCString("mUsage"))
;
168 MakeDirty(aProofOfLock);
169
170 if (!LockedPersisted()) {
171 mGroupInfo->mUsage -= aSize;
172 QM_ASSERT_NOT_NEGATIVE(mGroupInfo->mUsage)mozilla::dom::quota::AssertNotNegative( mGroupInfo->mUsage
, nsDependentCString(__func__) + "::"_ns + nsDependentCString
("mGroupInfo->mUsage"))
;
173 }
174
175 QuotaManager* quotaManager = QuotaManager::Get();
176 MOZ_ASSERT(quotaManager)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(quotaManager)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(quotaManager))), 0))) { do {
} while (false); MOZ_ReportAssertionFailure("quotaManager", "./../../../dom/quota/OriginInfo.cpp"
, 176); AnnotateMozCrashReason("MOZ_ASSERT" "(" "quotaManager"
")"); do { MOZ_CrashSequence(__null, 176); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
177
178 quotaManager->mTemporaryStorageUsage -= aSize;
179 QM_ASSERT_NOT_NEGATIVE(quotaManager->mTemporaryStorageUsage)mozilla::dom::quota::AssertNotNegative( quotaManager->mTemporaryStorageUsage
, nsDependentCString(__func__) + "::"_ns + nsDependentCString
("quotaManager->mTemporaryStorageUsage"))
;
180}
181
182void OriginInfo::LockedResetUsageForClient(
183 Client::Type aClientType, DirtyTrackingAutoLock& aProofOfLock) {
184 AssertCurrentThreadOwnsQuotaMutex();
185
186 int64_t size = mClientUsages[aClientType].valueOr(0);
187
188 mClientUsages[aClientType].reset();
189
190 mUsage -= size;
191 QM_ASSERT_NOT_NEGATIVE(mUsage)mozilla::dom::quota::AssertNotNegative( mUsage, nsDependentCString
(__func__) + "::"_ns + nsDependentCString("mUsage"))
;
192 MakeDirty(aProofOfLock);
193
194 if (!LockedPersisted()) {
195 mGroupInfo->mUsage -= size;
196 QM_ASSERT_NOT_NEGATIVE(mGroupInfo->mUsage)mozilla::dom::quota::AssertNotNegative( mGroupInfo->mUsage
, nsDependentCString(__func__) + "::"_ns + nsDependentCString
("mGroupInfo->mUsage"))
;
197 }
198
199 QuotaManager* quotaManager = QuotaManager::Get();
200 MOZ_ASSERT(quotaManager)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(quotaManager)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(quotaManager))), 0))) { do {
} while (false); MOZ_ReportAssertionFailure("quotaManager", "./../../../dom/quota/OriginInfo.cpp"
, 200); AnnotateMozCrashReason("MOZ_ASSERT" "(" "quotaManager"
")"); do { MOZ_CrashSequence(__null, 200); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
201
202 quotaManager->mTemporaryStorageUsage -= size;
203 QM_ASSERT_NOT_NEGATIVE(quotaManager->mTemporaryStorageUsage)mozilla::dom::quota::AssertNotNegative( quotaManager->mTemporaryStorageUsage
, nsDependentCString(__func__) + "::"_ns + nsDependentCString
("quotaManager->mTemporaryStorageUsage"))
;
204}
205
206UsageInfo OriginInfo::LockedGetUsageForClient(Client::Type aClientType) {
207 AssertCurrentThreadOwnsQuotaMutex();
208
209 // The current implementation of this method only supports DOMCACHE and LS,
210 // which only use DatabaseUsage. If this assertion is lifted, the logic below
211 // must be adapted.
212 MOZ_ASSERT(aClientType == Client::Type::DOMCACHE ||do { static_assert( mozilla::detail::AssertionConditionType<
decltype(aClientType == Client::Type::DOMCACHE || aClientType
== Client::Type::LS || aClientType == Client::Type::FILESYSTEM
)>::isValid, "invalid assertion condition"); if ((__builtin_expect
(!!(!(!!(aClientType == Client::Type::DOMCACHE || aClientType
== Client::Type::LS || aClientType == Client::Type::FILESYSTEM
))), 0))) { do { } while (false); MOZ_ReportAssertionFailure(
"aClientType == Client::Type::DOMCACHE || aClientType == Client::Type::LS || aClientType == Client::Type::FILESYSTEM"
, "./../../../dom/quota/OriginInfo.cpp", 214); AnnotateMozCrashReason
("MOZ_ASSERT" "(" "aClientType == Client::Type::DOMCACHE || aClientType == Client::Type::LS || aClientType == Client::Type::FILESYSTEM"
")"); do { MOZ_CrashSequence(__null, 214); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
213 aClientType == Client::Type::LS ||do { static_assert( mozilla::detail::AssertionConditionType<
decltype(aClientType == Client::Type::DOMCACHE || aClientType
== Client::Type::LS || aClientType == Client::Type::FILESYSTEM
)>::isValid, "invalid assertion condition"); if ((__builtin_expect
(!!(!(!!(aClientType == Client::Type::DOMCACHE || aClientType
== Client::Type::LS || aClientType == Client::Type::FILESYSTEM
))), 0))) { do { } while (false); MOZ_ReportAssertionFailure(
"aClientType == Client::Type::DOMCACHE || aClientType == Client::Type::LS || aClientType == Client::Type::FILESYSTEM"
, "./../../../dom/quota/OriginInfo.cpp", 214); AnnotateMozCrashReason
("MOZ_ASSERT" "(" "aClientType == Client::Type::DOMCACHE || aClientType == Client::Type::LS || aClientType == Client::Type::FILESYSTEM"
")"); do { MOZ_CrashSequence(__null, 214); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
214 aClientType == Client::Type::FILESYSTEM)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(aClientType == Client::Type::DOMCACHE || aClientType
== Client::Type::LS || aClientType == Client::Type::FILESYSTEM
)>::isValid, "invalid assertion condition"); if ((__builtin_expect
(!!(!(!!(aClientType == Client::Type::DOMCACHE || aClientType
== Client::Type::LS || aClientType == Client::Type::FILESYSTEM
))), 0))) { do { } while (false); MOZ_ReportAssertionFailure(
"aClientType == Client::Type::DOMCACHE || aClientType == Client::Type::LS || aClientType == Client::Type::FILESYSTEM"
, "./../../../dom/quota/OriginInfo.cpp", 214); AnnotateMozCrashReason
("MOZ_ASSERT" "(" "aClientType == Client::Type::DOMCACHE || aClientType == Client::Type::LS || aClientType == Client::Type::FILESYSTEM"
")"); do { MOZ_CrashSequence(__null, 214); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
215
216 return UsageInfo{DatabaseUsageType{mClientUsages[aClientType]}};
217}
218
219void OriginInfo::LockedPersist(DirtyTrackingAutoLock& aProofOfLock) {
220 AssertCurrentThreadOwnsQuotaMutex();
221 MOZ_ASSERT(mGroupInfo->mPersistenceType == PERSISTENCE_TYPE_DEFAULT)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(mGroupInfo->mPersistenceType == PERSISTENCE_TYPE_DEFAULT
)>::isValid, "invalid assertion condition"); if ((__builtin_expect
(!!(!(!!(mGroupInfo->mPersistenceType == PERSISTENCE_TYPE_DEFAULT
))), 0))) { do { } while (false); MOZ_ReportAssertionFailure(
"mGroupInfo->mPersistenceType == PERSISTENCE_TYPE_DEFAULT"
, "./../../../dom/quota/OriginInfo.cpp", 221); AnnotateMozCrashReason
("MOZ_ASSERT" "(" "mGroupInfo->mPersistenceType == PERSISTENCE_TYPE_DEFAULT"
")"); do { MOZ_CrashSequence(__null, 221); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
222 MOZ_ASSERT(!mPersisted)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(!mPersisted)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(!mPersisted))), 0))) { do { }
while (false); MOZ_ReportAssertionFailure("!mPersisted", "./../../../dom/quota/OriginInfo.cpp"
, 222); AnnotateMozCrashReason("MOZ_ASSERT" "(" "!mPersisted"
")"); do { MOZ_CrashSequence(__null, 222); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
223
224 mPersisted = true;
225 MakeDirty(aProofOfLock);
226
227 // Remove Usage from GroupInfo
228 mGroupInfo->mUsage -= mUsage;
229 QM_ASSERT_NOT_NEGATIVE(mGroupInfo->mUsage)mozilla::dom::quota::AssertNotNegative( mGroupInfo->mUsage
, nsDependentCString(__func__) + "::"_ns + nsDependentCString
("mGroupInfo->mUsage"))
;
230}
231
232void OriginInfo::LockedTruncateUsages(Client::Type aClientType, int64_t aDelta,
233 DirtyTrackingAutoLock& aProofOfLock) {
234 AssertCurrentThreadOwnsQuotaMutex();
235
236 if (mClientUsages[aClientType].isNothing()) {
237 return;
238 }
239
240 QuotaManager* quotaManager = QuotaManager::Get();
241 MOZ_ASSERT(quotaManager)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(quotaManager)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(quotaManager))), 0))) { do {
} while (false); MOZ_ReportAssertionFailure("quotaManager", "./../../../dom/quota/OriginInfo.cpp"
, 241); AnnotateMozCrashReason("MOZ_ASSERT" "(" "quotaManager"
")"); do { MOZ_CrashSequence(__null, 241); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
242
243 quotaManager->mTemporaryStorageUsage -= aDelta;
244 QM_ASSERT_NOT_NEGATIVE(quotaManager->mTemporaryStorageUsage)mozilla::dom::quota::AssertNotNegative( quotaManager->mTemporaryStorageUsage
, nsDependentCString(__func__) + "::"_ns + nsDependentCString
("quotaManager->mTemporaryStorageUsage"))
;
245
246 if (!LockedPersisted()) {
247 mGroupInfo->mUsage -= aDelta;
248 QM_ASSERT_NOT_NEGATIVE(mGroupInfo->mUsage)mozilla::dom::quota::AssertNotNegative( mGroupInfo->mUsage
, nsDependentCString(__func__) + "::"_ns + nsDependentCString
("mGroupInfo->mUsage"))
;
249 }
250
251 mUsage -= aDelta;
252 QM_ASSERT_NOT_NEGATIVE(mUsage)mozilla::dom::quota::AssertNotNegative( mUsage, nsDependentCString
(__func__) + "::"_ns + nsDependentCString("mUsage"))
;
253 MakeDirty(aProofOfLock);
254
255 MOZ_ASSERT(mClientUsages[aClientType].isSome())do { static_assert( mozilla::detail::AssertionConditionType<
decltype(mClientUsages[aClientType].isSome())>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(mClientUsages[aClientType].isSome
()))), 0))) { do { } while (false); MOZ_ReportAssertionFailure
("mClientUsages[aClientType].isSome()", "./../../../dom/quota/OriginInfo.cpp"
, 255); AnnotateMozCrashReason("MOZ_ASSERT" "(" "mClientUsages[aClientType].isSome()"
")"); do { MOZ_CrashSequence(__null, 255); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
256 mClientUsages[aClientType] =
257 Some(mClientUsages[aClientType].value() - aDelta);
258 QM_ASSERT_NOT_NEGATIVE_2(mozilla::dom::quota::AssertNotNegative( mClientUsages[aClientType
].value(), nsDependentCString(__func__) + "::"_ns + nsAutoCString
("mClientUsages["_ns + Client::TypeToText(aClientType) + "]"_ns
))
259 mClientUsages[aClientType].value(),mozilla::dom::quota::AssertNotNegative( mClientUsages[aClientType
].value(), nsDependentCString(__func__) + "::"_ns + nsAutoCString
("mClientUsages["_ns + Client::TypeToText(aClientType) + "]"_ns
))
260 "mClientUsages["_ns + Client::TypeToText(aClientType) + "]"_ns)mozilla::dom::quota::AssertNotNegative( mClientUsages[aClientType
].value(), nsDependentCString(__func__) + "::"_ns + nsAutoCString
("mClientUsages["_ns + Client::TypeToText(aClientType) + "]"_ns
))
;
261};
262
263Maybe<bool> OriginInfo::LockedUpdateUsages(
264 Client::Type aClientType, int64_t aDelta,
265 DirtyTrackingAutoLock& aProofOfLock) {
266 AssertCurrentThreadOwnsQuotaMutex();
267
268 QuotaManager* quotaManager = QuotaManager::Get();
269 MOZ_ASSERT(quotaManager)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(quotaManager)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(quotaManager))), 0))) { do {
} while (false); MOZ_ReportAssertionFailure("quotaManager", "./../../../dom/quota/OriginInfo.cpp"
, 269); AnnotateMozCrashReason("MOZ_ASSERT" "(" "quotaManager"
")"); do { MOZ_CrashSequence(__null, 269); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
270
271 const auto& complementaryPersistenceTypes =
272 ComplementaryPersistenceTypes(mGroupInfo->mPersistenceType);
273
274 AssertNoOverflow(mClientUsages[aClientType].valueOr(0), aDelta);
275 int64_t newClientUsage = mClientUsages[aClientType].valueOr(0) + aDelta;
276
277 AssertNoOverflow(mUsage, aDelta);
278 int64_t newUsage = mUsage + aDelta;
279 MakeDirty(aProofOfLock);
280
281 // Temporary storage has no limit for origin usage (there's a group and the
282 // global limit though).
283
284 int64_t newGroupUsage = mGroupInfo->mUsage;
285 if (!LockedPersisted()) {
286 AssertNoOverflow(mGroupInfo->mUsage, aDelta);
287 newGroupUsage += aDelta;
288
289 int64_t groupUsage = mGroupInfo->mUsage;
290 for (const auto& complementaryPersistenceType :
291 complementaryPersistenceTypes) {
292 const auto& complementaryGroupInfo =
293 mGroupInfo->mGroupInfoPair->LockedGetGroupInfo(
294 complementaryPersistenceType);
295
296 if (complementaryGroupInfo) {
297 AssertNoOverflow(groupUsage, complementaryGroupInfo->mUsage);
298 groupUsage += complementaryGroupInfo->mUsage;
299 }
300 }
301
302 // Temporary storage has a hard limit for group usage (20 % of the global
303 // limit).
304 AssertNoOverflow(groupUsage, aDelta);
305 if (groupUsage + aDelta > quotaManager->GetGroupLimit()) {
306 return Some(false);
307 }
308 }
309
310 AssertNoOverflow(quotaManager->mTemporaryStorageUsage, aDelta);
311 int64_t newTemporaryStorageUsage =
312 quotaManager->mTemporaryStorageUsage + aDelta;
313
314 if (newTemporaryStorageUsage <= quotaManager->mTemporaryStorageLimit) {
315 mClientUsages[aClientType] = Some(newClientUsage);
316
317 mUsage = newUsage;
318 if (!LockedPersisted()) {
319 mGroupInfo->mUsage = newGroupUsage;
320 }
321 quotaManager->mTemporaryStorageUsage = newTemporaryStorageUsage;
322
323 return Some(true);
324 }
325
326 return Nothing();
327}
328
329bool OriginInfo::LockedUpdateUsagesForEviction(
330 Client::Type aClientType, int64_t aDelta,
331 DirtyTrackingAutoLock& aProofOfLock) {
332 AssertCurrentThreadOwnsQuotaMutex();
333
334 QuotaManager* quotaManager = QuotaManager::Get();
335 MOZ_ASSERT(quotaManager)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(quotaManager)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(quotaManager))), 0))) { do {
} while (false); MOZ_ReportAssertionFailure("quotaManager", "./../../../dom/quota/OriginInfo.cpp"
, 335); AnnotateMozCrashReason("MOZ_ASSERT" "(" "quotaManager"
")"); do { MOZ_CrashSequence(__null, 335); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
336
337 AssertNoOverflow(mUsage, aDelta);
338 int64_t newUsage = mUsage + aDelta;
339 MakeDirty(aProofOfLock);
340
341 AssertNoOverflow(mClientUsages[aClientType].valueOr(0), aDelta);
342 int64_t newClientUsage = mClientUsages[aClientType].valueOr(0) + aDelta;
343
344 AssertNoOverflow(quotaManager->mTemporaryStorageUsage, aDelta);
345 int64_t newTemporaryStorageUsage =
Value stored to 'newTemporaryStorageUsage' during its initialization is never read
346 quotaManager->mTemporaryStorageUsage + aDelta;
347
348 int64_t newGroupUsage = mGroupInfo->mUsage;
349 if (!LockedPersisted()) {
350 AssertNoOverflow(mGroupInfo->mUsage, aDelta);
351 newGroupUsage += aDelta;
352
353 int64_t groupUsage = mGroupInfo->mUsage;
354
355 const auto& complementaryPersistenceTypes =
356 ComplementaryPersistenceTypes(mGroupInfo->mPersistenceType);
357 for (const auto& complementaryPersistenceType :
358 complementaryPersistenceTypes) {
359 const auto& complementaryGroupInfo =
360 mGroupInfo->mGroupInfoPair->LockedGetGroupInfo(
361 complementaryPersistenceType);
362
363 if (complementaryGroupInfo) {
364 AssertNoOverflow(groupUsage, complementaryGroupInfo->mUsage);
365 groupUsage += complementaryGroupInfo->mUsage;
366 }
367 }
368
369 AssertNoOverflow(groupUsage, aDelta);
370 if (groupUsage + aDelta > quotaManager->GetGroupLimit()) {
371 // Unfortunately some other thread increased the group usage in the
372 // meantime and we are not below the group limit anymore.
373 return false;
374 }
375 }
376
377 AssertNoOverflow(quotaManager->mTemporaryStorageUsage, aDelta);
378 newTemporaryStorageUsage = quotaManager->mTemporaryStorageUsage + aDelta;
379
380 NS_ASSERTION(newTemporaryStorageUsage <= quotaManager->mTemporaryStorageLimit,do { if (!(newTemporaryStorageUsage <= quotaManager->mTemporaryStorageLimit
)) { NS_DebugBreak(NS_DEBUG_ASSERTION, "How come?!", "newTemporaryStorageUsage <= quotaManager->mTemporaryStorageLimit"
, "./../../../dom/quota/OriginInfo.cpp", 381); MOZ_PretendNoReturn
(); } } while (0)
381 "How come?!")do { if (!(newTemporaryStorageUsage <= quotaManager->mTemporaryStorageLimit
)) { NS_DebugBreak(NS_DEBUG_ASSERTION, "How come?!", "newTemporaryStorageUsage <= quotaManager->mTemporaryStorageLimit"
, "./../../../dom/quota/OriginInfo.cpp", 381); MOZ_PretendNoReturn
(); } } while (0)
;
382
383 // Ok, we successfully freed enough space and the operation can continue
384 // without throwing the quota error.
385 mClientUsages[aClientType] = Some(newClientUsage);
386
387 mUsage = newUsage;
388 if (!LockedPersisted()) {
389 MOZ_ASSERT(mGroupInfo)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(mGroupInfo)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(mGroupInfo))), 0))) { do { }
while (false); MOZ_ReportAssertionFailure("mGroupInfo", "./../../../dom/quota/OriginInfo.cpp"
, 389); AnnotateMozCrashReason("MOZ_ASSERT" "(" "mGroupInfo" ")"
); do { MOZ_CrashSequence(__null, 389); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
390 mGroupInfo->mUsage = newGroupUsage;
391 }
392 quotaManager->mTemporaryStorageUsage = newTemporaryStorageUsage;
393
394 return true;
395};
396
397void OriginInfo::MakeDirty(DirtyTrackingAutoLock& aProofOfLock) {
398 AssertCurrentThreadOwnsQuotaMutex();
399
400 mLastModifiedTime = TimeStamp::Now();
401 if (!mMetadataDirty) {
402 auto* const quotaManager = QuotaManager::Get();
403 MOZ_ASSERT(quotaManager)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(quotaManager)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(quotaManager))), 0))) { do {
} while (false); MOZ_ReportAssertionFailure("quotaManager", "./../../../dom/quota/OriginInfo.cpp"
, 403); AnnotateMozCrashReason("MOZ_ASSERT" "(" "quotaManager"
")"); do { MOZ_CrashSequence(__null, 403); __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
404
405 quotaManager->RegisterDirtyOriginInfo(aProofOfLock);
406 mMetadataDirty = true;
407 }
408}
409
410void OriginInfo::LockedDirectoryCreated() {
411 AssertCurrentThreadOwnsQuotaMutex();
412 MOZ_ASSERT(!mDirectoryExists)do { static_assert( mozilla::detail::AssertionConditionType<
decltype(!mDirectoryExists)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(!mDirectoryExists))), 0))) {
do { } while (false); MOZ_ReportAssertionFailure("!mDirectoryExists"
, "./../../../dom/quota/OriginInfo.cpp", 412); AnnotateMozCrashReason
("MOZ_ASSERT" "(" "!mDirectoryExists" ")"); do { MOZ_CrashSequence
(__null, 412); __attribute__((nomerge)) ::abort(); } while (false
); } } while (false)
;
413
414 mDirectoryExists = true;
415}
416
417} // namespace mozilla::dom::quota
418
419#undef CHECK_USAGE