|
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/. */ |
|
4 |
|
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" |
|
14 |
|
15 namespace mozilla { |
|
16 namespace dom { |
|
17 |
|
18 NS_IMPL_ADDREF_INHERITED(DataStore, DOMEventTargetHelper) |
|
19 NS_IMPL_RELEASE_INHERITED(DataStore, DOMEventTargetHelper) |
|
20 |
|
21 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DataStore) |
|
22 NS_INTERFACE_MAP_ENTRY(nsISupports) |
|
23 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) |
|
24 |
|
25 NS_IMPL_CYCLE_COLLECTION(DataStore, mStore) |
|
26 |
|
27 DataStore::DataStore(nsPIDOMWindow* aWindow) |
|
28 : DOMEventTargetHelper(aWindow) |
|
29 { |
|
30 } |
|
31 |
|
32 already_AddRefed<DataStore> |
|
33 DataStore::Constructor(GlobalObject& aGlobal, ErrorResult& aRv) |
|
34 { |
|
35 nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aGlobal.GetAsSupports()); |
|
36 if (!window) { |
|
37 aRv.Throw(NS_ERROR_FAILURE); |
|
38 return nullptr; |
|
39 } |
|
40 |
|
41 nsRefPtr<DataStore> store = new DataStore(window); |
|
42 return store.forget(); |
|
43 } |
|
44 |
|
45 JSObject* |
|
46 DataStore::WrapObject(JSContext* aCx) |
|
47 { |
|
48 return DataStoreBinding::Wrap(aCx, this); |
|
49 } |
|
50 |
|
51 /*static*/ bool |
|
52 DataStore::EnabledForScope(JSContext* aCx, JS::Handle<JSObject*> aObj) |
|
53 { |
|
54 // Only expose the interface when it is: |
|
55 // 1. enabled by the preference and |
|
56 // 2. accessed by the chrome codes in Gecko. |
|
57 return (Navigator::HasDataStoreSupport(aCx, aObj) && |
|
58 nsContentUtils::ThreadsafeIsCallerChrome()); |
|
59 } |
|
60 |
|
61 void |
|
62 DataStore::GetName(nsAString& aName, ErrorResult& aRv) |
|
63 { |
|
64 MOZ_ASSERT(NS_IsMainThread()); |
|
65 MOZ_ASSERT(mStore); |
|
66 |
|
67 nsAutoString name; |
|
68 mStore->GetName(name, aRv); |
|
69 aName.Assign(name); |
|
70 } |
|
71 |
|
72 void |
|
73 DataStore::GetOwner(nsAString& aOwner, ErrorResult& aRv) |
|
74 { |
|
75 MOZ_ASSERT(NS_IsMainThread()); |
|
76 MOZ_ASSERT(mStore); |
|
77 |
|
78 nsAutoString owner; |
|
79 mStore->GetOwner(owner, aRv); |
|
80 aOwner.Assign(owner); |
|
81 } |
|
82 |
|
83 bool |
|
84 DataStore::GetReadOnly(ErrorResult& aRv) |
|
85 { |
|
86 MOZ_ASSERT(NS_IsMainThread()); |
|
87 MOZ_ASSERT(mStore); |
|
88 |
|
89 return mStore->GetReadOnly(aRv); |
|
90 } |
|
91 |
|
92 already_AddRefed<Promise> |
|
93 DataStore::Get(const Sequence<OwningStringOrUnsignedLong>& aId, |
|
94 ErrorResult& aRv) |
|
95 { |
|
96 MOZ_ASSERT(NS_IsMainThread()); |
|
97 MOZ_ASSERT(mStore); |
|
98 |
|
99 return mStore->Get(aId, aRv); |
|
100 } |
|
101 |
|
102 already_AddRefed<Promise> |
|
103 DataStore::Put(JSContext* aCx, |
|
104 JS::Handle<JS::Value> aObj, |
|
105 const StringOrUnsignedLong& aId, |
|
106 const nsAString& aRevisionId, |
|
107 ErrorResult& aRv) |
|
108 { |
|
109 MOZ_ASSERT(NS_IsMainThread()); |
|
110 MOZ_ASSERT(mStore); |
|
111 |
|
112 return mStore->Put(aObj, aId, aRevisionId, aRv); |
|
113 } |
|
114 |
|
115 already_AddRefed<Promise> |
|
116 DataStore::Add(JSContext* aCx, |
|
117 JS::Handle<JS::Value> aObj, |
|
118 const Optional<StringOrUnsignedLong>& aId, |
|
119 const nsAString& aRevisionId, |
|
120 ErrorResult& aRv) |
|
121 { |
|
122 MOZ_ASSERT(NS_IsMainThread()); |
|
123 MOZ_ASSERT(mStore); |
|
124 |
|
125 return mStore->Add(aObj, aId, aRevisionId, aRv); |
|
126 } |
|
127 |
|
128 already_AddRefed<Promise> |
|
129 DataStore::Remove(const StringOrUnsignedLong& aId, |
|
130 const nsAString& aRevisionId, |
|
131 ErrorResult& aRv) |
|
132 { |
|
133 MOZ_ASSERT(NS_IsMainThread()); |
|
134 MOZ_ASSERT(mStore); |
|
135 |
|
136 return mStore->Remove(aId, aRevisionId, aRv); |
|
137 } |
|
138 |
|
139 already_AddRefed<Promise> |
|
140 DataStore::Clear(const nsAString& aRevisionId, ErrorResult& aRv) |
|
141 { |
|
142 MOZ_ASSERT(NS_IsMainThread()); |
|
143 MOZ_ASSERT(mStore); |
|
144 |
|
145 return mStore->Clear(aRevisionId, aRv); |
|
146 } |
|
147 |
|
148 void |
|
149 DataStore::GetRevisionId(nsAString& aRevisionId, ErrorResult& aRv) |
|
150 { |
|
151 MOZ_ASSERT(NS_IsMainThread()); |
|
152 MOZ_ASSERT(mStore); |
|
153 |
|
154 nsAutoString revisionId; |
|
155 mStore->GetRevisionId(revisionId, aRv); |
|
156 aRevisionId.Assign(revisionId); |
|
157 } |
|
158 |
|
159 already_AddRefed<Promise> |
|
160 DataStore::GetLength(ErrorResult& aRv) |
|
161 { |
|
162 MOZ_ASSERT(NS_IsMainThread()); |
|
163 MOZ_ASSERT(mStore); |
|
164 |
|
165 return mStore->GetLength(aRv); |
|
166 } |
|
167 |
|
168 already_AddRefed<DataStoreCursor> |
|
169 DataStore::Sync(const nsAString& aRevisionId, ErrorResult& aRv) |
|
170 { |
|
171 MOZ_ASSERT(NS_IsMainThread()); |
|
172 MOZ_ASSERT(mStore); |
|
173 |
|
174 return mStore->Sync(aRevisionId, aRv); |
|
175 } |
|
176 |
|
177 void |
|
178 DataStore::SetDataStoreImpl(DataStoreImpl& aStore, ErrorResult& aRv) |
|
179 { |
|
180 MOZ_ASSERT(NS_IsMainThread()); |
|
181 MOZ_ASSERT(!mStore); |
|
182 |
|
183 mStore = &aStore; |
|
184 mStore->SetEventTarget(*this, aRv); |
|
185 } |
|
186 |
|
187 } //namespace dom |
|
188 } //namespace mozilla |