Bug 1722502 - P1 Implement the quota usage checking methods in ServiceWorker for quota usage mitigation. r=dom-worker-reviewers,asuth

This patch implements methods for ServiceWorkerRegistrationInfo to invoke the quota usage checking.

ServiceWorkerRegistrationInfo::CheckQuotaUsage() is an internal using method, such that it is a private method.

Differential Revision: https://phabricator.services.mozilla.com/D120964
This commit is contained in:
Eden Chuang 2021-08-30 09:24:31 +00:00
parent 1d8ba48f58
commit 780ca9d776
4 changed files with 41 additions and 0 deletions

View File

@ -2268,6 +2268,32 @@ int32_t ServiceWorkerManager::GetPrincipalQuotaUsageCheckCount(
return data->mQuotaUsageCheckCount;
}
void ServiceWorkerManager::CheckPrincipalQuotaUsage(nsIPrincipal* aPrincipal,
const nsACString& aScope) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aPrincipal);
nsAutoCString scopeKey;
nsresult rv = PrincipalToScopeKey(aPrincipal, scopeKey);
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
RegistrationDataPerPrincipal* data;
if (!mRegistrationInfos.Get(scopeKey, &data)) {
return;
}
// Had already schedule a quota usage check.
if (data->mQuotaUsageCheckCount != 0) {
return;
}
++data->mQuotaUsageCheckCount;
// Perform quota usage checking here with QuotaManager in the following patch.
}
void ServiceWorkerManager::SoftUpdate(const OriginAttributes& aOriginAttributes,
const nsACString& aScope) {
MOZ_ASSERT(NS_IsMainThread());

View File

@ -254,6 +254,9 @@ class ServiceWorkerManager final : public nsIServiceWorkerManager,
int32_t GetPrincipalQuotaUsageCheckCount(nsIPrincipal* aPrincipal);
void CheckPrincipalQuotaUsage(nsIPrincipal* aPrincipal,
const nsACString& aScope);
// Returns the shutdown state ID (may be an invalid ID if an
// nsIAsyncShutdownBlocker is not used).
uint32_t MaybeInitServiceWorkerShutdownProgress() const;

View File

@ -517,6 +517,7 @@ void ServiceWorkerRegistrationInfo::MaybeScheduleUpdate() {
// Disable unregister mitigation when navigation fault threshold is 0.
if (navigationFaultThreshold <= navigationFaultCount &&
navigationFaultThreshold != 0) {
CheckQuotaUsage();
swm->Unregister(mPrincipal, nullptr, NS_ConvertUTF8toUTF16(Scope()));
return;
}
@ -895,5 +896,14 @@ void ServiceWorkerRegistrationInfo::ForEachWorker(
}
}
void ServiceWorkerRegistrationInfo::CheckQuotaUsage() {
MOZ_ASSERT(NS_IsMainThread());
RefPtr<ServiceWorkerManager> swm = ServiceWorkerManager::GetInstance();
MOZ_ASSERT(swm);
swm->CheckPrincipalQuotaUsage(mPrincipal, Scope());
}
} // namespace dom
} // namespace mozilla

View File

@ -261,6 +261,8 @@ class ServiceWorkerRegistrationInfo final
// call to `aFunc`, so `aFunc` will always get a reference to a non-null
// pointer.
void ForEachWorker(void (*aFunc)(RefPtr<ServiceWorkerInfo>&));
void CheckQuotaUsage();
};
} // namespace dom