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