Bug 270248 - Cleanup string usage in wallet code.

r=cbiesinger@gmx.at, sr=darin@meer.net
This commit is contained in:
pkw%us.ibm.com 2004-12-06 13:55:12 +00:00
parent b054af0265
commit 959f87b8a9
9 changed files with 75 additions and 130 deletions

View File

@ -47,6 +47,7 @@
#include "nsIDocShell.h"
#include "nsIScriptGlobalObject.h"
#include "nsWalletEditor.h"
#include "nsString.h"
static NS_DEFINE_IID(kWalletServiceCID, NS_WALLETSERVICE_CID);

View File

@ -38,8 +38,6 @@
#include "nsISupports.idl"
%{ C++
#include "nsString.h"
// {738CFD52-ABCF-11d2-AB4B-0080C787AD96}
#define NS_WALLETSERVICE_CID \
{ 0x738cfd52, 0xabcf, 0x11d2, { 0xab, 0x4b, 0x0, 0x80, 0xc7, 0x87, 0xad, 0x96 } }
@ -52,37 +50,31 @@ interface nsIDOMNode;
interface nsIDOMWindowInternal;
interface nsIPrompt;
native nsAutoString(nsAutoString);
[ref] native nsAutoStringRef(nsAutoString);
/**
* The nsIWalletService interface provides an API to the wallet service.
* This is a preliminary interface which <B>will</B> change over time!
*
*/
[scriptable, uuid(738CFD51-ABCF-11d2-AB4B-0080C787AD96)]
[scriptable, uuid(FEDBF066-9C29-4307-86B1-2C0F69717FC5)]
interface nsIWalletService : nsISupports {
[noscript]void WALLET_PreEdit(in nsAutoStringRef walletList);
[noscript]void WALLET_PostEdit(in nsAutoString walletList);
void WALLET_PreEdit(out AString walletList);
void WALLET_PostEdit(in AString walletList);
boolean WALLET_ChangePassword();
void WALLET_DeleteAll();
unsigned long WALLET_RequestToCapture(in nsIDOMWindowInternal win);
boolean WALLET_Prefill(in boolean quick, in nsIDOMWindowInternal win);
wstring WALLET_PrefillOneElement
(in nsIDOMWindowInternal win, in nsIDOMNode elementNode);
[noscript]void WALLET_PrefillReturn(in nsAutoString results);
void WALLET_PrefillReturn(in AString results);
boolean WALLET_ExpirePassword();
void WALLET_InitReencryptCallback(in nsIDOMWindowInternal win);
void SI_RemoveUser(in string key, in wstring userName); // !!! get rid of this
void SI_StorePassword(in string key, in wstring userName, in wstring pwd); // !!! get rid of this
boolean haveData(in nsIPrompt dialog, in string key, in wstring userName);
[noscript] void WALLET_GetNopreviewListForViewer(in nsAutoStringRef aNopreviewList);
[noscript] void WALLET_GetNocaptureListForViewer(in nsAutoStringRef aNocaptureList);
[noscript] void WALLET_GetPrefillListForViewer(in nsAutoStringRef aPrefillList);
[noscript] void SI_SignonViewerReturn(in nsAutoString results);
void WALLET_GetNopreviewListForViewer(out AString aNopreviewList);
void WALLET_GetNocaptureListForViewer(out AString aNocaptureList);
void WALLET_GetPrefillListForViewer(out AString aPrefillList);
void SI_SignonViewerReturn(in AString results);
string WALLET_Encrypt(in wstring text);
wstring WALLET_Decrypt(in string crypt);

View File

@ -47,6 +47,7 @@
#include "nsReadableUtils.h"
#include "nsIScriptGlobalObject.h"
#include "nsSignonViewer.h"
#include "nsString.h"
static NS_DEFINE_IID(kWalletServiceCID, NS_WALLETSERVICE_CID);

View File

@ -94,12 +94,12 @@ NS_IMPL_THREADSAFE_ISUPPORTS5(nsWalletlibService,
nsIWebProgressListener,
nsISupportsWeakReference)
NS_IMETHODIMP nsWalletlibService::WALLET_PreEdit(nsAutoString& walletList) {
NS_IMETHODIMP nsWalletlibService::WALLET_PreEdit(nsAString& walletList) {
::WLLT_PreEdit(walletList);
return NS_OK;
}
NS_IMETHODIMP nsWalletlibService::WALLET_PostEdit(nsAutoString walletList) {
NS_IMETHODIMP nsWalletlibService::WALLET_PostEdit(const nsAString & walletList) {
::WLLT_PostEdit(walletList);
return NS_OK;
}
@ -157,7 +157,7 @@ nsWalletlibService::WALLET_Prefill(PRBool quick,
return ::WLLT_Prefill(presShell, quick, aWin);
}
NS_IMETHODIMP nsWalletlibService::WALLET_PrefillReturn(nsAutoString results){
NS_IMETHODIMP nsWalletlibService::WALLET_PrefillReturn(const nsAString & results){
::WLLT_PrefillReturn(results);
return NS_OK;
}
@ -173,33 +173,23 @@ NS_IMETHODIMP nsWalletlibService::WALLET_InitReencryptCallback(nsIDOMWindowInter
return NS_OK;
}
NS_IMETHODIMP nsWalletlibService::SI_RemoveUser(const char *key, const PRUnichar *userName) {
::SINGSIGN_RemoveUser(key, userName, PR_TRUE);
return NS_OK;
}
NS_IMETHODIMP nsWalletlibService::SI_StorePassword(const char *key, const PRUnichar *userName, const PRUnichar *password) {
::SINGSIGN_StorePassword(key, userName, password);
return NS_OK;
}
NS_IMETHODIMP nsWalletlibService::WALLET_GetNopreviewListForViewer(nsAutoString& aNopreviewList){
NS_IMETHODIMP nsWalletlibService::WALLET_GetNopreviewListForViewer(nsAString& aNopreviewList){
::WLLT_GetNopreviewListForViewer(aNopreviewList);
return NS_OK;
}
NS_IMETHODIMP nsWalletlibService::WALLET_GetNocaptureListForViewer(nsAutoString& aNocaptureList){
NS_IMETHODIMP nsWalletlibService::WALLET_GetNocaptureListForViewer(nsAString& aNocaptureList){
::WLLT_GetNocaptureListForViewer(aNocaptureList);
return NS_OK;
}
NS_IMETHODIMP nsWalletlibService::WALLET_GetPrefillListForViewer(nsAutoString& aPrefillList){
NS_IMETHODIMP nsWalletlibService::WALLET_GetPrefillListForViewer(nsAString& aPrefillList){
::WLLT_GetPrefillListForViewer(aPrefillList);
return NS_OK;
}
NS_IMETHODIMP nsWalletlibService::SI_SignonViewerReturn(nsAutoString results){
::SINGSIGN_SignonViewerReturn(results);
NS_IMETHODIMP nsWalletlibService::SI_SignonViewerReturn(const nsAString& results){
::Wallet_SignonViewerReturn(results);
return NS_OK;
}
@ -219,7 +209,7 @@ NS_IMETHODIMP nsWalletlibService::Observe(nsISupports *aSubject, const char *aTo
if (uri) {
nsCAutoString spec;
if (NS_SUCCEEDED(uri->GetSpec(spec)))
SI_StorePassword(spec.get(), nsnull, someData);
SINGSIGN_StorePassword(spec.get(), nsnull, someData);
}
}
else if (!nsCRT::strcmp(aTopic, "login-failed")) {

View File

@ -625,23 +625,10 @@ si_Randomize(nsString& password) {
* Encryption Routines *
***********************/
// don't understand why linker doesn't let me call Wallet_Encrypt and Wallet_Decrypt
// directly but it doesn't. Need to introduce Wallet_Enctrypt2 and Wallet_Decrypt2 instead.
static nsresult
si_Encrypt (const nsString& text, nsString& crypt) {
return Wallet_Encrypt2(text, crypt);
}
static nsresult
si_Decrypt (const nsString& crypt, nsString& text) {
return Wallet_Decrypt2(crypt, text);
}
static PRBool
si_CompareEncryptedToCleartext(const nsString& crypt, const nsString& text) {
nsAutoString decrypted;
if (NS_FAILED(si_Decrypt(crypt, decrypted))) {
if (NS_FAILED(Wallet_Decrypt(crypt, decrypted))) {
return PR_FALSE;
}
return (decrypted == text);
@ -651,10 +638,10 @@ static PRBool
si_CompareEncryptedToEncrypted(const nsString& crypt1, const nsString& crypt2) {
nsAutoString decrypted1;
nsAutoString decrypted2;
if (NS_FAILED(si_Decrypt(crypt1, decrypted1))) {
if (NS_FAILED(Wallet_Decrypt(crypt1, decrypted1))) {
return PR_FALSE;
}
if (NS_FAILED(si_Decrypt(crypt2, decrypted2))) {
if (NS_FAILED(Wallet_Decrypt(crypt2, decrypted2))) {
return PR_FALSE;
}
return (decrypted1 == decrypted2);
@ -1197,7 +1184,7 @@ si_GetUser(nsIPrompt* dialog, const char* passwordRealm, const char *legacyRealm
}
nsAutoString userName;
data = si_GetFirstNonPasswordData(user);
if (NS_SUCCEEDED(si_Decrypt (data->value, userName))) {
if (NS_SUCCEEDED(Wallet_Decrypt (data->value, userName))) {
*(list2++) = ToNewUnicode(userName);
*(users2++) = user;
user_count++;
@ -1371,7 +1358,7 @@ si_GetURLAndUserForChangeForm(nsIPrompt* dialog, const nsString& password)
user->signonData_list.ElementAt(0));
nsAutoString userName;
if (NS_SUCCEEDED(si_Decrypt (data->value, userName))) {
if (NS_SUCCEEDED(Wallet_Decrypt (data->value, userName))) {
nsAutoString temp; temp.AssignASCII(url->passwordRealm); // XXX non-ascii realms?
temp.AppendLiteral(":");
temp.Append(userName);
@ -2300,7 +2287,7 @@ si_RememberSignonData
for (j=0; j<signonData->Count(); j++) {
data2 = NS_STATIC_CAST(si_SignonDataStruct*, signonData->ElementAt(j));
nsAutoString value(data2->value);
if (NS_FAILED(si_Encrypt(value, data2->value))) {
if (NS_FAILED(Wallet_Encrypt(value, data2->value))) {
return;
}
}
@ -2357,7 +2344,7 @@ si_RememberSignonData
// si_Randomize(data1->value);
// data2->value = data1->value;
if (NS_SUCCEEDED(si_Encrypt(data1->value, data->value))) {
if (NS_SUCCEEDED(Wallet_Encrypt(data1->value, data->value))) {
user->time = SecondsFromPRTime(PR_Now());
si_signon_list_changed = PR_TRUE;
si_SaveSignonDataLocked("signons", PR_TRUE);
@ -2463,7 +2450,7 @@ si_RestoreSignonData(nsIPrompt* dialog,
data = NS_STATIC_CAST(si_SignonDataStruct*, user->signonData_list.ElementAt(i));
if (data->isPassword) {
nsAutoString password;
if (NS_SUCCEEDED(si_Decrypt(data->value, password))) {
if (NS_SUCCEEDED(Wallet_Decrypt(data->value, password))) {
*value = ToNewUnicode(password);
}
si_unlock_signon_list();
@ -2487,7 +2474,7 @@ si_RestoreSignonData(nsIPrompt* dialog,
NS_LossyConvertUCS2toASCII(data->value).get()));
if(!correctedName.IsEmpty() && (data->name == correctedName)) {
nsAutoString password;
if (NS_SUCCEEDED(si_Decrypt(data->value, password))) {
if (NS_SUCCEEDED(Wallet_Decrypt(data->value, password))) {
*value = ToNewUnicode(password);
}
si_unlock_signon_list();
@ -2532,14 +2519,14 @@ si_RememberSignonDataFromBrowser(const char* passwordRealm, const nsString& user
nsVoidArray signonData;
si_SignonDataStruct data1;
data1.name.AssignLiteral(USERNAMEFIELD);
if (NS_FAILED(si_Encrypt(nsAutoString(username), data1.value))) {
if (NS_FAILED(Wallet_Encrypt(username, data1.value))) {
return;
}
data1.isPassword = PR_FALSE;
signonData.AppendElement(&data1);
si_SignonDataStruct data2;
data2.name.AssignLiteral(PASSWORDFIELD);
if (NS_FAILED(si_Encrypt(nsAutoString(password), data2.value))) {
if (NS_FAILED(Wallet_Encrypt(password, data2.value))) {
return;
}
data2.isPassword = PR_TRUE;
@ -2580,7 +2567,7 @@ si_RestoreOldSignonDataFromBrowser
for (PRInt32 i=0; i<dataCount; i++) {
data = NS_STATIC_CAST(si_SignonDataStruct*, user->signonData_list.ElementAt(i));
nsAutoString decrypted;
if (NS_SUCCEEDED(si_Decrypt(data->value, decrypted))) {
if (NS_SUCCEEDED(Wallet_Decrypt(data->value, decrypted))) {
if(data->name.EqualsLiteral(USERNAMEFIELD)) {
username = decrypted;
} else if(data->name.EqualsLiteral(PASSWORDFIELD)) {
@ -2890,12 +2877,6 @@ SI_FindValueInArgs(const nsAString& results, const nsAString& name, nsAString& v
value = Substring(start, barPos);
}
void
SINGSIGN_SignonViewerReturn(const nsString& results) {
/* give wallet a chance to do its deletions */
Wallet_SignonViewerReturn(results);
}
PRBool
SINGSIGN_ReencryptAll()
{
@ -2920,11 +2901,11 @@ SINGSIGN_ReencryptAll()
data = NS_STATIC_CAST(si_SignonDataStruct *,
user->signonData_list.ElementAt(k));
nsAutoString userName;
if (NS_FAILED(si_Decrypt(data->value, userName))) {
if (NS_FAILED(Wallet_Decrypt(data->value, userName))) {
//Don't try to re-encrypt. Just go to the next one.
continue;
}
if (NS_FAILED(si_Encrypt(userName, data->value))) {
if (NS_FAILED(Wallet_Encrypt(userName, data->value))) {
return PR_FALSE;
}
}
@ -3021,7 +3002,7 @@ SINGSIGN_Enumerate
nsresult rv;
nsAutoString userName;
if (decrypt) {
rv = si_Decrypt(data->value, userName);
rv = Wallet_Decrypt(data->value, userName);
if (NS_FAILED(rv)) {
/* don't display saved signons if user couldn't unlock the database */
return rv;
@ -3043,7 +3024,7 @@ SINGSIGN_Enumerate
nsAutoString passWord;
if (decrypt) {
rv = si_Decrypt(data->value, passWord);
rv = Wallet_Decrypt(data->value, passWord);
if (NS_FAILED(rv)) {
/* don't display saved signons if user couldn't unlock the database */
Recycle(*user);

View File

@ -75,9 +75,6 @@ SINGSIGN_Enumerate
extern nsresult
SINGSIGN_RejectEnumerate(PRInt32 rejectNumber, char **host);
extern void
SINGSIGN_SignonViewerReturn(const nsString& results);
extern void
SINGSIGN_RestoreSignonData(nsIPrompt* dialog, nsIURI* passwordRealm, const PRUnichar* name, PRUnichar** value, PRUint32 formNumber, PRUint32 elementNumber);

View File

@ -90,10 +90,10 @@ PRLogModuleInfo* gWalletLog = nsnull;
/* The following data and procedures are for preference */
/********************************************************/
static const char *pref_Caveat = "wallet.caveat";
static const char *pref_captureForms = "wallet.captureForms";
static const char *pref_enabled = "wallet.enabled";
static const char *pref_WalletSchemaValueFileName = "wallet.SchemaValueFileName";
static const char pref_Caveat[] = "wallet.caveat";
static const char pref_captureForms[] = "wallet.captureForms";
static const char pref_enabled[] = "wallet.enabled";
static const char pref_WalletSchemaValueFileName[] = "wallet.SchemaValueFileName";
static PRBool wallet_captureForms = PR_FALSE;
@ -772,7 +772,7 @@ wallet_Decrypt(const nsCString& crypt, nsCString& text) {
}
nsresult
Wallet_Encrypt (const nsString& textUCS2, nsString& cryptUCS2) {
Wallet_Encrypt (const nsAString& textUCS2, nsAString& cryptUCS2) {
nsCAutoString cryptUTF8;
nsresult rv = wallet_Encrypt(NS_ConvertUCS2toUTF8(textUCS2), cryptUTF8);
CopyUTF8toUTF16(cryptUTF8, cryptUCS2);
@ -780,25 +780,13 @@ Wallet_Encrypt (const nsString& textUCS2, nsString& cryptUCS2) {
}
nsresult
Wallet_Decrypt(const nsString& cryptUCS2, nsString& textUCS2) {
Wallet_Decrypt(const nsAString& cryptUCS2, nsAString& textUCS2) {
nsCAutoString textUTF8;
nsresult rv = wallet_Decrypt(NS_ConvertUCS2toUTF8(cryptUCS2), textUTF8);
CopyUTF8toUTF16(textUTF8, textUCS2);
return rv;
}
nsresult
Wallet_Encrypt2(const nsString& text, nsString& crypt)
{
return Wallet_Encrypt (text, crypt);
}
nsresult
Wallet_Decrypt2 (const nsString& crypt, nsString& text)
{
return Wallet_Decrypt (crypt, text);
}
/**********************************************************/
/* The following routines are for accessing the data base */
@ -1054,15 +1042,15 @@ wallet_ReadFromList(
char* schemaValueFileName = nsnull;
const char URLFileName[] = "URL.tbl";
const char allFileName[] = "wallet.tbl";
const char fieldSchemaFileName[] = "FieldSchema.tbl";
const char vcardSchemaFileName[] = "VcardSchema.tbl";
const char schemaConcatFileName[] = "SchemaConcat.tbl";
const char schemaStringsFileName[] = "SchemaStrings.tbl";
const char positionalSchemaFileName[] = "PositionalSchema.tbl";
const char stateSchemaFileName[] = "StateSchema.tbl";
const char distinguishedSchemaFileName[] = "DistinguishedSchema.tbl";
static const char URLFileName[] = "URL.tbl";
static const char allFileName[] = "wallet.tbl";
static const char fieldSchemaFileName[] = "FieldSchema.tbl";
static const char vcardSchemaFileName[] = "VcardSchema.tbl";
static const char schemaConcatFileName[] = "SchemaConcat.tbl";
static const char schemaStringsFileName[] = "SchemaStrings.tbl";
static const char positionalSchemaFileName[] = "PositionalSchema.tbl";
static const char stateSchemaFileName[] = "StateSchema.tbl";
static const char distinguishedSchemaFileName[] = "DistinguishedSchema.tbl";
/******************************************************/
@ -1108,7 +1096,7 @@ Wallet_RandomName(char* suffix)
*/
nsresult
wallet_GetLine(nsIInputStream* strm, nsCString &line)
wallet_GetLine(nsIInputStream* strm, nsACString &line)
{
line.Truncate();
@ -2476,7 +2464,7 @@ nsVoidArray * wallet_list;
nsAutoString wallet_url;
void
WLLT_GetPrefillListForViewer(nsString& aPrefillList)
WLLT_GetPrefillListForViewer(nsAString& aPrefillList)
{
wallet_Initialize(PR_FALSE); /* to initialize helpMac */
wallet_PrefillElement * prefillElementPtr;
@ -2507,13 +2495,13 @@ wallet_FreeURL(wallet_MapElement *url) {
PR_Free(url);
}
const char* permission_NoCapture_NoPreview = "yy";
const char* permission_NoCapture_Preview = "yn";
const char* permission_Capture_NoPreview = "ny";
const char* permission_Capture_Preview = "nn";
static const char permission_NoCapture_NoPreview[] = "yy";
static const char permission_NoCapture_Preview[] = "yn";
static const char permission_Capture_NoPreview[] = "ny";
static const char permission_Capture_Preview[] = "nn";
void
Wallet_SignonViewerReturn(const nsString& results)
Wallet_SignonViewerReturn(const nsAString& results)
{
wallet_MapElement *url;
nsAutoString gone;
@ -2742,7 +2730,7 @@ wallet_Capture(nsIDocument* doc, const nsString& field, const nsString& value, n
/***************************************************************/
void
WLLT_GetNopreviewListForViewer(nsString& aNopreviewList)
WLLT_GetNopreviewListForViewer(nsAString& aNopreviewList)
{
wallet_Initialize(PR_FALSE); /* to initialize helpMac */
nsAutoString buffer;
@ -2761,7 +2749,7 @@ WLLT_GetNopreviewListForViewer(nsString& aNopreviewList)
}
void
WLLT_GetNocaptureListForViewer(nsString& aNocaptureList)
WLLT_GetNocaptureListForViewer(nsAString& aNocaptureList)
{
nsAutoString buffer;
wallet_MapElement *url;
@ -2779,7 +2767,7 @@ WLLT_GetNocaptureListForViewer(nsString& aNocaptureList)
}
void
WLLT_PostEdit(const nsString& walletList)
WLLT_PostEdit(const nsAString& walletList)
{
nsCOMPtr<nsIFile> file;
nsresult rv = Wallet_ProfileDirectory(getter_AddRefs(file));
@ -2856,7 +2844,7 @@ WLLT_PostEdit(const nsString& walletList)
}
void
WLLT_PreEdit(nsString& walletList)
WLLT_PreEdit(nsAString& walletList)
{
wallet_Initialize();
walletList.Assign(BREAK);
@ -3021,7 +3009,7 @@ wallet_DecodeVerticalBars(nsString& s) {
* return after previewing a set of prefills
*/
void
WLLT_PrefillReturn(const nsString& results)
WLLT_PrefillReturn(const nsAString& results)
{
nsAutoString fillins;
nsAutoString urlName;
@ -3270,7 +3258,7 @@ wallet_TraversalForPrefill
nsresult
WLLT_PrefillOneElement
(nsIDOMWindowInternal* win, nsIDOMNode* elementNode, nsString& compositeValue)
(nsIDOMWindowInternal* win, nsIDOMNode* elementNode, nsAString& compositeValue)
{
nsIDOMHTMLInputElement* inputElement;
nsIDOMHTMLSelectElement* selectElement;

View File

@ -79,32 +79,32 @@ extern void
WLLT_DeletePersistentUserData();
extern void
WLLT_PreEdit(nsString& walletList);
WLLT_PreEdit(nsAString& walletList);
extern void
WLLT_PostEdit(const nsString& walletList);
WLLT_PostEdit(const nsAString& walletList);
extern void
WLLT_PrefillReturn(const nsString& results);
WLLT_PrefillReturn(const nsAString& results);
extern void
WLLT_RequestToCapture(nsIPresShell* shell, nsIDOMWindowInternal * win, PRUint32* status);
extern nsresult
WLLT_PrefillOneElement
(nsIDOMWindowInternal* win, nsIDOMNode* elementNode, nsString& compositeValue);
(nsIDOMWindowInternal* win, nsIDOMNode* elementNode, nsAString& compositeValue);
extern nsresult
WLLT_Prefill(nsIPresShell* shell, PRBool quick, nsIDOMWindowInternal* win);
extern void
WLLT_GetNopreviewListForViewer(nsString& aNopreviewList);
WLLT_GetNopreviewListForViewer(nsAString& aNopreviewList);
extern void
WLLT_GetNocaptureListForViewer(nsString& aNocaptureList);
WLLT_GetNocaptureListForViewer(nsAString& aNocaptureList);
extern void
WLLT_GetPrefillListForViewer(nsString& aPrefillList);
WLLT_GetPrefillListForViewer(nsAString& aPrefillList);
extern void
WLLT_OnSubmit(nsIContent* formNode, nsIDOMWindowInternal* window);
@ -119,13 +119,13 @@ extern void
WLLT_InitReencryptCallback(nsIDOMWindowInternal* window);
extern nsresult
Wallet_Encrypt(const nsString& text, nsString& crypt);
Wallet_Encrypt(const nsAString& text, nsAString& crypt);
extern nsresult
Wallet_Decrypt(const nsString& crypt, nsString& text);
Wallet_Decrypt(const nsAString& crypt, nsAString& text);
extern nsresult
wallet_GetLine(nsIInputStream* strm, nsCString& line);
wallet_GetLine(nsIInputStream* strm, nsACString& line);
/**
* Writes a line to a stream, including a newline character.
@ -149,14 +149,8 @@ extern PRInt32 Wallet_3ButtonConfirm(PRUnichar * szMessage, nsIDOMWindowInternal
extern void Wallet_GiveCaveat(nsIDOMWindowInternal* window, nsIPrompt* dialog);
extern nsresult
Wallet_Encrypt2(const nsString& text, nsString& crypt);
extern nsresult
Wallet_Decrypt2(const nsString& crypt, nsString& text);
extern void
Wallet_SignonViewerReturn(const nsString& results);
Wallet_SignonViewerReturn(const nsAString& results);
extern void
Wallet_ReleaseAllLists();

View File

@ -50,6 +50,7 @@
#include "nsIDocShellTreeItem.h"
#include "nsIDocShellTreeOwner.h"
#include "nsIBaseWindow.h"
#include "nsString.h"
static NS_DEFINE_IID(kWalletServiceCID, NS_WALLETSERVICE_CID);