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 #include "PartitionedLocalStorage.h"
8 #include "SessionStorageCache.h"
9 #include "nsContentUtils.h"
11 #include "mozilla/dom/StorageBinding.h"
13 namespace mozilla::dom
{
15 NS_IMPL_CYCLE_COLLECTION_INHERITED(PartitionedLocalStorage
, Storage
);
17 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(PartitionedLocalStorage
)
18 NS_INTERFACE_MAP_END_INHERITING(Storage
)
20 NS_IMPL_ADDREF_INHERITED(PartitionedLocalStorage
, Storage
)
21 NS_IMPL_RELEASE_INHERITED(PartitionedLocalStorage
, Storage
)
23 PartitionedLocalStorage::PartitionedLocalStorage(
24 nsPIDOMWindowInner
* aWindow
, nsIPrincipal
* aPrincipal
,
25 nsIPrincipal
* aStoragePrincipal
, SessionStorageCache
* aCache
)
26 : Storage(aWindow
, aPrincipal
, aStoragePrincipal
), mCache(aCache
) {}
28 PartitionedLocalStorage::~PartitionedLocalStorage() = default;
30 int64_t PartitionedLocalStorage::GetOriginQuotaUsage() const {
31 return mCache
->GetOriginQuotaUsage();
34 uint32_t PartitionedLocalStorage::GetLength(nsIPrincipal
& aSubjectPrincipal
,
36 if (!CanUseStorage(aSubjectPrincipal
)) {
37 aRv
.Throw(NS_ERROR_DOM_SECURITY_ERR
);
41 return mCache
->Length();
44 void PartitionedLocalStorage::Key(uint32_t aIndex
, nsAString
& aResult
,
45 nsIPrincipal
& aSubjectPrincipal
,
47 if (!CanUseStorage(aSubjectPrincipal
)) {
48 aRv
.Throw(NS_ERROR_DOM_SECURITY_ERR
);
52 mCache
->Key(aIndex
, aResult
);
55 void PartitionedLocalStorage::GetItem(const nsAString
& aKey
, nsAString
& aResult
,
56 nsIPrincipal
& aSubjectPrincipal
,
58 if (!CanUseStorage(aSubjectPrincipal
)) {
59 aRv
.Throw(NS_ERROR_DOM_SECURITY_ERR
);
63 mCache
->GetItem(aKey
, aResult
);
66 void PartitionedLocalStorage::GetSupportedNames(nsTArray
<nsString
>& aKeys
) {
67 if (!CanUseStorage(*nsContentUtils::SubjectPrincipal())) {
68 // return just an empty array
73 mCache
->GetKeys(aKeys
);
76 void PartitionedLocalStorage::SetItem(const nsAString
& aKey
,
77 const nsAString
& aValue
,
78 nsIPrincipal
& aSubjectPrincipal
,
80 if (!CanUseStorage(aSubjectPrincipal
)) {
81 aRv
.Throw(NS_ERROR_DOM_SECURITY_ERR
);
86 nsresult rv
= mCache
->SetItem(aKey
, aValue
, oldValue
);
87 if (NS_WARN_IF(NS_FAILED(rv
))) {
92 if (rv
== NS_SUCCESS_DOM_NO_OPERATION
) {
97 void PartitionedLocalStorage::RemoveItem(const nsAString
& aKey
,
98 nsIPrincipal
& aSubjectPrincipal
,
100 if (!CanUseStorage(aSubjectPrincipal
)) {
101 aRv
.Throw(NS_ERROR_DOM_SECURITY_ERR
);
106 nsresult rv
= mCache
->RemoveItem(aKey
, oldValue
);
107 MOZ_ASSERT(NS_SUCCEEDED(rv
));
109 if (rv
== NS_SUCCESS_DOM_NO_OPERATION
) {
114 void PartitionedLocalStorage::Clear(nsIPrincipal
& aSubjectPrincipal
,
116 uint32_t length
= GetLength(aSubjectPrincipal
, aRv
);
124 bool PartitionedLocalStorage::IsForkOf(const Storage
* aOther
) const {
126 if (aOther
->Type() != eLocalStorage
) {
130 return mCache
== static_cast<const PartitionedLocalStorage
*>(aOther
)->mCache
;
133 } // namespace mozilla::dom