Bug 933447 - Use new weakRef to JSImpl feature. r=smaug, r=mccr8, r=abr

This commit is contained in:
Jan-Ivar Bruaroey 2013-11-08 19:45:59 -05:00
Родитель 7f1c641ed6
Коммит 5e7893b429
5 изменённых файлов: 46 добавлений и 67 удалений

Просмотреть файл

@ -10070,7 +10070,19 @@ class CGJSImplClass(CGBindingImplClass):
descriptor.name)
constructorBody = "SetIsDOMBinding();"
extradefinitions= string.Template(
"NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_2(${ifaceName}, mImpl, mParent)\n"
"NS_IMPL_CYCLE_COLLECTION_CLASS(${ifaceName})\n"
"NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(${ifaceName})\n"
" NS_IMPL_CYCLE_COLLECTION_UNLINK(mImpl)\n"
" NS_IMPL_CYCLE_COLLECTION_UNLINK(mParent)\n"
" NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER\n"
" tmp->ClearWeakReferences();\n"
"NS_IMPL_CYCLE_COLLECTION_UNLINK_END\n"
"NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(${ifaceName})\n"
" NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mImpl)\n"
" NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mParent)\n"
" NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS\n"
"NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END\n"
"NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(${ifaceName})\n"
"NS_IMPL_CYCLE_COLLECTING_ADDREF(${ifaceName})\n"
"NS_IMPL_CYCLE_COLLECTING_RELEASE(${ifaceName})\n"
"NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(${ifaceName})\n"

Просмотреть файл

@ -829,7 +829,6 @@ RTCError.prototype = {
// This is a separate object because we don't want to expose it to DOM.
function PeerConnectionObserver() {
this._dompc = null;
this._guard = new WeakReferent(this);
}
PeerConnectionObserver.prototype = {
classDescription: "PeerConnectionObserver",
@ -1127,20 +1126,6 @@ PeerConnectionObserver.prototype = {
getSupportedConstraints: function(dict) {
return dict;
},
get weakReferent() {
return this._guard;
}
};
// A PeerConnectionObserver member that c++ can do weak references on
function WeakReferent(parent) {
this._parent = parent; // prevents parent from going away without us
}
WeakReferent.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
Ci.nsISupportsWeakReference]),
};
this.NSGetFactory = XPCOMUtils.generateNSGetFactory(

Просмотреть файл

@ -42,9 +42,6 @@ interface PeerConnectionObserver
void onAddTrack();
void onRemoveTrack();
/* Used by c++ to know when Observer goes away */
readonly attribute nsISupports weakReferent;
/* Helper function to access supported constraints defined in webidl. Needs to
* be in a separate webidl object we hold, so putting it here was convenient.
*/

Просмотреть файл

@ -677,7 +677,7 @@ PeerConnectionImpl::Initialize(PeerConnectionObserver& aObserver,
MOZ_ASSERT(aThread);
mThread = do_QueryInterface(aThread);
mPCObserver.Set(&aObserver);
mPCObserver = do_GetWeakReference(&aObserver);
// Find the STS thread
@ -978,6 +978,28 @@ PeerConnectionImpl::CreateDataChannel(const nsAString& aLabel,
return NS_OK;
}
// do_QueryObjectReferent() - Helps get PeerConnectionObserver from nsWeakPtr.
//
// nsWeakPtr deals in XPCOM interfaces, while webidl bindings are concrete objs.
// TODO: Turn this into a central (template) function somewhere (Bug 939178)
//
// Without it, each weak-ref call in this file would look like this:
//
// nsCOMPtr<nsISupportsWeakReference> tmp = do_QueryReferent(mPCObserver);
// nsRefPtr<nsSupportsWeakReference> tmp2 = do_QueryObject(tmp);
// nsRefPtr<PeerConnectionObserver> pco = static_cast<PeerConnectionObserver*>(&*tmp2);
// if (!pco) {
// return;
// }
static already_AddRefed<PeerConnectionObserver>
do_QueryObjectReferent(nsIWeakReference* aRawPtr) {
nsCOMPtr<nsISupportsWeakReference> tmp = do_QueryReferent(aRawPtr);
nsRefPtr<nsSupportsWeakReference> tmp2 = do_QueryObject(tmp);
nsRefPtr<PeerConnectionObserver> tmp3 = static_cast<PeerConnectionObserver*>(&*tmp2);
return tmp3.forget();
}
void
PeerConnectionImpl::NotifyConnection()
{
@ -986,7 +1008,7 @@ PeerConnectionImpl::NotifyConnection()
CSFLogDebug(logTag, "%s", __FUNCTION__);
#ifdef MOZILLA_INTERNAL_API
nsRefPtr<PeerConnectionObserver> pco = mPCObserver.MayGet();
nsRefPtr<PeerConnectionObserver> pco = do_QueryObjectReferent(mPCObserver);
if (!pco) {
return;
}
@ -1007,7 +1029,7 @@ PeerConnectionImpl::NotifyClosedConnection()
CSFLogDebug(logTag, "%s", __FUNCTION__);
#ifdef MOZILLA_INTERNAL_API
nsRefPtr<PeerConnectionObserver> pco = mPCObserver.MayGet();
nsRefPtr<PeerConnectionObserver> pco = do_QueryObjectReferent(mPCObserver);
if (!pco) {
return;
}
@ -1047,7 +1069,7 @@ PeerConnectionImpl::NotifyDataChannel(already_AddRefed<DataChannel> aChannel)
getter_AddRefs(domchannel));
NS_ENSURE_SUCCESS_VOID(rv);
nsRefPtr<PeerConnectionObserver> pco = mPCObserver.MayGet();
nsRefPtr<PeerConnectionObserver> pco = do_QueryObjectReferent(mPCObserver);
if (!pco) {
return;
}
@ -1513,7 +1535,7 @@ PeerConnectionImpl::onCallEvent(const OnCallEventArgs& args)
break;
}
nsRefPtr<PeerConnectionObserver> pco = mPCObserver.MayGet();
nsRefPtr<PeerConnectionObserver> pco = do_QueryObjectReferent(mPCObserver);
if (!pco) {
return;
}
@ -1536,7 +1558,7 @@ PeerConnectionImpl::ChangeReadyState(PCImplReadyState aReadyState)
mReadyState = aReadyState;
// Note that we are passing an nsRefPtr which keeps the observer live.
nsRefPtr<PeerConnectionObserver> pco = mPCObserver.MayGet();
nsRefPtr<PeerConnectionObserver> pco = do_QueryObjectReferent(mPCObserver);
if (!pco) {
return;
}
@ -1558,7 +1580,7 @@ PeerConnectionImpl::SetSignalingState_m(PCImplSignalingState aSignalingState)
}
mSignalingState = aSignalingState;
nsRefPtr<PeerConnectionObserver> pco = mPCObserver.MayGet();
nsRefPtr<PeerConnectionObserver> pco = do_QueryObjectReferent(mPCObserver);
if (!pco) {
return;
}
@ -1657,7 +1679,7 @@ PeerConnectionImpl::IceStateChange_m(PCImplIceState aState)
break;
}
nsRefPtr<PeerConnectionObserver> pco = mPCObserver.MayGet();
nsRefPtr<PeerConnectionObserver> pco = do_QueryObjectReferent(mPCObserver);
if (!pco) {
return NS_OK;
}
@ -1760,7 +1782,7 @@ void PeerConnectionImpl::OnStatsReport_m(
uint32_t trackId,
nsresult result,
nsAutoPtr<RTCStatsReportInternal> report) {
PeerConnectionObserver* pco = mPCObserver.MayGet();
nsRefPtr<PeerConnectionObserver> pco = do_QueryObjectReferent(mPCObserver);
if (pco) {
JSErrorResult rv;
if (NS_SUCCEEDED(result)) {
@ -1853,30 +1875,4 @@ PeerConnectionImpl::GetRemoteStreams(nsTArray<nsRefPtr<DOMMediaStream > >& resul
#endif
}
// WeakConcretePtr gets around WeakPtr not working on concrete types by using
// the attribute getWeakReferent, a member that supports weak refs, as a guard.
void
PeerConnectionImpl::WeakConcretePtr::Set(PeerConnectionObserver *aObserver) {
mObserver = aObserver;
#ifdef MOZILLA_INTERNAL_API
MOZ_ASSERT(NS_IsMainThread());
JSErrorResult rv;
nsCOMPtr<nsISupports> tmp = aObserver->GetWeakReferent(rv);
MOZ_ASSERT(!rv.Failed());
mWeakPtr = do_GetWeakReference(tmp);
#else
mWeakPtr = do_GetWeakReference(aObserver);
#endif
}
PeerConnectionObserver *
PeerConnectionImpl::WeakConcretePtr::MayGet() {
#ifdef MOZILLA_INTERNAL_API
MOZ_ASSERT(NS_IsMainThread());
#endif
nsCOMPtr<nsISupports> guard = do_QueryReferent(mWeakPtr);
return (!guard) ? nullptr : mObserver;
}
} // end sipcc namespace

Просмотреть файл

@ -510,20 +510,9 @@ private:
mozilla::dom::PCImplIceState mIceState;
nsCOMPtr<nsIThread> mThread;
// WeakConcretePtr to PeerConnectionObserver. TODO: Remove after bug 928535
//
// This is only safe to use on the main thread
// TODO: Remove if we ever properly wire PeerConnection for cycle-collection.
class WeakConcretePtr
{
public:
WeakConcretePtr() : mObserver(nullptr) {}
void Set(PeerConnectionObserver *aObserver);
PeerConnectionObserver *MayGet();
private:
PeerConnectionObserver *mObserver;
nsWeakPtr mWeakPtr;
} mPCObserver;
nsWeakPtr mPCObserver;
nsCOMPtr<nsPIDOMWindow> mWindow;
// The SDP sent in from JS - here for debugging.