зеркало из https://github.com/mozilla/gecko-dev.git
Fix for Bug 66939.
This commit is contained in:
Родитель
a7c109086e
Коммит
f8401a3ea7
|
@ -64,6 +64,9 @@
|
||||||
|
|
||||||
#include "nsIDOMWindow.h"
|
#include "nsIDOMWindow.h"
|
||||||
|
|
||||||
|
#include "nsIObserverService.h"
|
||||||
|
#include "nsIProfileChangeStatus.h"
|
||||||
|
|
||||||
#define PSM_VERSION_REG_KEY "/Netscape/Personal Security Manager"
|
#define PSM_VERSION_REG_KEY "/Netscape/Personal Security Manager"
|
||||||
|
|
||||||
#if defined(WIN32) || defined(XP_OS2)
|
#if defined(WIN32) || defined(XP_OS2)
|
||||||
|
@ -74,7 +77,6 @@
|
||||||
#define PSM_FILE_NAME "psm"
|
#define PSM_FILE_NAME "psm"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static NS_DEFINE_CID(kCStringBundleServiceCID, NS_STRINGBUNDLESERVICE_CID);
|
static NS_DEFINE_CID(kCStringBundleServiceCID, NS_STRINGBUNDLESERVICE_CID);
|
||||||
static NS_DEFINE_CID(kProfileCID, NS_PROFILE_CID);
|
static NS_DEFINE_CID(kProfileCID, NS_PROFILE_CID);
|
||||||
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
|
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
|
||||||
|
@ -87,6 +89,7 @@ nsPSMComponent::nsPSMComponent()
|
||||||
NS_INIT_REFCNT();
|
NS_INIT_REFCNT();
|
||||||
mControl = nsnull;
|
mControl = nsnull;
|
||||||
mCertContentListener = nsnull;
|
mCertContentListener = nsnull;
|
||||||
|
mEventLoopThread = nsnull;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsPSMComponent::~nsPSMComponent()
|
nsPSMComponent::~nsPSMComponent()
|
||||||
|
@ -123,8 +126,10 @@ nsPSMComponent::CreatePSMComponent(nsISupports* aOuter, REFNSIID aIID, void **aR
|
||||||
if (mInstance == nsnull)
|
if (mInstance == nsnull)
|
||||||
{
|
{
|
||||||
mInstance = new nsPSMComponent();
|
mInstance = new nsPSMComponent();
|
||||||
if (mInstance)
|
if (mInstance) {
|
||||||
mInstance->RegisterCertContentListener();
|
mInstance->RegisterCertContentListener();
|
||||||
|
mInstance->RegisterProfileChangeObserver();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mInstance == nsnull)
|
if (mInstance == nsnull)
|
||||||
|
@ -152,13 +157,31 @@ nsPSMComponent::RegisterCertContentListener()
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsPSMComponent::RegisterProfileChangeObserver()
|
||||||
|
{
|
||||||
|
nsresult rv;
|
||||||
|
NS_WITH_SERVICE(nsIObserverService, observerService, NS_OBSERVERSERVICE_CONTRACTID, &rv);
|
||||||
|
NS_ASSERTION(observerService, "could not get observer service");
|
||||||
|
if (observerService) {
|
||||||
|
// Our refcnt must be > 0 when we call AddObserver or we'll get deleted.
|
||||||
|
++mRefCnt;
|
||||||
|
observerService->AddObserver(this, PROFILE_BEFORE_CHANGE_TOPIC);
|
||||||
|
--mRefCnt;
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* nsISupports Implementation for the class */
|
/* nsISupports Implementation for the class */
|
||||||
NS_IMPL_THREADSAFE_ISUPPORTS5(nsPSMComponent,
|
NS_IMPL_THREADSAFE_ISUPPORTS7(nsPSMComponent,
|
||||||
nsIPSMComponent,
|
nsIPSMComponent,
|
||||||
nsISecurityManagerComponent,
|
nsISecurityManagerComponent,
|
||||||
nsIContentHandler,
|
nsIContentHandler,
|
||||||
nsISignatureVerifier,
|
nsISignatureVerifier,
|
||||||
nsIEntropyCollector);
|
nsIEntropyCollector,
|
||||||
|
nsIObserver,
|
||||||
|
nsISupportsWeakReference);
|
||||||
|
|
||||||
#define INIT_NUM_PREFS 100
|
#define INIT_NUM_PREFS 100
|
||||||
/* preference types */
|
/* preference types */
|
||||||
|
@ -612,7 +635,7 @@ nsPSMComponent::GetControlConnection( CMT_CONTROL * *_retval )
|
||||||
if (psmStatus == CMTFailure)
|
if (psmStatus == CMTFailure)
|
||||||
goto failure;
|
goto failure;
|
||||||
|
|
||||||
if (InitPSMEventLoop(mControl) != PR_SUCCESS)
|
if (InitPSMEventLoop(mControl, &mEventLoopThread) != PR_SUCCESS)
|
||||||
goto failure;
|
goto failure;
|
||||||
|
|
||||||
if (NS_FAILED(PassPrefs()))
|
if (NS_FAILED(PassPrefs()))
|
||||||
|
@ -1194,3 +1217,23 @@ nsPSMComponent::RandomUpdate(void *entropy, PRInt32 bufLen)
|
||||||
}
|
}
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsPSMComponent::Observe(nsISupports *aSubject, const PRUnichar *aTopic, const PRUnichar *someData)
|
||||||
|
{
|
||||||
|
if (nsCRT::strcmp(aTopic, PROFILE_BEFORE_CHANGE_TOPIC) == 0) {
|
||||||
|
|
||||||
|
// The profile is about to change - close our control connection if we have one.
|
||||||
|
// Next time PSM is needed, we'll make a new control connection which
|
||||||
|
// will use the new profile dir.
|
||||||
|
if (mEventLoopThread) {
|
||||||
|
PR_Interrupt(mEventLoopThread);
|
||||||
|
mEventLoopThread = nsnull;
|
||||||
|
}
|
||||||
|
if (mControl) {
|
||||||
|
CMT_CloseControlConnection(mControl);
|
||||||
|
mControl = nsnull;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#ifndef _NSPSMCOMPONENT_H
|
#ifndef _NSPSMCOMPONENT_H
|
||||||
#define _NSPSMCOMPONENT_H
|
#define _NSPSMCOMPONENT_H
|
||||||
#include "nscore.h"
|
#include "nscore.h"
|
||||||
|
#include "prthread.h"
|
||||||
#include "nsIPSMComponent.h"
|
#include "nsIPSMComponent.h"
|
||||||
#include "nsISignatureVerifier.h"
|
#include "nsISignatureVerifier.h"
|
||||||
#include "nsIStringBundle.h"
|
#include "nsIStringBundle.h"
|
||||||
|
@ -32,6 +33,9 @@
|
||||||
#include "nsIURIContentListener.h"
|
#include "nsIURIContentListener.h"
|
||||||
#include "nsIEntropyCollector.h"
|
#include "nsIEntropyCollector.h"
|
||||||
|
|
||||||
|
#include "nsIObserver.h"
|
||||||
|
#include "nsWeakReference.h"
|
||||||
|
|
||||||
#define SECURITY_STRING_BUNDLE_URL "chrome://communicator/locale/security.properties"
|
#define SECURITY_STRING_BUNDLE_URL "chrome://communicator/locale/security.properties"
|
||||||
|
|
||||||
#define NS_PSMCOMPONENT_CID {0xddcae170, 0x5412, 0x11d3, {0xbb, 0xc8, 0x00, 0x00, 0x86, 0x1d, 0x12, 0x37}}
|
#define NS_PSMCOMPONENT_CID {0xddcae170, 0x5412, 0x11d3, {0xbb, 0xc8, 0x00, 0x00, 0x86, 0x1d, 0x12, 0x37}}
|
||||||
|
@ -60,7 +64,9 @@ private:
|
||||||
class nsPSMComponent : public nsIPSMComponent,
|
class nsPSMComponent : public nsIPSMComponent,
|
||||||
public nsIContentHandler,
|
public nsIContentHandler,
|
||||||
public nsISignatureVerifier,
|
public nsISignatureVerifier,
|
||||||
public nsIEntropyCollector
|
public nsIEntropyCollector,
|
||||||
|
public nsIObserver,
|
||||||
|
public nsSupportsWeakReference
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NS_DEFINE_STATIC_CID_ACCESSOR( NS_PSMCOMPONENT_CID );
|
NS_DEFINE_STATIC_CID_ACCESSOR( NS_PSMCOMPONENT_CID );
|
||||||
|
@ -74,12 +80,15 @@ public:
|
||||||
NS_DECL_NSICONTENTHANDLER
|
NS_DECL_NSICONTENTHANDLER
|
||||||
NS_DECL_NSISIGNATUREVERIFIER
|
NS_DECL_NSISIGNATUREVERIFIER
|
||||||
NS_DECL_NSIENTROPYCOLLECTOR
|
NS_DECL_NSIENTROPYCOLLECTOR
|
||||||
|
NS_DECL_NSIOBSERVER
|
||||||
|
|
||||||
static NS_METHOD CreatePSMComponent(nsISupports* aOuter, REFNSIID aIID, void **aResult);
|
static NS_METHOD CreatePSMComponent(nsISupports* aOuter, REFNSIID aIID, void **aResult);
|
||||||
nsresult RegisterCertContentListener();
|
nsresult RegisterCertContentListener();
|
||||||
|
nsresult RegisterProfileChangeObserver();
|
||||||
private:
|
private:
|
||||||
|
|
||||||
PCMT_CONTROL mControl;
|
PCMT_CONTROL mControl;
|
||||||
|
PRThread *mEventLoopThread;
|
||||||
|
|
||||||
nsCOMPtr<nsISupports> mSecureBrowserIU;
|
nsCOMPtr<nsISupports> mSecureBrowserIU;
|
||||||
nsCOMPtr<nsIURIContentListener> mCertContentListener;
|
nsCOMPtr<nsIURIContentListener> mCertContentListener;
|
||||||
|
|
|
@ -207,9 +207,12 @@ extern "C" void CARTMAN_UIEventLoop(void *data)
|
||||||
CMT_EventLoop((PCMT_CONTROL)data);
|
CMT_EventLoop((PCMT_CONTROL)data);
|
||||||
}
|
}
|
||||||
|
|
||||||
PRStatus InitPSMEventLoop(PCMT_CONTROL control)
|
PRStatus InitPSMEventLoop(PCMT_CONTROL control, PRThread **aThread)
|
||||||
{
|
{
|
||||||
PR_CreateThread(PR_USER_THREAD,
|
if (!aThread)
|
||||||
|
return PR_FAILURE;
|
||||||
|
|
||||||
|
*aThread = PR_CreateThread(PR_USER_THREAD,
|
||||||
CARTMAN_UIEventLoop,
|
CARTMAN_UIEventLoop,
|
||||||
control,
|
control,
|
||||||
PR_PRIORITY_NORMAL,
|
PR_PRIORITY_NORMAL,
|
||||||
|
@ -217,7 +220,7 @@ PRStatus InitPSMEventLoop(PCMT_CONTROL control)
|
||||||
PR_UNJOINABLE_THREAD,
|
PR_UNJOINABLE_THREAD,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
return PR_SUCCESS;
|
return *aThread ? PR_SUCCESS : PR_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
PRStatus InitPSMUICallbacks(PCMT_CONTROL control)
|
PRStatus InitPSMUICallbacks(PCMT_CONTROL control)
|
||||||
|
|
|
@ -27,12 +27,13 @@
|
||||||
|
|
||||||
#include "prtypes.h"
|
#include "prtypes.h"
|
||||||
#include "cmtcmn.h"
|
#include "cmtcmn.h"
|
||||||
|
#include "prthread.h"
|
||||||
|
|
||||||
#include "nsIPSMUIHandler.h"
|
#include "nsIPSMUIHandler.h"
|
||||||
#include "nsIDOMWindow.h"
|
#include "nsIDOMWindow.h"
|
||||||
|
|
||||||
PRStatus InitPSMUICallbacks(PCMT_CONTROL gControl);
|
PRStatus InitPSMUICallbacks(PCMT_CONTROL gControl);
|
||||||
PRStatus InitPSMEventLoop(PCMT_CONTROL gControl);
|
PRStatus InitPSMEventLoop(PCMT_CONTROL gControl, PRThread **aThread);
|
||||||
PRStatus DisplayPSMUIDialog(PCMT_CONTROL control, const char* pickledStatus, const char *hostName, nsIDOMWindow * window);
|
PRStatus DisplayPSMUIDialog(PCMT_CONTROL control, const char* pickledStatus, const char *hostName, nsIDOMWindow * window);
|
||||||
|
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче