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"
10 #include "mozilla/dom/StorageBinding.h"
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() {}
30 int64_t PartitionedLocalStorage::GetOriginQuotaUsage() const {
31 return mCache
->GetOriginQuotaUsage(SessionStorageCache::eSessionSetType
);
34 uint32_t PartitionedLocalStorage::GetLength(nsIPrincipal
& aSubjectPrincipal
,
36 if (!CanUseStorage(aSubjectPrincipal
)) {
37 aRv
.Throw(NS_ERROR_DOM_SECURITY_ERR
);
41 return mCache
->Length(SessionStorageCache::eSessionSetType
);
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(SessionStorageCache::eSessionSetType
, 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(SessionStorageCache::eSessionSetType
, aKey
, aResult
);
66 void PartitionedLocalStorage::GetSupportedNames(nsTArray
<nsString
>& aKeys
) {
67 if (!CanUseStorage(*nsContentUtils::SubjectPrincipal())) {
68 // return just an empty array
73 mCache
->GetKeys(SessionStorageCache::eSessionSetType
, 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(SessionStorageCache::eSessionSetType
, aKey
,
88 if (NS_WARN_IF(NS_FAILED(rv
))) {
93 if (rv
== NS_SUCCESS_DOM_NO_OPERATION
) {
98 void PartitionedLocalStorage::RemoveItem(const nsAString
& aKey
,
99 nsIPrincipal
& aSubjectPrincipal
,
101 if (!CanUseStorage(aSubjectPrincipal
)) {
102 aRv
.Throw(NS_ERROR_DOM_SECURITY_ERR
);
108 mCache
->RemoveItem(SessionStorageCache::eSessionSetType
, aKey
, oldValue
);
109 MOZ_ASSERT(NS_SUCCEEDED(rv
));
111 if (rv
== NS_SUCCESS_DOM_NO_OPERATION
) {
116 void PartitionedLocalStorage::Clear(nsIPrincipal
& aSubjectPrincipal
,
118 uint32_t length
= GetLength(aSubjectPrincipal
, aRv
);
123 mCache
->Clear(SessionStorageCache::eSessionSetType
);
126 bool PartitionedLocalStorage::IsForkOf(const Storage
* aOther
) const {
128 if (aOther
->Type() != eLocalStorage
) {
132 return mCache
== static_cast<const PartitionedLocalStorage
*>(aOther
)->mCache
;
136 } // namespace mozilla