fune/toolkit/components/backgroundtasks/BackgroundTasks.cpp
Nick Alexander 7360317f0c Bug 1675850 - Add MOZ_BACKGROUNDTASKS flag, {nsI}BackgroundTasks IDL and class. r=mossop,firefox-build-system-reviewers,mhentges
This adds a build flag (defaulting to on in Nightly builds) and an
`AppConstants.jsm` definition.

It lays the foundation for managing an active background task.  A
singleton, exposed as an XPCOM service, owns the task name and lives
for the life of the application.

This will be wired into the application startup path in future
commits.  It's separated to allow the changes to category registration
to come early in the commit sequence.

Differential Revision: https://phabricator.services.mozilla.com/D96481
2021-01-25 23:44:39 +00:00

91 lines
2.4 KiB
C++

/* 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 "nsPrintfCString.h"
#include "SpecialSystemDirectory.h"
#include "mozilla/BackgroundTasks.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/Maybe.h"
namespace mozilla {
NS_IMPL_ISUPPORTS(BackgroundTasks, nsIBackgroundTasks);
nsresult BackgroundTasks::GetOrCreateTemporaryProfileDirectoryImpl(
nsIFile** aFile) {
if (mBackgroundTask.isNothing()) {
return NS_ERROR_NOT_AVAILABLE;
}
nsresult rv;
nsCOMPtr<nsIFile> file;
if (mProfD) {
rv = mProfD->Clone(getter_AddRefs(file));
NS_ENSURE_SUCCESS(rv, rv);
} else {
// We don't have the directory service at this point.
rv = GetSpecialSystemDirectory(OS_TemporaryDirectory, getter_AddRefs(file));
NS_ENSURE_SUCCESS(rv, rv);
// TODO: mix in the application hash and perhaps add some additional
// randomness.
rv = file->AppendNative(
nsPrintfCString("backgroundtask-%s", mBackgroundTask.ref().get()));
NS_ENSURE_SUCCESS(rv, rv);
// Make sure that the profile path exists and it's a directory.
bool exists;
rv = file->Exists(&exists);
NS_ENSURE_SUCCESS(rv, rv);
if (!exists) {
rv = file->Create(nsIFile::DIRECTORY_TYPE, 0700);
NS_ENSURE_SUCCESS(rv, rv);
} else {
bool isDir;
rv = file->IsDirectory(&isDir);
NS_ENSURE_SUCCESS(rv, rv);
if (!isDir) {
return NS_ERROR_FILE_DESTINATION_NOT_DIR;
}
}
rv = file->Clone(getter_AddRefs(mProfD));
NS_ENSURE_SUCCESS(rv, rv);
}
nsString path;
file->GetPath(path);
file.forget(aFile);
return NS_OK;
}
nsresult BackgroundTasks::GetIsBackgroundTaskMode(bool* result) {
*result = mBackgroundTask.isSome();
return NS_OK;
}
nsresult BackgroundTasks::BackgroundTaskName(nsAString& name) {
name.SetIsVoid(true);
if (mBackgroundTask.isSome()) {
name.AssignASCII(mBackgroundTask.ref());
}
return NS_OK;
}
nsresult BackgroundTasks::OverrideBackgroundTaskNameForTesting(
const nsAString& name) {
if (name.IsVoid()) {
mBackgroundTask = Nothing();
} else {
mBackgroundTask = Some(NS_LossyConvertUTF16toASCII(name));
}
return NS_OK;
}
mozilla::StaticRefPtr<BackgroundTasks> BackgroundTasks::sSingleton;
} // namespace mozilla