mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-16 13:56:29 +00:00
fixes bug 338248 "workaround bug 337492" r=tony
This commit is contained in:
parent
ff6ba2c143
commit
38559bb5f1
@ -71,6 +71,37 @@ static nsUrlClassifierDBService* sUrlClassifierDBService;
|
||||
// Thread that we do the updates on.
|
||||
static nsIThread* gDbBackgroundThread = nsnull;
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Wrapper for JS-implemented nsIUrlClassifierCallback that protects against
|
||||
// bug 337492. We should be able to remove this code once that bug is fixed.
|
||||
|
||||
#include "nsProxyRelease.h"
|
||||
|
||||
class nsUrlClassifierCallbackWrapper : public nsIUrlClassifierCallback
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_FORWARD_NSIURLCLASSIFIERCALLBACK(mInner->)
|
||||
|
||||
nsUrlClassifierCallbackWrapper(nsIUrlClassifierCallback *inner)
|
||||
: mInner(inner)
|
||||
{
|
||||
NS_ADDREF(mInner);
|
||||
}
|
||||
|
||||
~nsUrlClassifierCallbackWrapper()
|
||||
{
|
||||
nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
|
||||
NS_ProxyRelease(mainThread, mInner);
|
||||
}
|
||||
|
||||
private:
|
||||
nsIUrlClassifierCallback *mInner;
|
||||
};
|
||||
|
||||
NS_IMPL_THREADSAFE_ISUPPORTS1(nsUrlClassifierCallbackWrapper,
|
||||
nsIUrlClassifierCallback)
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Actual worker implemenatation
|
||||
class nsUrlClassifierDBServiceWorker : public nsIUrlClassifierDBServiceWorker
|
||||
@ -467,12 +498,16 @@ nsUrlClassifierDBService::Exists(const nsACString& tableName,
|
||||
{
|
||||
NS_ENSURE_TRUE(gDbBackgroundThread, NS_ERROR_NOT_INITIALIZED);
|
||||
|
||||
nsCOMPtr<nsIUrlClassifierCallback> wrapper =
|
||||
new nsUrlClassifierCallbackWrapper(c);
|
||||
NS_ENSURE_TRUE(wrapper, NS_ERROR_OUT_OF_MEMORY);
|
||||
|
||||
nsresult rv;
|
||||
// The proxy callback uses the current thread.
|
||||
nsCOMPtr<nsIUrlClassifierCallback> proxyCallback;
|
||||
rv = NS_GetProxyForObject(NS_PROXY_TO_CURRENT_THREAD,
|
||||
NS_GET_IID(nsIUrlClassifierCallback),
|
||||
c,
|
||||
wrapper,
|
||||
NS_PROXY_ASYNC,
|
||||
getter_AddRefs(proxyCallback));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
@ -495,12 +530,16 @@ nsUrlClassifierDBService::UpdateTables(const nsACString& updateString,
|
||||
{
|
||||
NS_ENSURE_TRUE(gDbBackgroundThread, NS_ERROR_NOT_INITIALIZED);
|
||||
|
||||
nsCOMPtr<nsIUrlClassifierCallback> wrapper =
|
||||
new nsUrlClassifierCallbackWrapper(c);
|
||||
NS_ENSURE_TRUE(wrapper, NS_ERROR_OUT_OF_MEMORY);
|
||||
|
||||
nsresult rv;
|
||||
// The proxy callback uses the current thread.
|
||||
nsCOMPtr<nsIUrlClassifierCallback> proxyCallback;
|
||||
rv = NS_GetProxyForObject(NS_PROXY_TO_CURRENT_THREAD,
|
||||
NS_GET_IID(nsIUrlClassifierCallback),
|
||||
c,
|
||||
wrapper,
|
||||
NS_PROXY_ASYNC,
|
||||
getter_AddRefs(proxyCallback));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
Loading…
x
Reference in New Issue
Block a user