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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user