зеркало из https://github.com/mozilla/pjs.git
Fix for bug 67466 -- don't crash when opening lots of files on startup. r=pinkerton, sr=beard
This commit is contained in:
Родитель
9798e10ddf
Коммит
cb3e487353
|
@ -59,7 +59,7 @@ nsMacCommandLine nsMacCommandLine::sMacCommandLine;
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
||||||
nsMacCommandLine::nsMacCommandLine()
|
nsMacCommandLine::nsMacCommandLine()
|
||||||
: mArgBuffer(NULL)
|
: mArgsBuffer(NULL)
|
||||||
, mArgs(NULL)
|
, mArgs(NULL)
|
||||||
, mStartedUp(PR_FALSE)
|
, mStartedUp(PR_FALSE)
|
||||||
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
||||||
|
@ -72,6 +72,8 @@ nsMacCommandLine::~nsMacCommandLine()
|
||||||
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
ShutdownAEHandlerClasses();
|
ShutdownAEHandlerClasses();
|
||||||
|
nsMemory::Free(mArgsBuffer);
|
||||||
|
mArgsBuffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -85,6 +87,9 @@ nsresult nsMacCommandLine::Initialize(int& argc, char**& argv)
|
||||||
argc = 0;
|
argc = 0;
|
||||||
argv = mArgs;
|
argv = mArgs;
|
||||||
|
|
||||||
|
// init the args buffer with the program name
|
||||||
|
mTempArgsString.Assign("mozilla");
|
||||||
|
|
||||||
// Set up AppleEvent handling.
|
// Set up AppleEvent handling.
|
||||||
OSErr err = CreateAEHandlerClasses(false);
|
OSErr err = CreateAEHandlerClasses(false);
|
||||||
if (err != noErr) return NS_ERROR_FAILURE;
|
if (err != noErr) return NS_ERROR_FAILURE;
|
||||||
|
@ -105,25 +110,27 @@ nsresult nsMacCommandLine::Initialize(int& argc, char**& argv)
|
||||||
{
|
{
|
||||||
::WaitNextEvent(highLevelEventMask, &anEvent, 0, nsnull);
|
::WaitNextEvent(highLevelEventMask, &anEvent, 0, nsnull);
|
||||||
if (anEvent.what == kHighLevelEvent)
|
if (anEvent.what == kHighLevelEvent)
|
||||||
|
{
|
||||||
|
// here we process startup odoc/pdoc events, which can
|
||||||
|
// add items to the command line.
|
||||||
err = ::AEProcessAppleEvent(&anEvent);
|
err = ::AEProcessAppleEvent(&anEvent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// we've started up now
|
// we've started up now
|
||||||
mStartedUp = PR_TRUE;
|
mStartedUp = PR_TRUE;
|
||||||
|
|
||||||
|
// Care! We have to ensure that the addresses we pass out in
|
||||||
|
// argv continue to point to valid memory. Because we can't guarantee
|
||||||
|
// anything about the way that nsCString works, we make a copy
|
||||||
|
// of the buffer, which is never freed until the command line handler
|
||||||
|
// goes way (and, since it's static, that is at library unload time).
|
||||||
|
|
||||||
|
mArgsBuffer = mTempArgsString.ToNewCString();
|
||||||
|
mTempArgsString.Truncate(); // it's job is done
|
||||||
|
|
||||||
if (!mArgBuffer) // no arguments from anywhere
|
|
||||||
return NS_OK;
|
|
||||||
|
|
||||||
// Release some unneeded memory
|
|
||||||
char* oldBuffer = mArgBuffer;
|
|
||||||
mArgBuffer = new char[PL_strlen(mArgBuffer) + 1];
|
|
||||||
PL_strcpy(mArgBuffer, oldBuffer);
|
|
||||||
delete [] oldBuffer;
|
|
||||||
|
|
||||||
// Parse the buffer.
|
// Parse the buffer.
|
||||||
int rowNumber = 0;
|
char* strtokFirstParam = mArgsBuffer;
|
||||||
char* strtokFirstParam = mArgBuffer;
|
|
||||||
while (argc < kMaxTokens)
|
while (argc < kMaxTokens)
|
||||||
{
|
{
|
||||||
// Get the next token. Initialize strtok by passing the string the
|
// Get the next token. Initialize strtok by passing the string the
|
||||||
|
@ -147,37 +154,17 @@ nsresult nsMacCommandLine::Initialize(int& argc, char**& argv)
|
||||||
delete [] oldArgs;
|
delete [] oldArgs;
|
||||||
argv = mArgs;
|
argv = mArgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------
|
|
||||||
PRBool nsMacCommandLine::EnsureCommandLine()
|
|
||||||
//----------------------------------------------------------------------------------------
|
|
||||||
{
|
|
||||||
if (mArgBuffer)
|
|
||||||
return PR_TRUE;
|
|
||||||
|
|
||||||
mArgBuffer = new char[kMaxBufferSize];
|
|
||||||
if (!mArgBuffer)
|
|
||||||
return PR_FALSE;
|
|
||||||
|
|
||||||
PL_strcpy(mArgBuffer, "mozilla"); // argv[0]
|
|
||||||
return PR_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
||||||
nsresult nsMacCommandLine::AddToCommandLine(const char* inArgText)
|
nsresult nsMacCommandLine::AddToCommandLine(const char* inArgText)
|
||||||
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
if (!EnsureCommandLine())
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
|
|
||||||
if (*inArgText != ' ')
|
if (*inArgText != ' ')
|
||||||
PL_strcat(mArgBuffer, " ");
|
mTempArgsString.Append(" ");
|
||||||
PL_strcat(mArgBuffer, inArgText);
|
mTempArgsString.Append(inArgText);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,13 +173,10 @@ nsresult nsMacCommandLine::AddToCommandLine(const char* inArgText)
|
||||||
nsresult nsMacCommandLine::AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec)
|
nsresult nsMacCommandLine::AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec)
|
||||||
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
if (!EnsureCommandLine())
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
|
|
||||||
// Convert the filespec to a URL
|
// Convert the filespec to a URL
|
||||||
nsFileSpec nsspec(inFileSpec);
|
nsFileSpec nsspec(inFileSpec);
|
||||||
nsFileURL fileAsURL(nsspec);
|
nsFileURL fileAsURL(nsspec);
|
||||||
PL_strcat(mArgBuffer, " ");
|
mTempArgsString.Append(" ");
|
||||||
AddToCommandLine(inOptionString);
|
AddToCommandLine(inOptionString);
|
||||||
AddToCommandLine(fileAsURL.GetAsString());
|
AddToCommandLine(fileAsURL.GetAsString());
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
#include "nscore.h"
|
#include "nscore.h"
|
||||||
#include "nsError.h"
|
#include "nsError.h"
|
||||||
|
#include "nsString.h"
|
||||||
|
|
||||||
#include "nsAEDefs.h"
|
#include "nsAEDefs.h"
|
||||||
|
|
||||||
|
@ -41,7 +42,6 @@ public:
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
kMaxBufferSize = 512,
|
|
||||||
kMaxTokens = 20
|
kMaxTokens = 20
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -50,7 +50,6 @@ public:
|
||||||
|
|
||||||
nsresult Initialize(int& argc, char**& argv);
|
nsresult Initialize(int& argc, char**& argv);
|
||||||
|
|
||||||
PRBool EnsureCommandLine();
|
|
||||||
nsresult AddToCommandLine(const char* inArgText);
|
nsresult AddToCommandLine(const char* inArgText);
|
||||||
nsresult AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec);
|
nsresult AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec);
|
||||||
nsresult AddToEnvironmentVars(const char* inArgText);
|
nsresult AddToEnvironmentVars(const char* inArgText);
|
||||||
|
@ -66,8 +65,10 @@ protected:
|
||||||
|
|
||||||
nsresult OpenWindow(const char *chrome, const PRUnichar *url);
|
nsresult OpenWindow(const char *chrome, const PRUnichar *url);
|
||||||
|
|
||||||
char* mArgBuffer; // the command line itself
|
nsCString mTempArgsString; // temp storage for args as we accumulate them
|
||||||
char** mArgs; // array of pointers into argBuffer
|
char* mArgsBuffer; // final, immutable container for args
|
||||||
|
|
||||||
|
char** mArgs; // array of pointers into argBuffer
|
||||||
|
|
||||||
PRBool mStartedUp;
|
PRBool mStartedUp;
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ nsMacCommandLine nsMacCommandLine::sMacCommandLine;
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
||||||
nsMacCommandLine::nsMacCommandLine()
|
nsMacCommandLine::nsMacCommandLine()
|
||||||
: mArgBuffer(NULL)
|
: mArgsBuffer(NULL)
|
||||||
, mArgs(NULL)
|
, mArgs(NULL)
|
||||||
, mStartedUp(PR_FALSE)
|
, mStartedUp(PR_FALSE)
|
||||||
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
||||||
|
@ -72,6 +72,8 @@ nsMacCommandLine::~nsMacCommandLine()
|
||||||
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
ShutdownAEHandlerClasses();
|
ShutdownAEHandlerClasses();
|
||||||
|
nsMemory::Free(mArgsBuffer);
|
||||||
|
mArgsBuffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -85,6 +87,9 @@ nsresult nsMacCommandLine::Initialize(int& argc, char**& argv)
|
||||||
argc = 0;
|
argc = 0;
|
||||||
argv = mArgs;
|
argv = mArgs;
|
||||||
|
|
||||||
|
// init the args buffer with the program name
|
||||||
|
mTempArgsString.Assign("mozilla");
|
||||||
|
|
||||||
// Set up AppleEvent handling.
|
// Set up AppleEvent handling.
|
||||||
OSErr err = CreateAEHandlerClasses(false);
|
OSErr err = CreateAEHandlerClasses(false);
|
||||||
if (err != noErr) return NS_ERROR_FAILURE;
|
if (err != noErr) return NS_ERROR_FAILURE;
|
||||||
|
@ -105,25 +110,27 @@ nsresult nsMacCommandLine::Initialize(int& argc, char**& argv)
|
||||||
{
|
{
|
||||||
::WaitNextEvent(highLevelEventMask, &anEvent, 0, nsnull);
|
::WaitNextEvent(highLevelEventMask, &anEvent, 0, nsnull);
|
||||||
if (anEvent.what == kHighLevelEvent)
|
if (anEvent.what == kHighLevelEvent)
|
||||||
|
{
|
||||||
|
// here we process startup odoc/pdoc events, which can
|
||||||
|
// add items to the command line.
|
||||||
err = ::AEProcessAppleEvent(&anEvent);
|
err = ::AEProcessAppleEvent(&anEvent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// we've started up now
|
// we've started up now
|
||||||
mStartedUp = PR_TRUE;
|
mStartedUp = PR_TRUE;
|
||||||
|
|
||||||
|
// Care! We have to ensure that the addresses we pass out in
|
||||||
|
// argv continue to point to valid memory. Because we can't guarantee
|
||||||
|
// anything about the way that nsCString works, we make a copy
|
||||||
|
// of the buffer, which is never freed until the command line handler
|
||||||
|
// goes way (and, since it's static, that is at library unload time).
|
||||||
|
|
||||||
|
mArgsBuffer = mTempArgsString.ToNewCString();
|
||||||
|
mTempArgsString.Truncate(); // it's job is done
|
||||||
|
|
||||||
if (!mArgBuffer) // no arguments from anywhere
|
|
||||||
return NS_OK;
|
|
||||||
|
|
||||||
// Release some unneeded memory
|
|
||||||
char* oldBuffer = mArgBuffer;
|
|
||||||
mArgBuffer = new char[PL_strlen(mArgBuffer) + 1];
|
|
||||||
PL_strcpy(mArgBuffer, oldBuffer);
|
|
||||||
delete [] oldBuffer;
|
|
||||||
|
|
||||||
// Parse the buffer.
|
// Parse the buffer.
|
||||||
int rowNumber = 0;
|
char* strtokFirstParam = mArgsBuffer;
|
||||||
char* strtokFirstParam = mArgBuffer;
|
|
||||||
while (argc < kMaxTokens)
|
while (argc < kMaxTokens)
|
||||||
{
|
{
|
||||||
// Get the next token. Initialize strtok by passing the string the
|
// Get the next token. Initialize strtok by passing the string the
|
||||||
|
@ -147,37 +154,17 @@ nsresult nsMacCommandLine::Initialize(int& argc, char**& argv)
|
||||||
delete [] oldArgs;
|
delete [] oldArgs;
|
||||||
argv = mArgs;
|
argv = mArgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------
|
|
||||||
PRBool nsMacCommandLine::EnsureCommandLine()
|
|
||||||
//----------------------------------------------------------------------------------------
|
|
||||||
{
|
|
||||||
if (mArgBuffer)
|
|
||||||
return PR_TRUE;
|
|
||||||
|
|
||||||
mArgBuffer = new char[kMaxBufferSize];
|
|
||||||
if (!mArgBuffer)
|
|
||||||
return PR_FALSE;
|
|
||||||
|
|
||||||
PL_strcpy(mArgBuffer, "mozilla"); // argv[0]
|
|
||||||
return PR_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
||||||
nsresult nsMacCommandLine::AddToCommandLine(const char* inArgText)
|
nsresult nsMacCommandLine::AddToCommandLine(const char* inArgText)
|
||||||
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
if (!EnsureCommandLine())
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
|
|
||||||
if (*inArgText != ' ')
|
if (*inArgText != ' ')
|
||||||
PL_strcat(mArgBuffer, " ");
|
mTempArgsString.Append(" ");
|
||||||
PL_strcat(mArgBuffer, inArgText);
|
mTempArgsString.Append(inArgText);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,13 +173,10 @@ nsresult nsMacCommandLine::AddToCommandLine(const char* inArgText)
|
||||||
nsresult nsMacCommandLine::AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec)
|
nsresult nsMacCommandLine::AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec)
|
||||||
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
if (!EnsureCommandLine())
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
|
|
||||||
// Convert the filespec to a URL
|
// Convert the filespec to a URL
|
||||||
nsFileSpec nsspec(inFileSpec);
|
nsFileSpec nsspec(inFileSpec);
|
||||||
nsFileURL fileAsURL(nsspec);
|
nsFileURL fileAsURL(nsspec);
|
||||||
PL_strcat(mArgBuffer, " ");
|
mTempArgsString.Append(" ");
|
||||||
AddToCommandLine(inOptionString);
|
AddToCommandLine(inOptionString);
|
||||||
AddToCommandLine(fileAsURL.GetAsString());
|
AddToCommandLine(fileAsURL.GetAsString());
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
#include "nscore.h"
|
#include "nscore.h"
|
||||||
#include "nsError.h"
|
#include "nsError.h"
|
||||||
|
#include "nsString.h"
|
||||||
|
|
||||||
#include "nsAEDefs.h"
|
#include "nsAEDefs.h"
|
||||||
|
|
||||||
|
@ -41,7 +42,6 @@ public:
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
kMaxBufferSize = 512,
|
|
||||||
kMaxTokens = 20
|
kMaxTokens = 20
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -50,7 +50,6 @@ public:
|
||||||
|
|
||||||
nsresult Initialize(int& argc, char**& argv);
|
nsresult Initialize(int& argc, char**& argv);
|
||||||
|
|
||||||
PRBool EnsureCommandLine();
|
|
||||||
nsresult AddToCommandLine(const char* inArgText);
|
nsresult AddToCommandLine(const char* inArgText);
|
||||||
nsresult AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec);
|
nsresult AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec);
|
||||||
nsresult AddToEnvironmentVars(const char* inArgText);
|
nsresult AddToEnvironmentVars(const char* inArgText);
|
||||||
|
@ -66,8 +65,10 @@ protected:
|
||||||
|
|
||||||
nsresult OpenWindow(const char *chrome, const PRUnichar *url);
|
nsresult OpenWindow(const char *chrome, const PRUnichar *url);
|
||||||
|
|
||||||
char* mArgBuffer; // the command line itself
|
nsCString mTempArgsString; // temp storage for args as we accumulate them
|
||||||
char** mArgs; // array of pointers into argBuffer
|
char* mArgsBuffer; // final, immutable container for args
|
||||||
|
|
||||||
|
char** mArgs; // array of pointers into argBuffer
|
||||||
|
|
||||||
PRBool mStartedUp;
|
PRBool mStartedUp;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче