1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6 #include "nsUrlClassifierProxies.h"
7 #include "nsUrlClassifierDBService.h"
8
9 #include "mozilla/SyncRunnable.h"
10
11 using namespace mozilla::safebrowsing;
12 using mozilla::NewRunnableMethod;
13
14 static nsresult
DispatchToWorkerThread(nsIRunnable * r)15 DispatchToWorkerThread(nsIRunnable* r)
16 {
17 nsIThread* t = nsUrlClassifierDBService::BackgroundThread();
18 if (!t)
19 return NS_ERROR_FAILURE;
20
21 return t->Dispatch(r, NS_DISPATCH_NORMAL);
22 }
23
NS_IMPL_ISUPPORTS(UrlClassifierDBServiceWorkerProxy,nsIUrlClassifierDBService)24 NS_IMPL_ISUPPORTS(UrlClassifierDBServiceWorkerProxy, nsIUrlClassifierDBService)
25
26 NS_IMETHODIMP
27 UrlClassifierDBServiceWorkerProxy::Lookup(nsIPrincipal* aPrincipal,
28 const nsACString& aTables,
29 nsIUrlClassifierCallback* aCB)
30 {
31 nsCOMPtr<nsIRunnable> r = new LookupRunnable(mTarget, aPrincipal, aTables,
32 aCB);
33 return DispatchToWorkerThread(r);
34 }
35
36 NS_IMETHODIMP
Run()37 UrlClassifierDBServiceWorkerProxy::LookupRunnable::Run()
38 {
39 (void) mTarget->Lookup(mPrincipal, mLookupTables, mCB);
40 return NS_OK;
41 }
42
43 NS_IMETHODIMP
GetTables(nsIUrlClassifierCallback * aCB)44 UrlClassifierDBServiceWorkerProxy::GetTables(nsIUrlClassifierCallback* aCB)
45 {
46 nsCOMPtr<nsIRunnable> r = new GetTablesRunnable(mTarget, aCB);
47 return DispatchToWorkerThread(r);
48 }
49
50 NS_IMETHODIMP
Run()51 UrlClassifierDBServiceWorkerProxy::GetTablesRunnable::Run()
52 {
53 mTarget->GetTables(mCB);
54 return NS_OK;
55 }
56
57 NS_IMETHODIMP
SetHashCompleter(const nsACString &,nsIUrlClassifierHashCompleter *)58 UrlClassifierDBServiceWorkerProxy::SetHashCompleter
59 (const nsACString&, nsIUrlClassifierHashCompleter*)
60 {
61 NS_NOTREACHED("This method should not be called!");
62 return NS_ERROR_NOT_IMPLEMENTED;
63 }
64
65 NS_IMETHODIMP
BeginUpdate(nsIUrlClassifierUpdateObserver * aUpdater,const nsACString & aTables)66 UrlClassifierDBServiceWorkerProxy::BeginUpdate
67 (nsIUrlClassifierUpdateObserver* aUpdater,
68 const nsACString& aTables)
69 {
70 nsCOMPtr<nsIRunnable> r = new BeginUpdateRunnable(mTarget, aUpdater,
71 aTables);
72 return DispatchToWorkerThread(r);
73 }
74
75 NS_IMETHODIMP
Run()76 UrlClassifierDBServiceWorkerProxy::BeginUpdateRunnable::Run()
77 {
78 mTarget->BeginUpdate(mUpdater, mTables);
79 return NS_OK;
80 }
81
82 NS_IMETHODIMP
BeginStream(const nsACString & aTable)83 UrlClassifierDBServiceWorkerProxy::BeginStream(const nsACString& aTable)
84 {
85 nsCOMPtr<nsIRunnable> r =
86 new BeginStreamRunnable(mTarget, aTable);
87 return DispatchToWorkerThread(r);
88 }
89
90 NS_IMETHODIMP
Run()91 UrlClassifierDBServiceWorkerProxy::BeginStreamRunnable::Run()
92 {
93 mTarget->BeginStream(mTable);
94 return NS_OK;
95 }
96
97 NS_IMETHODIMP
UpdateStream(const nsACString & aUpdateChunk)98 UrlClassifierDBServiceWorkerProxy::UpdateStream(const nsACString& aUpdateChunk)
99 {
100 nsCOMPtr<nsIRunnable> r =
101 new UpdateStreamRunnable(mTarget, aUpdateChunk);
102 return DispatchToWorkerThread(r);
103 }
104
105 NS_IMETHODIMP
Run()106 UrlClassifierDBServiceWorkerProxy::UpdateStreamRunnable::Run()
107 {
108 mTarget->UpdateStream(mUpdateChunk);
109 return NS_OK;
110 }
111
112 NS_IMETHODIMP
FinishStream()113 UrlClassifierDBServiceWorkerProxy::FinishStream()
114 {
115 nsCOMPtr<nsIRunnable> r =
116 NewRunnableMethod(mTarget,
117 &nsUrlClassifierDBServiceWorker::FinishStream);
118 return DispatchToWorkerThread(r);
119 }
120
121 NS_IMETHODIMP
Run()122 UrlClassifierDBServiceWorkerProxy::DoLocalLookupRunnable::Run()
123 {
124 mTarget->DoLocalLookup(mSpec, mTables, mResults);
125 return NS_OK;
126 }
127
128 nsresult
DoLocalLookup(const nsACString & spec,const nsACString & tables,LookupResultArray * results)129 UrlClassifierDBServiceWorkerProxy::DoLocalLookup(const nsACString& spec,
130 const nsACString& tables,
131 LookupResultArray* results)
132
133 {
134 // Run synchronously on background thread. NS_DISPATCH_SYNC does *not* do
135 // what we want -- it continues processing events on the main thread loop
136 // before the Dispatch returns.
137 nsCOMPtr<nsIRunnable> r = new DoLocalLookupRunnable(mTarget, spec, tables, results);
138 nsIThread* t = nsUrlClassifierDBService::BackgroundThread();
139 if (!t)
140 return NS_ERROR_FAILURE;
141
142 mozilla::SyncRunnable::DispatchToThread(t, r);
143 return NS_OK;
144 }
145
146 NS_IMETHODIMP
FinishUpdate()147 UrlClassifierDBServiceWorkerProxy::FinishUpdate()
148 {
149 nsCOMPtr<nsIRunnable> r =
150 NewRunnableMethod(mTarget,
151 &nsUrlClassifierDBServiceWorker::FinishUpdate);
152 return DispatchToWorkerThread(r);
153 }
154
155 NS_IMETHODIMP
CancelUpdate()156 UrlClassifierDBServiceWorkerProxy::CancelUpdate()
157 {
158 nsCOMPtr<nsIRunnable> r =
159 NewRunnableMethod(mTarget,
160 &nsUrlClassifierDBServiceWorker::CancelUpdate);
161 return DispatchToWorkerThread(r);
162 }
163
164 NS_IMETHODIMP
ResetDatabase()165 UrlClassifierDBServiceWorkerProxy::ResetDatabase()
166 {
167 nsCOMPtr<nsIRunnable> r =
168 NewRunnableMethod(mTarget,
169 &nsUrlClassifierDBServiceWorker::ResetDatabase);
170 return DispatchToWorkerThread(r);
171 }
172
173 NS_IMETHODIMP
ReloadDatabase()174 UrlClassifierDBServiceWorkerProxy::ReloadDatabase()
175 {
176 nsCOMPtr<nsIRunnable> r =
177 NewRunnableMethod(mTarget,
178 &nsUrlClassifierDBServiceWorker::ReloadDatabase);
179 return DispatchToWorkerThread(r);
180 }
181
182 nsresult
OpenDb()183 UrlClassifierDBServiceWorkerProxy::OpenDb()
184 {
185 nsCOMPtr<nsIRunnable> r =
186 NewRunnableMethod(mTarget,
187 &nsUrlClassifierDBServiceWorker::OpenDb);
188 return DispatchToWorkerThread(r);
189 }
190
191 nsresult
CloseDb()192 UrlClassifierDBServiceWorkerProxy::CloseDb()
193 {
194 nsCOMPtr<nsIRunnable> r =
195 NewRunnableMethod(mTarget,
196 &nsUrlClassifierDBServiceWorker::CloseDb);
197 return DispatchToWorkerThread(r);
198 }
199
200 nsresult
CacheCompletions(CacheResultArray * aEntries)201 UrlClassifierDBServiceWorkerProxy::CacheCompletions(CacheResultArray * aEntries)
202 {
203 nsCOMPtr<nsIRunnable> r = new CacheCompletionsRunnable(mTarget, aEntries);
204 return DispatchToWorkerThread(r);
205 }
206
207 NS_IMETHODIMP
Run()208 UrlClassifierDBServiceWorkerProxy::CacheCompletionsRunnable::Run()
209 {
210 mTarget->CacheCompletions(mEntries);
211 return NS_OK;
212 }
213
214 nsresult
CacheMisses(PrefixArray * aEntries)215 UrlClassifierDBServiceWorkerProxy::CacheMisses(PrefixArray * aEntries)
216 {
217 nsCOMPtr<nsIRunnable> r = new CacheMissesRunnable(mTarget, aEntries);
218 return DispatchToWorkerThread(r);
219 }
220
221 NS_IMETHODIMP
Run()222 UrlClassifierDBServiceWorkerProxy::CacheMissesRunnable::Run()
223 {
224 mTarget->CacheMisses(mEntries);
225 return NS_OK;
226 }
227
228 NS_IMETHODIMP
SetLastUpdateTime(const nsACString & table,uint64_t lastUpdateTime)229 UrlClassifierDBServiceWorkerProxy::SetLastUpdateTime(const nsACString& table,
230 uint64_t lastUpdateTime)
231 {
232 nsCOMPtr<nsIRunnable> r =
233 new SetLastUpdateTimeRunnable(mTarget, table, lastUpdateTime);
234 return DispatchToWorkerThread(r);
235 }
236
237 NS_IMETHODIMP
Run()238 UrlClassifierDBServiceWorkerProxy::SetLastUpdateTimeRunnable::Run()
239 {
240 mTarget->SetLastUpdateTime(mTable, mUpdateTime);
241 return NS_OK;
242 }
243
244 NS_IMETHODIMP
ClearLastResults()245 UrlClassifierDBServiceWorkerProxy::ClearLastResults()
246 {
247 nsCOMPtr<nsIRunnable> r = new ClearLastResultsRunnable(mTarget);
248 return DispatchToWorkerThread(r);
249 }
250
251 NS_IMETHODIMP
Run()252 UrlClassifierDBServiceWorkerProxy::ClearLastResultsRunnable::Run()
253 {
254 return mTarget->ClearLastResults();
255 }
256
NS_IMPL_ISUPPORTS(UrlClassifierLookupCallbackProxy,nsIUrlClassifierLookupCallback)257 NS_IMPL_ISUPPORTS(UrlClassifierLookupCallbackProxy,
258 nsIUrlClassifierLookupCallback)
259
260 NS_IMETHODIMP
261 UrlClassifierLookupCallbackProxy::LookupComplete
262 (LookupResultArray * aResults)
263 {
264 nsCOMPtr<nsIRunnable> r = new LookupCompleteRunnable(mTarget, aResults);
265 return NS_DispatchToMainThread(r);
266 }
267
268 NS_IMETHODIMP
Run()269 UrlClassifierLookupCallbackProxy::LookupCompleteRunnable::Run()
270 {
271 mTarget->LookupComplete(mResults);
272 return NS_OK;
273 }
274
NS_IMPL_ISUPPORTS(UrlClassifierCallbackProxy,nsIUrlClassifierCallback)275 NS_IMPL_ISUPPORTS(UrlClassifierCallbackProxy,
276 nsIUrlClassifierCallback)
277
278 NS_IMETHODIMP
279 UrlClassifierCallbackProxy::HandleEvent(const nsACString& aValue)
280 {
281 nsCOMPtr<nsIRunnable> r = new HandleEventRunnable(mTarget, aValue);
282 return NS_DispatchToMainThread(r);
283 }
284
285 NS_IMETHODIMP
Run()286 UrlClassifierCallbackProxy::HandleEventRunnable::Run()
287 {
288 mTarget->HandleEvent(mValue);
289 return NS_OK;
290 }
291
NS_IMPL_ISUPPORTS(UrlClassifierUpdateObserverProxy,nsIUrlClassifierUpdateObserver)292 NS_IMPL_ISUPPORTS(UrlClassifierUpdateObserverProxy,
293 nsIUrlClassifierUpdateObserver)
294
295 NS_IMETHODIMP
296 UrlClassifierUpdateObserverProxy::UpdateUrlRequested
297 (const nsACString& aURL,
298 const nsACString& aTable)
299 {
300 nsCOMPtr<nsIRunnable> r =
301 new UpdateUrlRequestedRunnable(mTarget, aURL, aTable);
302 return NS_DispatchToMainThread(r);
303 }
304
305 NS_IMETHODIMP
Run()306 UrlClassifierUpdateObserverProxy::UpdateUrlRequestedRunnable::Run()
307 {
308 mTarget->UpdateUrlRequested(mURL, mTable);
309 return NS_OK;
310 }
311
312 NS_IMETHODIMP
StreamFinished(nsresult aStatus,uint32_t aDelay)313 UrlClassifierUpdateObserverProxy::StreamFinished(nsresult aStatus,
314 uint32_t aDelay)
315 {
316 nsCOMPtr<nsIRunnable> r =
317 new StreamFinishedRunnable(mTarget, aStatus, aDelay);
318 return NS_DispatchToMainThread(r);
319 }
320
321 NS_IMETHODIMP
Run()322 UrlClassifierUpdateObserverProxy::StreamFinishedRunnable::Run()
323 {
324 mTarget->StreamFinished(mStatus, mDelay);
325 return NS_OK;
326 }
327
328 NS_IMETHODIMP
UpdateError(nsresult aError)329 UrlClassifierUpdateObserverProxy::UpdateError(nsresult aError)
330 {
331 nsCOMPtr<nsIRunnable> r =
332 new UpdateErrorRunnable(mTarget, aError);
333 return NS_DispatchToMainThread(r);
334 }
335
336 NS_IMETHODIMP
Run()337 UrlClassifierUpdateObserverProxy::UpdateErrorRunnable::Run()
338 {
339 mTarget->UpdateError(mError);
340 return NS_OK;
341 }
342
343 NS_IMETHODIMP
UpdateSuccess(uint32_t aRequestedTimeout)344 UrlClassifierUpdateObserverProxy::UpdateSuccess(uint32_t aRequestedTimeout)
345 {
346 nsCOMPtr<nsIRunnable> r =
347 new UpdateSuccessRunnable(mTarget, aRequestedTimeout);
348 return NS_DispatchToMainThread(r);
349 }
350
351 NS_IMETHODIMP
Run()352 UrlClassifierUpdateObserverProxy::UpdateSuccessRunnable::Run()
353 {
354 mTarget->UpdateSuccess(mRequestedTimeout);
355 return NS_OK;
356 }
357