Files
tubestation/dom/quota/ActorsChild.cpp
Jan Varga 8f6f907c24 Bug 1933053 - QM: Rework QuotaManagerService::ListOrigins to use an async message with an async response; r=dom-storage-reviewers,asuth
A sub actor is no longer created. Actual result is now returned as an
asynchronous response to an asynchronous message.

Although this modernizes the code, the primary motivation is to enable calling
QuotaManager::ListOrigins in gtests.

Differential Revision: https://phabricator.services.mozilla.com/D230137
2024-12-14 21:48:18 +00:00

231 lines
5.5 KiB
C++

/* -*- 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 "ActorsChild.h"
// Local includes
#include "QuotaManagerService.h"
#include "QuotaRequests.h"
#include "QuotaResults.h"
// Global includes
#include <new>
#include <utility>
#include "mozilla/Assertions.h"
#include "mozilla/dom/quota/PQuotaRequest.h"
#include "nsError.h"
#include "nsID.h"
#include "nsIEventTarget.h"
#include "nsIQuotaResults.h"
#include "nsISupports.h"
#include "nsIVariant.h"
#include "nsString.h"
#include "nsThreadUtils.h"
#include "nsVariant.h"
namespace mozilla::dom::quota {
/*******************************************************************************
* QuotaChild
******************************************************************************/
QuotaChild::QuotaChild(QuotaManagerService* aService)
: mService(aService)
#ifdef DEBUG
,
mOwningThread(GetCurrentSerialEventTarget())
#endif
{
AssertIsOnOwningThread();
MOZ_ASSERT(aService);
MOZ_COUNT_CTOR(quota::QuotaChild);
}
QuotaChild::~QuotaChild() {
AssertIsOnOwningThread();
MOZ_COUNT_DTOR(quota::QuotaChild);
}
#ifdef DEBUG
void QuotaChild::AssertIsOnOwningThread() const {
MOZ_ASSERT(mOwningThread);
bool current;
MOZ_ASSERT(NS_SUCCEEDED(mOwningThread->IsOnCurrentThread(&current)));
MOZ_ASSERT(current);
}
#endif // DEBUG
void QuotaChild::ActorDestroy(ActorDestroyReason aWhy) {
AssertIsOnOwningThread();
if (mService) {
mService->ClearBackgroundActor();
#ifdef DEBUG
mService = nullptr;
#endif
}
}
PQuotaRequestChild* QuotaChild::AllocPQuotaRequestChild(
const RequestParams& aParams) {
AssertIsOnOwningThread();
MOZ_CRASH("PQuotaRequestChild actors should be manually constructed!");
}
bool QuotaChild::DeallocPQuotaRequestChild(PQuotaRequestChild* aActor) {
AssertIsOnOwningThread();
MOZ_ASSERT(aActor);
delete static_cast<QuotaRequestChild*>(aActor);
return true;
}
/*******************************************************************************
* QuotaRequestChild
******************************************************************************/
QuotaRequestChild::QuotaRequestChild(Request* aRequest) : mRequest(aRequest) {
AssertIsOnOwningThread();
MOZ_COUNT_CTOR(quota::QuotaRequestChild);
}
QuotaRequestChild::~QuotaRequestChild() {
AssertIsOnOwningThread();
MOZ_COUNT_DTOR(quota::QuotaRequestChild);
}
#ifdef DEBUG
void QuotaRequestChild::AssertIsOnOwningThread() const {
MOZ_ASSERT(mRequest);
mRequest->AssertIsOnOwningThread();
}
#endif // DEBUG
void QuotaRequestChild::HandleResponse(nsresult aResponse) {
AssertIsOnOwningThread();
MOZ_ASSERT(NS_FAILED(aResponse));
MOZ_ASSERT(mRequest);
mRequest->SetError(aResponse);
}
void QuotaRequestChild::HandleResponse() {
AssertIsOnOwningThread();
MOZ_ASSERT(mRequest);
RefPtr<nsVariant> variant = new nsVariant();
variant->SetAsVoid();
mRequest->SetResult(variant);
}
void QuotaRequestChild::HandleResponse(bool aResponse) {
AssertIsOnOwningThread();
MOZ_ASSERT(mRequest);
RefPtr<nsVariant> variant = new nsVariant();
variant->SetAsBool(aResponse);
mRequest->SetResult(variant);
}
void QuotaRequestChild::HandleResponse(const nsAString& aResponse) {
AssertIsOnOwningThread();
MOZ_ASSERT(mRequest);
RefPtr<nsVariant> variant = new nsVariant();
variant->SetAsAString(aResponse);
mRequest->SetResult(variant);
}
void QuotaRequestChild::HandleResponse(const EstimateResponse& aResponse) {
AssertIsOnOwningThread();
MOZ_ASSERT(mRequest);
RefPtr<EstimateResult> result =
new EstimateResult(aResponse.usage(), aResponse.limit());
RefPtr<nsVariant> variant = new nsVariant();
variant->SetAsInterface(NS_GET_IID(nsIQuotaEstimateResult), result);
mRequest->SetResult(variant);
}
void QuotaRequestChild::HandleResponse(
const GetFullOriginMetadataResponse& aResponse) {
AssertIsOnOwningThread();
MOZ_ASSERT(mRequest);
RefPtr<nsVariant> variant = new nsVariant();
if (aResponse.maybeFullOriginMetadata()) {
RefPtr<FullOriginMetadataResult> result =
new FullOriginMetadataResult(*aResponse.maybeFullOriginMetadata());
variant->SetAsInterface(NS_GET_IID(nsIQuotaFullOriginMetadataResult),
result);
} else {
variant->SetAsVoid();
}
mRequest->SetResult(variant);
}
void QuotaRequestChild::ActorDestroy(ActorDestroyReason aWhy) {
AssertIsOnOwningThread();
}
mozilla::ipc::IPCResult QuotaRequestChild::Recv__delete__(
const RequestResponse& aResponse) {
AssertIsOnOwningThread();
MOZ_ASSERT(mRequest);
switch (aResponse.type()) {
case RequestResponse::Tnsresult:
HandleResponse(aResponse.get_nsresult());
break;
case RequestResponse::TStorageNameResponse:
HandleResponse(aResponse.get_StorageNameResponse().name());
break;
case RequestResponse::TPersistResponse:
HandleResponse();
break;
case RequestResponse::TGetFullOriginMetadataResponse:
HandleResponse(aResponse.get_GetFullOriginMetadataResponse());
break;
case RequestResponse::TPersistedResponse:
HandleResponse(aResponse.get_PersistedResponse().persisted());
break;
case RequestResponse::TEstimateResponse:
HandleResponse(aResponse.get_EstimateResponse());
break;
default:
MOZ_CRASH("Unknown response type!");
}
return IPC_OK();
}
} // namespace mozilla::dom::quota