mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-25 20:01:50 +00:00
Bug 884268 - Part b: Move nsContentUtils::PreserveWrapper to nsWrapperCache; r=smaug
This commit is contained in:
parent
4842331722
commit
b7bef21f7f
@ -1263,32 +1263,6 @@ public:
|
||||
static bool AreJSObjectsHeld(void* aScriptObjectHolder);
|
||||
#endif
|
||||
|
||||
static void PreserveWrapper(nsISupports* aScriptObjectHolder,
|
||||
nsWrapperCache* aCache)
|
||||
{
|
||||
if (!aCache->PreservingWrapper()) {
|
||||
nsISupports *ccISupports;
|
||||
aScriptObjectHolder->QueryInterface(NS_GET_IID(nsCycleCollectionISupports),
|
||||
reinterpret_cast<void**>(&ccISupports));
|
||||
MOZ_ASSERT(ccISupports);
|
||||
nsXPCOMCycleCollectionParticipant* participant;
|
||||
CallQueryInterface(ccISupports, &participant);
|
||||
PreserveWrapper(ccISupports, aCache, participant);
|
||||
}
|
||||
}
|
||||
static void PreserveWrapper(void* aScriptObjectHolder,
|
||||
nsWrapperCache* aCache,
|
||||
nsScriptObjectTracer* aTracer)
|
||||
{
|
||||
if (!aCache->PreservingWrapper()) {
|
||||
HoldJSObjects(aScriptObjectHolder, aTracer);
|
||||
aCache->SetPreservingWrapper(true);
|
||||
#ifdef DEBUG
|
||||
// Make sure the cycle collector will be able to traverse to the wrapper.
|
||||
aCache->CheckCCWrapperTraversal(aScriptObjectHolder, aTracer);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
static void ReleaseWrapper(void* aScriptObjectHolder,
|
||||
nsWrapperCache* aCache);
|
||||
|
||||
|
@ -194,7 +194,7 @@ nsXBLProtoImpl::InitTargetObjects(nsXBLPrototypeBinding* aBinding,
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsContentUtils::PreserveWrapper(aBoundElement, aBoundElement);
|
||||
aBoundElement->PreserveWrapper(aBoundElement);
|
||||
|
||||
wrapper.swap(*aScriptObjectHolder);
|
||||
|
||||
|
@ -5086,8 +5086,7 @@ nsNodeSH::GetFlags(uint32_t *aFlags)
|
||||
void
|
||||
nsNodeSH::PreserveWrapper(nsISupports *aNative)
|
||||
{
|
||||
nsINode *node = static_cast<nsINode*>(aNative);
|
||||
nsContentUtils::PreserveWrapper(aNative, node);
|
||||
static_cast<nsINode*>(aNative)->PreserveWrapper(aNative);
|
||||
}
|
||||
|
||||
// EventTarget helper
|
||||
@ -5122,7 +5121,7 @@ nsEventTargetSH::PreserveWrapper(nsISupports *aNative)
|
||||
{
|
||||
nsDOMEventTargetHelper *target =
|
||||
nsDOMEventTargetHelper::FromSupports(aNative);
|
||||
nsContentUtils::PreserveWrapper(aNative, target);
|
||||
target->PreserveWrapper(aNative);
|
||||
}
|
||||
|
||||
// IDBEventTarget helper
|
||||
|
@ -7,6 +7,17 @@
|
||||
#include "nsWrapperCacheInlines.h"
|
||||
|
||||
#include "nsCycleCollectionTraversalCallback.h"
|
||||
#include "nsCycleCollector.h"
|
||||
|
||||
using namespace mozilla;
|
||||
using namespace mozilla::dom;
|
||||
|
||||
/* static */ void
|
||||
nsWrapperCache::HoldJSObjects(void* aScriptObjectHolder,
|
||||
nsScriptObjectTracer* aTracer)
|
||||
{
|
||||
cyclecollector::AddJSHolder(aScriptObjectHolder, aTracer);
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
|
@ -214,10 +214,35 @@ public:
|
||||
mFlags &= ~aFlagsToUnset;
|
||||
}
|
||||
|
||||
void PreserveWrapper(nsISupports* aScriptObjectHolder)
|
||||
{
|
||||
if (PreservingWrapper()) {
|
||||
return;
|
||||
}
|
||||
|
||||
nsISupports* ccISupports;
|
||||
aScriptObjectHolder->QueryInterface(NS_GET_IID(nsCycleCollectionISupports),
|
||||
reinterpret_cast<void**>(&ccISupports));
|
||||
MOZ_ASSERT(ccISupports);
|
||||
|
||||
nsXPCOMCycleCollectionParticipant* participant;
|
||||
CallQueryInterface(ccISupports, &participant);
|
||||
PreserveWrapper(ccISupports, participant);
|
||||
}
|
||||
|
||||
void PreserveWrapper(void* aScriptObjectHolder, nsScriptObjectTracer* aTracer)
|
||||
{
|
||||
if (PreservingWrapper()) {
|
||||
return;
|
||||
}
|
||||
|
||||
HoldJSObjects(aScriptObjectHolder, aTracer);
|
||||
SetPreservingWrapper(true);
|
||||
#ifdef DEBUG
|
||||
void CheckCCWrapperTraversal(void* aScriptObjectHolder,
|
||||
nsScriptObjectTracer* aTracer);
|
||||
#endif // DEBUG
|
||||
// Make sure the cycle collector will be able to traverse to the wrapper.
|
||||
CheckCCWrapperTraversal(aScriptObjectHolder, aTracer);
|
||||
#endif
|
||||
}
|
||||
|
||||
private:
|
||||
JSObject *GetWrapperJSObject() const
|
||||
@ -256,6 +281,14 @@ private:
|
||||
mFlags &= ~aFlagsToUnset;
|
||||
}
|
||||
|
||||
static void HoldJSObjects(void* aScriptObjectHolder,
|
||||
nsScriptObjectTracer* aTracer);
|
||||
|
||||
#ifdef DEBUG
|
||||
void CheckCCWrapperTraversal(void* aScriptObjectHolder,
|
||||
nsScriptObjectTracer* aTracer);
|
||||
#endif // DEBUG
|
||||
|
||||
/**
|
||||
* If this bit is set then we're preserving the wrapper, which in effect ties
|
||||
* the lifetime of the JS object stored in the cache to the lifetime of the
|
||||
|
@ -640,7 +640,7 @@ TryPreserveWrapper(JSObject* obj)
|
||||
nsWrapperCache* cache = nullptr;
|
||||
CallQueryInterface(native, &cache);
|
||||
if (cache) {
|
||||
nsContentUtils::PreserveWrapper(native, cache);
|
||||
cache->PreserveWrapper(native);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -938,12 +938,12 @@ class CGAddPropertyHook(CGAbstractClassHook):
|
||||
def generate_code(self):
|
||||
assert not self.descriptor.workers and self.descriptor.wrapperCache
|
||||
if self.descriptor.nativeOwnership == 'nsisupports':
|
||||
preserveArgs = "reinterpret_cast<nsISupports*>(self), self"
|
||||
preserveArgs = "reinterpret_cast<nsISupports*>(self)"
|
||||
else:
|
||||
preserveArgs = "self, self, NS_CYCLE_COLLECTION_PARTICIPANT(%s)" % self.descriptor.nativeType
|
||||
preserveArgs = "self, NS_CYCLE_COLLECTION_PARTICIPANT(%s)" % self.descriptor.nativeType
|
||||
return (" // We don't want to preserve if we don't have a wrapper.\n"
|
||||
" if (self->GetWrapperPreserveColor()) {\n"
|
||||
" nsContentUtils::PreserveWrapper(%s);\n"
|
||||
" self->PreserveWrapper(%s);\n"
|
||||
" }\n"
|
||||
" return true;" % preserveArgs)
|
||||
|
||||
@ -8362,11 +8362,7 @@ class CGBindingRoot(CGThing):
|
||||
return any(m.getExtendedAttribute("Pref") for m in iface.members + [iface]);
|
||||
requiresPreferences = any(descriptorRequiresPreferences(d) for d in descriptors)
|
||||
hasOwnedDescriptors = any(d.nativeOwnership == 'owned' for d in descriptors)
|
||||
def descriptorRequiresContentUtils(desc):
|
||||
return ((desc.concrete and not desc.proxy and
|
||||
not desc.workers and desc.wrapperCache) or
|
||||
desc.interface.hasInterfaceObject())
|
||||
requiresContentUtils = any(descriptorRequiresContentUtils(d) for d in descriptors)
|
||||
requiresContentUtils = any(d.interface.hasInterfaceObject() for d in descriptors)
|
||||
def descriptorHasChromeOnlyMembers(desc):
|
||||
return any(isChromeOnly(a) for a in desc.interface.members)
|
||||
hasChromeOnlyMembers = any(descriptorHasChromeOnlyMembers(d) for d in descriptors)
|
||||
|
@ -132,7 +132,7 @@ DOMProxyHandler::EnsureExpandoObject(JSContext* cx, JS::Handle<JSObject*> obj)
|
||||
nsWrapperCache* cache;
|
||||
CallQueryInterface(native, &cache);
|
||||
if (expandoAndGeneration) {
|
||||
nsContentUtils::PreserveWrapper(native, cache);
|
||||
cache->PreserveWrapper(native);
|
||||
expandoAndGeneration->expando.setObject(*expando);
|
||||
|
||||
return expando;
|
||||
|
@ -2532,7 +2532,7 @@ PreserveWrapper(JSContext *cx, JSObject *objArg)
|
||||
|
||||
// For pre-Paris DOM bindings objects, we only support Node.
|
||||
if (nsCOMPtr<nsINode> node = do_QueryInterface(supports)) {
|
||||
nsContentUtils::PreserveWrapper(supports, node);
|
||||
node->PreserveWrapper(supports);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -1282,7 +1282,7 @@ DOMXrayTraits::preserveWrapper(JSObject *target)
|
||||
nsWrapperCache* cache = nullptr;
|
||||
CallQueryInterface(identity, &cache);
|
||||
if (cache)
|
||||
nsContentUtils::PreserveWrapper(identity, cache);
|
||||
cache->PreserveWrapper(identity);
|
||||
}
|
||||
|
||||
JSObject*
|
||||
|
Loading…
x
Reference in New Issue
Block a user