NS_IMETHODIMP nsXREDirProvider::DoStartup() { if (!mProfileNotified) { nsCOMPtr<nsIObserverService> obsSvc = mozilla::services::GetObserverService(); if (!obsSvc) return NS_ERROR_FAILURE; mProfileNotified = true; /* Setup prefs before profile-do-change to be able to use them to track crashes and because we want to begin crash tracking before other code run from this notification since they may cause crashes. */ nsresult rv = mozilla::Preferences::ResetAndReadUserPrefs(); if (NS_FAILED(rv)) NS_WARNING("Failed to setup pref service."); bool safeModeNecessary = false; nsCOMPtr<nsIAppStartup> appStartup (do_GetService(NS_APPSTARTUP_CONTRACTID)); if (appStartup) { rv = appStartup->TrackStartupCrashBegin(&safeModeNecessary); if (NS_FAILED(rv) && rv != NS_ERROR_NOT_AVAILABLE) NS_WARNING("Error while beginning startup crash tracking"); if (!gSafeMode && safeModeNecessary) { appStartup->RestartInSafeMode(nsIAppStartup::eForceQuit); return NS_OK; } } static const PRUnichar kStartup[] = {'s','t','a','r','t','u','p','\0'}; obsSvc->NotifyObservers(nsnull, "profile-do-change", kStartup); // Init the Extension Manager nsCOMPtr<nsIObserver> em = do_GetService("@mozilla.org/addons/integration;1"); if (em) { em->Observe(nsnull, "addons-startup", nsnull); } else { NS_WARNING("Failed to create Addons Manager."); } LoadExtensionBundleDirectories(); obsSvc->NotifyObservers(nsnull, "load-extension-defaults", nsnull); obsSvc->NotifyObservers(nsnull, "profile-after-change", kStartup); // Any component that has registered for the profile-after-change category // should also be created at this time. (void)NS_CreateServicesFromCategory("profile-after-change", nsnull, "profile-after-change"); if (gSafeMode && safeModeNecessary) { static const PRUnichar kCrashed[] = {'c','r','a','s','h','e','d','\0'}; obsSvc->NotifyObservers(nsnull, "safemode-forced", kCrashed); } obsSvc->NotifyObservers(nsnull, "profile-initial-state", nsnull); } return NS_OK; }
void beos_signal_handler(int signum) { #ifdef DEBUG fprintf(stderr, "beos_signal_handler: %d\n", signum); #endif nsresult rv; nsCOMPtr<nsIAppStartup> appStartup(do_GetService(NS_APPSTARTUP_CONTRACTID, &rv)); if (NS_FAILED(rv)) { // Failed to get the appstartup service so shutdown the hard way #ifdef DEBUG fprintf(stderr, "beos_signal_handler: appShell->do_GetService() failed\n"); #endif exit(13); } // Exit the appshell so that the app can shutdown normally appStartup->Quit(nsIAppStartup::eAttemptQuit); }
/** * Delete the profile directory being reset after a backup and delete the local profile directory. */ nsresult ProfileResetCleanup(nsIToolkitProfile* aOldProfile) { nsresult rv; nsCOMPtr<nsIFile> profileDir; rv = aOldProfile->GetRootDir(getter_AddRefs(profileDir)); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsIFile> profileLocalDir; rv = aOldProfile->GetLocalDir(getter_AddRefs(profileLocalDir)); if (NS_FAILED(rv)) return rv; // Get the friendly name for the backup directory. nsCOMPtr<nsIStringBundleService> sbs = mozilla::services::GetStringBundleService(); if (!sbs) return NS_ERROR_FAILURE; nsCOMPtr<nsIStringBundle> sb; rv = sbs->CreateBundle(kProfileProperties, getter_AddRefs(sb)); if (!sb) return NS_ERROR_FAILURE; NS_ConvertUTF8toUTF16 appName(gAppData->name); const PRUnichar* params[] = {appName.get(), appName.get()}; nsXPIDLString resetBackupDirectoryName; static const PRUnichar* kResetBackupDirectory = NS_LITERAL_STRING("resetBackupDirectory").get(); rv = sb->FormatStringFromName(kResetBackupDirectory, params, 2, getter_Copies(resetBackupDirectoryName)); // Get info to copy the old root profile dir to the desktop as a backup. nsCOMPtr<nsIFile> backupDest, uniqueDest; rv = NS_GetSpecialDirectory(NS_OS_DESKTOP_DIR, getter_AddRefs(backupDest)); if (NS_FAILED(rv)) { // Fall back to the home directory if the desktop is not available. rv = NS_GetSpecialDirectory(NS_OS_HOME_DIR, getter_AddRefs(backupDest)); if (NS_FAILED(rv)) return rv; } // Try to get a unique backup directory name. backupDest->Clone(getter_AddRefs(uniqueDest)); uniqueDest->Append(resetBackupDirectoryName); rv = uniqueDest->CreateUnique(nsIFile::DIRECTORY_TYPE, 0700); if (NS_FAILED(rv)) return rv; nsAutoString leafName; rv = uniqueDest->GetLeafName(leafName); if (NS_FAILED(rv)) return rv; // Delete the empty directory that CreateUnique just created. rv = uniqueDest->Remove(false); if (NS_FAILED(rv)) return rv; // Show a progress window while the cleanup happens since the disk I/O can take time. nsCOMPtr<nsIWindowWatcher> windowWatcher(do_GetService(NS_WINDOWWATCHER_CONTRACTID)); if (!windowWatcher) return NS_ERROR_FAILURE; nsCOMPtr<nsIAppStartup> appStartup(do_GetService(NS_APPSTARTUP_CONTRACTID)); if (!appStartup) return NS_ERROR_FAILURE; nsCOMPtr<nsIDOMWindow> progressWindow; rv = windowWatcher->OpenWindow(nullptr, kResetProgressURL, "_blank", "centerscreen,chrome,titlebar", NULL, getter_AddRefs(progressWindow)); if (NS_FAILED(rv)) return rv; // Create a new thread to do the bulk of profile cleanup to stay responsive. nsCOMPtr<nsIThreadManager> tm = do_GetService(NS_THREADMANAGER_CONTRACTID); nsCOMPtr<nsIThread> cleanupThread; rv = tm->NewThread(0, 0, getter_AddRefs(cleanupThread)); if (NS_SUCCEEDED(rv)) { nsCOMPtr<nsIRunnable> runnable = new ProfileResetCleanupAsyncTask(profileDir, profileLocalDir, backupDest, leafName); cleanupThread->Dispatch(runnable, nsIThread::DISPATCH_NORMAL); // The result callback will shut down the worker thread. nsIThread *thread = NS_GetCurrentThread(); // Wait for the cleanup thread to complete. while(!gProfileResetCleanupCompleted) { NS_ProcessNextEvent(thread); } } else { gProfileResetCleanupCompleted = true; NS_WARNING("Cleanup thread creation failed"); return rv; } // Close the progress window now that the cleanup thread is done. progressWindow->Close(); // Delete the old profile from profiles.ini. The folder was already deleted above. rv = aOldProfile->Remove(false); if (NS_FAILED(rv)) NS_WARNING("Could not remove the profile"); return rv; }
NS_IMETHODIMP nsNativeAppSupportMac::ReOpen() { PRBool haveUncollapsed = PR_FALSE; PRBool haveOpenWindows = PR_FALSE; PRBool done = PR_FALSE; nsCOMPtr<nsIWindowMediator> wm(do_GetService(NS_WINDOWMEDIATOR_CONTRACTID)); if (!wm) { return NS_ERROR_FAILURE; } else { nsCOMPtr<nsISimpleEnumerator> windowList; wm->GetXULWindowEnumerator(nsnull, getter_AddRefs(windowList)); PRBool more; windowList->HasMoreElements(&more); while (more) { nsCOMPtr<nsISupports> nextWindow = nsnull; windowList->GetNext(getter_AddRefs(nextWindow)); nsCOMPtr<nsIBaseWindow> baseWindow(do_QueryInterface(nextWindow)); if (!baseWindow) { windowList->HasMoreElements(&more); continue; } else { haveOpenWindows = PR_TRUE; } nsCOMPtr<nsIWidget> widget = nsnull; baseWindow->GetMainWidget(getter_AddRefs(widget)); if (!widget) { windowList->HasMoreElements(&more); continue; } WindowRef windowRef = (WindowRef)widget->GetNativeData(NS_NATIVE_DISPLAY); if (!::IsWindowCollapsed(windowRef)) { haveUncollapsed = PR_TRUE; break; //have un-minimized windows, nothing to do } windowList->HasMoreElements(&more); } // end while if (!haveUncollapsed) { //uncollapse the most recenty used window nsCOMPtr<nsIDOMWindowInternal> mru = nsnull; wm->GetMostRecentWindow(nsnull, getter_AddRefs(mru)); if (mru) { WindowRef mruRef = nil; GetNativeWindowPointerFromDOMWindow(mru, &mruRef); if (mruRef) { ::CollapseWindow(mruRef, FALSE); ::SelectWindow(mruRef); done = PR_TRUE; } } } // end if have uncollapsed if (!haveOpenWindows && !done) { NS_WARNING("trying to open new window"); //use the bootstrap helpers to make the right kind(s) of window open nsresult rv = PR_FALSE; nsCOMPtr<nsIAppStartup> appStartup(do_GetService(NS_APPSTARTUP_CONTRACTID)); if (appStartup) { PRBool openedAWindow = PR_FALSE; appStartup->CreateStartupState(nsIAppShellService::SIZE_TO_CONTENT, nsIAppShellService::SIZE_TO_CONTENT, &openedAWindow); } } } // got window mediator return NS_OK; }