Bug 1850843 - Keeping doing nothing for NotificationWorkerRunnable when the worker is dying. r=dom-worker-reviewers,smaug

Differential Revision: https://phabricator.services.mozilla.com/D187433
This commit is contained in:
Eden Chuang 2023-09-05 11:22:24 +00:00
parent 34cef822f7
commit ccc3244a24

View file

@ -320,7 +320,14 @@ class NotificationWorkerRunnable : public MainThreadWorkerRunnable {
bool WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override { bool WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override {
aWorkerPrivate->AssertIsOnWorkerThread(); aWorkerPrivate->AssertIsOnWorkerThread();
aWorkerPrivate->ModifyBusyCountFromWorker(true); aWorkerPrivate->ModifyBusyCountFromWorker(true);
WorkerRunInternal(aWorkerPrivate); // WorkerScope might start dying at the moment. And WorkerRunInternal()
// should not be executed once WorkerScope is dying, since
// WorkerRunInternal() might access resources which already been freed
// during WorkerRef::Notify().
if (aWorkerPrivate->GlobalScope() &&
!aWorkerPrivate->GlobalScope()->IsDying()) {
WorkerRunInternal(aWorkerPrivate);
}
return true; return true;
} }
@ -347,10 +354,7 @@ class NotificationEventWorkerRunnable final
mEventName(aEventName) {} mEventName(aEventName) {}
void WorkerRunInternal(WorkerPrivate* aWorkerPrivate) override { void WorkerRunInternal(WorkerPrivate* aWorkerPrivate) override {
if (aWorkerPrivate->GlobalScope() && mNotification->DispatchTrustedEvent(mEventName);
!aWorkerPrivate->GlobalScope()->IsDying()) {
mNotification->DispatchTrustedEvent(mEventName);
}
} }
}; };
@ -362,6 +366,18 @@ class ReleaseNotificationRunnable final : public NotificationWorkerRunnable {
: NotificationWorkerRunnable(aNotification->mWorkerPrivate), : NotificationWorkerRunnable(aNotification->mWorkerPrivate),
mNotification(aNotification) {} mNotification(aNotification) {}
bool WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override {
aWorkerPrivate->AssertIsOnWorkerThread();
aWorkerPrivate->ModifyBusyCountFromWorker(true);
// ReleaseNotificationRunnable is only used in StrongWorkerRef's shutdown
// callback. At the moment, it is supposed to executing
// mNotification->ReleaseObject() safely even though the corresponding
// WorkerScope::IsDying() is true. It is unlike other
// NotificationWorkerRunnable.
WorkerRunInternal(aWorkerPrivate);
return true;
}
void WorkerRunInternal(WorkerPrivate* aWorkerPrivate) override { void WorkerRunInternal(WorkerPrivate* aWorkerPrivate) override {
mNotification->ReleaseObject(); mNotification->ReleaseObject();
} }