зеркало из https://github.com/mozilla/gecko-dev.git
Backed out changeset 77fc6f341fef (bug 1346247)
This commit is contained in:
Родитель
40632b3650
Коммит
5b2cf78b72
|
@ -509,46 +509,6 @@ private:
|
|||
{}
|
||||
};
|
||||
|
||||
class PromiseResolverCallback final : public ServiceWorkerUpdateFinishCallback
|
||||
{
|
||||
public:
|
||||
PromiseResolverCallback(ServiceWorkerUpdateFinishCallback* aCallback,
|
||||
GenericPromise::Private* aPromise)
|
||||
: mCallback(aCallback)
|
||||
, mPromise(aPromise)
|
||||
{
|
||||
MOZ_DIAGNOSTIC_ASSERT(mPromise);
|
||||
}
|
||||
|
||||
void UpdateSucceeded(ServiceWorkerRegistrationInfo* aInfo) override
|
||||
{
|
||||
MOZ_DIAGNOSTIC_ASSERT(mPromise);
|
||||
|
||||
if (mCallback) {
|
||||
mCallback->UpdateSucceeded(aInfo);
|
||||
}
|
||||
|
||||
mPromise->Resolve(true, __func__);
|
||||
mPromise = nullptr;
|
||||
}
|
||||
|
||||
void UpdateFailed(ErrorResult& aStatus) override
|
||||
{
|
||||
MOZ_DIAGNOSTIC_ASSERT(mPromise);
|
||||
|
||||
if (mCallback) {
|
||||
mCallback->UpdateFailed(aStatus);
|
||||
}
|
||||
|
||||
mPromise->Resolve(true, __func__);
|
||||
mPromise = nullptr;
|
||||
}
|
||||
|
||||
private:
|
||||
RefPtr<ServiceWorkerUpdateFinishCallback> mCallback;
|
||||
RefPtr<GenericPromise::Private> mPromise;
|
||||
};
|
||||
|
||||
// This runnable is used for 2 different tasks:
|
||||
// - to postpone the SoftUpdate() until the IPC SWM actor is created
|
||||
// (aInternalMethod == false)
|
||||
|
@ -558,12 +518,10 @@ class SoftUpdateRunnable final : public Runnable
|
|||
{
|
||||
public:
|
||||
SoftUpdateRunnable(const OriginAttributes& aOriginAttributes,
|
||||
const nsACString& aScope, bool aInternalMethod,
|
||||
GenericPromise::Private* aPromise)
|
||||
const nsACString& aScope, bool aInternalMethod)
|
||||
: mAttrs(aOriginAttributes)
|
||||
, mScope(aScope)
|
||||
, mInternalMethod(aInternalMethod)
|
||||
, mPromise(aPromise)
|
||||
{}
|
||||
|
||||
NS_IMETHOD Run() override
|
||||
|
@ -576,10 +534,7 @@ public:
|
|||
}
|
||||
|
||||
if (mInternalMethod) {
|
||||
RefPtr<PromiseResolverCallback> callback =
|
||||
new PromiseResolverCallback(nullptr, mPromise);
|
||||
|
||||
swm->SoftUpdateInternal(mAttrs, mScope, callback);
|
||||
swm->SoftUpdateInternal(mAttrs, mScope);
|
||||
} else {
|
||||
swm->SoftUpdate(mAttrs, mScope);
|
||||
}
|
||||
|
@ -594,8 +549,6 @@ private:
|
|||
const OriginAttributes mAttrs;
|
||||
const nsCString mScope;
|
||||
bool mInternalMethod;
|
||||
|
||||
RefPtr<GenericPromise::Private> mPromise;
|
||||
};
|
||||
|
||||
// This runnable is used for 3 different tasks:
|
||||
|
@ -616,13 +569,11 @@ public:
|
|||
UpdateRunnable(nsIPrincipal* aPrincipal,
|
||||
const nsACString& aScope,
|
||||
ServiceWorkerUpdateFinishCallback* aCallback,
|
||||
Type aType,
|
||||
GenericPromise::Private* aPromise)
|
||||
Type aType)
|
||||
: mPrincipal(aPrincipal)
|
||||
, mScope(aScope)
|
||||
, mCallback(aCallback)
|
||||
, mType(aType)
|
||||
, mPromise(aPromise)
|
||||
{}
|
||||
|
||||
NS_IMETHOD Run() override
|
||||
|
@ -639,18 +590,13 @@ public:
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
MOZ_ASSERT(mPromise);
|
||||
|
||||
RefPtr<PromiseResolverCallback> callback =
|
||||
new PromiseResolverCallback(mCallback, mPromise);
|
||||
|
||||
if (mType == eSuccess) {
|
||||
swm->UpdateInternal(mPrincipal, mScope, callback);
|
||||
swm->UpdateInternal(mPrincipal, mScope, mCallback);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
ErrorResult error(NS_ERROR_DOM_ABORT_ERR);
|
||||
callback->UpdateFailed(error);
|
||||
mCallback->UpdateFailed(error);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -662,26 +608,6 @@ private:
|
|||
const nsCString mScope;
|
||||
RefPtr<ServiceWorkerUpdateFinishCallback> mCallback;
|
||||
Type mType;
|
||||
|
||||
RefPtr<GenericPromise::Private> mPromise;
|
||||
};
|
||||
|
||||
class ResolvePromiseRunnable final : public Runnable
|
||||
{
|
||||
public:
|
||||
explicit ResolvePromiseRunnable(GenericPromise::Private* aPromise)
|
||||
: mPromise(aPromise)
|
||||
{}
|
||||
|
||||
NS_IMETHOD
|
||||
Run() override
|
||||
{
|
||||
mPromise->Resolve(true, __func__);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
RefPtr<GenericPromise::Private> mPromise;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
@ -2904,73 +2830,25 @@ ServiceWorkerManager::SoftUpdate(const OriginAttributes& aOriginAttributes,
|
|||
|
||||
if (!mActor) {
|
||||
RefPtr<Runnable> runnable =
|
||||
new SoftUpdateRunnable(aOriginAttributes, aScope, false, nullptr);
|
||||
new SoftUpdateRunnable(aOriginAttributes, aScope, false);
|
||||
AppendPendingOperation(runnable);
|
||||
return;
|
||||
}
|
||||
|
||||
RefPtr<GenericPromise::Private> promise =
|
||||
new GenericPromise::Private(__func__);
|
||||
|
||||
RefPtr<Runnable> successRunnable =
|
||||
new SoftUpdateRunnable(aOriginAttributes, aScope, true, promise);
|
||||
|
||||
RefPtr<Runnable> failureRunnable =
|
||||
new ResolvePromiseRunnable(promise);
|
||||
RefPtr<Runnable> runnable =
|
||||
new SoftUpdateRunnable(aOriginAttributes, aScope, true);
|
||||
|
||||
ServiceWorkerUpdaterChild* actor =
|
||||
new ServiceWorkerUpdaterChild(promise, successRunnable, failureRunnable);
|
||||
|
||||
new ServiceWorkerUpdaterChild(runnable, nullptr);
|
||||
mActor->SendPServiceWorkerUpdaterConstructor(actor, aOriginAttributes,
|
||||
nsCString(aScope));
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
class UpdateJobCallback final : public ServiceWorkerJob::Callback
|
||||
{
|
||||
RefPtr<ServiceWorkerUpdateFinishCallback> mCallback;
|
||||
|
||||
~UpdateJobCallback() = default;
|
||||
|
||||
public:
|
||||
explicit UpdateJobCallback(ServiceWorkerUpdateFinishCallback* aCallback)
|
||||
: mCallback(aCallback)
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
MOZ_ASSERT(mCallback);
|
||||
}
|
||||
|
||||
void
|
||||
JobFinished(ServiceWorkerJob* aJob, ErrorResult& aStatus)
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
MOZ_ASSERT(aJob);
|
||||
|
||||
if (aStatus.Failed()) {
|
||||
mCallback->UpdateFailed(aStatus);
|
||||
return;
|
||||
}
|
||||
|
||||
MOZ_DIAGNOSTIC_ASSERT(aJob->GetType() == ServiceWorkerJob::Type::Update);
|
||||
RefPtr<ServiceWorkerUpdateJob> updateJob =
|
||||
static_cast<ServiceWorkerUpdateJob*>(aJob);
|
||||
RefPtr<ServiceWorkerRegistrationInfo> reg = updateJob->GetRegistration();
|
||||
mCallback->UpdateSucceeded(reg);
|
||||
}
|
||||
|
||||
NS_INLINE_DECL_REFCOUNTING(UpdateJobCallback)
|
||||
};
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
void
|
||||
ServiceWorkerManager::SoftUpdateInternal(const OriginAttributes& aOriginAttributes,
|
||||
const nsACString& aScope,
|
||||
ServiceWorkerUpdateFinishCallback* aCallback)
|
||||
const nsACString& aScope)
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
MOZ_ASSERT(aCallback);
|
||||
|
||||
if (mShuttingDown) {
|
||||
return;
|
||||
|
@ -3029,13 +2907,50 @@ ServiceWorkerManager::SoftUpdateInternal(const OriginAttributes& aOriginAttribut
|
|||
new ServiceWorkerUpdateJob(principal, registration->mScope,
|
||||
newest->ScriptSpec(), nullptr,
|
||||
registration->GetLoadFlags());
|
||||
|
||||
RefPtr<UpdateJobCallback> cb = new UpdateJobCallback(aCallback);
|
||||
job->AppendResultCallback(cb);
|
||||
|
||||
queue->ScheduleJob(job);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
class UpdateJobCallback final : public ServiceWorkerJob::Callback
|
||||
{
|
||||
RefPtr<ServiceWorkerUpdateFinishCallback> mCallback;
|
||||
|
||||
~UpdateJobCallback()
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
explicit UpdateJobCallback(ServiceWorkerUpdateFinishCallback* aCallback)
|
||||
: mCallback(aCallback)
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
MOZ_ASSERT(mCallback);
|
||||
}
|
||||
|
||||
void
|
||||
JobFinished(ServiceWorkerJob* aJob, ErrorResult& aStatus)
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
MOZ_ASSERT(aJob);
|
||||
|
||||
if (aStatus.Failed()) {
|
||||
mCallback->UpdateFailed(aStatus);
|
||||
return;
|
||||
}
|
||||
|
||||
MOZ_ASSERT(aJob->GetType() == ServiceWorkerJob::Type::Update);
|
||||
RefPtr<ServiceWorkerUpdateJob> updateJob =
|
||||
static_cast<ServiceWorkerUpdateJob*>(aJob);
|
||||
RefPtr<ServiceWorkerRegistrationInfo> reg = updateJob->GetRegistration();
|
||||
mCallback->UpdateSucceeded(reg);
|
||||
}
|
||||
|
||||
NS_INLINE_DECL_REFCOUNTING(UpdateJobCallback)
|
||||
};
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
void
|
||||
ServiceWorkerManager::Update(nsIPrincipal* aPrincipal,
|
||||
const nsACString& aScope,
|
||||
|
@ -3046,25 +2961,21 @@ ServiceWorkerManager::Update(nsIPrincipal* aPrincipal,
|
|||
if (!mActor) {
|
||||
RefPtr<Runnable> runnable =
|
||||
new UpdateRunnable(aPrincipal, aScope, aCallback,
|
||||
UpdateRunnable::ePostpone, nullptr);
|
||||
UpdateRunnable::ePostpone);
|
||||
AppendPendingOperation(runnable);
|
||||
return;
|
||||
}
|
||||
|
||||
RefPtr<GenericPromise::Private> promise =
|
||||
new GenericPromise::Private(__func__);
|
||||
|
||||
RefPtr<Runnable> successRunnable =
|
||||
new UpdateRunnable(aPrincipal, aScope, aCallback,
|
||||
UpdateRunnable::eSuccess, promise);
|
||||
UpdateRunnable::eSuccess);
|
||||
|
||||
RefPtr<Runnable> failureRunnable =
|
||||
new UpdateRunnable(aPrincipal, aScope, aCallback,
|
||||
UpdateRunnable::eFailure, promise);
|
||||
UpdateRunnable::eFailure);
|
||||
|
||||
ServiceWorkerUpdaterChild* actor =
|
||||
new ServiceWorkerUpdaterChild(promise, successRunnable, failureRunnable);
|
||||
|
||||
new ServiceWorkerUpdaterChild(successRunnable, failureRunnable);
|
||||
mActor->SendPServiceWorkerUpdaterConstructor(actor,
|
||||
aPrincipal->OriginAttributesRef(),
|
||||
nsCString(aScope));
|
||||
|
|
|
@ -175,8 +175,7 @@ public:
|
|||
|
||||
void
|
||||
SoftUpdateInternal(const OriginAttributes& aOriginAttributes,
|
||||
const nsACString& aScope,
|
||||
ServiceWorkerUpdateFinishCallback* aCallback);
|
||||
const nsACString& aScope);
|
||||
|
||||
|
||||
void
|
||||
|
|
|
@ -10,43 +10,27 @@ namespace mozilla {
|
|||
namespace dom {
|
||||
namespace workers {
|
||||
|
||||
ServiceWorkerUpdaterChild::ServiceWorkerUpdaterChild(GenericPromise* aPromise,
|
||||
Runnable* aSuccessRunnable,
|
||||
ServiceWorkerUpdaterChild::ServiceWorkerUpdaterChild(Runnable* aSuccessRunnable,
|
||||
Runnable* aFailureRunnable)
|
||||
: mSuccessRunnable(aSuccessRunnable)
|
||||
, mFailureRunnable(aFailureRunnable)
|
||||
{
|
||||
MOZ_ASSERT(aPromise);
|
||||
MOZ_ASSERT(aSuccessRunnable);
|
||||
MOZ_ASSERT(aFailureRunnable);
|
||||
|
||||
aPromise->Then(AbstractThread::GetCurrent(), __func__,
|
||||
[this]() {
|
||||
mPromiseHolder.Complete();
|
||||
Unused << Send__delete__(this);
|
||||
}).Track(mPromiseHolder);
|
||||
}
|
||||
|
||||
mozilla::ipc::IPCResult
|
||||
ServiceWorkerUpdaterChild::RecvProceed(const bool& aAllowed)
|
||||
{
|
||||
// If we have a callback, it will resolve the promise.
|
||||
|
||||
if (aAllowed) {
|
||||
mSuccessRunnable->Run();
|
||||
} else {
|
||||
} else if (mFailureRunnable) {
|
||||
mFailureRunnable->Run();
|
||||
}
|
||||
|
||||
Unused << Send__delete__(this);
|
||||
return IPC_OK();
|
||||
}
|
||||
|
||||
void
|
||||
ServiceWorkerUpdaterChild::ActorDestroy(ActorDestroyReason aWhy)
|
||||
{
|
||||
mPromiseHolder.DisconnectIfExists();
|
||||
}
|
||||
|
||||
} // namespace workers
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
|
||||
#include "mozilla/dom/PServiceWorkerUpdaterChild.h"
|
||||
#include "mozilla/BasePrincipal.h"
|
||||
#include "mozilla/MozPromise.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
@ -18,19 +17,13 @@ namespace workers {
|
|||
class ServiceWorkerUpdaterChild final : public PServiceWorkerUpdaterChild
|
||||
{
|
||||
public:
|
||||
ServiceWorkerUpdaterChild(GenericPromise* aPromise,
|
||||
Runnable* aSuccessRunnable,
|
||||
ServiceWorkerUpdaterChild(Runnable* aSuccessRunnable,
|
||||
Runnable* aFailureRunnable);
|
||||
|
||||
mozilla::ipc::IPCResult
|
||||
RecvProceed(const bool& aAllowed) override;
|
||||
|
||||
private:
|
||||
void
|
||||
ActorDestroy(ActorDestroyReason aWhy) override;
|
||||
|
||||
MozPromiseRequestHolder<GenericPromise> mPromiseHolder;
|
||||
|
||||
RefPtr<Runnable> mSuccessRunnable;
|
||||
RefPtr<Runnable> mFailureRunnable;
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче