Bug 1472005 Don't resolve ready promise until the registration has reached the right state version. r=mrbkap
This commit is contained in:
@@ -544,7 +544,14 @@ ServiceWorkerContainer::GetReady(ErrorResult& aRv)
|
|||||||
RefPtr<ServiceWorkerRegistration> reg =
|
RefPtr<ServiceWorkerRegistration> reg =
|
||||||
global->GetOrCreateServiceWorkerRegistration(aDescriptor);
|
global->GetOrCreateServiceWorkerRegistration(aDescriptor);
|
||||||
NS_ENSURE_TRUE_VOID(reg);
|
NS_ENSURE_TRUE_VOID(reg);
|
||||||
|
|
||||||
|
// Don't resolve the ready promise until the registration has
|
||||||
|
// reached the right version. This ensures that the active
|
||||||
|
// worker property is set correctly on the registration.
|
||||||
|
reg->WhenVersionReached(aDescriptor.Version(),
|
||||||
|
[outer, reg] (bool aResult) {
|
||||||
outer->MaybeResolve(reg);
|
outer->MaybeResolve(reg);
|
||||||
|
});
|
||||||
}, [self, outer] (ErrorResult& aRv) {
|
}, [self, outer] (ErrorResult& aRv) {
|
||||||
outer->MaybeReject(aRv);
|
outer->MaybeReject(aRv);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -158,6 +158,17 @@ ServiceWorkerRegistration::UpdateState(const ServiceWorkerRegistrationDescriptor
|
|||||||
UpdateStateInternal(aDescriptor.GetInstalling(),
|
UpdateStateInternal(aDescriptor.GetInstalling(),
|
||||||
aDescriptor.GetWaiting(),
|
aDescriptor.GetWaiting(),
|
||||||
aDescriptor.GetActive());
|
aDescriptor.GetActive());
|
||||||
|
|
||||||
|
nsTArray<UniquePtr<VersionCallback>> callbackList;
|
||||||
|
mVersionCallbackList.SwapElements(callbackList);
|
||||||
|
for (auto& cb : callbackList) {
|
||||||
|
if (cb->mVersion > mDescriptor.Version()) {
|
||||||
|
mVersionCallbackList.AppendElement(std::move(cb));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
cb->mFunc(cb->mVersion == mDescriptor.Version());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@@ -343,6 +354,19 @@ ServiceWorkerRegistration::Descriptor() const
|
|||||||
return mDescriptor;
|
return mDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ServiceWorkerRegistration::WhenVersionReached(uint64_t aVersion,
|
||||||
|
ServiceWorkerBoolCallback&& aCallback)
|
||||||
|
{
|
||||||
|
if (aVersion <= mDescriptor.Version()) {
|
||||||
|
aCallback(aVersion == mDescriptor.Version());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mVersionCallbackList.AppendElement(
|
||||||
|
MakeUnique<VersionCallback>(aVersion, std::move(aCallback)));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ServiceWorkerRegistration::MaybeScheduleUpdateFound(const Maybe<ServiceWorkerDescriptor>& aInstallingDescriptor)
|
ServiceWorkerRegistration::MaybeScheduleUpdateFound(const Maybe<ServiceWorkerDescriptor>& aInstallingDescriptor)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -119,6 +119,9 @@ public:
|
|||||||
const ServiceWorkerRegistrationDescriptor&
|
const ServiceWorkerRegistrationDescriptor&
|
||||||
Descriptor() const;
|
Descriptor() const;
|
||||||
|
|
||||||
|
void
|
||||||
|
WhenVersionReached(uint64_t aVersion, ServiceWorkerBoolCallback&& aCallback);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ServiceWorkerRegistration(nsIGlobalObject* aGlobal,
|
ServiceWorkerRegistration(nsIGlobalObject* aGlobal,
|
||||||
const ServiceWorkerRegistrationDescriptor& aDescriptor,
|
const ServiceWorkerRegistrationDescriptor& aDescriptor,
|
||||||
@@ -148,6 +151,20 @@ private:
|
|||||||
RefPtr<ServiceWorker> mActiveWorker;
|
RefPtr<ServiceWorker> mActiveWorker;
|
||||||
RefPtr<PushManager> mPushManager;
|
RefPtr<PushManager> mPushManager;
|
||||||
|
|
||||||
|
struct VersionCallback
|
||||||
|
{
|
||||||
|
uint64_t mVersion;
|
||||||
|
ServiceWorkerBoolCallback mFunc;
|
||||||
|
|
||||||
|
VersionCallback(uint64_t aVersion, ServiceWorkerBoolCallback&& aFunc)
|
||||||
|
: mVersion(aVersion)
|
||||||
|
, mFunc(std::move(aFunc))
|
||||||
|
{
|
||||||
|
MOZ_DIAGNOSTIC_ASSERT(mFunc);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
nsTArray<UniquePtr<VersionCallback>> mVersionCallbackList;
|
||||||
|
|
||||||
uint64_t mScheduledUpdateFoundId;
|
uint64_t mScheduledUpdateFoundId;
|
||||||
uint64_t mDispatchedUpdateFoundId;
|
uint64_t mDispatchedUpdateFoundId;
|
||||||
uint32_t mPendingUpdatePromises;
|
uint32_t mPendingUpdatePromises;
|
||||||
|
|||||||
Reference in New Issue
Block a user