rv = nsComponentManager::AutoRegister(nsIComponentManagerObsolete::NS_Startup, NULL );
nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface(sServiceManager, &rv); if (NS_FAILED(rv)) { NS_ASSERTION(PR_FALSE, "Could not QI to registrar"); return rv; }  rv = registrar->AutoRegister(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);                #ifdef HACK_AROUND_NONREENTRANT_INITXPCOM        sXPCOMInitializedFlag = PR_TRUE;        sXPCOMCleanupHack.mCleanOnExit = PR_TRUE;#endif    }    // 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(                do_GetService(NS_EVENTQUEUESERVICE_CONTRACTID, &rv));    if (NS_FAILED(rv))      return rv;    eventQService->CreateThreadEventQueue();    // Register components    if (!sRegistryInitializedFlag)    {        rv = nsComponentManager::AutoRegister(nsIComponentManagerObsolete::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);#ifdef HACK_AROUND_THREADING_ISSUES    // XXX force certain objects to be created on the main thread    nsCOMPtr<nsIStringBundleService> sBundleService;    sBundleService = do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv);    if (NS_SUCCEEDED(rv))    {        nsCOMPtr<nsIStringBundle> stringBundle;        const char propertyURL[] = "chrome://necko/locale/necko.properties";        rv = sBundleService->CreateBundle(propertyURL,                                          getter_AddRefs(stringBundle));    }#endif    return NS_OK;}