Bug 321167 viewer crashes at launch

r=roc sr=roc

Stop calling InitXPCOM2 since there's now a call to InitXPCOM3

Changing nsViewerApp::SetupRegistry and nsViewerApp::Initialize to
appropriately bail for failure cases, both will return SUCCESS and set
mIsInitialized only if it leaves XPCOM initialized. Otherwise it will
return failure, leave mIsInitialized false and leave XPCOM uninitialized
or if it started it up, it will shutdown xpcom before returning.

main will return -1 if nsNativeViewerApp isn't created and -2 if
initialize fails.


git-svn-id: svn://10.0.0.236/trunk@187151 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
timeless%mozdev.org
2006-01-08 22:15:30 +00:00
parent a5ca8ab5d4
commit b4bb853e8d
2 changed files with 57 additions and 40 deletions

View File

@@ -212,59 +212,72 @@ nsViewerApp::SetupRegistry()
nsCOMPtr<nsIServiceManager> servManager;
rv = NS_InitXPCOM3(getter_AddRefs(servManager), nsnull, nsnull,
kPStaticModules, kStaticModuleCount);
if (NS_FAILED(rv))
return rv;
do {
nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface(servManager);
NS_ASSERTION(registrar, "No nsIComponentRegistrar from get service. see dougt");
rv = registrar->AutoRegister(nsnull);
nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface(servManager);
NS_ASSERTION(registrar, "No nsIComponentRegistrar from get service. see dougt");
rv = registrar->AutoRegister(nsnull);
// Register our browser window factory
nsIFactory* bwf;
NS_NewXPBaseWindowFactory(&bwf);
registrar->RegisterFactory(kXPBaseWindowCID, 0, 0, bwf);
NS_RELEASE(bwf);
// register the cookie manager
nsCOMPtr<nsICookieService> cookieService =
do_GetService(kCookieServiceCID, &rv);
if (NS_FAILED(rv) || (nsnull == cookieService)) {
// register the cookie manager
nsCOMPtr<nsICookieService> cookieService =
do_GetService(kCookieServiceCID, &rv);
if (NS_FAILED(rv) || (nsnull == cookieService)) {
#ifdef DEBUG
printf("Unable to instantiate Cookie Manager\n");
printf("Unable to instantiate Cookie Manager\n");
#endif
}
}
return NS_OK;
// Register our browser window factory
nsIFactory* bwf;
rv = NS_NewXPBaseWindowFactory(&bwf);
if (NS_FAILED(rv))
break;
registrar->RegisterFactory(kXPBaseWindowCID, 0, 0, bwf);
NS_RELEASE(bwf);
} while (0);
if (NS_FAILED(rv))
NS_ShutdownXPCOM(nsnull);
return rv;
}
nsresult
nsViewerApp::Initialize(int argc, char** argv)
{
nsresult rv;
rv = SetupRegistry();
nsresult rv = SetupRegistry();
if (NS_FAILED(rv)) {
return rv;
}
InitializeWindowCreator();
do {
rv = InitializeWindowCreator();
// Create widget application shell
rv = CallCreateInstance(kAppShellCID, &mAppShell);
if (NS_FAILED(rv)) {
return rv;
}
mAppShell->Create(&argc, argv);
// Create widget application shell
rv = CallCreateInstance(kAppShellCID, &mAppShell);
if (NS_FAILED(rv))
break;
// Load preferences
rv = CallGetService(NS_PREFSERVICE_CONTRACTID, &mPrefService);
if (NS_FAILED(rv)) {
return rv;
}
mPrefService->ReadUserPrefs(nsnull);
rv = mAppShell->Create(&argc, argv);
if (NS_FAILED(rv))
break;
// Finally process our arguments
rv = ProcessArguments(argc, argv);
// Load preferences
rv = CallGetService(NS_PREFSERVICE_CONTRACTID, &mPrefService);
if (NS_FAILED(rv))
break;
mPrefService->ReadUserPrefs(nsnull);
// Finally process our arguments
rv = ProcessArguments(argc, argv);
if (NS_FAILED(rv))
break;
mIsInitialized = PR_TRUE;
} while (0);
if (NS_FAILED(rv))
NS_ShutdownXPCOM(nsnull);
mIsInitialized = PR_TRUE;
return rv;
}

View File

@@ -146,12 +146,16 @@ nsNativeBrowserWindow::DispatchMenuItem(PRInt32 aID)
int main(int argc, char **argv)
{
nsresult rv;
rv = NS_InitXPCOM2(nsnull, nsnull, nsnull);
NS_ASSERTION(NS_SUCCEEDED(rv), "NS_InitXPCOM failed");
nsViewerApp* app = new nsNativeViewerApp();
if (!app)
return -1;
NS_ADDREF(app);
app->Initialize(argc, argv);
nsresult rv = app->Initialize(argc, argv);
if (NS_FAILED(rv)) {
NS_RELEASE(app);
return -2;
}
/* XPCOM is now initialized. we must clean it up. */
int result = app->Run();
app->Exit(); // this exit is needed for the -x case where the close box is never clicked
NS_RELEASE(app);