From dee00f8b910245371b26eb927d1e6eadcec23c5d Mon Sep 17 00:00:00 2001 From: Benjamin Smedberg Date: Wed, 2 Nov 2011 21:06:51 -0700 Subject: [PATCH] Bug 675702: Call nsICertVerificationListener on the main thread, rev. 1, r=bsmith, r=mayhemer --- .../pki/resources/content/viewCertDetails.js | 18 +----------- security/manager/ssl/public/nsIX509Cert3.idl | 2 +- .../ssl/src/nsCertVerificationThread.cpp | 28 ++++++++++++++++++- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/security/manager/pki/resources/content/viewCertDetails.js b/security/manager/pki/resources/content/viewCertDetails.js index 1740befb5660..88b3d5dcf7fd 100644 --- a/security/manager/pki/resources/content/viewCertDetails.js +++ b/security/manager/pki/resources/content/viewCertDetails.js @@ -134,9 +134,7 @@ function setWindowName() if (cert instanceof nsIX509Cert3) { - cert.requestUsagesArrayAsync( - getProxyOnUIThread(new listener(), - Components.interfaces.nsICertVerificationListener)); + cert.requestUsagesArrayAsync(new listener()); } } @@ -316,20 +314,6 @@ function updateCertDump() displaySelected(); } -function getProxyOnUIThread(aObject, aInterface) { - var mainThread = Components. - classes["@mozilla.org/thread-manager;1"]. - getService().mainThread; - - var proxyMgr = Components. - classes["@mozilla.org/xpcomproxy;1"]. - getService(Components.interfaces.nsIProxyObjectManager); - - return proxyMgr.getProxyForObject(mainThread, - aInterface, aObject, 5); - // 5 == NS_PROXY_ALWAYS | NS_PROXY_SYNC -} - function getCurrentCert() { var realIndex; diff --git a/security/manager/ssl/public/nsIX509Cert3.idl b/security/manager/ssl/public/nsIX509Cert3.idl index a46439bd4a70..93ff438929fb 100644 --- a/security/manager/ssl/public/nsIX509Cert3.idl +++ b/security/manager/ssl/public/nsIX509Cert3.idl @@ -57,7 +57,7 @@ interface nsIX509Cert3 : nsIX509Cert2 { * Async version of nsIX509Cert::getUsagesArray() * * Will not block, will request results asynchronously, - * availability of results will be notified. + * availability of results will be notified on the main thread. */ void requestUsagesArrayAsync(in nsICertVerificationListener cvl); diff --git a/security/manager/ssl/src/nsCertVerificationThread.cpp b/security/manager/ssl/src/nsCertVerificationThread.cpp index b506cd007f90..a5c3c999a67e 100644 --- a/security/manager/ssl/src/nsCertVerificationThread.cpp +++ b/security/manager/ssl/src/nsCertVerificationThread.cpp @@ -38,6 +38,7 @@ #include "nsMemory.h" #include "nsAutoPtr.h" #include "nsCertVerificationThread.h" +#include "nsThreadUtils.h" using namespace mozilla; @@ -45,6 +46,30 @@ nsCertVerificationThread *nsCertVerificationThread::verification_thread_singleto NS_IMPL_THREADSAFE_ISUPPORTS1(nsCertVerificationResult, nsICertVerificationResult) +namespace { +class DispatchCertVerificationResult : public nsRunnable +{ +public: + DispatchCertVerificationResult(nsICertVerificationListener* aListener, + nsIX509Cert3* aCert, + nsICertVerificationResult* aResult) + : mListener(aListener) + , mCert(aCert) + , mResult(aResult) + { } + + NS_IMETHOD Run() { + mListener->Notify(mCert, mResult); + return NS_OK; + } + +private: + nsCOMPtr mListener; + nsCOMPtr mCert; + nsCOMPtr mResult; +}; +} // anonymous namespace + void nsCertVerificationJob::Run() { if (!mListener || !mCert) @@ -74,7 +99,8 @@ void nsCertVerificationJob::Run() } nsCOMPtr c3 = do_QueryInterface(mCert); - mListener->Notify(c3, ires); + nsCOMPtr r = new DispatchCertVerificationResult(mListener, c3, ires); + NS_DispatchToMainThread(r); } void nsSMimeVerificationJob::Run()