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