StorageQuotaManager.h [plain text]
#pragma once
#include <wtf/CompletionHandler.h>
#include <wtf/Deque.h>
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
#include <wtf/WeakPtr.h>
#include <wtf/WorkQueue.h>
namespace WebCore {
class StorageQuotaManager : public ThreadSafeRefCounted<StorageQuotaManager>, public CanMakeWeakPtr<StorageQuotaManager> {
WTF_MAKE_FAST_ALLOCATED;
public:
using UsageGetter = Function<uint64_t()>;
using QuotaIncreaseRequester = Function<void(uint64_t currentQuota, uint64_t currentUsage, uint64_t requestedIncrease, CompletionHandler<void(Optional<uint64_t>)>&&)>;
WEBCORE_EXPORT static Ref<StorageQuotaManager> create(uint64_t quota, UsageGetter&&, QuotaIncreaseRequester&&);
static constexpr uint64_t defaultThirdPartyQuotaFromPerOriginQuota(uint64_t quota) { return quota / 10; }
static constexpr uint64_t defaultQuota() { return 1000 * MB; }
static constexpr uint64_t defaultThirdPartyQuota() { return defaultThirdPartyQuotaFromPerOriginQuota(defaultQuota()); }
enum class Decision { Deny, Grant };
using RequestCallback = CompletionHandler<void(Decision)>;
WEBCORE_EXPORT void requestSpaceOnMainThread(uint64_t, RequestCallback&&);
WEBCORE_EXPORT Decision requestSpaceOnBackgroundThread(uint64_t);
WEBCORE_EXPORT void resetQuotaUpdatedBasedOnUsageForTesting();
WEBCORE_EXPORT void resetQuotaForTesting();
private:
StorageQuotaManager(uint64_t quota, UsageGetter&&, QuotaIncreaseRequester&&);
bool tryGrantRequest(uint64_t);
void updateQuotaBasedOnUsage();
Lock m_quotaCountDownLock;
uint64_t m_quotaCountDown { 0 };
uint64_t m_quota { 0 };
uint64_t m_usage { 0 };
UsageGetter m_usageGetter;
QuotaIncreaseRequester m_quotaIncreaseRequester;
Ref<WorkQueue> m_workQueue;
bool m_quotaUpdatedBasedOnUsage { false };
uint64_t m_initialQuota { 0 };
};
}