diff --git a/mozilla/content/xul/content/src/nsXULElement.cpp b/mozilla/content/xul/content/src/nsXULElement.cpp index d9780eee462..11fe9abe8e0 100644 --- a/mozilla/content/xul/content/src/nsXULElement.cpp +++ b/mozilla/content/xul/content/src/nsXULElement.cpp @@ -79,6 +79,7 @@ #include "nsIStyledContent.h" #include "nsIStyleRule.h" #include "nsIURL.h" +#include "nsXULTreeElement.h" #include "rdfutil.h" #include "prlog.h" #include "rdf.h" @@ -319,6 +320,10 @@ private: nsIDOMXULElement* mBroadcaster; // [OWNER] nsIController* mController; // [OWNER] nsCOMPtr mDatabase; // [OWNER] + + // An unreferenced bare pointer to an aggregate that can implement + // element-specific APIs. + nsXULElement* mInnerXULElement; }; @@ -398,7 +403,8 @@ RDFElementImpl::RDFElementImpl(PRInt32 aNameSpaceID, nsIAtom* aTag) mContentsMustBeGenerated(PR_FALSE), mBroadcastListeners(nsnull), mBroadcaster(nsnull), - mController(nsnull) + mController(nsnull), + mInnerXULElement(nsnull) { NS_INIT_REFCNT(); NS_ADDREF(aTag); @@ -491,6 +497,9 @@ RDFElementImpl::~RDFElementImpl() NS_IF_RELEASE(mController); + // Delete the aggregated interface, if one exists. + delete mInnerXULElement; + if (--gRefCnt == 0) { if (gRDFService) { nsServiceManager::ReleaseService(kRDFServiceCID, gRDFService); @@ -574,6 +583,17 @@ RDFElementImpl::QueryInterface(REFNSIID iid, void** result) else if (iid.Equals(kIJSScriptObjectIID)) { *result = NS_STATIC_CAST(nsIJSScriptObject*, this); } + else if (iid.Equals(nsIDOMXULTreeElement::GetIID()) && + (mNameSpaceID == kNameSpaceID_XUL) && + (mTag == kTreeAtom)) { + // We delegate XULTreeElement APIs to an aggregate object + if (! mInnerXULElement) { + if ((mInnerXULElement = new nsXULTreeElement(this)) == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + } + + return mInnerXULElement->QueryInterface(iid, result); + } else { *result = nsnull; return NS_NOINTERFACE; @@ -1264,7 +1284,16 @@ RDFElementImpl::GetScriptObject(nsIScriptContext* aContext, void** aScriptObject if (! mScriptObject) { nsIScriptGlobalObject *global = aContext->GetGlobalObject(); - rv = NS_NewScriptXULElement(aContext, (nsIDOMXULElement*) this, global, (void**) &mScriptObject); + nsresult (*fn)(nsIScriptContext* aContext, nsISupports* aSupports, nsISupports* aParent, void** aReturn); + + if (mTag == kTreeAtom) { + fn = NS_NewScriptXULTreeElement; + } + else { + fn = NS_NewScriptXULElement; + } + + rv = fn(aContext, (nsIDOMXULElement*) this, global, (void**) &mScriptObject); NS_RELEASE(global); diff --git a/mozilla/rdf/content/src/nsRDFElement.cpp b/mozilla/rdf/content/src/nsRDFElement.cpp index d9780eee462..11fe9abe8e0 100644 --- a/mozilla/rdf/content/src/nsRDFElement.cpp +++ b/mozilla/rdf/content/src/nsRDFElement.cpp @@ -79,6 +79,7 @@ #include "nsIStyledContent.h" #include "nsIStyleRule.h" #include "nsIURL.h" +#include "nsXULTreeElement.h" #include "rdfutil.h" #include "prlog.h" #include "rdf.h" @@ -319,6 +320,10 @@ private: nsIDOMXULElement* mBroadcaster; // [OWNER] nsIController* mController; // [OWNER] nsCOMPtr mDatabase; // [OWNER] + + // An unreferenced bare pointer to an aggregate that can implement + // element-specific APIs. + nsXULElement* mInnerXULElement; }; @@ -398,7 +403,8 @@ RDFElementImpl::RDFElementImpl(PRInt32 aNameSpaceID, nsIAtom* aTag) mContentsMustBeGenerated(PR_FALSE), mBroadcastListeners(nsnull), mBroadcaster(nsnull), - mController(nsnull) + mController(nsnull), + mInnerXULElement(nsnull) { NS_INIT_REFCNT(); NS_ADDREF(aTag); @@ -491,6 +497,9 @@ RDFElementImpl::~RDFElementImpl() NS_IF_RELEASE(mController); + // Delete the aggregated interface, if one exists. + delete mInnerXULElement; + if (--gRefCnt == 0) { if (gRDFService) { nsServiceManager::ReleaseService(kRDFServiceCID, gRDFService); @@ -574,6 +583,17 @@ RDFElementImpl::QueryInterface(REFNSIID iid, void** result) else if (iid.Equals(kIJSScriptObjectIID)) { *result = NS_STATIC_CAST(nsIJSScriptObject*, this); } + else if (iid.Equals(nsIDOMXULTreeElement::GetIID()) && + (mNameSpaceID == kNameSpaceID_XUL) && + (mTag == kTreeAtom)) { + // We delegate XULTreeElement APIs to an aggregate object + if (! mInnerXULElement) { + if ((mInnerXULElement = new nsXULTreeElement(this)) == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + } + + return mInnerXULElement->QueryInterface(iid, result); + } else { *result = nsnull; return NS_NOINTERFACE; @@ -1264,7 +1284,16 @@ RDFElementImpl::GetScriptObject(nsIScriptContext* aContext, void** aScriptObject if (! mScriptObject) { nsIScriptGlobalObject *global = aContext->GetGlobalObject(); - rv = NS_NewScriptXULElement(aContext, (nsIDOMXULElement*) this, global, (void**) &mScriptObject); + nsresult (*fn)(nsIScriptContext* aContext, nsISupports* aSupports, nsISupports* aParent, void** aReturn); + + if (mTag == kTreeAtom) { + fn = NS_NewScriptXULTreeElement; + } + else { + fn = NS_NewScriptXULElement; + } + + rv = fn(aContext, (nsIDOMXULElement*) this, global, (void**) &mScriptObject); NS_RELEASE(global); diff --git a/mozilla/rdf/content/src/nsXULElement.cpp b/mozilla/rdf/content/src/nsXULElement.cpp index d9780eee462..11fe9abe8e0 100644 --- a/mozilla/rdf/content/src/nsXULElement.cpp +++ b/mozilla/rdf/content/src/nsXULElement.cpp @@ -79,6 +79,7 @@ #include "nsIStyledContent.h" #include "nsIStyleRule.h" #include "nsIURL.h" +#include "nsXULTreeElement.h" #include "rdfutil.h" #include "prlog.h" #include "rdf.h" @@ -319,6 +320,10 @@ private: nsIDOMXULElement* mBroadcaster; // [OWNER] nsIController* mController; // [OWNER] nsCOMPtr mDatabase; // [OWNER] + + // An unreferenced bare pointer to an aggregate that can implement + // element-specific APIs. + nsXULElement* mInnerXULElement; }; @@ -398,7 +403,8 @@ RDFElementImpl::RDFElementImpl(PRInt32 aNameSpaceID, nsIAtom* aTag) mContentsMustBeGenerated(PR_FALSE), mBroadcastListeners(nsnull), mBroadcaster(nsnull), - mController(nsnull) + mController(nsnull), + mInnerXULElement(nsnull) { NS_INIT_REFCNT(); NS_ADDREF(aTag); @@ -491,6 +497,9 @@ RDFElementImpl::~RDFElementImpl() NS_IF_RELEASE(mController); + // Delete the aggregated interface, if one exists. + delete mInnerXULElement; + if (--gRefCnt == 0) { if (gRDFService) { nsServiceManager::ReleaseService(kRDFServiceCID, gRDFService); @@ -574,6 +583,17 @@ RDFElementImpl::QueryInterface(REFNSIID iid, void** result) else if (iid.Equals(kIJSScriptObjectIID)) { *result = NS_STATIC_CAST(nsIJSScriptObject*, this); } + else if (iid.Equals(nsIDOMXULTreeElement::GetIID()) && + (mNameSpaceID == kNameSpaceID_XUL) && + (mTag == kTreeAtom)) { + // We delegate XULTreeElement APIs to an aggregate object + if (! mInnerXULElement) { + if ((mInnerXULElement = new nsXULTreeElement(this)) == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + } + + return mInnerXULElement->QueryInterface(iid, result); + } else { *result = nsnull; return NS_NOINTERFACE; @@ -1264,7 +1284,16 @@ RDFElementImpl::GetScriptObject(nsIScriptContext* aContext, void** aScriptObject if (! mScriptObject) { nsIScriptGlobalObject *global = aContext->GetGlobalObject(); - rv = NS_NewScriptXULElement(aContext, (nsIDOMXULElement*) this, global, (void**) &mScriptObject); + nsresult (*fn)(nsIScriptContext* aContext, nsISupports* aSupports, nsISupports* aParent, void** aReturn); + + if (mTag == kTreeAtom) { + fn = NS_NewScriptXULTreeElement; + } + else { + fn = NS_NewScriptXULElement; + } + + rv = fn(aContext, (nsIDOMXULElement*) this, global, (void**) &mScriptObject); NS_RELEASE(global);