void BroadcastChannel::Shutdown() { mState = StateClosed; if (mWorkerFeature) { WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate(); workerPrivate->RemoveFeature(workerPrivate->GetJSContext(), mWorkerFeature); mWorkerFeature = nullptr; } if (mActor) { mActor->SetParent(nullptr); nsRefPtr<TeardownRunnable> runnable = new TeardownRunnable(mActor); NS_DispatchToCurrentThread(runnable); mActor = nullptr; } // If shutdown() is called we have to release the reference if we still keep // it. if (mIsKeptAlive) { mIsKeptAlive = false; Release(); } }
void MessagePort::UpdateMustKeepAlive() { if (mState >= eStateDisentangled && mMessages.IsEmpty() && mIsKeptAlive) { mIsKeptAlive = false; if (mWorkerFeature) { WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate(); MOZ_ASSERT(workerPrivate); workerPrivate->RemoveFeature(workerPrivate->GetJSContext(), mWorkerFeature); mWorkerFeature = nullptr; } if (NS_IsMainThread()) { nsCOMPtr<nsIObserverService> obs = do_GetService("@mozilla.org/observer-service;1"); if (obs) { obs->RemoveObserver(this, "inner-window-destroyed"); } } Release(); return; } if (mState < eStateDisentangled && !mIsKeptAlive) { mIsKeptAlive = true; AddRef(); } }
~WorkerFeature() { mWorkerPrivate->AssertIsOnWorkerThread(); MOZ_COUNT_DTOR(IDBOpenDBRequest::WorkerFeature); mWorkerPrivate->RemoveFeature(mWorkerPrivate->GetJSContext(), this); }
void MessagePort::UpdateMustKeepAlive() { if (mState == eStateDisentangled && mIsKeptAlive) { mIsKeptAlive = false; if (mWorkerFeature) { WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate(); MOZ_ASSERT(workerPrivate); workerPrivate->RemoveFeature(workerPrivate->GetJSContext(), mWorkerFeature); mWorkerFeature = nullptr; } Release(); return; } if (mState < eStateDisentangled && !mIsKeptAlive) { mIsKeptAlive = true; AddRef(); } }