2019-08-23 07:49:14 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
|
|
/* 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 "Client.h"
|
|
|
|
|
2020-10-21 16:16:19 +03:00
|
|
|
// Global includes
|
2021-06-09 07:56:48 +03:00
|
|
|
#include "mozilla/ipc/BackgroundParent.h"
|
2020-10-21 16:16:19 +03:00
|
|
|
#include "mozilla/Assertions.h"
|
2020-12-15 20:15:27 +03:00
|
|
|
#include "mozilla/dom/quota/QuotaManager.h"
|
2020-10-21 16:16:19 +03:00
|
|
|
|
2020-11-04 20:04:01 +03:00
|
|
|
namespace mozilla::dom::quota {
|
2019-08-23 07:49:14 +03:00
|
|
|
|
2020-11-26 12:20:03 +03:00
|
|
|
using mozilla::ipc::AssertIsOnBackgroundThread;
|
2022-04-14 18:05:36 +03:00
|
|
|
using mozilla::ipc::IsOnBackgroundThread;
|
2020-11-26 12:20:03 +03:00
|
|
|
|
2019-08-23 07:49:14 +03:00
|
|
|
namespace {
|
|
|
|
|
2019-08-25 04:34:37 +03:00
|
|
|
const char kIDBPrefix = 'I';
|
|
|
|
const char kDOMCachePrefix = 'C';
|
|
|
|
const char kSDBPrefix = 'S';
|
2022-08-31 12:35:00 +03:00
|
|
|
const char kFILESYSTEMPrefix = 'F';
|
2019-08-25 04:34:37 +03:00
|
|
|
const char kLSPrefix = 'L';
|
|
|
|
|
2019-08-23 07:49:14 +03:00
|
|
|
template <Client::Type type>
|
|
|
|
struct ClientTypeTraits;
|
|
|
|
|
|
|
|
template <>
|
|
|
|
struct ClientTypeTraits<Client::Type::IDB> {
|
|
|
|
template <typename T>
|
|
|
|
static void To(T& aData) {
|
|
|
|
aData.AssignLiteral(IDB_DIRECTORY_NAME);
|
|
|
|
}
|
|
|
|
|
2019-08-25 04:34:37 +03:00
|
|
|
static void To(char& aData) { aData = kIDBPrefix; }
|
|
|
|
|
2019-08-23 07:49:14 +03:00
|
|
|
template <typename T>
|
|
|
|
static bool From(const T& aData) {
|
|
|
|
return aData.EqualsLiteral(IDB_DIRECTORY_NAME);
|
|
|
|
}
|
2019-08-25 04:34:37 +03:00
|
|
|
|
|
|
|
static bool From(char aData) { return aData == kIDBPrefix; }
|
2019-08-23 07:49:14 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
template <>
|
|
|
|
struct ClientTypeTraits<Client::Type::DOMCACHE> {
|
|
|
|
template <typename T>
|
|
|
|
static void To(T& aData) {
|
|
|
|
aData.AssignLiteral(DOMCACHE_DIRECTORY_NAME);
|
|
|
|
}
|
|
|
|
|
2019-08-25 04:34:37 +03:00
|
|
|
static void To(char& aData) { aData = kDOMCachePrefix; }
|
|
|
|
|
2019-08-23 07:49:14 +03:00
|
|
|
template <typename T>
|
|
|
|
static bool From(const T& aData) {
|
|
|
|
return aData.EqualsLiteral(DOMCACHE_DIRECTORY_NAME);
|
|
|
|
}
|
2019-08-25 04:34:37 +03:00
|
|
|
|
|
|
|
static bool From(char aData) { return aData == kDOMCachePrefix; }
|
2019-08-23 07:49:14 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
template <>
|
|
|
|
struct ClientTypeTraits<Client::Type::SDB> {
|
|
|
|
template <typename T>
|
|
|
|
static void To(T& aData) {
|
|
|
|
aData.AssignLiteral(SDB_DIRECTORY_NAME);
|
|
|
|
}
|
|
|
|
|
2019-08-25 04:34:37 +03:00
|
|
|
static void To(char& aData) { aData = kSDBPrefix; }
|
|
|
|
|
2019-08-23 07:49:14 +03:00
|
|
|
template <typename T>
|
|
|
|
static bool From(const T& aData) {
|
|
|
|
return aData.EqualsLiteral(SDB_DIRECTORY_NAME);
|
|
|
|
}
|
2019-08-25 04:34:37 +03:00
|
|
|
|
|
|
|
static bool From(char aData) { return aData == kSDBPrefix; }
|
2019-08-23 07:49:14 +03:00
|
|
|
};
|
|
|
|
|
2022-08-31 12:35:00 +03:00
|
|
|
template <>
|
|
|
|
struct ClientTypeTraits<Client::Type::FILESYSTEM> {
|
|
|
|
template <typename T>
|
|
|
|
static void To(T& aData) {
|
|
|
|
aData.AssignLiteral(FILESYSTEM_DIRECTORY_NAME);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void To(char& aData) { aData = kFILESYSTEMPrefix; }
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
static bool From(const T& aData) {
|
|
|
|
return aData.EqualsLiteral(FILESYSTEM_DIRECTORY_NAME);
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool From(char aData) { return aData == kFILESYSTEMPrefix; }
|
|
|
|
};
|
|
|
|
|
2019-08-23 07:49:14 +03:00
|
|
|
template <>
|
|
|
|
struct ClientTypeTraits<Client::Type::LS> {
|
|
|
|
template <typename T>
|
|
|
|
static void To(T& aData) {
|
|
|
|
aData.AssignLiteral(LS_DIRECTORY_NAME);
|
|
|
|
}
|
|
|
|
|
2019-08-25 04:34:37 +03:00
|
|
|
static void To(char& aData) { aData = kLSPrefix; }
|
|
|
|
|
2019-08-23 07:49:14 +03:00
|
|
|
template <typename T>
|
|
|
|
static bool From(const T& aData) {
|
|
|
|
return aData.EqualsLiteral(LS_DIRECTORY_NAME);
|
|
|
|
}
|
2019-08-25 04:34:37 +03:00
|
|
|
|
|
|
|
static bool From(char aData) { return aData == kLSPrefix; }
|
2019-08-23 07:49:14 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
bool TypeTo_impl(Client::Type aType, T& aData) {
|
|
|
|
switch (aType) {
|
|
|
|
case Client::IDB:
|
|
|
|
ClientTypeTraits<Client::Type::IDB>::To(aData);
|
|
|
|
return true;
|
|
|
|
|
|
|
|
case Client::DOMCACHE:
|
|
|
|
ClientTypeTraits<Client::Type::DOMCACHE>::To(aData);
|
|
|
|
return true;
|
|
|
|
|
|
|
|
case Client::SDB:
|
|
|
|
ClientTypeTraits<Client::Type::SDB>::To(aData);
|
|
|
|
return true;
|
|
|
|
|
2022-08-31 12:35:00 +03:00
|
|
|
case Client::FILESYSTEM:
|
|
|
|
ClientTypeTraits<Client::Type::FILESYSTEM>::To(aData);
|
|
|
|
return true;
|
|
|
|
|
2019-08-23 07:49:14 +03:00
|
|
|
case Client::LS:
|
|
|
|
if (CachedNextGenLocalStorageEnabled()) {
|
|
|
|
ClientTypeTraits<Client::Type::LS>::To(aData);
|
|
|
|
return true;
|
|
|
|
}
|
2019-12-20 10:16:43 +03:00
|
|
|
[[fallthrough]];
|
2019-08-23 07:49:14 +03:00
|
|
|
|
|
|
|
case Client::TYPE_MAX:
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
MOZ_CRASH("Should never get here!");
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
bool TypeFrom_impl(const T& aData, Client::Type& aType) {
|
|
|
|
if (ClientTypeTraits<Client::Type::IDB>::From(aData)) {
|
|
|
|
aType = Client::IDB;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ClientTypeTraits<Client::Type::DOMCACHE>::From(aData)) {
|
|
|
|
aType = Client::DOMCACHE;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ClientTypeTraits<Client::Type::SDB>::From(aData)) {
|
|
|
|
aType = Client::SDB;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2022-08-31 12:35:00 +03:00
|
|
|
if (ClientTypeTraits<Client::Type::FILESYSTEM>::From(aData)) {
|
|
|
|
aType = Client::FILESYSTEM;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2019-08-23 07:49:14 +03:00
|
|
|
if (CachedNextGenLocalStorageEnabled() &&
|
|
|
|
ClientTypeTraits<Client::Type::LS>::From(aData)) {
|
|
|
|
aType = Client::LS;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void BadType() { MOZ_CRASH("Bad client type value!"); }
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
2020-03-17 16:06:30 +03:00
|
|
|
// static
|
|
|
|
bool Client::IsValidType(Type aType) {
|
|
|
|
switch (aType) {
|
|
|
|
case Client::IDB:
|
|
|
|
case Client::DOMCACHE:
|
|
|
|
case Client::SDB:
|
|
|
|
return true;
|
|
|
|
|
|
|
|
case Client::LS:
|
|
|
|
if (CachedNextGenLocalStorageEnabled()) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
[[fallthrough]];
|
|
|
|
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-23 07:49:14 +03:00
|
|
|
// static
|
|
|
|
bool Client::TypeToText(Type aType, nsAString& aText, const fallible_t&) {
|
|
|
|
nsString text;
|
|
|
|
if (!TypeTo_impl(aType, text)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
aText = text;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// static
|
2020-11-30 13:47:02 +03:00
|
|
|
nsAutoCString Client::TypeToText(Type aType) {
|
|
|
|
nsAutoCString res;
|
|
|
|
if (!TypeTo_impl(aType, res)) {
|
2019-08-23 07:49:14 +03:00
|
|
|
BadType();
|
|
|
|
}
|
2020-11-30 13:47:02 +03:00
|
|
|
return res;
|
2019-08-23 07:49:14 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// static
|
|
|
|
bool Client::TypeFromText(const nsAString& aText, Type& aType,
|
|
|
|
const fallible_t&) {
|
|
|
|
Type type;
|
|
|
|
if (!TypeFrom_impl(aText, type)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
aType = type;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// static
|
|
|
|
Client::Type Client::TypeFromText(const nsACString& aText) {
|
|
|
|
Type type;
|
|
|
|
if (!TypeFrom_impl(aText, type)) {
|
|
|
|
BadType();
|
|
|
|
}
|
|
|
|
return type;
|
|
|
|
}
|
|
|
|
|
2019-08-25 04:34:37 +03:00
|
|
|
// static
|
|
|
|
char Client::TypeToPrefix(Type aType) {
|
|
|
|
char prefix;
|
|
|
|
if (!TypeTo_impl(aType, prefix)) {
|
|
|
|
BadType();
|
|
|
|
}
|
|
|
|
return prefix;
|
|
|
|
}
|
|
|
|
|
|
|
|
// static
|
|
|
|
bool Client::TypeFromPrefix(char aPrefix, Type& aType, const fallible_t&) {
|
|
|
|
Type type;
|
|
|
|
if (!TypeFrom_impl(aPrefix, type)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
aType = type;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2020-12-07 17:49:36 +03:00
|
|
|
bool Client::InitiateShutdownWorkThreads() {
|
2020-11-26 12:20:03 +03:00
|
|
|
AssertIsOnBackgroundThread();
|
2020-11-30 13:54:29 +03:00
|
|
|
|
2021-05-28 09:46:04 +03:00
|
|
|
QuotaManager::MaybeRecordQuotaClientShutdownStep(GetType(), "starting"_ns);
|
2020-11-26 12:20:03 +03:00
|
|
|
|
|
|
|
InitiateShutdown();
|
|
|
|
|
2020-12-15 20:15:27 +03:00
|
|
|
return IsShutdownCompleted();
|
2020-12-07 17:49:36 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void Client::FinalizeShutdownWorkThreads() {
|
2021-05-28 09:46:04 +03:00
|
|
|
QuotaManager::MaybeRecordQuotaClientShutdownStep(GetType(), "completed"_ns);
|
2020-11-30 13:54:29 +03:00
|
|
|
|
2020-11-26 12:20:03 +03:00
|
|
|
FinalizeShutdown();
|
|
|
|
}
|
|
|
|
|
2022-04-14 18:05:36 +03:00
|
|
|
// static
|
|
|
|
bool Client::IsShuttingDownOnBackgroundThread() {
|
|
|
|
MOZ_ASSERT(IsOnBackgroundThread());
|
|
|
|
return QuotaManager::IsShuttingDown();
|
|
|
|
}
|
|
|
|
|
|
|
|
// static
|
|
|
|
bool Client::IsShuttingDownOnNonBackgroundThread() {
|
|
|
|
MOZ_ASSERT(!IsOnBackgroundThread());
|
|
|
|
return QuotaManager::IsShuttingDown();
|
|
|
|
}
|
|
|
|
|
2020-11-04 20:04:01 +03:00
|
|
|
} // namespace mozilla::dom::quota
|