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
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef DOM_INDEXEDDB_DATABASEFILEMANAGER_H_
8 #define DOM_INDEXEDDB_DATABASEFILEMANAGER_H_
10 #include "FileInfoManager.h"
11 #include "IndexedDBCipherKeyManager.h"
12 #include "mozilla/dom/FlippedOnce.h"
13 #include "mozilla/dom/quota/CommonMetadata.h"
14 #include "mozilla/dom/quota/PersistenceType.h"
15 #include "mozilla/dom/quota/UsageInfo.h"
16 #include "mozilla/InitializedOnce.h"
19 class mozIStorageConnection
;
21 namespace mozilla::dom::indexedDB
{
23 // Implemented in ActorsParent.cpp.
24 class DatabaseFileManager final
25 : public FileInfoManager
<DatabaseFileManager
>,
26 public AtomicSafeRefCounted
<DatabaseFileManager
> {
27 using PersistenceType
= mozilla::dom::quota::PersistenceType
;
28 using FileInfoManager
<DatabaseFileManager
>::MutexType
;
30 const PersistenceType mPersistenceType
;
31 const quota::OriginMetadata mOriginMetadata
;
32 const nsString mDatabaseName
;
33 const nsCString mDatabaseID
;
35 RefPtr
<IndexedDBCipherKeyManager
> mCipherKeyManager
;
37 LazyInitializedOnce
<const nsString
> mDirectoryPath
;
38 LazyInitializedOnce
<const nsString
> mJournalDirectoryPath
;
40 const bool mEnforcingQuota
;
41 const bool mIsInPrivateBrowsingMode
;
43 FlippedOnce
<false> mInitialized
;
45 // Lock protecting DatabaseFileManager.mFileInfos.
46 // It's s also used to atomically update DatabaseFileInfo.mRefCnt and
47 // DatabaseFileInfo.mDBRefCnt
48 static MutexType sMutex
;
51 [[nodiscard
]] static nsCOMPtr
<nsIFile
> GetFileForId(nsIFile
* aDirectory
,
54 [[nodiscard
]] static nsCOMPtr
<nsIFile
> GetCheckedFileForId(
55 nsIFile
* aDirectory
, int64_t aId
);
57 static nsresult
InitDirectory(nsIFile
& aDirectory
, nsIFile
& aDatabaseFile
,
58 const nsACString
& aOrigin
,
59 uint32_t aTelemetryId
);
61 template <typename KnownDirEntryOp
, typename UnknownDirEntryOp
>
62 static Result
<Ok
, nsresult
> TraverseFiles(
63 nsIFile
& aDirectory
, KnownDirEntryOp
&& aKnownDirEntryOp
,
64 UnknownDirEntryOp
&& aUnknownDirEntryOp
);
66 static Result
<quota::FileUsageType
, nsresult
> GetUsage(nsIFile
* aDirectory
);
68 DatabaseFileManager(PersistenceType aPersistenceType
,
69 const quota::OriginMetadata
& aOriginMetadata
,
70 const nsAString
& aDatabaseName
,
71 const nsCString
& aDatabaseID
, bool aEnforcingQuota
,
72 bool aIsInPrivateBrowsingMode
);
74 PersistenceType
Type() const { return mPersistenceType
; }
76 const quota::OriginMetadata
& OriginMetadata() const {
77 return mOriginMetadata
;
80 const nsACString
& Origin() const { return mOriginMetadata
.mOrigin
; }
82 const nsAString
& DatabaseName() const { return mDatabaseName
; }
84 const nsCString
& DatabaseID() const { return mDatabaseID
; }
86 IndexedDBCipherKeyManager
& MutableCipherKeyManagerRef() const {
87 MOZ_ASSERT(mIsInPrivateBrowsingMode
);
88 MOZ_ASSERT(mCipherKeyManager
);
90 return *mCipherKeyManager
;
93 auto IsInPrivateBrowsingMode() const { return mIsInPrivateBrowsingMode
; }
95 bool EnforcingQuota() const { return mEnforcingQuota
; }
97 bool Initialized() const { return mInitialized
; }
99 nsresult
Init(nsIFile
* aDirectory
, mozIStorageConnection
& aConnection
);
101 [[nodiscard
]] nsCOMPtr
<nsIFile
> GetDirectory();
103 [[nodiscard
]] nsCOMPtr
<nsIFile
> GetCheckedDirectory();
105 [[nodiscard
]] nsCOMPtr
<nsIFile
> GetJournalDirectory();
107 [[nodiscard
]] nsCOMPtr
<nsIFile
> EnsureJournalDirectory();
109 [[nodiscard
]] nsresult
SyncDeleteFile(int64_t aId
);
111 // XXX When getting rid of FileHelper, this method should be removed/made
113 [[nodiscard
]] nsresult
SyncDeleteFile(nsIFile
& aFile
,
114 nsIFile
& aJournalFile
) const;
116 [[nodiscard
]] nsresult
AsyncDeleteFile(int64_t aFileId
);
118 nsresult
Invalidate() override
;
120 MOZ_DECLARE_REFCOUNTED_TYPENAME(DatabaseFileManager
)
122 static StaticMutex
& Mutex() { return sMutex
; }
124 ~DatabaseFileManager() = default;
127 } // namespace mozilla::dom::indexedDB
129 #endif // DOM_INDEXEDDB_DATABASEFILEMANAGER_H_