mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1160527 - Patch 1 - Support PushEvent.waitUntil(). r=baku.
This commit is contained in:
parent
65dbcc75c2
commit
365efe4a1f
@ -284,7 +284,7 @@ private:
|
|||||||
nsRefPtr<ServiceWorkerManagerChild> mActor;
|
nsRefPtr<ServiceWorkerManagerChild> mActor;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // Anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
||||||
NS_IMPL_ISUPPORTS0(ServiceWorkerJob)
|
NS_IMPL_ISUPPORTS0(ServiceWorkerJob)
|
||||||
NS_IMPL_ISUPPORTS0(ServiceWorkerRegistrationInfo)
|
NS_IMPL_ISUPPORTS0(ServiceWorkerRegistrationInfo)
|
||||||
@ -1587,6 +1587,74 @@ ServiceWorkerManager::AppendPendingOperation(nsIRunnable* aRunnable)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
// Just holds a ref to a ServiceWorker until the Promise is fulfilled.
|
||||||
|
class KeepAliveHandler final : public PromiseNativeHandler
|
||||||
|
{
|
||||||
|
nsMainThreadPtrHandle<ServiceWorker> mServiceWorker;
|
||||||
|
|
||||||
|
virtual ~KeepAliveHandler()
|
||||||
|
{}
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit KeepAliveHandler(const nsMainThreadPtrHandle<ServiceWorker>& aServiceWorker)
|
||||||
|
: mServiceWorker(aServiceWorker)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void
|
||||||
|
ResolvedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue) override
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
|
||||||
|
MOZ_ASSERT(workerPrivate);
|
||||||
|
workerPrivate->AssertIsOnWorkerThread();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
RejectedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue) override
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
|
||||||
|
MOZ_ASSERT(workerPrivate);
|
||||||
|
workerPrivate->AssertIsOnWorkerThread();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Returns a Promise if the event was successfully dispatched and no exceptions
|
||||||
|
// were raised, otherwise returns null.
|
||||||
|
already_AddRefed<Promise>
|
||||||
|
DispatchExtendableEventOnWorkerScope(JSContext* aCx,
|
||||||
|
WorkerGlobalScope* aWorkerScope,
|
||||||
|
ExtendableEvent* aEvent)
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(aWorkerScope);
|
||||||
|
MOZ_ASSERT(aEvent);
|
||||||
|
nsCOMPtr<nsIGlobalObject> sgo = aWorkerScope;
|
||||||
|
WidgetEvent* internalEvent = aEvent->GetInternalNSEvent();
|
||||||
|
|
||||||
|
ErrorResult result;
|
||||||
|
result = aWorkerScope->DispatchDOMEvent(nullptr, aEvent, nullptr, nullptr);
|
||||||
|
if (result.Failed() || internalEvent->mFlags.mExceptionHasBeenRisen) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsRefPtr<Promise> waitUntilPromise = aEvent->GetPromise();
|
||||||
|
if (!waitUntilPromise) {
|
||||||
|
ErrorResult result;
|
||||||
|
waitUntilPromise =
|
||||||
|
Promise::Resolve(sgo, aCx, JS::UndefinedHandleValue, result);
|
||||||
|
if (NS_WARN_IF(result.Failed())) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MOZ_ASSERT(waitUntilPromise);
|
||||||
|
return waitUntilPromise.forget();
|
||||||
|
}
|
||||||
|
}; // anonymous namespace
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Used to handle ExtendableEvent::waitUntil() and proceed with
|
* Used to handle ExtendableEvent::waitUntil() and proceed with
|
||||||
* installation/activation.
|
* installation/activation.
|
||||||
@ -1674,23 +1742,12 @@ LifecycleEventWorkerRunnable::DispatchLifecycleEvent(JSContext* aCx, WorkerPriva
|
|||||||
|
|
||||||
event->SetTrusted(true);
|
event->SetTrusted(true);
|
||||||
|
|
||||||
nsRefPtr<Promise> waitUntilPromise;
|
nsRefPtr<Promise> waitUntilPromise =
|
||||||
|
DispatchExtendableEventOnWorkerScope(aCx, aWorkerPrivate->GlobalScope(), event);
|
||||||
ErrorResult result;
|
if (waitUntilPromise) {
|
||||||
result = target->DispatchDOMEvent(nullptr, event, nullptr, nullptr);
|
nsRefPtr<LifecycleEventPromiseHandler> handler =
|
||||||
|
new LifecycleEventPromiseHandler(mTask, mServiceWorker, false /* activateImmediately */);
|
||||||
nsCOMPtr<nsIGlobalObject> sgo = aWorkerPrivate->GlobalScope();
|
waitUntilPromise->AppendNativeHandler(handler);
|
||||||
WidgetEvent* internalEvent = event->GetInternalNSEvent();
|
|
||||||
if (!result.Failed() && !internalEvent->mFlags.mExceptionHasBeenRisen) {
|
|
||||||
waitUntilPromise = event->GetPromise();
|
|
||||||
if (!waitUntilPromise) {
|
|
||||||
ErrorResult result;
|
|
||||||
waitUntilPromise =
|
|
||||||
Promise::Resolve(sgo, aCx, JS::UndefinedHandleValue, result);
|
|
||||||
if (NS_WARN_IF(result.Failed())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// Continue with a canceled install.
|
// Continue with a canceled install.
|
||||||
// Although the spec has different routines to deal with popping stuff
|
// Although the spec has different routines to deal with popping stuff
|
||||||
@ -1699,12 +1756,8 @@ LifecycleEventWorkerRunnable::DispatchLifecycleEvent(JSContext* aCx, WorkerPriva
|
|||||||
nsRefPtr<ContinueLifecycleRunnable> r =
|
nsRefPtr<ContinueLifecycleRunnable> r =
|
||||||
new ContinueLifecycleRunnable(mTask, false /* success */, false /* activate immediately */);
|
new ContinueLifecycleRunnable(mTask, false /* success */, false /* activate immediately */);
|
||||||
MOZ_ALWAYS_TRUE(NS_SUCCEEDED(NS_DispatchToMainThread(r)));
|
MOZ_ALWAYS_TRUE(NS_SUCCEEDED(NS_DispatchToMainThread(r)));
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nsRefPtr<LifecycleEventPromiseHandler> handler =
|
|
||||||
new LifecycleEventPromiseHandler(mTask, mServiceWorker, false /* activateImmediately */);
|
|
||||||
waitUntilPromise->AppendNativeHandler(handler);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2091,8 +2144,13 @@ public:
|
|||||||
event->SetTrusted(true);
|
event->SetTrusted(true);
|
||||||
event->PostInit(mServiceWorker);
|
event->PostInit(mServiceWorker);
|
||||||
|
|
||||||
nsRefPtr<EventTarget> target = do_QueryObject(aWorkerPrivate->GlobalScope());
|
nsRefPtr<Promise> waitUntilPromise =
|
||||||
target->DispatchDOMEvent(nullptr, event, nullptr, nullptr);
|
DispatchExtendableEventOnWorkerScope(aCx, aWorkerPrivate->GlobalScope(), event);
|
||||||
|
if (waitUntilPromise) {
|
||||||
|
nsRefPtr<KeepAliveHandler> handler = new KeepAliveHandler(mServiceWorker);
|
||||||
|
waitUntilPromise->AppendNativeHandler(handler);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user