diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /toolkit/components/backgroundtasks/BackgroundTasksRunner.cpp | |
parent | Initial commit. (diff) | |
download | firefox-upstream.tar.xz firefox-upstream.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'toolkit/components/backgroundtasks/BackgroundTasksRunner.cpp')
-rw-r--r-- | toolkit/components/backgroundtasks/BackgroundTasksRunner.cpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/toolkit/components/backgroundtasks/BackgroundTasksRunner.cpp b/toolkit/components/backgroundtasks/BackgroundTasksRunner.cpp new file mode 100644 index 0000000000..9b950ecf0d --- /dev/null +++ b/toolkit/components/backgroundtasks/BackgroundTasksRunner.cpp @@ -0,0 +1,86 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/BackgroundTasksRunner.h" + +#include "base/process_util.h" +#include "mozilla/StaticPrefs_toolkit.h" +#include "nsIFile.h" + +#ifdef XP_WIN +# include "mozilla/AssembleCmdLine.h" +#endif + +namespace mozilla { + +NS_IMPL_ISUPPORTS(BackgroundTasksRunner, nsIBackgroundTasksRunner); + +NS_IMETHODIMP BackgroundTasksRunner::RunInDetachedProcess( + const nsACString& aTaskName, const nsTArray<nsCString>& aArgs) { + nsCOMPtr<nsIFile> lf; + nsresult rv = XRE_GetBinaryPath(getter_AddRefs(lf)); + NS_ENSURE_SUCCESS(rv, rv); + + nsAutoCString exePath; +#if !defined(XP_WIN) + rv = lf->GetNativePath(exePath); +#else + rv = lf->GetNativeTarget(exePath); +#endif + NS_ENSURE_SUCCESS(rv, rv); + + base::LaunchOptions options; +#ifdef XP_WIN + options.start_independent = true; + + nsTArray<const char*> argv = {exePath.Data(), "--backgroundtask", + aTaskName.Data()}; + for (const nsCString& str : aArgs) { + argv.AppendElement(str.get()); + } + argv.AppendElement(nullptr); + + wchar_t* assembledCmdLine = nullptr; + if (assembleCmdLine(argv.Elements(), &assembledCmdLine, CP_UTF8) == -1) { + return NS_ERROR_FAILURE; + } + + if (!base::LaunchApp(assembledCmdLine, options, nullptr)) { + return NS_ERROR_FAILURE; + } +#else + std::vector<std::string> argv = {exePath.Data(), "--backgroundtask", + aTaskName.Data()}; + for (const nsCString& str : aArgs) { + argv.push_back(str.get()); + } + + if (!base::LaunchApp(argv, options, nullptr)) { + return NS_ERROR_FAILURE; + } +#endif + + return NS_OK; +} + +NS_IMETHODIMP BackgroundTasksRunner::RemoveDirectoryInDetachedProcess( + const nsACString& aParentDirPath, const nsACString& aChildDirName, + const nsACString& aSecondsToWait, const nsACString& aOtherFoldersSuffix) { + nsTArray<nsCString> argv = {aParentDirPath + ""_ns, aChildDirName + ""_ns, + aSecondsToWait + ""_ns, + aOtherFoldersSuffix + ""_ns}; + + uint32_t testingSleepMs = + StaticPrefs::toolkit_background_tasks_remove_directory_testing_sleep_ms(); + if (testingSleepMs > 0) { + argv.AppendElement("--test-sleep"); + nsAutoCString sleep; + sleep.AppendInt(testingSleepMs); + argv.AppendElement(sleep); + } + + return RunInDetachedProcess("removeDirectory"_ns, argv); +} + +} // namespace mozilla |