Backing out bug 372769 due to leaks.

This commit is contained in:
bzbarsky@mit.edu 2007-09-26 07:39:31 -07:00
Родитель bc74280bea
Коммит 50fd4b81f0
14 изменённых файлов: 143 добавлений и 313 удалений

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

@ -111,7 +111,6 @@ LOCAL_INCLUDES = \
-I$(srcdir)/../../xul/document/src \
-I$(srcdir)/../../events/src \
-I$(srcdir)/../../../layout/style \
-I$(srcdir)/../../../dom/src/base \
$(NULL)
DEFINES += -D_IMPL_NS_LAYOUT

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

@ -102,127 +102,27 @@
#include "prprf.h"
#include "nsNodeUtils.h"
// Nasty hack. Maybe we could move some of the classinfo utility methods
// (e.g. WrapNative and ThrowJSException) over to nsContentUtils?
#include "nsDOMClassInfo.h"
#include "nsJSUtils.h"
// Helper classes
/***********************************************************************/
//
// The JS class for XBLBinding
//
JS_STATIC_DLL_CALLBACK(void)
PR_STATIC_CALLBACK(void)
XBLFinalize(JSContext *cx, JSObject *obj)
{
nsXBLPrototypeBinding* protoBinding =
static_cast<nsXBLPrototypeBinding*>(::JS_GetPrivate(cx, obj));
protoBinding->XBLDocumentInfo()->Release();
nsXBLJSClass* c = static_cast<nsXBLJSClass*>(::JS_GetClass(cx, obj));
c->Drop();
}
JS_STATIC_DLL_CALLBACK(JSBool)
XBLResolve(JSContext *cx, JSObject *obj, jsval id, uintN flags,
JSObject **objp)
{
// Note: if we get here, that means that the implementation for some binding
// was installed, which means that AllowScripts() tested true. Hence no need
// to do checks like that here.
// Default to not resolving things.
NS_ASSERTION(*objp, "Must have starting object");
JSObject* origObj = *objp;
*objp = NULL;
if (!JSVAL_IS_STRING(id)) {
return JS_TRUE;
}
nsDependentJSString fieldName(id);
nsXBLPrototypeBinding* protoBinding =
static_cast<nsXBLPrototypeBinding*>(::JS_GetPrivate(cx, obj));
NS_ASSERTION(protoBinding, "Must have prototype binding!");
nsXBLProtoImplField* field = protoBinding->FindField(fieldName);
if (!field) {
return JS_TRUE;
}
// We have this field. Time to install it. Get our node.
JSClass* nodeClass = ::JS_GetClass(cx, origObj);
if (!nodeClass) {
return JS_FALSE;
}
if (~nodeClass->flags &
(JSCLASS_HAS_PRIVATE | JSCLASS_PRIVATE_IS_NSISUPPORTS)) {
// Looks like whatever |origObj| is it's not our nsIContent. It might well
// be the proto our binding installed, however, so just baul out quietly.
// Do NOT throw an exception here.
// We could make this stricter by checking the class maybe, but whatever
return JS_TRUE;
}
nsCOMPtr<nsIXPConnectWrappedNative> xpcWrapper =
do_QueryInterface(static_cast<nsISupports*>(::JS_GetPrivate(cx, origObj)));
if (!xpcWrapper) {
nsDOMClassInfo::ThrowJSException(cx, NS_ERROR_UNEXPECTED);
return JS_FALSE;
}
nsCOMPtr<nsIContent> content = do_QueryWrappedNative(xpcWrapper);
if (!content) {
nsDOMClassInfo::ThrowJSException(cx, NS_ERROR_UNEXPECTED);
return JS_FALSE;
}
// This mirrors code in nsXBLProtoImpl::InstallImplementation
nsIDocument* doc = content->GetOwnerDoc();
if (!doc) {
return JS_TRUE;
}
nsIScriptGlobalObject* global = doc->GetScriptGlobalObject();
if (!global) {
return JS_TRUE;
}
nsCOMPtr<nsIScriptContext> context = global->GetContext();
if (!context) {
return JS_TRUE;
}
// Now we either resolve or fail
*objp = origObj;
nsresult rv = field->InstallField(context, origObj,
protoBinding->DocURI());
if (NS_FAILED(rv)) {
if (!::JS_IsExceptionPending(cx)) {
nsDOMClassInfo::ThrowJSException(cx, rv);
}
return JS_FALSE;
}
return JS_TRUE;
}
nsXBLJSClass::nsXBLJSClass(const nsAFlatCString& aClassName)
{
memset(this, 0, sizeof(nsXBLJSClass));
next = prev = static_cast<JSCList*>(this);
name = ToNewCString(aClassName);
flags =
JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE | JSCLASS_NEW_RESOLVE_GETS_START;
addProperty = delProperty = setProperty = getProperty = ::JS_PropertyStub;
enumerate = ::JS_EnumerateStub;
resolve = (JSResolveOp)XBLResolve;
resolve = ::JS_ResolveStub;
convert = ::JS_ConvertStub;
finalize = XBLFinalize;
}
@ -1134,7 +1034,6 @@ nsXBLBinding::WalkRules(nsIStyleRuleProcessor::EnumFunc aFunc, void* aData)
nsresult
nsXBLBinding::DoInitJSClass(JSContext *cx, JSObject *global, JSObject *obj,
const nsAFlatCString& aClassName,
nsXBLPrototypeBinding* aProtoBinding,
void **aClassObject)
{
// First ensure our JS class is initialized.
@ -1240,11 +1139,6 @@ nsXBLBinding::DoInitJSClass(JSContext *cx, JSObject *global, JSObject *obj,
return NS_ERROR_OUT_OF_MEMORY;
}
::JS_SetPrivate(cx, proto, aProtoBinding);
// Keep this proto binding alive while we're alive
aProtoBinding->XBLDocumentInfo()->AddRef();
*aClassObject = (void*)proto;
}
else {
@ -1261,6 +1155,63 @@ nsXBLBinding::DoInitJSClass(JSContext *cx, JSObject *global, JSObject *obj,
return NS_OK;
}
nsresult
nsXBLBinding::InitClass(const nsCString& aClassName,
nsIScriptContext* aContext,
nsIDocument* aDocument, void** aScriptObject,
void** aClassObject)
{
*aClassObject = nsnull;
*aScriptObject = nsnull;
nsresult rv;
// Obtain the bound element's current script object.
JSContext* cx = (JSContext*)aContext->GetNativeContext();
nsIDocument *ownerDoc = mBoundElement->GetOwnerDoc();
nsIScriptGlobalObject *sgo;
if (!ownerDoc || !(sgo = ownerDoc->GetScriptGlobalObject())) {
NS_ERROR("Can't find global object for bound content!");
return NS_ERROR_UNEXPECTED;
}
nsCOMPtr<nsIXPConnectJSObjectHolder> wrapper;
rv = nsContentUtils::XPConnect()->WrapNative(cx, sgo->GetGlobalJSObject(),
mBoundElement,
NS_GET_IID(nsISupports),
getter_AddRefs(wrapper));
NS_ENSURE_SUCCESS(rv, rv);
JSObject* object = nsnull;
rv = wrapper->GetJSObject(&object);
NS_ENSURE_SUCCESS(rv, rv);
*aScriptObject = object;
// First ensure our JS class is initialized.
rv = DoInitJSClass(cx, sgo->GetGlobalJSObject(), object, aClassName,
aClassObject);
NS_ENSURE_SUCCESS(rv, rv);
// Root mBoundElement so that it doesn't lose it's binding
nsIDocument* doc = mBoundElement->GetOwnerDoc();
if (doc) {
nsCOMPtr<nsIXPConnectWrappedNative> native_wrapper =
do_QueryInterface(wrapper);
if (native_wrapper) {
doc->AddReference(mBoundElement, native_wrapper);
}
}
return NS_OK;
}
PRBool
nsXBLBinding::AllowScripts()
{
@ -1393,20 +1344,6 @@ nsXBLBinding::GetFirstStyleBinding()
return mNextBinding ? mNextBinding->GetFirstStyleBinding() : nsnull;
}
PRBool
nsXBLBinding::ResolveAllFields(JSContext *cx, JSObject *obj) const
{
if (!mPrototypeBinding->ResolveAllFields(cx, obj)) {
return PR_FALSE;
}
if (mNextBinding) {
return mNextBinding->ResolveAllFields(cx, obj);
}
return PR_TRUE;
}
void
nsXBLBinding::MarkForDeath()
{

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

@ -132,10 +132,6 @@ public:
nsXBLBinding* RootBinding();
nsXBLBinding* GetFirstStyleBinding();
// Resolve all the fields for this binding and all ancestor bindings on the
// object |obj|. False return means a JS exception was set.
PRBool ResolveAllFields(JSContext *cx, JSObject *obj) const;
// Get the list of insertion points for aParent. The nsInsertionPointList
// is owned by the binding, you should not delete it.
nsresult GetInsertionPointsFor(nsIContent* aParent,
@ -159,11 +155,16 @@ public:
static nsresult DoInitJSClass(JSContext *cx, JSObject *global, JSObject *obj,
const nsAFlatCString& aClassName,
nsXBLPrototypeBinding* aProtoBinding,
void **aClassObject);
PRBool AllowScripts(); // XXX make const
// Internal member functions
protected:
nsresult InitClass(const nsCString& aClassName, nsIScriptContext* aContext,
nsIDocument* aDocument, void** aScriptObject,
void** aClassObject);
// MEMBER VARIABLES
protected:
nsAutoRefCnt mRefCnt;

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

@ -83,13 +83,12 @@ nsXBLContentSink::nsXBLContentSink()
: mState(eXBL_InDocument),
mSecondaryState(eXBL_None),
mDocInfo(nsnull),
mIsChromeOrResource(PR_FALSE),
mFoundFirstBinding(PR_FALSE),
mIsChromeOrResource(PR_FALSE),
mBinding(nsnull),
mHandler(nsnull),
mImplementation(nsnull),
mImplMember(nsnull),
mImplField(nsnull),
mProperty(nsnull),
mMethod(nsnull),
mField(nsnull)
@ -264,18 +263,6 @@ nsXBLContentSink::AddMember(nsXBLProtoImplMember* aMember)
mImplMember = aMember; // Adjust our pointer to point to the new last member in the chain.
}
void
nsXBLContentSink::AddField(nsXBLProtoImplField* aField)
{
// Add this field to our chain.
if (mImplField)
mImplField->SetNext(aField); // Already have a chain. Just append to the end.
else
mImplementation->SetFieldList(aField); // We're the first member in the chain.
mImplField = aField; // Adjust our pointer to point to the new last field in the chain.
}
NS_IMETHODIMP
nsXBLContentSink::HandleStartElement(const PRUnichar *aName,
const PRUnichar **aAtts,
@ -716,8 +703,7 @@ nsXBLContentSink::ConstructImplementation(const PRUnichar **aAtts)
{
mImplementation = nsnull;
mImplMember = nsnull;
mImplField = nsnull;
if (!mBinding)
return;
@ -791,7 +777,7 @@ nsXBLContentSink::ConstructField(const PRUnichar **aAtts, PRUint32 aLineNumber)
mField = new nsXBLProtoImplField(name, readonly);
if (mField) {
mField->SetLineNumber(aLineNumber);
AddField(mField);
AddMember(mField);
}
}
}

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

@ -157,7 +157,6 @@ protected:
nsresult ReportUnexpectedElement(nsIAtom* aElementName, PRUint32 aLineNumber);
void AddMember(nsXBLProtoImplMember* aMember);
void AddField(nsXBLProtoImplField* aField);
XBLPrimaryState mState;
XBLSecondaryState mSecondaryState;
@ -169,7 +168,6 @@ protected:
nsXBLPrototypeHandler* mHandler; // current handler, owned by its PrototypeBinding
nsXBLProtoImpl* mImplementation;
nsXBLProtoImplMember* mImplMember;
nsXBLProtoImplField* mImplField;
nsXBLProtoImplProperty* mProperty;
nsXBLProtoImplMethod* mMethod;
nsXBLProtoImplField* mField;

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

@ -47,7 +47,6 @@
#include "nsIServiceManager.h"
#include "nsIXBLDocumentInfo.h"
#include "nsIDOMNode.h"
#include "nsXBLPrototypeBinding.h"
nsresult
nsXBLProtoImpl::InstallImplementation(nsXBLPrototypeBinding* aBinding, nsIContent* aBoundElement)
@ -56,7 +55,7 @@ nsXBLProtoImpl::InstallImplementation(nsXBLPrototypeBinding* aBinding, nsIConten
// this prototype implementation as a guide. The prototype implementation is compiled lazily,
// so for the first bound element that needs a concrete implementation, we also build the
// prototype implementation.
if (!mMembers && !mFields) // Constructor and destructor also live in mMembers
if (!mMembers) // Constructor and destructor also live in mMembers
return NS_OK; // Nothing to do, so let's not waste time.
// If the way this gets the script context changes, fix
@ -215,37 +214,6 @@ nsXBLProtoImpl::Traverse(nsCycleCollectionTraversalCallback &cb) const
}
}
nsXBLProtoImplField*
nsXBLProtoImpl::FindField(const nsString& aFieldName) const
{
for (nsXBLProtoImplField* f = mFields; f; f = f->GetNext()) {
if (aFieldName.Equals(f->GetName())) {
return f;
}
}
return nsnull;
}
PRBool
nsXBLProtoImpl::ResolveAllFields(JSContext *cx, JSObject *obj) const
{
for (nsXBLProtoImplField* f = mFields; f; f = f->GetNext()) {
// Using OBJ_LOOKUP_PROPERTY is a pain, since what we have is a
// PRUnichar* for the property name. Let's just use the public API and
// all.
nsDependentString name(f->GetName());
jsval dummy;
if (!::JS_LookupUCProperty(cx, obj,
reinterpret_cast<const jschar*>(name.get()),
name.Length(), &dummy)) {
return PR_FALSE;
}
}
return PR_TRUE;
}
void
nsXBLProtoImpl::DestroyMembers(nsXBLProtoImplMember* aBrokenMember)
{

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

@ -42,11 +42,9 @@
#include "nsMemory.h"
#include "nsXBLPrototypeHandler.h"
#include "nsXBLProtoImplMember.h"
#include "nsXBLProtoImplField.h"
#include "nsXBLPrototypeBinding.h"
class nsIXPConnectJSObjectHolder;
class nsXBLPrototypeBinding;
class nsXBLProtoImplAnonymousMethod;
class nsXBLProtoImpl
{
@ -54,7 +52,6 @@ public:
nsXBLProtoImpl()
: mClassObject(nsnull),
mMembers(nsnull),
mFields(nsnull),
mConstructor(nsnull),
mDestructor(nsnull)
{
@ -67,8 +64,7 @@ public:
// clean them up automatically.
for (nsXBLProtoImplMember* curr = mMembers; curr; curr=curr->GetNext())
curr->Destroy(mClassObject != nsnull);
delete mMembers;
delete mFields;
delete mMembers;
}
nsresult InstallImplementation(nsXBLPrototypeBinding* aBinding, nsIContent* aBoundElement);
@ -78,26 +74,10 @@ public:
void** aTargetClassObject);
nsresult CompilePrototypeMembers(nsXBLPrototypeBinding* aBinding);
void SetMemberList(nsXBLProtoImplMember* aMemberList)
{
delete mMembers;
mMembers = aMemberList;
}
void SetFieldList(nsXBLProtoImplField* aFieldList)
{
delete mFields;
mFields = aFieldList;
}
void SetMemberList(nsXBLProtoImplMember* aMemberList) { delete mMembers; mMembers = aMemberList; }
void Traverse(nsCycleCollectionTraversalCallback &cb) const;
nsXBLProtoImplField* FindField(const nsString& aFieldName) const;
// Resolve all the fields for this implementation on the object |obj| False
// return means a JS exception was set.
PRBool ResolveAllFields(JSContext *cx, JSObject *obj) const;
protected:
// Function to call if compilation of a member fails. When this is called,
// all members before aBrokenMember are compiled, compilation of
@ -113,8 +93,6 @@ protected:
// and methods for the binding.
nsXBLProtoImplMember* mMembers; // The members of an implementation are chained in this singly-linked list.
nsXBLProtoImplField* mFields; // Our fields
public:
nsXBLProtoImplAnonymousMethod* mConstructor; // Our class constructor.

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

@ -46,17 +46,14 @@
#include "nsXBLProtoImplField.h"
#include "nsIScriptContext.h"
#include "nsContentUtils.h"
#include "nsIURI.h"
nsXBLProtoImplField::nsXBLProtoImplField(const PRUnichar* aName, const PRUnichar* aReadOnly)
: mNext(nsnull),
: nsXBLProtoImplMember(aName),
mFieldText(nsnull),
mFieldTextLength(0),
mLineNumber(0)
{
MOZ_COUNT_CTOR(nsXBLProtoImplField);
mName = NS_strdup(aName); // XXXbz make more sense to use a stringbuffer?
mJSAttributes = JSPROP_ENUMERATE;
if (aReadOnly) {
nsAutoString readOnly; readOnly.Assign(*aReadOnly);
@ -70,8 +67,11 @@ nsXBLProtoImplField::~nsXBLProtoImplField()
MOZ_COUNT_DTOR(nsXBLProtoImplField);
if (mFieldText)
nsMemory::Free(mFieldText);
NS_Free(mName);
delete mNext;
}
void
nsXBLProtoImplField::Destroy(PRBool aIsCompiled)
{
}
void
@ -92,15 +92,27 @@ nsXBLProtoImplField::AppendFieldText(const nsAString& aText)
}
nsresult
nsXBLProtoImplField::InstallField(nsIScriptContext* aContext,
JSObject* aBoundNode,
nsIURI* aBindingDocURI) const
nsXBLProtoImplField::InstallMember(nsIScriptContext* aContext,
nsIContent* aBoundElement,
void* aScriptObject,
void* aTargetClassObject,
const nsCString& aClassStr)
{
NS_PRECONDITION(aBoundNode,
"uh-oh, bound node should NOT be null or bad things will "
"happen");
if (mFieldTextLength == 0)
return NS_OK; // nothing to do.
jsval result = JSVAL_VOID;
JSContext* cx = (JSContext*) aContext->GetNativeContext();
NS_ASSERTION(aScriptObject, "uh-oh, script Object should NOT be null or bad things will happen");
if (!aScriptObject)
return NS_ERROR_FAILURE;
nsCAutoString bindingURI(aClassStr);
PRInt32 hash = bindingURI.RFindChar('#');
if (hash != kNotFound)
bindingURI.Truncate(hash);
// compile the literal string
jsval result = JSVAL_NULL;
// EvaluateStringWithValue and JS_DefineUCProperty can both trigger GC, so
// protect |result| here.
@ -108,40 +120,39 @@ nsXBLProtoImplField::InstallField(nsIScriptContext* aContext,
nsAutoGCRoot root(&result, &rv);
if (NS_FAILED(rv))
return rv;
PRBool undefined;
// XXX Need a URI here!
nsCOMPtr<nsIScriptContext> context = aContext;
rv = context->EvaluateStringWithValue(nsDependentString(mFieldText,
mFieldTextLength),
aScriptObject,
nsnull, bindingURI.get(),
mLineNumber, nsnull,
(void*) &result, &undefined);
if (NS_FAILED(rv))
return rv;
if (mFieldTextLength != 0) {
nsCAutoString uriSpec;
aBindingDocURI->GetSpec(uriSpec);
// compile the literal string
// XXX Could we produce a better principal here? Should be able
// to, really!
PRBool undefined;
nsCOMPtr<nsIScriptContext> context = aContext;
rv = context->EvaluateStringWithValue(nsDependentString(mFieldText,
mFieldTextLength),
aBoundNode,
nsnull, uriSpec.get(),
mLineNumber, nsnull,
(void*) &result, &undefined);
if (NS_FAILED(rv))
return rv;
if (undefined) {
result = JSVAL_VOID;
}
}
// Define the evaluated result as a JS property
nsDependentString name(mName);
JSContext* cx = (JSContext*) aContext->GetNativeContext();
JSAutoRequest ar(cx);
if (!::JS_DefineUCProperty(cx, aBoundNode,
reinterpret_cast<const jschar*>(mName),
name.Length(), result, nsnull, nsnull,
mJSAttributes)) {
return NS_ERROR_OUT_OF_MEMORY;
if (!undefined) {
// Define the evaluated result as a JS property
nsDependentString name(mName);
JSAutoRequest ar(cx);
if (!::JS_DefineUCProperty(cx, static_cast<JSObject *>(aScriptObject),
reinterpret_cast<const jschar*>(mName),
name.Length(), result, nsnull, nsnull, mJSAttributes))
return NS_ERROR_OUT_OF_MEMORY;
}
return NS_OK;
}
nsresult
nsXBLProtoImplField::CompileMember(nsIScriptContext* aContext, const nsCString& aClassStr,
void* aClassObject)
{
return NS_OK;
}
void
nsXBLProtoImplField::Traverse(nsCycleCollectionTraversalCallback &cb) const
{
}

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

@ -46,31 +46,30 @@
#include "nsString.h"
#include "nsXBLProtoImplMember.h"
class nsIURI;
class nsXBLProtoImplField
class nsXBLProtoImplField: public nsXBLProtoImplMember
{
public:
nsXBLProtoImplField(const PRUnichar* aName, const PRUnichar* aReadOnly);
~nsXBLProtoImplField();
virtual ~nsXBLProtoImplField();
virtual void Destroy(PRBool aIsCompiled);
void AppendFieldText(const nsAString& aText);
void SetLineNumber(PRUint32 aLineNumber) {
mLineNumber = aLineNumber;
}
nsXBLProtoImplField* GetNext() const { return mNext; }
void SetNext(nsXBLProtoImplField* aNext) { mNext = aNext; }
virtual nsresult InstallMember(nsIScriptContext* aContext,
nsIContent* aBoundElement,
void* aScriptObject,
void* aTargetClassObject,
const nsCString& aClassStr);
virtual nsresult CompileMember(nsIScriptContext* aContext,
const nsCString& aClassStr,
void* aClassObject);
nsresult InstallField(nsIScriptContext* aContext,
JSObject* aBoundNode, nsIURI*
aBindingDocURI) const;
const PRUnichar* GetName() const { return mName; }
virtual void Traverse(nsCycleCollectionTraversalCallback &cb) const;
protected:
nsXBLProtoImplField* mNext;
PRUnichar* mName;
PRUnichar* mFieldText;
PRUint32 mFieldTextLength;
PRUint32 mLineNumber;

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

@ -822,7 +822,7 @@ nsXBLPrototypeBinding::InitClass(const nsCString& aClassName,
*aClassObject = nsnull;
return nsXBLBinding::DoInitJSClass(aContext, aGlobal, aScriptObject,
aClassName, this, aClassObject);
aClassName, aClassObject);
}
nsIContent*

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

@ -50,7 +50,6 @@
#include "nsHashtable.h"
#include "nsIXBLDocumentInfo.h"
#include "nsCOMArray.h"
#include "nsXBLProtoImpl.h"
class nsIAtom;
class nsIDocument;
@ -59,7 +58,7 @@ class nsISupportsArray;
class nsSupportsHashtable;
class nsIXBLService;
class nsFixedSizeAllocator;
class nsXBLProtoImplField;
class nsXBLProtoImpl;
class nsXBLBinding;
// *********************************************************************/
@ -95,22 +94,6 @@ public:
nsXBLProtoImplAnonymousMethod* GetDestructor();
nsresult SetDestructor(nsXBLProtoImplAnonymousMethod* aDestructor);
nsXBLProtoImplField* FindField(const nsString& aFieldName) const
{
return mImplementation ? mImplementation->FindField(aFieldName) : nsnull;
}
// Resolve all the fields for this binding on the object |obj|.
// False return means a JS exception was set.
PRBool ResolveAllFields(JSContext* cx, JSObject* obj) const
{
return !mImplementation || mImplementation->ResolveAllFields(cx, obj);
}
const nsCString& ClassName() const {
return mImplementation ? mImplementation->mClassName : EmptyCString();
}
nsresult InitClass(const nsCString& aClassName, JSContext * aContext,
JSObject * aGlobal, JSObject * aScriptObject,
void ** aClassObject);

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

@ -50,7 +50,6 @@ _TEST_FILES = \
test_bug296375.xul \
test_bug366770.html \
test_bug371724.xhtml \
test_bug372769.xhtml \
$(NULL)
libs:: $(_TEST_FILES)

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

@ -477,8 +477,7 @@ static const char kDOMStringBundleURL[] =
// possible.
#define ELEMENT_SCRIPTABLE_FLAGS \
((NODE_SCRIPTABLE_FLAGS & ~nsIXPCScriptable::CLASSINFO_INTERFACES_ONLY) | \
nsIXPCScriptable::WANT_ENUMERATE)
(NODE_SCRIPTABLE_FLAGS & ~nsIXPCScriptable::CLASSINFO_INTERFACES_ONLY)
#define EXTERNAL_OBJ_SCRIPTABLE_FLAGS \
(ELEMENT_SCRIPTABLE_FLAGS & ~nsIXPCScriptable::USE_JSSTUB_FOR_SETPROPERTY | \
@ -6941,32 +6940,6 @@ nsElementSH::PostCreate(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
return NS_OK;
}
NS_IMETHODIMP
nsElementSH::Enumerate(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
JSObject *obj, PRBool *_retval)
{
// Make sure to not call the superclass here!
nsCOMPtr<nsIContent> content(do_QueryWrappedNative(wrapper));
NS_ENSURE_TRUE(content, NS_ERROR_UNEXPECTED);
nsIDocument* doc = content->GetOwnerDoc();
if (!doc) {
// Nothing else to do here
return NS_OK;
}
nsXBLBinding* binding = doc->BindingManager()->GetBinding(content);
if (!binding) {
// Nothing else to do here
return NS_OK;
}
*_retval = binding->ResolveAllFields(cx, obj);
return NS_OK;
}
// Generic array scriptable helper.
NS_IMETHODIMP

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

@ -563,8 +563,6 @@ protected:
public:
NS_IMETHOD PostCreate(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
JSObject *obj);
NS_IMETHOD Enumerate(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
JSObject *obj, PRBool *_retval);
static nsIClassInfo *doCreate(nsDOMClassInfoData* aData)
{