зеркало из https://github.com/mozilla/gecko-dev.git
Bug 933447 - Use new weakRef to JSImpl feature. r=smaug, r=mccr8, r=abr
This commit is contained in:
Родитель
7f1c641ed6
Коммит
5e7893b429
|
@ -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.
|
||||
|
|
Загрузка…
Ссылка в новой задаче