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();
  }
}
Exemplo n.º 2
0
void
nsObserverList::UnmarkGrayStrongObservers()
{
  for (uint32_t i = 0; i < mObservers.Length(); ++i) {
    if (!mObservers[i].isWeakRef) {
      xpc_TryUnmarkWrappedGrayObject(mObservers[i].asObserver());
    }
  }
}