void EventListenerManager::MarkForCC() { uint32_t count = mListeners.Length(); for (uint32_t i = 0; i < count; ++i) { const Listener& listener = mListeners.ElementAt(i); nsIJSEventListener* jsListener = listener.GetJSListener(); if (jsListener) { if (jsListener->GetHandler().HasEventHandler()) { JS::ExposeObjectToActiveJS(jsListener->GetHandler().Ptr()->Callable()); } if (JSObject* scope = jsListener->GetEventScope()) { JS::ExposeObjectToActiveJS(scope); } } else if (listener.mListenerType == Listener::eWrappedJSListener) { xpc_TryUnmarkWrappedGrayObject(listener.mListener.GetXPCOMCallback()); } else if (listener.mListenerType == Listener::eWebIDLListener) { // Callback() unmarks gray listener.mListener.GetWebIDLCallback()->Callback(); } } if (mRefCnt.IsPurple()) { mRefCnt.RemovePurple(); } }
void nsObserverList::UnmarkGrayStrongObservers() { for (uint32_t i = 0; i < mObservers.Length(); ++i) { if (!mObservers[i].isWeakRef) { xpc_TryUnmarkWrappedGrayObject(mObservers[i].asObserver()); } } }