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
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "mozilla/dom/DataStore.h"
6 #include "mozilla/dom/DataStoreCursor.h"
7 #include "mozilla/dom/DataStoreBinding.h"
8 #include "mozilla/dom/DataStoreImplBinding.h"
9 #include "mozilla/dom/Navigator.h"
10 #include "mozilla/dom/Promise.h"
11 #include "mozilla/ErrorResult.h"
12 #include "mozilla/Preferences.h"
13 #include "AccessCheck.h"
18 NS_IMPL_ADDREF_INHERITED(DataStore
, DOMEventTargetHelper
)
19 NS_IMPL_RELEASE_INHERITED(DataStore
, DOMEventTargetHelper
)
21 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DataStore
)
22 NS_INTERFACE_MAP_ENTRY(nsISupports
)
23 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper
)
25 NS_IMPL_CYCLE_COLLECTION_INHERITED(DataStore
, DOMEventTargetHelper
, mStore
)
27 DataStore::DataStore(nsPIDOMWindow
* aWindow
)
28 : DOMEventTargetHelper(aWindow
)
32 DataStore::~DataStore()
36 already_AddRefed
<DataStore
>
37 DataStore::Constructor(GlobalObject
& aGlobal
, ErrorResult
& aRv
)
39 nsCOMPtr
<nsPIDOMWindow
> window
= do_QueryInterface(aGlobal
.GetAsSupports());
41 aRv
.Throw(NS_ERROR_FAILURE
);
45 nsRefPtr
<DataStore
> store
= new DataStore(window
);
46 return store
.forget();
50 DataStore::WrapObject(JSContext
* aCx
)
52 return DataStoreBinding::Wrap(aCx
, this);
56 DataStore::EnabledForScope(JSContext
* aCx
, JS::Handle
<JSObject
*> aObj
)
58 // Only expose the interface when it is:
59 // 1. enabled by the preference and
60 // 2. accessed by the chrome codes in Gecko.
61 return (Navigator::HasDataStoreSupport(aCx
, aObj
) &&
62 nsContentUtils::ThreadsafeIsCallerChrome());
66 DataStore::GetName(nsAString
& aName
, ErrorResult
& aRv
)
68 MOZ_ASSERT(NS_IsMainThread());
72 mStore
->GetName(name
, aRv
);
77 DataStore::GetOwner(nsAString
& aOwner
, ErrorResult
& aRv
)
79 MOZ_ASSERT(NS_IsMainThread());
83 mStore
->GetOwner(owner
, aRv
);
88 DataStore::GetReadOnly(ErrorResult
& aRv
)
90 MOZ_ASSERT(NS_IsMainThread());
93 return mStore
->GetReadOnly(aRv
);
96 already_AddRefed
<Promise
>
97 DataStore::Get(const Sequence
<OwningStringOrUnsignedLong
>& aId
,
100 MOZ_ASSERT(NS_IsMainThread());
103 return mStore
->Get(aId
, aRv
);
106 already_AddRefed
<Promise
>
107 DataStore::Put(JSContext
* aCx
,
108 JS::Handle
<JS::Value
> aObj
,
109 const StringOrUnsignedLong
& aId
,
110 const nsAString
& aRevisionId
,
113 MOZ_ASSERT(NS_IsMainThread());
116 return mStore
->Put(aObj
, aId
, aRevisionId
, aRv
);
119 already_AddRefed
<Promise
>
120 DataStore::Add(JSContext
* aCx
,
121 JS::Handle
<JS::Value
> aObj
,
122 const Optional
<StringOrUnsignedLong
>& aId
,
123 const nsAString
& aRevisionId
,
126 MOZ_ASSERT(NS_IsMainThread());
129 return mStore
->Add(aObj
, aId
, aRevisionId
, aRv
);
132 already_AddRefed
<Promise
>
133 DataStore::Remove(const StringOrUnsignedLong
& aId
,
134 const nsAString
& aRevisionId
,
137 MOZ_ASSERT(NS_IsMainThread());
140 return mStore
->Remove(aId
, aRevisionId
, aRv
);
143 already_AddRefed
<Promise
>
144 DataStore::Clear(const nsAString
& aRevisionId
, ErrorResult
& aRv
)
146 MOZ_ASSERT(NS_IsMainThread());
149 return mStore
->Clear(aRevisionId
, aRv
);
153 DataStore::GetRevisionId(nsAString
& aRevisionId
, ErrorResult
& aRv
)
155 MOZ_ASSERT(NS_IsMainThread());
158 nsAutoString revisionId
;
159 mStore
->GetRevisionId(revisionId
, aRv
);
160 aRevisionId
.Assign(revisionId
);
163 already_AddRefed
<Promise
>
164 DataStore::GetLength(ErrorResult
& aRv
)
166 MOZ_ASSERT(NS_IsMainThread());
169 return mStore
->GetLength(aRv
);
172 already_AddRefed
<DataStoreCursor
>
173 DataStore::Sync(const nsAString
& aRevisionId
, ErrorResult
& aRv
)
175 MOZ_ASSERT(NS_IsMainThread());
178 return mStore
->Sync(aRevisionId
, aRv
);
182 DataStore::SetDataStoreImpl(DataStoreImpl
& aStore
, ErrorResult
& aRv
)
184 MOZ_ASSERT(NS_IsMainThread());
188 mStore
->SetEventTarget(*this, aRv
);
192 } //namespace mozilla