nsCOMPtr<nsIObserver> mStartupNotifier = do_CreateInstance(NS_APPSTARTUPNOTIFIER_CONTRACTID, &rv); if(NS_FAILED(rv)) return rv; mStartupNotifier->Observe(nsnull, APPSTARTUP_TOPIC, nsnull);
nsresult NS_InitEmbedding(nsILocalFile *mozBinDirectory,                          nsIDirectoryServiceProvider *appFileLocProvider){    nsresult rv;    // Reentrant calls to this method do nothing except increment a counter    sInitCounter++;    if (sInitCounter > 1)        return NS_OK;    // Initialise XPCOM#ifdef HACK_AROUND_NONREENTRANT_INITXPCOM    // Can't call NS_InitXPCom more than once or things go boom!    if (!sXPCOMInitializedFlag)#endif    {        // Initialise XPCOM        NS_InitXPCOM2(&sServiceManager, mozBinDirectory, appFileLocProvider);        if (!sServiceManager)            return NS_ERROR_NULL_POINTER;                #ifdef HACK_AROUND_NONREENTRANT_INITXPCOM        sXPCOMInitializedFlag = PR_TRUE;        sXPCOMCleanupHack.mCleanOnExit = PR_TRUE;#endif    }    // Register components    if (!sRegistryInitializedFlag)    {        // XXX hack method        NS_SetupRegistry();                rv = nsComponentManager::AutoRegister(nsIComponentManager::NS_Startup,                                              NULL /* default */);        if (NS_FAILED(rv))        {            NS_ASSERTION(PR_FALSE, "Could not AutoRegister");            return rv;        }        sRegistryInitializedFlag = PR_TRUE;    }	nsCOMPtr<nsIObserver> mStartupNotifier = do_CreateInstance(NS_APPSTARTUPNOTIFIER_CONTRACTID, &rv);	if(NS_FAILED(rv))		return rv;	mStartupNotifier->Observe(nsnull, APPSTARTUP_TOPIC, nsnull);    // Create the Event Queue for the UI thread...    //    // If an event queue already exists for the thread, then     // CreateThreadEventQueue(...) will fail...    // CreateThread0ueue(...) will fail...    nsCOMPtr<nsIEventQueueService> eventQService;    rv = sServiceManager->GetService(NS_EVENTQUEUESERVICE_CONTRACTID,                                      nsIEventQueueService::GetIID(),                                      getter_AddRefs(eventQService));    if (NS_FAILED(rv))      return rv;    eventQService->CreateThreadEventQueue();#ifdef HACK_AROUND_THREADING_ISSUES    // XXX force certain objects to be created on the main thread    nsCOMPtr<nsIStringBundleService> sBundleService;    rv = sServiceManager->GetService(NS_STRINGBUNDLE_CONTRACTID,                                     nsIStringBundleService::GetIID(),                                      getter_AddRefs(sBundleService));    if (NS_SUCCEEDED(rv))    {        nsCOMPtr<nsIStringBundle> stringBundle;        char*  propertyURL = "chrome://necko/locale/necko.properties";        nsILocale *locale = nsnull;        rv = sBundleService->CreateBundle(propertyURL, locale,                                          getter_AddRefs(stringBundle));    }#endif    // Init the chrome registry.    nsCOMPtr<nsIChromeRegistry> chromeReg;    rv = sServiceManager->GetService("@mozilla.org/chrome/chrome-registry;1",                                      nsIChromeRegistry::GetIID(),                                      getter_AddRefs(chromeReg));    if (chromeReg)    {        // Ignore the return value here.  If chrome is already initialized        // this call will return an error even though nothing is wrong.        (void) chromeReg->CheckForNewChrome();    }    return NS_OK;}