From b4bb853e8df12486b2bcb02839e1ec3bde88a21b Mon Sep 17 00:00:00 2001 From: "timeless%mozdev.org" Date: Sun, 8 Jan 2006 22:15:30 +0000 Subject: [PATCH] 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 --- mozilla/webshell/tests/viewer/nsViewerApp.cpp | 85 +++++++++++-------- mozilla/webshell/tests/viewer/nsWinMain.cpp | 12 ++- 2 files changed, 57 insertions(+), 40 deletions(-) diff --git a/mozilla/webshell/tests/viewer/nsViewerApp.cpp b/mozilla/webshell/tests/viewer/nsViewerApp.cpp index 3063ec58a28..2d62cbbe42b 100644 --- a/mozilla/webshell/tests/viewer/nsViewerApp.cpp +++ b/mozilla/webshell/tests/viewer/nsViewerApp.cpp @@ -212,59 +212,72 @@ nsViewerApp::SetupRegistry() nsCOMPtr servManager; rv = NS_InitXPCOM3(getter_AddRefs(servManager), nsnull, nsnull, kPStaticModules, kStaticModuleCount); + if (NS_FAILED(rv)) + return rv; + do { + nsCOMPtr registrar = do_QueryInterface(servManager); + NS_ASSERTION(registrar, "No nsIComponentRegistrar from get service. see dougt"); + rv = registrar->AutoRegister(nsnull); - nsCOMPtr 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 cookieService = - do_GetService(kCookieServiceCID, &rv); - if (NS_FAILED(rv) || (nsnull == cookieService)) { + // register the cookie manager + nsCOMPtr 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; } diff --git a/mozilla/webshell/tests/viewer/nsWinMain.cpp b/mozilla/webshell/tests/viewer/nsWinMain.cpp index e9ee9bb00f3..cab6ea10ce5 100644 --- a/mozilla/webshell/tests/viewer/nsWinMain.cpp +++ b/mozilla/webshell/tests/viewer/nsWinMain.cpp @@ -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);