зеркало из https://github.com/mozilla/gecko-dev.git
289 строки
6.2 KiB
C++
289 строки
6.2 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 "QuotaRequests.h"
|
|
|
|
// Local includes
|
|
#include "ActorsChild.h"
|
|
|
|
// Global includes
|
|
#include "mozilla/ErrorNames.h"
|
|
#include "mozilla/MacroForEach.h"
|
|
#include "nsDebug.h"
|
|
#include "nsIQuotaCallbacks.h"
|
|
#include "nsISupportsUtils.h"
|
|
#include "nsIVariant.h"
|
|
#include "nsStringFwd.h"
|
|
#include "nscore.h"
|
|
|
|
namespace mozilla {
|
|
class Runnable;
|
|
}
|
|
|
|
namespace mozilla::dom::quota {
|
|
|
|
RequestBase::RequestBase() : mResultCode(NS_OK), mHaveResultOrErrorCode(false) {
|
|
AssertIsOnOwningThread();
|
|
}
|
|
|
|
RequestBase::RequestBase(nsIPrincipal* aPrincipal)
|
|
: mPrincipal(aPrincipal),
|
|
mResultCode(NS_OK),
|
|
mHaveResultOrErrorCode(false) {
|
|
AssertIsOnOwningThread();
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
|
|
void RequestBase::AssertIsOnOwningThread() const {
|
|
NS_ASSERT_OWNINGTHREAD(RequestBase);
|
|
}
|
|
|
|
#endif // DEBUG
|
|
|
|
void RequestBase::SetError(nsresult aRv) {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(mResultCode == NS_OK);
|
|
MOZ_ASSERT(!mHaveResultOrErrorCode);
|
|
|
|
mResultCode = aRv;
|
|
mHaveResultOrErrorCode = true;
|
|
|
|
FireCallback();
|
|
}
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_0(RequestBase)
|
|
|
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RequestBase)
|
|
NS_INTERFACE_MAP_ENTRY(nsISupports)
|
|
NS_INTERFACE_MAP_END
|
|
|
|
NS_IMPL_CYCLE_COLLECTING_ADDREF(RequestBase)
|
|
NS_IMPL_CYCLE_COLLECTING_RELEASE(RequestBase)
|
|
|
|
NS_IMETHODIMP
|
|
RequestBase::GetPrincipal(nsIPrincipal** aPrincipal) {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(aPrincipal);
|
|
|
|
NS_IF_ADDREF(*aPrincipal = mPrincipal);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
RequestBase::GetResultCode(nsresult* aResultCode) {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(aResultCode);
|
|
|
|
if (!mHaveResultOrErrorCode) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
*aResultCode = mResultCode;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
RequestBase::GetResultName(nsACString& aResultName) {
|
|
AssertIsOnOwningThread();
|
|
|
|
if (!mHaveResultOrErrorCode) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
mozilla::GetErrorName(mResultCode, aResultName);
|
|
return NS_OK;
|
|
}
|
|
|
|
UsageRequest::UsageRequest(nsIQuotaUsageCallback* aCallback)
|
|
: mCallback(aCallback), mBackgroundActor(nullptr), mCanceled(false) {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(aCallback);
|
|
}
|
|
|
|
UsageRequest::UsageRequest(nsIPrincipal* aPrincipal,
|
|
nsIQuotaUsageCallback* aCallback)
|
|
: RequestBase(aPrincipal),
|
|
mCallback(aCallback),
|
|
mBackgroundActor(nullptr),
|
|
mCanceled(false) {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(aPrincipal);
|
|
MOZ_ASSERT(aCallback);
|
|
}
|
|
|
|
UsageRequest::~UsageRequest() { AssertIsOnOwningThread(); }
|
|
|
|
void UsageRequest::SetBackgroundActor(
|
|
QuotaUsageRequestChild* aBackgroundActor) {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(aBackgroundActor);
|
|
MOZ_ASSERT(!mBackgroundActor);
|
|
|
|
mBackgroundActor = aBackgroundActor;
|
|
|
|
if (mCanceled) {
|
|
mBackgroundActor->SendCancel();
|
|
}
|
|
}
|
|
|
|
void UsageRequest::SetResult(nsIVariant* aResult) {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(aResult);
|
|
MOZ_ASSERT(!mHaveResultOrErrorCode);
|
|
|
|
mResult = aResult;
|
|
|
|
mHaveResultOrErrorCode = true;
|
|
|
|
FireCallback();
|
|
}
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_INHERITED(UsageRequest, RequestBase, mCallback)
|
|
|
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(UsageRequest)
|
|
NS_INTERFACE_MAP_ENTRY(nsIQuotaUsageRequest)
|
|
NS_INTERFACE_MAP_END_INHERITING(RequestBase)
|
|
|
|
NS_IMPL_ADDREF_INHERITED(UsageRequest, RequestBase)
|
|
NS_IMPL_RELEASE_INHERITED(UsageRequest, RequestBase)
|
|
|
|
NS_IMETHODIMP
|
|
UsageRequest::GetResult(nsIVariant** aResult) {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(aResult);
|
|
|
|
if (!mHaveResultOrErrorCode) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
NS_IF_ADDREF(*aResult = mResult);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
UsageRequest::GetCallback(nsIQuotaUsageCallback** aCallback) {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(aCallback);
|
|
|
|
NS_IF_ADDREF(*aCallback = mCallback);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
UsageRequest::SetCallback(nsIQuotaUsageCallback* aCallback) {
|
|
AssertIsOnOwningThread();
|
|
|
|
mCallback = aCallback;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
UsageRequest::Cancel() {
|
|
AssertIsOnOwningThread();
|
|
|
|
if (mCanceled) {
|
|
NS_WARNING("Canceled more than once?!");
|
|
return NS_ERROR_UNEXPECTED;
|
|
}
|
|
|
|
if (mBackgroundActor) {
|
|
mBackgroundActor->SendCancel();
|
|
}
|
|
|
|
mCanceled = true;
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
void UsageRequest::FireCallback() {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(mCallback);
|
|
|
|
mCallback->OnUsageResult(this);
|
|
|
|
// Clean up.
|
|
mCallback = nullptr;
|
|
}
|
|
|
|
Request::Request() { AssertIsOnOwningThread(); }
|
|
|
|
Request::Request(nsIPrincipal* aPrincipal) : RequestBase(aPrincipal) {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(aPrincipal);
|
|
}
|
|
|
|
Request::Request(nsIQuotaCallback* aCallback) : mCallback(aCallback) {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(aCallback);
|
|
}
|
|
|
|
Request::~Request() { AssertIsOnOwningThread(); }
|
|
|
|
void Request::SetResult(nsIVariant* aResult) {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(aResult);
|
|
MOZ_ASSERT(!mHaveResultOrErrorCode);
|
|
|
|
mResult = aResult;
|
|
|
|
mHaveResultOrErrorCode = true;
|
|
|
|
FireCallback();
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
Request::GetResult(nsIVariant** aResult) {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(aResult);
|
|
|
|
if (!mHaveResultOrErrorCode) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
NS_IF_ADDREF(*aResult = mResult);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_INHERITED(Request, RequestBase, mCallback, mResult)
|
|
|
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Request)
|
|
NS_INTERFACE_MAP_ENTRY(nsIQuotaRequest)
|
|
NS_INTERFACE_MAP_END_INHERITING(RequestBase)
|
|
|
|
NS_IMPL_ADDREF_INHERITED(mozilla::dom::quota::Request, RequestBase)
|
|
NS_IMPL_RELEASE_INHERITED(mozilla::dom::quota::Request, RequestBase)
|
|
|
|
NS_IMETHODIMP
|
|
Request::GetCallback(nsIQuotaCallback** aCallback) {
|
|
AssertIsOnOwningThread();
|
|
MOZ_ASSERT(aCallback);
|
|
|
|
NS_IF_ADDREF(*aCallback = mCallback);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
Request::SetCallback(nsIQuotaCallback* aCallback) {
|
|
AssertIsOnOwningThread();
|
|
|
|
mCallback = aCallback;
|
|
return NS_OK;
|
|
}
|
|
|
|
void Request::FireCallback() {
|
|
AssertIsOnOwningThread();
|
|
|
|
if (mCallback) {
|
|
mCallback->OnComplete(this);
|
|
|
|
// Clean up.
|
|
mCallback = nullptr;
|
|
}
|
|
}
|
|
|
|
} // namespace mozilla::dom::quota
|