diff --git a/content/base/public/nsDOMFile.h b/content/base/public/nsDOMFile.h index 96f92e6f28c..2b022d16120 100644 --- a/content/base/public/nsDOMFile.h +++ b/content/base/public/nsDOMFile.h @@ -88,6 +88,28 @@ public: PRBool Remove(PRUint32 aIndex) { return mFiles.RemoveObjectAt(aIndex); } void Clear() { return mFiles.Clear(); } + nsIDOMFile* GetItemAt(PRUint32 aIndex) + { + return mFiles.SafeObjectAt(aIndex); + } + + static nsDOMFileList* FromSupports(nsISupports* aSupports) + { +#ifdef DEBUG + { + nsCOMPtr list_qi = do_QueryInterface(aSupports); + + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsIDOMFileList pointer as the nsISupports + // pointer. That must be fixed, or we'll crash... + NS_ASSERTION(list_qi == static_cast(aSupports), + "Uh, fix QI!"); + } +#endif + + return static_cast(aSupports); + } + private: nsCOMArray mFiles; }; diff --git a/content/base/public/nsINodeList.h b/content/base/public/nsINodeList.h index 7d2230de667..9ae33bbfc1a 100644 --- a/content/base/public/nsINodeList.h +++ b/content/base/public/nsINodeList.h @@ -39,17 +39,18 @@ #define nsINodeList_h___ class nsINode; +class nsIDOMNodeList; // IID for the nsINodeList interface #define NS_INODELIST_IID \ -{ 0x06a6639a, 0x2d47, 0x4551, \ - { 0x94, 0xef, 0x93, 0xb8, 0xe1, 0x09, 0x3a, 0xb3 } } - +{ 0x943420c4, 0x8774, 0x43ea, \ + { 0xb3, 0x53, 0x62, 0xa1, 0x26, 0x1c, 0x9b, 0x55 } } /** * An internal interface that allows QI-less getting of nodes from node lists */ -class nsINodeList : public nsISupports { +class nsINodeList : public nsIDOMNodeList +{ public: NS_DECLARE_STATIC_IID_ACCESSOR(NS_INODELIST_IID) diff --git a/content/base/src/Makefile.in b/content/base/src/Makefile.in index 849e2d8c502..a3702b6a6a0 100644 --- a/content/base/src/Makefile.in +++ b/content/base/src/Makefile.in @@ -135,7 +135,6 @@ CPPSRCS = \ nsFrameLoader.cpp \ nsGenConImageContent.cpp \ nsGenericDOMDataNode.cpp \ - nsGenericDOMNodeList.cpp \ nsGenericElement.cpp \ nsGkAtoms.cpp \ nsHTMLContentSerializer.cpp \ diff --git a/content/base/src/nsContentList.cpp b/content/base/src/nsContentList.cpp index 7c7fe7a8dc3..bf4de326d54 100644 --- a/content/base/src/nsContentList.cpp +++ b/content/base/src/nsContentList.cpp @@ -70,10 +70,6 @@ NS_NewPreContentIterator(nsIContentIterator** aInstancePtrResult); static nsContentList *gCachedContentList; -nsBaseContentList::nsBaseContentList() -{ -} - nsBaseContentList::~nsBaseContentList() { } @@ -90,7 +86,7 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsBaseContentList) NS_INTERFACE_MAP_ENTRY(nsINodeList) NS_INTERFACE_MAP_ENTRY(nsIDOMNodeList) - NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMNodeList) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsINodeList) NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(NodeList) NS_INTERFACE_MAP_END diff --git a/content/base/src/nsContentList.h b/content/base/src/nsContentList.h index ed8439a6a32..1f2e41e3349 100644 --- a/content/base/src/nsContentList.h +++ b/content/base/src/nsContentList.h @@ -74,11 +74,9 @@ class nsIDocument; class nsIDOMHTMLFormElement; -class nsBaseContentList : public nsIDOMNodeList, - public nsINodeList +class nsBaseContentList : public nsINodeList { public: - nsBaseContentList(); virtual ~nsBaseContentList(); NS_DECL_CYCLE_COLLECTING_ISUPPORTS @@ -89,7 +87,7 @@ public: // nsINodeList virtual nsINode* GetNodeAt(PRUint32 aIndex); - NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsBaseContentList, nsIDOMNodeList) + NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsBaseContentList, nsINodeList) void AppendElement(nsIContent *aContent); void RemoveElement(nsIContent *aContent); @@ -265,6 +263,22 @@ public: static void OnDocumentDestroy(nsIDocument *aDocument); + static nsContentList* FromSupports(nsISupports* aSupports) + { + nsINodeList* list = static_cast(aSupports); +#ifdef DEBUG + { + nsCOMPtr list_qi = do_QueryInterface(aSupports); + + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsINodeList pointer as the nsISupports + // pointer. That must be fixed, or we'll crash... + NS_ASSERTION(list_qi == list, "Uh, fix QI!"); + } +#endif + return static_cast(list); + } + protected: /** * Returns whether the content element matches our criterion diff --git a/content/base/src/nsDOMAttribute.h b/content/base/src/nsDOMAttribute.h index d449090114d..0357f525900 100644 --- a/content/base/src/nsDOMAttribute.h +++ b/content/base/src/nsDOMAttribute.h @@ -46,7 +46,6 @@ #include "nsIDOMAttr.h" #include "nsIDOMText.h" #include "nsIDOMNodeList.h" -#include "nsGenericDOMNodeList.h" #include "nsString.h" #include "nsCOMPtr.h" #include "nsINodeInfo.h" diff --git a/content/base/src/nsDOMAttributeMap.cpp b/content/base/src/nsDOMAttributeMap.cpp index 48e251549f5..f3b4d2a8d7f 100644 --- a/content/base/src/nsDOMAttributeMap.cpp +++ b/content/base/src/nsDOMAttributeMap.cpp @@ -163,12 +163,10 @@ nsDOMAttributeMap::DropAttribute(PRInt32 aNamespaceID, nsIAtom* aLocalName) } nsresult -nsDOMAttributeMap::GetAttribute(nsINodeInfo* aNodeInfo, - nsIDOMNode** aReturn, - PRBool aRemove) +nsDOMAttributeMap::RemoveAttribute(nsINodeInfo* aNodeInfo, nsIDOMNode** aReturn) { - NS_ASSERTION(aNodeInfo, "GetAttribute() called with aNodeInfo == nsnull!"); - NS_ASSERTION(aReturn, "GetAttribute() called with aReturn == nsnull"); + NS_ASSERTION(aNodeInfo, "RemoveAttribute() called with aNodeInfo == nsnull!"); + NS_ASSERTION(aReturn, "RemoveAttribute() called with aReturn == nsnull"); *aReturn = nsnull; @@ -176,22 +174,16 @@ nsDOMAttributeMap::GetAttribute(nsINodeInfo* aNodeInfo, if (!mAttributeCache.Get(attr, aReturn)) { nsAutoString value; - if (aRemove) { - // As we are removing the attribute we need to set the current value in - // the attribute node. - mContent->GetAttr(aNodeInfo->NamespaceID(), aNodeInfo->NameAtom(), value); - } - nsCOMPtr newAttr = new nsDOMAttribute(aRemove ? nsnull : this, - aNodeInfo, value); + // As we are removing the attribute we need to set the current value in + // the attribute node. + mContent->GetAttr(aNodeInfo->NamespaceID(), aNodeInfo->NameAtom(), value); + nsCOMPtr newAttr = new nsDOMAttribute(nsnull, aNodeInfo, value); if (!newAttr) { return NS_ERROR_OUT_OF_MEMORY; } - if (!aRemove && !mAttributeCache.Put(attr, newAttr)) { - return NS_ERROR_OUT_OF_MEMORY; - } newAttr.swap(*aReturn); } - else if (aRemove) { + else { nsCOMPtr iAttr(do_QueryInterface(*aReturn)); NS_ASSERTION(iAttr, "non-nsIAttribute somehow made it into the hashmap?!"); @@ -205,6 +197,25 @@ nsDOMAttributeMap::GetAttribute(nsINodeInfo* aNodeInfo, return NS_OK; } +nsIDOMNode* +nsDOMAttributeMap::GetAttribute(nsINodeInfo* aNodeInfo) +{ + NS_ASSERTION(aNodeInfo, "GetAttribute() called with aNodeInfo == nsnull!"); + + nsAttrKey attr(aNodeInfo->NamespaceID(), aNodeInfo->NameAtom()); + + nsIDOMNode* node = mAttributeCache.GetWeak(attr); + if (!node) { + nsCOMPtr newAttr = + new nsDOMAttribute(this, aNodeInfo, EmptyString()); + if (newAttr && mAttributeCache.Put(attr, newAttr)) { + node = newAttr; + } + } + + return node; +} + NS_IMETHODIMP nsDOMAttributeMap::GetNamedItem(const nsAString& aAttrName, nsIDOMNode** aAttribute) @@ -294,7 +305,7 @@ nsDOMAttributeMap::SetNamedItemInternal(nsIDOMNode *aNode, ni = iAttribute->NodeInfo(); if (mContent->HasAttr(ni->NamespaceID(), ni->NameAtom())) { - rv = GetAttribute(ni, getter_AddRefs(tmpReturn), PR_TRUE); + rv = RemoveAttribute(ni, getter_AddRefs(tmpReturn)); NS_ENSURE_SUCCESS(rv, rv); } } @@ -304,7 +315,7 @@ nsDOMAttributeMap::SetNamedItemInternal(nsIDOMNode *aNode, // get node-info of old attribute ni = mContent->GetExistingAttrNameFromQName(name); if (ni) { - rv = GetAttribute(ni, getter_AddRefs(tmpReturn), PR_TRUE); + rv = RemoveAttribute(ni, getter_AddRefs(tmpReturn)); NS_ENSURE_SUCCESS(rv, rv); } else { @@ -374,10 +385,12 @@ nsDOMAttributeMap::RemoveNamedItem(const nsAString& aName, } -NS_IMETHODIMP -nsDOMAttributeMap::Item(PRUint32 aIndex, nsIDOMNode** aReturn) +nsIDOMNode* +nsDOMAttributeMap::GetItemAt(PRUint32 aIndex, nsresult *aResult) { - NS_ENSURE_ARG_POINTER(aReturn); + *aResult = NS_OK; + + nsIDOMNode* node = nsnull; const nsAttrName* name; if (mContent && (name = mContent->GetAttrNameAt(aIndex))) { @@ -386,14 +399,23 @@ nsDOMAttributeMap::Item(PRUint32 aIndex, nsIDOMNode** aReturn) nsCOMPtr ni; ni = mContent->NodeInfo()->NodeInfoManager()-> GetNodeInfo(name->LocalName(), name->GetPrefix(), name->NamespaceID()); - NS_ENSURE_TRUE(ni, NS_ERROR_OUT_OF_MEMORY); - - return GetAttribute(ni, aReturn); + if (ni) { + node = GetAttribute(ni); + } + if (!node) { + *aResult = NS_ERROR_OUT_OF_MEMORY; + } } - *aReturn = nsnull; + return node; +} - return NS_OK; +NS_IMETHODIMP +nsDOMAttributeMap::Item(PRUint32 aIndex, nsIDOMNode** aReturn) +{ + nsresult rv; + NS_IF_ADDREF(*aReturn = GetItemAt(aIndex, &rv)); + return rv; } nsresult @@ -457,7 +479,7 @@ nsDOMAttributeMap::GetNamedItemNSInternal(const nsAString& aNamespaceURI, GetNodeInfo(nameAtom, name->GetPrefix(), nameSpaceID); NS_ENSURE_TRUE(ni, NS_ERROR_OUT_OF_MEMORY); - return GetAttribute(ni, aReturn, aRemove); + return aRemove ? RemoveAttribute(ni, aReturn) : GetAttribute(ni, aReturn); } } diff --git a/content/base/src/nsDOMAttributeMap.h b/content/base/src/nsDOMAttributeMap.h index 359ab2c984a..8e2b95a5ef9 100644 --- a/content/base/src/nsDOMAttributeMap.h +++ b/content/base/src/nsDOMAttributeMap.h @@ -48,6 +48,7 @@ #include "nsInterfaceHashtable.h" #include "nsCycleCollectionParticipant.h" #include "prbit.h" +#include "nsIDOMNode.h" class nsIAtom; class nsIContent; @@ -169,6 +170,25 @@ public: */ PRUint32 Enumerate(AttrCache::EnumReadFunction aFunc, void *aUserArg) const; + nsIDOMNode* GetItemAt(PRUint32 aIndex, nsresult *rv); + + static nsDOMAttributeMap* FromSupports(nsISupports* aSupports) + { +#ifdef DEBUG + { + nsCOMPtr map_qi = do_QueryInterface(aSupports); + + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsIDOMNamedNodeMap pointer as the nsISupports + // pointer. That must be fixed, or we'll crash... + NS_ASSERTION(map_qi == static_cast(aSupports), + "Uh, fix QI!"); + } +#endif + + return static_cast(aSupports); + } + NS_DECL_CYCLE_COLLECTION_CLASS(nsDOMAttributeMap) private: @@ -201,8 +221,25 @@ private: * creating a new one. */ nsresult GetAttribute(nsINodeInfo* aNodeInfo, - nsIDOMNode** aReturn, - PRBool aRemove = PR_FALSE); + nsIDOMNode** aReturn) + { + *aReturn = GetAttribute(aNodeInfo); + if (!*aReturn) { + return NS_ERROR_OUT_OF_MEMORY; + } + + NS_ADDREF(*aReturn); + + return NS_OK; + } + + nsIDOMNode* GetAttribute(nsINodeInfo* aNodeInfo); + + /** + * Remove an attribute, returns the removed node. + */ + nsresult RemoveAttribute(nsINodeInfo* aNodeInfo, + nsIDOMNode** aReturn); }; diff --git a/content/base/src/nsDOMFile.cpp b/content/base/src/nsDOMFile.cpp index 1e8f902fb65..1e1a4edf4e4 100644 --- a/content/base/src/nsDOMFile.cpp +++ b/content/base/src/nsDOMFile.cpp @@ -386,7 +386,7 @@ nsDOMFileList::GetLength(PRUint32* aLength) NS_IMETHODIMP nsDOMFileList::Item(PRUint32 aIndex, nsIDOMFile **aFile) { - NS_IF_ADDREF(*aFile = mFiles.SafeObjectAt(aIndex)); + NS_IF_ADDREF(*aFile = GetItemAt(aIndex)); return NS_OK; } diff --git a/content/base/src/nsDocument.cpp b/content/base/src/nsDocument.cpp index 9525c88bae9..734226a1513 100644 --- a/content/base/src/nsDocument.cpp +++ b/content/base/src/nsDocument.cpp @@ -616,20 +616,30 @@ nsDOMStyleSheetList::GetLength(PRUint32* aLength) return NS_OK; } +nsIStyleSheet* +nsDOMStyleSheetList::GetItemAt(PRUint32 aIndex) +{ + if (!mDocument || aIndex >= (PRUint32)mDocument->GetNumberOfStyleSheets()) { + return nsnull; + } + + nsIStyleSheet *sheet = mDocument->GetStyleSheetAt(aIndex); + NS_ASSERTION(sheet, "Must have a sheet"); + + return sheet; +} + NS_IMETHODIMP nsDOMStyleSheetList::Item(PRUint32 aIndex, nsIDOMStyleSheet** aReturn) { - *aReturn = nsnull; - if (mDocument) { - PRInt32 count = mDocument->GetNumberOfStyleSheets(); - if (aIndex < (PRUint32)count) { - nsIStyleSheet *sheet = mDocument->GetStyleSheetAt(aIndex); - NS_ASSERTION(sheet, "Must have a sheet"); - return CallQueryInterface(sheet, aReturn); - } + nsIStyleSheet *sheet = GetItemAt(aIndex); + if (!sheet) { + *aReturn = nsnull; + + return NS_OK; } - return NS_OK; + return CallQueryInterface(sheet, aReturn); } void diff --git a/content/base/src/nsDocument.h b/content/base/src/nsDocument.h index a38f0a88588..75808f8c3ba 100644 --- a/content/base/src/nsDocument.h +++ b/content/base/src/nsDocument.h @@ -368,6 +368,24 @@ public: nsIStyleSheet* aStyleSheet, PRBool aDocumentSheet); + nsIStyleSheet* GetItemAt(PRUint32 aIndex); + + static nsDOMStyleSheetList* FromSupports(nsISupports* aSupports) + { + nsIDOMStyleSheetList* list = static_cast(aSupports); +#ifdef DEBUG + { + nsCOMPtr list_qi = do_QueryInterface(aSupports); + + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsIDOMStyleSheetList pointer as the + // nsISupports pointer. That must be fixed, or we'll crash... + NS_ASSERTION(list_qi == list, "Uh, fix QI!"); + } +#endif + return static_cast(list); + } + protected: PRInt32 mLength; nsIDocument* mDocument; diff --git a/content/base/src/nsGenericDOMNodeList.cpp b/content/base/src/nsGenericDOMNodeList.cpp deleted file mode 100644 index e6fc6273709..00000000000 --- a/content/base/src/nsGenericDOMNodeList.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either of the GNU General Public License Version 2 or later (the "GPL"), - * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -/* - * A base class for simple DOM NodeLists which implements nsISupports - * and expects subclasess to implement GetLength() and Item() - */ - -#include "nsGenericDOMNodeList.h" -#include "nsGenericElement.h" - -nsGenericDOMNodeList::nsGenericDOMNodeList() -{ -} - -nsGenericDOMNodeList::~nsGenericDOMNodeList() -{ -} - - -NS_IMPL_ADDREF(nsGenericDOMNodeList) -NS_IMPL_RELEASE(nsGenericDOMNodeList) - - -// QueryInterface implementation for nsGenericDOMNodeList -NS_INTERFACE_MAP_BEGIN(nsGenericDOMNodeList) - NS_INTERFACE_MAP_ENTRY(nsINodeList) - NS_INTERFACE_MAP_ENTRY(nsIDOMNodeList) - NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMNodeList) - NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(NodeList) -NS_INTERFACE_MAP_END - -NS_IMETHODIMP -nsGenericDOMNodeList::Item(PRUint32 aIndex, nsIDOMNode** aReturn) -{ - nsINode* node = GetNodeAt(aIndex); - if (!node) { - *aReturn = nsnull; - return NS_OK; - } - - return CallQueryInterface(node, aReturn); -} diff --git a/content/base/src/nsGenericElement.cpp b/content/base/src/nsGenericElement.cpp index 48c94e80204..84197aba184 100644 --- a/content/base/src/nsGenericElement.cpp +++ b/content/base/src/nsGenericElement.cpp @@ -456,10 +456,15 @@ nsIContent::FindFirstNonNativeAnonymous() const //---------------------------------------------------------------------- -nsChildContentList::~nsChildContentList() -{ - MOZ_COUNT_DTOR(nsChildContentList); -} +NS_IMPL_ADDREF(nsChildContentList) +NS_IMPL_RELEASE(nsChildContentList) + +NS_INTERFACE_MAP_BEGIN(nsChildContentList) + NS_INTERFACE_MAP_ENTRY(nsINodeList) + NS_INTERFACE_MAP_ENTRY(nsIDOMNodeList) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsINodeList) + NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(NodeList) +NS_INTERFACE_MAP_END NS_IMETHODIMP nsChildContentList::GetLength(PRUint32* aLength) @@ -469,6 +474,19 @@ nsChildContentList::GetLength(PRUint32* aLength) return NS_OK; } +NS_IMETHODIMP +nsChildContentList::Item(PRUint32 aIndex, nsIDOMNode** aReturn) +{ + nsINode* node = GetNodeAt(aIndex); + if (!node) { + *aReturn = nsnull; + + return NS_OK; + } + + return CallQueryInterface(node, aReturn); +} + nsINode* nsChildContentList::GetNodeAt(PRUint32 aIndex) { diff --git a/content/base/src/nsGenericElement.h b/content/base/src/nsGenericElement.h index 4379a143c07..d1595f3a96c 100644 --- a/content/base/src/nsGenericElement.h +++ b/content/base/src/nsGenericElement.h @@ -55,7 +55,6 @@ #include "nsIDOMNSEventTarget.h" #include "nsIDOMNSElement.h" #include "nsILinkHandler.h" -#include "nsGenericDOMNodeList.h" #include "nsContentUtils.h" #include "nsNodeUtils.h" #include "nsAttrAndChildArray.h" @@ -90,18 +89,18 @@ typedef unsigned long PtrBits; * and Item to its existing child list. * @see nsIDOMNodeList */ -class nsChildContentList : public nsGenericDOMNodeList +class nsChildContentList : public nsINodeList { public: nsChildContentList(nsINode* aNode) : mNode(aNode) { - MOZ_COUNT_CTOR(nsChildContentList); } - virtual ~nsChildContentList(); + + NS_DECL_ISUPPORTS // nsIDOMNodeList interface - NS_IMETHOD GetLength(PRUint32* aLength); + NS_DECL_NSIDOMNODELIST // nsINodeList interface virtual nsINode* GetNodeAt(PRUint32 aIndex); diff --git a/content/html/content/public/Makefile.in b/content/html/content/public/Makefile.in index d2047f294df..8b2d615d1c2 100644 --- a/content/html/content/public/Makefile.in +++ b/content/html/content/public/Makefile.in @@ -67,6 +67,7 @@ EXPORTS = \ nsHTMLAudioElement.h \ nsHTMLMediaElement.h \ nsHTMLVideoElement.h \ + nsIHTMLCollection.h \ $(NULL) include $(topsrcdir)/config/rules.mk diff --git a/content/base/src/nsGenericDOMNodeList.h b/content/html/content/public/nsIHTMLCollection.h similarity index 53% rename from content/base/src/nsGenericDOMNodeList.h rename to content/html/content/public/nsIHTMLCollection.h index 10404537738..1195f91748d 100644 --- a/content/base/src/nsGenericDOMNodeList.h +++ b/content/html/content/public/nsIHTMLCollection.h @@ -12,18 +12,18 @@ * for the specific language governing rights and limitations under the * License. * - * The Original Code is Mozilla Communicator client code. + * The Original Code is Mozilla DOM code. * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 + * The Initial Developer of the Original Code is Mozilla Corporation. + * Portions created by the Initial Developer are Copyright (C) 2008 * the Initial Developer. All Rights Reserved. * * Contributor(s): + * Peter Van der Beken (Original Author) * * Alternatively, the contents of this file may be used under the terms of - * either of the GNU General Public License Version 2 or later (the "GPL"), - * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to @@ -35,38 +35,31 @@ * * ***** END LICENSE BLOCK ***** */ -/* - * A base class for simple DOM NodeLists which implements nsISupports and Item() - * and expects subclasess to implement GetLength() and GetNodeAt() +#ifndef nsIHTMLCollection_h___ +#define nsIHTMLCollection_h___ + +#include "nsIDOMHTMLCollection.h"; + +// IID for the nsIHTMLCollection interface +#define NS_IHTMLCOLLECTION_IID \ +{ 0xb90f2c8c, 0xc564, 0x4464, \ + { 0x97, 0x01, 0x05, 0x14, 0xe4, 0xeb, 0x69, 0x65 } } + +/** + * An internal interface that allows QI-less getting of nodes from HTML + * collections */ - -// XXXbz we don't use this for much... should we be using it more, or -// just nix it? - -#ifndef nsGenericDOMNodeList_h__ -#define nsGenericDOMNodeList_h__ - -#include "nsISupports.h" -#include "nsIDOMNodeList.h" -#include "nsINodeList.h" - -class nsGenericDOMNodeList : public nsIDOMNodeList, - public nsINodeList +class nsIHTMLCollection : public nsIDOMHTMLCollection { public: - nsGenericDOMNodeList(); - virtual ~nsGenericDOMNodeList(); + NS_DECLARE_STATIC_IID_ACCESSOR(NS_IHTMLCOLLECTION_IID) - NS_DECL_ISUPPORTS - - NS_IMETHOD Item(PRUint32 aIndex, nsIDOMNode** aReturn); - - // The following need to be defined in the subclass - // nsIDOMNodeList interface - NS_IMETHOD GetLength(PRUint32* aLength)=0; - - // nsINodeList interface - virtual nsINode* GetNodeAt(PRUint32 aIndex) = 0; + /** + * Get the node at the index. Returns null if the index is out of bounds + */ + virtual nsISupports* GetNodeAt(PRUint32 aIndex, nsresult* aResult) = 0; }; -#endif // nsGenericDOMNodeList_h__ +NS_DEFINE_STATIC_IID_ACCESSOR(nsIHTMLCollection, NS_IHTMLCOLLECTION_IID) + +#endif /* nsIHTMLCollection_h___ */ diff --git a/content/html/content/src/nsClientRect.cpp b/content/html/content/src/nsClientRect.cpp index 9db43ac6921..714294cda59 100644 --- a/content/html/content/src/nsClientRect.cpp +++ b/content/html/content/src/nsClientRect.cpp @@ -118,12 +118,7 @@ nsClientRectList::GetLength(PRUint32* aLength) NS_IMETHODIMP nsClientRectList::Item(PRUint32 aIndex, nsIDOMClientRect** aReturn) { - if (aIndex >= PRUint32(mArray.Count())) { - *aReturn = nsnull; - return NS_OK; - } - - NS_IF_ADDREF(*aReturn = mArray.ObjectAt(aIndex)); + NS_IF_ADDREF(*aReturn = GetItemAt(aIndex)); return NS_OK; } diff --git a/content/html/content/src/nsClientRect.h b/content/html/content/src/nsClientRect.h index 666f1cb5859..a18535c59cf 100644 --- a/content/html/content/src/nsClientRect.h +++ b/content/html/content/src/nsClientRect.h @@ -43,6 +43,7 @@ #include "nsIDOMClientRectList.h" #include "nsCOMArray.h" #include "nsRect.h" +#include "nsCOMPtr.h" class nsPresContext; @@ -76,6 +77,28 @@ public: void Append(nsIDOMClientRect* aElement) { mArray.AppendObject(aElement); } + nsIDOMClientRect* GetItemAt(PRUint32 aIndex) + { + return mArray.SafeObjectAt(aIndex); + } + + static nsClientRectList* FromSupports(nsISupports* aSupports) + { +#ifdef DEBUG + { + nsCOMPtr list_qi = do_QueryInterface(aSupports); + + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsIDOMClientRectList pointer as the nsISupports + // pointer. That must be fixed, or we'll crash... + NS_ASSERTION(list_qi == static_cast(aSupports), + "Uh, fix QI!"); + } +#endif + + return static_cast(aSupports); + } + protected: virtual ~nsClientRectList() {} diff --git a/content/html/content/src/nsHTMLFormElement.cpp b/content/html/content/src/nsHTMLFormElement.cpp index efce6b55d1f..fadb7131dff 100644 --- a/content/html/content/src/nsHTMLFormElement.cpp +++ b/content/html/content/src/nsHTMLFormElement.cpp @@ -88,6 +88,7 @@ #include "nsEventDispatcher.h" #include "mozAutoDocUpdate.h" +#include "nsIHTMLCollection.h" static const int NS_FORM_CONTROL_LIST_HASHTABLE_SIZE = 16; @@ -348,7 +349,7 @@ PRBool nsHTMLFormElement::gPasswordManagerInitialized = PR_FALSE; // nsFormControlList class nsFormControlList : public nsIDOMNSHTMLFormControlList, - public nsIDOMHTMLCollection + public nsIHTMLCollection { public: nsFormControlList(nsHTMLFormElement* aForm); @@ -366,6 +367,15 @@ public: // nsIDOMNSHTMLFormControlList interface NS_DECL_NSIDOMNSHTMLFORMCONTROLLIST + virtual nsISupports* GetNodeAt(PRUint32 aIndex, nsresult* aResult) + { + FlushPendingNotifications(); + + *aResult = NS_OK; + + return mElements.SafeElementAt(aIndex, nsnull); + } + nsresult AddElementToTable(nsIFormControl* aChild, const nsAString& aName); nsresult RemoveElementFromTable(nsIFormControl* aChild, @@ -398,8 +408,7 @@ public: nsTArray mNotInElements; // Holds WEAK references - NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsFormControlList, - nsIDOMHTMLCollection) + NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsFormControlList, nsIHTMLCollection) protected: // Drop all our references to the form elements @@ -2112,7 +2121,8 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END // XPConnect interface list for nsFormControlList NS_INTERFACE_TABLE_HEAD(nsFormControlList) - NS_INTERFACE_TABLE2(nsFormControlList, + NS_INTERFACE_TABLE3(nsFormControlList, + nsIHTMLCollection, nsIDOMHTMLCollection, nsIDOMNSHTMLFormControlList) NS_INTERFACE_TABLE_TO_MAP_SEGUE_CYCLE_COLLECTION(nsFormControlList) @@ -2120,10 +2130,8 @@ NS_INTERFACE_TABLE_HEAD(nsFormControlList) NS_INTERFACE_MAP_END -NS_IMPL_CYCLE_COLLECTING_ADDREF_AMBIGUOUS(nsFormControlList, - nsIDOMHTMLCollection) -NS_IMPL_CYCLE_COLLECTING_RELEASE_AMBIGUOUS(nsFormControlList, - nsIDOMHTMLCollection) +NS_IMPL_CYCLE_COLLECTING_ADDREF_AMBIGUOUS(nsFormControlList, nsIHTMLCollection) +NS_IMPL_CYCLE_COLLECTING_RELEASE_AMBIGUOUS(nsFormControlList, nsIHTMLCollection) // nsIDOMHTMLCollection interface @@ -2139,14 +2147,15 @@ nsFormControlList::GetLength(PRUint32* aLength) NS_IMETHODIMP nsFormControlList::Item(PRUint32 aIndex, nsIDOMNode** aReturn) { - FlushPendingNotifications(); + nsresult rv; + nsISupports* item = GetNodeAt(aIndex, &rv); + if (!item) { + *aReturn = nsnull; - if (aIndex < mElements.Length()) { - return CallQueryInterface(mElements[aIndex], aReturn); + return rv; } - *aReturn = nsnull; - return NS_OK; + return CallQueryInterface(item, aReturn); } NS_IMETHODIMP diff --git a/content/html/content/src/nsHTMLSelectElement.cpp b/content/html/content/src/nsHTMLSelectElement.cpp index b4e9942849d..4d01cdb7ffa 100644 --- a/content/html/content/src/nsHTMLSelectElement.cpp +++ b/content/html/content/src/nsHTMLSelectElement.cpp @@ -1845,7 +1845,8 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END // QueryInterface implementation for nsHTMLOptionCollection NS_INTERFACE_TABLE_HEAD(nsHTMLOptionCollection) - NS_INTERFACE_TABLE3(nsHTMLOptionCollection, + NS_INTERFACE_TABLE4(nsHTMLOptionCollection, + nsIHTMLCollection, nsIDOMNSHTMLOptionCollection, nsIDOMHTMLOptionsCollection, nsIDOMHTMLCollection) @@ -1855,9 +1856,9 @@ NS_INTERFACE_MAP_END NS_IMPL_CYCLE_COLLECTING_ADDREF_AMBIGUOUS(nsHTMLOptionCollection, - nsIDOMNSHTMLOptionCollection) + nsIHTMLCollection) NS_IMPL_CYCLE_COLLECTING_RELEASE_AMBIGUOUS(nsHTMLOptionCollection, - nsIDOMNSHTMLOptionCollection) + nsIHTMLCollection) // nsIDOMNSHTMLOptionCollection interface @@ -1947,11 +1948,15 @@ nsHTMLOptionCollection::SetSelectedIndex(PRInt32 aSelectedIndex) NS_IMETHODIMP nsHTMLOptionCollection::Item(PRUint32 aIndex, nsIDOMNode** aReturn) { - nsIDOMHTMLOptionElement *option = mElements.SafeObjectAt(aIndex); + nsresult rv; + nsISupports* item = GetNodeAt(aIndex, &rv); + if (!item) { + *aReturn = nsnull; - NS_IF_ADDREF(*aReturn = option); + return rv; + } - return NS_OK; + return CallQueryInterface(item, aReturn); } NS_IMETHODIMP diff --git a/content/html/content/src/nsHTMLSelectElement.h b/content/html/content/src/nsHTMLSelectElement.h index c6a3bf94124..87ddffe071c 100644 --- a/content/html/content/src/nsHTMLSelectElement.h +++ b/content/html/content/src/nsHTMLSelectElement.h @@ -49,11 +49,11 @@ #include "nsIDOMNSXBLFormControl.h" #include "nsIDOMHTMLFormElement.h" #include "nsIDOMHTMLOptionElement.h" -#include "nsIDOMHTMLCollection.h" #include "nsIDOMHTMLOptionsCollection.h" #include "nsIDOMNSHTMLOptionCollectn.h" #include "nsISelectControlFrame.h" #include "nsContentUtils.h" +#include "nsIHTMLCollection.h" // PresState #include "nsXPCOM.h" @@ -71,7 +71,7 @@ class nsHTMLSelectElement; */ class nsHTMLOptionCollection: public nsIDOMHTMLOptionsCollection, public nsIDOMNSHTMLOptionCollection, - public nsIDOMHTMLCollection + public nsIHTMLCollection { public: nsHTMLOptionCollection(nsHTMLSelectElement* aSelect); @@ -88,8 +88,15 @@ public: // nsIDOMHTMLCollection interface, all its methods are defined in // nsIDOMHTMLOptionsCollection + virtual nsISupports* GetNodeAt(PRUint32 aIndex, nsresult* aResult) + { + *aResult = NS_OK; + + return mElements.SafeObjectAt(aIndex); + } + NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsHTMLOptionCollection, - nsIDOMNSHTMLOptionCollection) + nsIHTMLCollection) // Helpers for nsHTMLSelectElement /** diff --git a/content/html/content/src/nsHTMLTableElement.cpp b/content/html/content/src/nsHTMLTableElement.cpp index 3b626a23308..a394d588311 100644 --- a/content/html/content/src/nsHTMLTableElement.cpp +++ b/content/html/content/src/nsHTMLTableElement.cpp @@ -54,6 +54,7 @@ /* for collections */ #include "nsIDOMElement.h" #include "nsGenericHTMLElement.h" +#include "nsIHTMLCollection.h" /* end for collections */ class TableRowsCollection; @@ -105,7 +106,7 @@ protected: * This class provides a late-bound collection of rows in a table. * mParent is NOT ref-counted to avoid circular references */ -class TableRowsCollection : public nsIDOMHTMLCollection +class TableRowsCollection : public nsIHTMLCollection { public: TableRowsCollection(nsHTMLTableElement *aParent); @@ -116,6 +117,8 @@ public: NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_NSIDOMHTMLCOLLECTION + virtual nsISupports* GetNodeAt(PRUint32 aIndex, nsresult* aResult); + NS_IMETHOD ParentDestroyed(); NS_DECL_CYCLE_COLLECTION_CLASS(TableRowsCollection) @@ -172,12 +175,14 @@ TableRowsCollection::Init() // that this may be null at any time. This macro assumes an nsresult named // |rv| is in scope. #define DO_FOR_EACH_ROWGROUP(_code) \ - PR_BEGIN_MACRO \ + do { \ if (mParent) { \ /* THead */ \ nsCOMPtr rowGroup; \ rv = mParent->GetTHead(getter_AddRefs(rowGroup)); \ - NS_ENSURE_SUCCESS(rv, rv); \ + if (NS_FAILED(rv)) { \ + break; \ + } \ nsCOMPtr rows; \ if (rowGroup) { \ rowGroup->GetRows(getter_AddRefs(rows)); \ @@ -188,12 +193,16 @@ TableRowsCollection::Init() nsCOMPtr _tbodies; \ /* TBodies */ \ rv = mParent->GetTBodies(getter_AddRefs(_tbodies)); \ - NS_ENSURE_SUCCESS(rv, rv); \ + if (NS_FAILED(rv)) { \ + break; \ + } \ if (_tbodies) { \ nsCOMPtr _node; \ PRUint32 _tbodyIndex = 0; \ rv = _tbodies->Item(_tbodyIndex, getter_AddRefs(_node)); \ - NS_ENSURE_SUCCESS(rv, rv); \ + if (NS_FAILED(rv)) { \ + break; \ + } \ while (_node) { \ rowGroup = do_QueryInterface(_node); \ if (rowGroup) { \ @@ -203,7 +212,12 @@ TableRowsCollection::Init() } while (0); \ } \ rv = _tbodies->Item(++_tbodyIndex, getter_AddRefs(_node)); \ - NS_ENSURE_SUCCESS(rv, rv); \ + if (NS_FAILED(rv)) { \ + break; \ + } \ + } \ + if (NS_FAILED(rv)) { \ + break; \ } \ } \ /* orphan rows */ \ @@ -213,7 +227,9 @@ TableRowsCollection::Init() } while (0); \ /* TFoot */ \ rv = mParent->GetTFoot(getter_AddRefs(rowGroup)); \ - NS_ENSURE_SUCCESS(rv, rv); \ + if (NS_FAILED(rv)) { \ + break; \ + } \ rows = nsnull; \ if (rowGroup) { \ rowGroup->GetRows(getter_AddRefs(rows)); \ @@ -222,7 +238,7 @@ TableRowsCollection::Init() } while (0); \ } \ } \ - PR_END_MACRO + } while (0); static PRUint32 CountRowsInRowGroup(nsIDOMHTMLCollection* rows) @@ -252,45 +268,59 @@ TableRowsCollection::GetLength(PRUint32* aLength) return rv; } -// Returns the number of items in the row group, only if *aItem ends -// up null. Otherwise, returns 0. -static PRUint32 +// Returns the item at index aIndex if available. If null is returned, +// then aCount will be set to the number of rows in this row collection. +// Otherwise, the value of aCount is undefined. +static nsINode* GetItemOrCountInRowGroup(nsIDOMHTMLCollection* rows, - PRUint32 aIndex, nsIDOMNode** aItem) + PRUint32 aIndex, PRUint32* aCount) { - NS_PRECONDITION(aItem, "Null out param"); + *aCount = 0; - *aItem = nsnull; - PRUint32 length = 0; - if (rows) { - rows->Item(aIndex, aItem); - if (!*aItem) { - rows->GetLength(&length); + rows->GetLength(aCount); + if (aIndex < *aCount) { + nsCOMPtr list = do_QueryInterface(rows); + return list->GetNodeAt(aIndex); } } - return length; + return nsnull; } -// increments aReturn refcnt by 1 -NS_IMETHODIMP -TableRowsCollection::Item(PRUint32 aIndex, nsIDOMNode** aReturn) +nsISupports* +TableRowsCollection::GetNodeAt(PRUint32 aIndex, nsresult *aResult) { - *aReturn = nsnull; - nsresult rv = NS_OK; - + nsresult rv; DO_FOR_EACH_ROWGROUP( - PRUint32 count = GetItemOrCountInRowGroup(rows, aIndex, aReturn); - if (*aReturn) { - return NS_OK; + PRUint32 count; + nsINode* node = GetItemOrCountInRowGroup(rows, aIndex, &count); + if (node) { + return node; } NS_ASSERTION(count <= aIndex, "GetItemOrCountInRowGroup screwed up"); aIndex -= count; ); - return rv; + *aResult = rv; + + return nsnull; +} + +NS_IMETHODIMP +TableRowsCollection::Item(PRUint32 aIndex, nsIDOMNode** aReturn) +{ + nsresult rv; + + nsISupports* node = GetNodeAt(aIndex, &rv); + if (!node) { + *aReturn = nsnull; + + return rv; + } + + return CallQueryInterface(node, aReturn); } static nsresult diff --git a/content/html/document/src/nsHTMLDocument.cpp b/content/html/document/src/nsHTMLDocument.cpp index 48dff49ad02..3a973a25649 100644 --- a/content/html/document/src/nsHTMLDocument.cpp +++ b/content/html/document/src/nsHTMLDocument.cpp @@ -98,7 +98,6 @@ #include "nsIDOMHTMLBodyElement.h" #include "nsINameSpaceManager.h" #include "nsGenericHTMLElement.h" -#include "nsGenericDOMNodeList.h" #include "nsICSSLoader.h" #include "nsIHttpChannel.h" #include "nsIFile.h" @@ -2860,7 +2859,7 @@ nsHTMLDocument::ResolveName(const nsAString& aName, if (aForm) { // ... we're called from a form, in that case we create a - // nsFormNameContentList which will filter out the elements in the + // nsFormContentList which will filter out the elements in the // list that don't belong to aForm nsFormContentList *fc_list = new nsFormContentList(aForm, *list); diff --git a/content/xbl/src/nsBindingManager.cpp b/content/xbl/src/nsBindingManager.cpp index 43161bd1634..403961fc164 100644 --- a/content/xbl/src/nsBindingManager.cpp +++ b/content/xbl/src/nsBindingManager.cpp @@ -58,7 +58,6 @@ #include "nsContentCID.h" #include "nsXMLDocument.h" #include "nsIStreamListener.h" -#include "nsGenericDOMNodeList.h" #include "nsXBLBinding.h" #include "nsXBLPrototypeBinding.h" @@ -92,15 +91,14 @@ { 0xa29df1f8, 0xaeca, 0x4356, \ { 0xa8, 0xc2, 0xa7, 0x24, 0xa2, 0x11, 0x73, 0xac } } -class nsAnonymousContentList : public nsIDOMNodeList, - public nsINodeList +class nsAnonymousContentList : public nsINodeList { public: nsAnonymousContentList(nsInsertionPointList* aElements); virtual ~nsAnonymousContentList(); NS_DECL_CYCLE_COLLECTING_ISUPPORTS - NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsAnonymousContentList, nsIDOMNodeList) + NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsAnonymousContentList, nsINodeList) // nsIDOMNodeList interface NS_DECL_NSIDOMNODELIST @@ -142,10 +140,8 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(nsAnonymousContentList) NS_INTERFACE_MAP_BEGIN(nsAnonymousContentList) NS_INTERFACE_MAP_ENTRY(nsINodeList) NS_INTERFACE_MAP_ENTRY(nsIDOMNodeList) - if (aIID.Equals(NS_GET_IID(nsAnonymousContentList))) - foundInterface = static_cast(this); - else - NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMNodeList) + NS_INTERFACE_MAP_ENTRY(nsAnonymousContentList) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsINodeList) NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(NodeList) NS_INTERFACE_MAP_ENTRIES_CYCLE_COLLECTION(nsAnonymousContentList) NS_INTERFACE_MAP_END diff --git a/dom/public/idl/base/nsIDOMClientInformation.idl b/dom/public/idl/base/nsIDOMClientInformation.idl index 3adeafea23b..5f5028257f9 100755 --- a/dom/public/idl/base/nsIDOMClientInformation.idl +++ b/dom/public/idl/base/nsIDOMClientInformation.idl @@ -38,7 +38,6 @@ #include "domstubs.idl" interface nsIDOMOfflineResourceList; -interface nsIDOMLoadStatusList; [scriptable, uuid(f8bbf8c3-c47b-465a-a221-22824449f689)] interface nsIDOMClientInformation : nsISupports diff --git a/dom/public/idl/offline/Makefile.in b/dom/public/idl/offline/Makefile.in index c7f3d084477..4fa8071ee05 100644 --- a/dom/public/idl/offline/Makefile.in +++ b/dom/public/idl/offline/Makefile.in @@ -48,7 +48,6 @@ GRE_MODULE = 1 XPIDLSRCS = \ nsIDOMOfflineResourceList.idl \ - nsIDOMLoadStatusList.idl \ nsIDOMLoadStatus.idl \ nsIDOMLoadStatusEvent.idl \ $(NULL) diff --git a/dom/public/nsDOMClassInfoID.h b/dom/public/nsDOMClassInfoID.h index 56e99236ca3..2116ac8b125 100644 --- a/dom/public/nsDOMClassInfoID.h +++ b/dom/public/nsDOMClassInfoID.h @@ -408,7 +408,6 @@ enum nsDOMClassInfoID { eDOMClassInfo_XULCommandEvent_id, eDOMClassInfo_CommandEvent_id, eDOMClassInfo_OfflineResourceList_id, - eDOMClassInfo_LoadStatusList_id, eDOMClassInfo_LoadStatus_id, eDOMClassInfo_LoadStatusEvent_id, diff --git a/dom/src/base/Makefile.in b/dom/src/base/Makefile.in index 2c24bb8ecfe..2d64ac6d6db 100644 --- a/dom/src/base/Makefile.in +++ b/dom/src/base/Makefile.in @@ -132,6 +132,7 @@ LOCAL_INCLUDES = \ -I$(topsrcdir)/content/base/src \ -I$(topsrcdir)/content/html/document/src \ -I$(topsrcdir)/layout/style \ + -I$(topsrcdir)/layout/xul/base/src/tree/src \ $(NULL) DEFINES += -D_IMPL_NS_LAYOUT diff --git a/dom/src/base/nsDOMClassInfo.cpp b/dom/src/base/nsDOMClassInfo.cpp index 5933880dc61..32e47cd6385 100644 --- a/dom/src/base/nsDOMClassInfo.cpp +++ b/dom/src/base/nsDOMClassInfo.cpp @@ -113,8 +113,7 @@ #include "nsIDOMMediaList.h" #include "nsIDOMChromeWindow.h" #include "nsIDOMConstructor.h" -#include "nsIDOMClientRect.h" -#include "nsIDOMClientRectList.h" +#include "nsClientRect.h" // DOM core includes #include "nsDOMError.h" @@ -134,6 +133,7 @@ #include "nsIDOMHTMLFormElement.h" #include "nsIDOMNSHTMLFormControlList.h" #include "nsIDOMHTMLCollection.h" +#include "nsIHTMLCollection.h" #include "nsHTMLDocument.h" // HTMLSelectElement helper includes @@ -182,7 +182,8 @@ #include "nsIDOMStyleSheetList.h" #include "nsIDOMCSSStyleDeclaration.h" #include "nsIDOMCSSRule.h" -#include "nsIDOMCSSRuleList.h" +#include "nsICSSRule.h" +#include "nsICSSRuleList.h" #include "nsIDOMRect.h" #include "nsIDOMRGBColor.h" #include "nsIDOMNSRGBAColor.h" @@ -331,7 +332,7 @@ #include "nsIDOMCSSPrimitiveValue.h" #include "nsIDOMCSSStyleRule.h" #include "nsIDOMCSSStyleSheet.h" -#include "nsIDOMCSSValueList.h" +#include "nsDOMCSSValueList.h" #include "nsIDOMRange.h" #include "nsIDOMNSRange.h" #include "nsIDOMRangeException.h" @@ -351,7 +352,7 @@ #include "nsITreeContentView.h" #include "nsITreeView.h" #include "nsIXULTemplateBuilder.h" -#include "nsITreeColumns.h" +#include "nsTreeColumns.h" #endif #include "nsIDOMXPathException.h" #include "nsIDOMXPathExpression.h" @@ -453,7 +454,6 @@ #include "nsIDOMDataTransfer.h" // Offline includes -#include "nsIDOMLoadStatusList.h" #include "nsIDOMLoadStatus.h" #include "nsIDOMLoadStatusEvent.h" @@ -462,8 +462,7 @@ #include "nsIDOMGeoPosition.h" #include "nsIDOMGeoPositionError.h" -#include "nsIDOMFileList.h" -#include "nsIDOMFile.h" +#include "nsDOMFile.h" #include "nsIDOMFileException.h" static NS_DEFINE_CID(kCPluginManagerCID, NS_PLUGINMANAGER_CID); @@ -634,7 +633,7 @@ static nsDOMClassInfoData sClassInfoData[] = { NS_DEFINE_CLASSINFO_DATA(ProcessingInstruction, nsNodeSH, NODE_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(Notation, nsNodeSH, NODE_SCRIPTABLE_FLAGS) - NS_DEFINE_CLASSINFO_DATA(NodeList, nsArraySH, ARRAY_SCRIPTABLE_FLAGS) + NS_DEFINE_CLASSINFO_DATA(NodeList, nsNodeListSH, ARRAY_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(NamedNodeMap, nsNamedNodeMapSH, ARRAY_SCRIPTABLE_FLAGS) @@ -1229,8 +1228,6 @@ static nsDOMClassInfoData sClassInfoData[] = { NS_DEFINE_CLASSINFO_DATA(OfflineResourceList, nsOfflineResourceListSH, ARRAY_SCRIPTABLE_FLAGS) - NS_DEFINE_CLASSINFO_DATA(LoadStatusList, nsLoadStatusListSH, - ARRAY_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(LoadStatus, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(LoadStatusEvent, nsDOMGenericSH, @@ -3419,11 +3416,6 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_ENTRY(nsIDOMEventTarget) DOM_CLASSINFO_MAP_END - DOM_CLASSINFO_MAP_BEGIN(LoadStatusList, nsIDOMLoadStatusList) - DOM_CLASSINFO_MAP_ENTRY(nsIDOMLoadStatusList) - DOM_CLASSINFO_MAP_ENTRY(nsIDOMEventTarget) - DOM_CLASSINFO_MAP_END - DOM_CLASSINFO_MAP_BEGIN(LoadStatus, nsIDOMLoadStatus) DOM_CLASSINFO_MAP_ENTRY(nsIDOMLoadStatus) DOM_CLASSINFO_MAP_END @@ -7538,35 +7530,8 @@ nsGenericArraySH::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext *cx, // it doesn't provide one. PRUint32 length; - - nsCOMPtr map = do_QueryWrappedNative(wrapper); - if (map) { - // Fast path: Get the length from our map. - - map->GetLength(&length); - } else { - // Slow path: We don't know how to get the length in a fast way, ask our - // implementation. - - jsval lenval; - if (!JS_GetProperty(cx, obj, "length", &lenval)) { - return NS_ERROR_UNEXPECTED; - } - - if (!JSVAL_IS_INT(lenval)) { - // This can apparently happen with some sparse array impls falling back - // onto this code. - - return NS_OK; - } - - PRInt32 slen = JSVAL_TO_INT(lenval); - if (slen < 0) { - return NS_OK; - } - - length = (PRUint32)slen; - } + nsresult rv = GetLength(wrapper, cx, obj, &length); + NS_ENSURE_SUCCESS(rv, rv); if ((PRUint32)n < length) { *_retval = ::JS_DefineElement(cx, obj, n, JSVAL_VOID, nsnull, nsnull, @@ -7578,6 +7543,33 @@ nsGenericArraySH::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext *cx, return NS_OK; } +nsresult +nsGenericArraySH::GetLength(nsIXPConnectWrappedNative *wrapper, JSContext *cx, + JSObject *obj, PRUint32 *length) +{ + *length = 0; + + jsval lenval; + if (!JS_GetProperty(cx, obj, "length", &lenval)) { + return NS_ERROR_UNEXPECTED; + } + + if (!JSVAL_IS_INT(lenval)) { + // This can apparently happen with some sparse array impls falling back + // onto this code. + return NS_OK; + } + + PRInt32 slen = JSVAL_TO_INT(lenval); + if (slen < 0) { + return NS_OK; + } + + *length = (PRUint32)slen; + + return NS_OK; +} + NS_IMETHODIMP nsGenericArraySH::Enumerate(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, PRBool *_retval) @@ -7613,21 +7605,7 @@ nsGenericArraySH::Enumerate(nsIXPConnectWrappedNative *wrapper, JSContext *cx, return ok ? NS_OK : NS_ERROR_UNEXPECTED; } -// NodeList scriptable helper - -nsresult -nsArraySH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult) -{ - nsCOMPtr list(do_QueryInterface(aNative)); - if (!list) { - return NS_ERROR_UNEXPECTED; - } - - NS_IF_ADDREF(*aResult = list->GetNodeAt(aIndex)); - - return NS_OK; -} +// Array scriptable helper NS_IMETHODIMP nsArraySH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, @@ -7643,9 +7621,10 @@ nsArraySH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, return NS_ERROR_DOM_INDEX_SIZE_ERR; } - nsCOMPtr array_item; - - rv = GetItemAt(wrapper->Native(), n, getter_AddRefs(array_item)); + // Make sure rv == NS_OK here, so GetItemAt implementations that never fail + // don't have to set rv. + rv = NS_OK; + nsISupports* array_item = GetItemAt(wrapper->Native(), n, &rv); NS_ENSURE_SUCCESS(rv, rv); if (array_item) { @@ -7662,6 +7641,47 @@ nsArraySH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, } +// NodeList scriptable helper + +nsresult +nsNodeListSH::GetLength(nsIXPConnectWrappedNative *wrapper, JSContext *cx, + JSObject *obj, PRUint32 *length) +{ + nsINodeList* list = static_cast(wrapper->Native()); +#ifdef DEBUG + { + nsCOMPtr list_qi = do_QueryWrappedNative(wrapper); + + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsINodeList pointer as the nsISupports + // pointer. That must be fixed, or we'll crash... + NS_ASSERTION(list_qi == list, "Uh, fix QI!"); + } +#endif + + return list->GetLength(length); +} + +nsISupports* +nsNodeListSH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult) +{ + nsINodeList* list = static_cast(aNative); +#ifdef DEBUG + { + nsCOMPtr list_qi = do_QueryInterface(aNative); + + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsINodeList pointer as the nsISupports + // pointer. That must be fixed, or we'll crash... + NS_ASSERTION(list_qi == list, "Uh, fix QI!"); + } +#endif + + return list->GetNodeAt(aIndex); +} + + // StringList scriptable helper nsresult @@ -7707,19 +7727,13 @@ nsNamedArraySH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, // NamedNodeMap helper -nsresult +nsISupports* nsNamedNodeMapSH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult) + nsresult *aResult) { - nsCOMPtr map(do_QueryInterface(aNative)); - NS_ENSURE_TRUE(map, NS_ERROR_UNEXPECTED); + nsDOMAttributeMap* map = nsDOMAttributeMap::FromSupports(aNative); - nsIDOMNode *node = nsnull; // Weak, transfer the ownership over to aResult - nsresult rv = map->Item(aIndex, &node); - - *aResult = node; - - return rv; + return map->GetItemAt(aIndex, aResult); } nsresult @@ -7740,25 +7754,23 @@ nsNamedNodeMapSH::GetNamedItem(nsISupports *aNative, const nsAString& aName, // HTMLCollection helper -nsresult +nsISupports* nsHTMLCollectionSH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult) + nsresult *aResult) { - // Common case is that we're also an nsINodeList - nsresult rv = nsArraySH::GetItemAt(aNative, aIndex, aResult); - if (NS_SUCCEEDED(rv)) { - return rv; + nsIHTMLCollection* collection = static_cast(aNative); +#ifdef DEBUG + { + nsCOMPtr collection_qi = do_QueryInterface(aNative); + + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsIHTMLCollection pointer as the nsISupports + // pointer. That must be fixed, or we'll crash... + NS_ASSERTION(collection_qi == collection, "Uh, fix QI!"); } - - nsCOMPtr collection(do_QueryInterface(aNative)); - NS_ENSURE_TRUE(collection, NS_ERROR_UNEXPECTED); +#endif - nsIDOMNode *node = nsnull; // Weak, transfer the ownership over to aResult - rv = collection->Item(aIndex, &node); - - *aResult = node; - - return rv; + return collection->GetNodeAt(aIndex, aResult); } nsresult @@ -7783,14 +7795,7 @@ nsresult nsContentListSH::PreCreate(nsISupports *nativeObj, JSContext *cx, JSObject *globalObj, JSObject **parentObj) { - nsCOMPtr nodeList(do_QueryInterface(nativeObj)); - nsContentList *contentList = - static_cast(static_cast(nodeList)); - - if (!contentList) { - return NS_OK; - } - + nsContentList *contentList = nsContentList::FromSupports(nativeObj); nsISupports *native_parent = contentList->GetParentObject(); if (!native_parent) { @@ -7809,6 +7814,29 @@ nsContentListSH::PreCreate(nsISupports *nativeObj, JSContext *cx, return rv; } +NS_IMETHODIMP +nsContentListSH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, + JSObject *obj, jsval id, jsval *vp, + PRBool *_retval) +{ + if (JSVAL_IS_STRING(id) && !ObjectIsNativeWrapper(cx, obj)) { + nsContentList *list = nsContentList::FromSupports(wrapper->Native()); + nsINode* node = list->NamedItem(nsDependentJSString(id), PR_TRUE); + if (!node) { + return NS_OK; + } + + nsCOMPtr holder; + nsresult rv = WrapNative(cx, obj, node, NS_GET_IID(nsISupports), vp, + getter_AddRefs(holder)); + + return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING; + } + + return nsNodeListSH::GetProperty(wrapper, cx, obj, id, vp, _retval); +} + + // FormControlList helper nsresult @@ -9846,19 +9874,13 @@ nsHTMLOptionsCollectionSH::Add(JSContext *cx, JSObject *obj, uintN argc, // Plugin helper -nsresult +nsISupports* nsPluginSH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult) + nsresult *aResult) { - nsCOMPtr plugin(do_QueryInterface(aNative)); - NS_ENSURE_TRUE(plugin, NS_ERROR_UNEXPECTED); + nsPluginElement* plugin = nsPluginElement::FromSupports(aNative); - nsIDOMMimeType *mime_type = nsnull; - nsresult rv = plugin->Item(aIndex, &mime_type); - - *aResult = mime_type; - - return rv; + return plugin->GetItemAt(aIndex, aResult); } nsresult @@ -9880,19 +9902,13 @@ nsPluginSH::GetNamedItem(nsISupports *aNative, const nsAString& aName, // PluginArray helper -nsresult +nsISupports* nsPluginArraySH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult) + nsresult *aResult) { - nsCOMPtr array(do_QueryInterface(aNative)); - NS_ENSURE_TRUE(array, NS_ERROR_UNEXPECTED); + nsPluginArray* array = nsPluginArray::FromSupports(aNative); - nsIDOMPlugin *plugin = nsnull; - nsresult rv = array->Item(aIndex, &plugin); - - *aResult = plugin; - - return rv; + return array->GetItemAt(aIndex, aResult); } nsresult @@ -9914,19 +9930,13 @@ nsPluginArraySH::GetNamedItem(nsISupports *aNative, const nsAString& aName, // MimeTypeArray helper -nsresult +nsISupports* nsMimeTypeArraySH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult) + nsresult *aResult) { - nsCOMPtr array(do_QueryInterface(aNative)); - NS_ENSURE_TRUE(array, NS_ERROR_UNEXPECTED); + nsMimeTypeArray* array = nsMimeTypeArray::FromSupports(aNative); - nsIDOMMimeType *mime_type = nsnull; - nsresult rv = array->Item(aIndex, &mime_type); - - *aResult = mime_type; - - return rv; + return array->GetItemAt(aIndex, aResult); } nsresult @@ -10041,37 +10051,25 @@ nsMediaListSH::GetStringAt(nsISupports *aNative, PRInt32 aIndex, // StyleSheetList helper -nsresult +nsISupports* nsStyleSheetListSH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult) + nsresult *rv) { - nsCOMPtr stylesheets(do_QueryInterface(aNative)); - NS_ENSURE_TRUE(stylesheets, NS_ERROR_UNEXPECTED); + nsDOMStyleSheetList* list = nsDOMStyleSheetList::FromSupports(aNative); - nsIDOMStyleSheet *sheet = nsnull; - nsresult rv = stylesheets->Item(aIndex, &sheet); - - *aResult = sheet; - - return rv; + return list->GetItemAt(aIndex); } // CSSValueList helper -nsresult +nsISupports* nsCSSValueListSH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult) + nsresult *aResult) { - nsCOMPtr cssValueList(do_QueryInterface(aNative)); - NS_ENSURE_TRUE(cssValueList, NS_ERROR_UNEXPECTED); + nsDOMCSSValueList* list = nsDOMCSSValueList::FromSupports(aNative); - nsIDOMCSSValue *cssValue = nsnull; // Weak, transfer the ownership over to aResult - nsresult rv = cssValueList->Item(aIndex, &cssValue); - - *aResult = cssValue; - - return rv; + return list->GetItemAt(aIndex); } @@ -10093,54 +10091,46 @@ nsCSSStyleDeclSH::GetStringAt(nsISupports *aNative, PRInt32 aIndex, // CSSRuleList scriptable helper -nsresult +nsISupports* nsCSSRuleListSH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult) + nsresult *aResult) { - nsCOMPtr list(do_QueryInterface(aNative)); - NS_ENSURE_TRUE(list, NS_ERROR_UNEXPECTED); + nsICSSRuleList* list = static_cast(aNative); +#ifdef DEBUG + { + nsCOMPtr list_qi = do_QueryInterface(aNative); - nsIDOMCSSRule *rule = nsnull; // Weak, transfer the ownership over to aResult - nsresult rv = list->Item(aIndex, &rule); + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsICSSRuleList pointer as the nsISupports + // pointer. That must be fixed, or we'll crash... + NS_ASSERTION(list_qi == list, "Uh, fix QI!"); + } +#endif - *aResult = rule; - - return rv; + return list->GetItemAt(aIndex, aResult); } // ClientRectList scriptable helper -nsresult +nsISupports* nsClientRectListSH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult) + nsresult *aResult) { - nsCOMPtr list(do_QueryInterface(aNative)); - NS_ENSURE_TRUE(list, NS_ERROR_UNEXPECTED); + nsClientRectList* list = nsClientRectList::FromSupports(aNative); - nsIDOMClientRect *rule = nsnull; // Weak, transfer the ownership over to aResult - nsresult rv = list->Item(aIndex, &rule); - - *aResult = rule; - - return rv; + return list->GetItemAt(aIndex); } #ifdef MOZ_XUL // TreeColumns helper -nsresult +nsISupports* nsTreeColumnsSH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult) + nsresult *aResult) { - nsCOMPtr columns(do_QueryInterface(aNative)); - NS_ENSURE_TRUE(columns, NS_ERROR_UNEXPECTED); + nsTreeColumns* columns = nsTreeColumns::FromSupports(aNative); - nsITreeColumn* column = nsnull; // Weak, transfer the ownership over to aResult - nsresult rv = columns->GetColumnAt(aIndex, &column); - - *aResult = column; - - return rv; + return columns->GetColumnAt(aIndex); } nsresult @@ -10479,34 +10469,12 @@ nsOfflineResourceListSH::GetStringAt(nsISupports *aNative, PRInt32 aIndex, return list->Item(aIndex, aResult); } -// nsLoadStatusListSH -nsresult -nsLoadStatusListSH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult) -{ - nsCOMPtr list(do_QueryInterface(aNative)); - NS_ENSURE_TRUE(list, NS_ERROR_UNEXPECTED); - - nsIDOMLoadStatus *status = nsnull; // Weak, transfer the ownership over to aResult - nsresult rv = list->Item(aIndex, &status); - - *aResult = status; - - return rv; -} - // nsFileListSH -nsresult +nsISupports* nsFileListSH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult) + nsresult *aResult) { - nsCOMPtr list(do_QueryInterface(aNative)); - NS_ENSURE_TRUE(list, NS_ERROR_UNEXPECTED); + nsDOMFileList* list = nsDOMFileList::FromSupports(aNative); - nsIDOMFile *file = nsnull; // weak, transfer ownership over to aResult - nsresult rv = list->Item(aIndex, &file); - - *aResult = file; - - return rv; + return list->GetItemAt(aIndex); } diff --git a/dom/src/base/nsDOMClassInfo.h b/dom/src/base/nsDOMClassInfo.h index 44d861daa08..5225741cb2d 100644 --- a/dom/src/base/nsDOMClassInfo.h +++ b/dom/src/base/nsDOMClassInfo.h @@ -620,6 +620,9 @@ public: NS_IMETHOD Enumerate(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, PRBool *_retval); + virtual nsresult GetLength(nsIXPConnectWrappedNative *wrapper, JSContext *cx, + JSObject *obj, PRUint32 *length); + static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) { return new nsGenericArraySH(aData); @@ -627,7 +630,7 @@ public: }; -// NodeList scriptable helper +// Array scriptable helper class nsArraySH : public nsGenericArraySH { @@ -640,16 +643,39 @@ protected: { } - virtual nsresult GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult); + // Subclasses need to override this, if the implementation can't fail it's + // allowed to not set *aResult. + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult) = 0; public: NS_IMETHOD GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, jsval id, jsval *vp, PRBool *_retval); +private: + // Not implemented, nothing should create an instance of this class. + static nsIClassInfo *doCreate(nsDOMClassInfoData* aData); +}; + + +// NodeList scriptable helper + +class nsNodeListSH : public nsArraySH +{ +protected: + nsNodeListSH(nsDOMClassInfoData* aData) : nsArraySH(aData) + { + } + +public: + virtual nsresult GetLength(nsIXPConnectWrappedNative *wrapper, JSContext *cx, + JSObject *obj, PRUint32 *length); + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult); + static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) { - return new nsArraySH(aData); + return new nsNodeListSH(aData); } }; @@ -673,6 +699,10 @@ protected: public: NS_IMETHOD GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, jsval id, jsval *vp, PRBool *_retval); + +private: + // Not implemented, nothing should create an instance of this class. + static nsIClassInfo *doCreate(nsDOMClassInfoData* aData); }; @@ -689,10 +719,8 @@ protected: { } - // Override nsArraySH::GetItemAt() since our list isn't a - // nsIDOMNodeList - virtual nsresult GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult); + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult); // Override nsNamedArraySH::GetNamedItem() virtual nsresult GetNamedItem(nsISupports *aNative, const nsAString& aName, @@ -719,10 +747,8 @@ protected: { } - // Override nsArraySH::GetItemAt() since our list isn't a - // nsIDOMNodeList - virtual nsresult GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult); + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult); // Override nsNamedArraySH::GetNamedItem() virtual nsresult GetNamedItem(nsISupports *aNative, const nsAString& aName, @@ -738,20 +764,18 @@ public: // ContentList helper -class nsContentListSH : public nsHTMLCollectionSH +class nsContentListSH : public nsNodeListSH { protected: - nsContentListSH(nsDOMClassInfoData* aData) : nsHTMLCollectionSH(aData) - { - } - - virtual ~nsContentListSH() + nsContentListSH(nsDOMClassInfoData* aData) : nsNodeListSH(aData) { } public: NS_IMETHOD PreCreate(nsISupports *nativeObj, JSContext *cx, JSObject *globalObj, JSObject **parentObj); + NS_IMETHOD GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, + JSObject *obj, jsval id, jsval *vp, PRBool *_retval); static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) { @@ -1067,10 +1091,8 @@ protected: { } - // Override nsArraySH::GetItemAt() since our list isn't a - // nsIDOMNodeList - virtual nsresult GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult); + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult); // Override nsNamedArraySH::GetNamedItem() virtual nsresult GetNamedItem(nsISupports *aNative, const nsAString& aName, @@ -1097,10 +1119,8 @@ protected: { } - // Override nsArraySH::GetItemAt() since our list isn't a - // nsIDOMNodeList - virtual nsresult GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult); + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult); // Override nsNamedArraySH::GetNamedItem() virtual nsresult GetNamedItem(nsISupports *aNative, const nsAString& aName, @@ -1127,10 +1147,8 @@ protected: { } - // Override nsArraySH::GetItemAt() since our list isn't a - // nsIDOMNodeList - virtual nsresult GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult); + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult); // Override nsNamedArraySH::GetNamedItem() virtual nsresult GetNamedItem(nsISupports *aNative, const nsAString& aName, @@ -1255,10 +1273,8 @@ protected: { } - // Override nsArraySH::GetItemAt() since our list isn't a - // nsIDOMNodeList - virtual nsresult GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult); + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult); public: static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) @@ -1281,10 +1297,8 @@ protected: { } - // Override nsArraySH::GetItemAt() since our list isn't a - // nsIDOMNodeList - virtual nsresult GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult); + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult); public: static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) @@ -1331,10 +1345,8 @@ protected: { } - // Override nsArraySH::GetItemAt() since our list isn't a - // nsIDOMNodeList - virtual nsresult GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult); + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult); public: static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) @@ -1356,10 +1368,8 @@ protected: { } - // Override nsArraySH::GetItemAt() since our list isn't a - // nsIDOMNodeList - virtual nsresult GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult); + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult); public: static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) @@ -1383,10 +1393,8 @@ protected: { } - // Override nsArraySH::GetItemAt() since our list isn't a - // nsIDOMNodeList - virtual nsresult GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult); + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult); // Override nsNamedArraySH::GetNamedItem() virtual nsresult GetNamedItem(nsISupports *aNative, const nsAString& aName, @@ -1424,6 +1432,11 @@ protected: JSObject *obj, PRUint32 enum_op, jsval *statep, jsid *idp, PRBool *_retval); + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult) + { + return nsnull; + } // Override nsNamedArraySH::GetNamedItem() virtual nsresult GetNamedItem(nsISupports *aNative, const nsAString& aName, nsISupports **aResult); @@ -1446,6 +1459,11 @@ protected: { } + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult) + { + return nsnull; + } // Override nsNamedArraySH::GetNamedItem() virtual nsresult GetNamedItem(nsISupports *aNative, const nsAString& aName, nsISupports **aResult); @@ -1571,27 +1589,6 @@ public: } }; -class nsLoadStatusListSH : public nsArraySH -{ -protected: - nsLoadStatusListSH(nsDOMClassInfoData *aData) : nsArraySH(aData) - { - } - - virtual ~nsLoadStatusListSH() - { - } - - virtual nsresult GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult); - -public: - static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) - { - return new nsLoadStatusListSH(aData); - } -}; - class nsFileListSH : public nsArraySH { protected: @@ -1603,8 +1600,8 @@ protected: { } - virtual nsresult GetItemAt(nsISupports *aNative, PRUint32 aIndex, - nsISupports **aResult); + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsresult *aResult); public: static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) diff --git a/dom/src/base/nsGlobalWindow.h b/dom/src/base/nsGlobalWindow.h index d9aa287bed8..4dca29c2ed9 100644 --- a/dom/src/base/nsGlobalWindow.h +++ b/dom/src/base/nsGlobalWindow.h @@ -124,7 +124,6 @@ class nsDummyJavaPluginOwner; class PostMessageEvent; class nsDOMOfflineResourceList; -class nsDOMOfflineLoadStatusList; class nsGeolocation; // permissible values for CheckOpenAllow diff --git a/dom/src/base/nsMimeTypeArray.cpp b/dom/src/base/nsMimeTypeArray.cpp index b091d555323..7a5cd5abf4d 100644 --- a/dom/src/base/nsMimeTypeArray.cpp +++ b/dom/src/base/nsMimeTypeArray.cpp @@ -85,20 +85,34 @@ nsMimeTypeArray::GetLength(PRUint32* aLength) return NS_OK; } +nsIDOMMimeType* +nsMimeTypeArray::GetItemAt(PRUint32 aIndex, nsresult *aResult) +{ + if (mMimeTypeArray == nsnull) { + *aResult = GetMimeTypes(); + if (*aResult != NS_OK) + return nsnull; + } + + if (aIndex >= mMimeTypeCount) { + *aResult = NS_ERROR_FAILURE; + + return nsnull; + } + + *aResult = NS_OK; + + return mMimeTypeArray[aIndex]; +} + NS_IMETHODIMP nsMimeTypeArray::Item(PRUint32 aIndex, nsIDOMMimeType** aReturn) { - if (mMimeTypeArray == nsnull) { - nsresult rv = GetMimeTypes(); - if (rv != NS_OK) - return rv; - } - if (aIndex < mMimeTypeCount) { - *aReturn = mMimeTypeArray[aIndex]; - NS_IF_ADDREF(*aReturn); - return NS_OK; - } - return NS_ERROR_FAILURE; + nsresult rv; + + NS_IF_ADDREF(*aReturn = GetItemAt(aIndex, &rv)); + + return rv; } NS_IMETHODIMP diff --git a/dom/src/base/nsMimeTypeArray.h b/dom/src/base/nsMimeTypeArray.h index e064eb28075..71cc18c0e29 100644 --- a/dom/src/base/nsMimeTypeArray.h +++ b/dom/src/base/nsMimeTypeArray.h @@ -56,6 +56,25 @@ public: nsresult Refresh(); + nsIDOMMimeType* GetItemAt(PRUint32 aIndex, nsresult* aResult); + + static nsMimeTypeArray* FromSupports(nsISupports* aSupports) + { +#ifdef DEBUG + { + nsCOMPtr array_qi = do_QueryInterface(aSupports); + + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsIDOMMimeTypeArray pointer as the nsISupports + // pointer. That must be fixed, or we'll crash... + NS_ASSERTION(array_qi == static_cast(aSupports), + "Uh, fix QI!"); + } +#endif + + return static_cast(aSupports); + } + private: nsresult GetMimeTypes(); void Clear(); diff --git a/dom/src/base/nsPluginArray.cpp b/dom/src/base/nsPluginArray.cpp index c2d1ac6ab6d..e96deea72f0 100644 --- a/dom/src/base/nsPluginArray.cpp +++ b/dom/src/base/nsPluginArray.cpp @@ -105,27 +105,31 @@ nsPluginArray::AllowPlugins() return allowPlugins; } +nsIDOMPlugin* +nsPluginArray::GetItemAt(PRUint32 aIndex, nsresult* aResult) +{ + *aResult = NS_OK; + + if (!AllowPlugins()) + return nsnull; + + if (mPluginArray == nsnull) { + *aResult = GetPlugins(); + if (*aResult != NS_OK) + return nsnull; + } + + return aIndex < mPluginCount ? mPluginArray[aIndex] : nsnull; +} + NS_IMETHODIMP nsPluginArray::Item(PRUint32 aIndex, nsIDOMPlugin** aReturn) { - NS_PRECONDITION(nsnull != aReturn, "null arg"); - *aReturn = nsnull; + nsresult rv; - if (!AllowPlugins()) - return NS_OK; + NS_IF_ADDREF(*aReturn = GetItemAt(aIndex, &rv)); - if (mPluginArray == nsnull) { - nsresult rv = GetPlugins(); - if (rv != NS_OK) - return rv; - } - - if (aIndex < mPluginCount) { - *aReturn = mPluginArray[aIndex]; - NS_IF_ADDREF(*aReturn); - } - - return NS_OK; + return rv; } NS_IMETHODIMP @@ -330,21 +334,34 @@ nsPluginElement::GetLength(PRUint32* aLength) return mPlugin->GetLength(aLength); } +nsIDOMMimeType* +nsPluginElement::GetItemAt(PRUint32 aIndex, nsresult *aResult) +{ + if (mMimeTypeArray == nsnull) { + *aResult = GetMimeTypes(); + if (*aResult != NS_OK) + return nsnull; + } + + if (aIndex >= mMimeTypeCount) { + *aResult = NS_ERROR_FAILURE; + + return nsnull; + } + + *aResult = NS_OK; + + return mMimeTypeArray[aIndex]; +} + NS_IMETHODIMP nsPluginElement::Item(PRUint32 aIndex, nsIDOMMimeType** aReturn) { - if (mMimeTypeArray == nsnull) { - nsresult rv = GetMimeTypes(); - if (rv != NS_OK) - return rv; - } - if (aIndex < mMimeTypeCount) { - nsIDOMMimeType* mimeType = mMimeTypeArray[aIndex]; - NS_IF_ADDREF(mimeType); - *aReturn = mimeType; - return NS_OK; - } - return NS_ERROR_FAILURE; + nsresult rv; + + NS_IF_ADDREF(*aReturn = GetItemAt(aIndex, &rv)); + + return rv; } NS_IMETHODIMP diff --git a/dom/src/base/nsPluginArray.h b/dom/src/base/nsPluginArray.h index 50392cb5120..912acd154dc 100644 --- a/dom/src/base/nsPluginArray.h +++ b/dom/src/base/nsPluginArray.h @@ -60,6 +60,25 @@ public: nsresult GetPluginHost(nsIPluginHost** aPluginHost); + nsIDOMPlugin* GetItemAt(PRUint32 aIndex, nsresult* aResult); + + static nsPluginArray* FromSupports(nsISupports* aSupports) + { +#ifdef DEBUG + { + nsCOMPtr array_qi = do_QueryInterface(aSupports); + + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsIDOMPluginArray pointer as the nsISupports + // pointer. That must be fixed, or we'll crash... + NS_ASSERTION(array_qi == static_cast(aSupports), + "Uh, fix QI!"); + } +#endif + + return static_cast(aSupports); + } + private: nsresult GetPlugins(); PRBool AllowPlugins(); @@ -84,6 +103,25 @@ public: NS_DECL_ISUPPORTS NS_DECL_NSIDOMPLUGIN + nsIDOMMimeType* GetItemAt(PRUint32 aIndex, nsresult* aResult); + + static nsPluginElement* FromSupports(nsISupports* aSupports) + { +#ifdef DEBUG + { + nsCOMPtr plugin_qi = do_QueryInterface(aSupports); + + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsIDOMPlugin pointer as the nsISupports + // pointer. That must be fixed, or we'll crash... + NS_ASSERTION(plugin_qi == static_cast(aSupports), + "Uh, fix QI!"); + } +#endif + + return static_cast(aSupports); + } + private: nsresult GetMimeTypes(); diff --git a/dom/src/offline/nsDOMOfflineLoadStatusList.cpp b/dom/src/offline/nsDOMOfflineLoadStatusList.cpp deleted file mode 100644 index edc5c14070b..00000000000 --- a/dom/src/offline/nsDOMOfflineLoadStatusList.cpp +++ /dev/null @@ -1,577 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Mozilla Corporation - * Portions created by the Initial Developer are Copyright (C) 2007 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Dave Camp - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsDOMOfflineLoadStatusList.h" -#include "nsDOMClassInfo.h" -#include "nsIMutableArray.h" -#include "nsCPrefetchService.h" -#include "nsIObserverService.h" -#include "nsIJSContextStack.h" -#include "nsIScriptSecurityManager.h" -#include "nsIContent.h" -#include "nsNetCID.h" -#include "nsICacheService.h" -#include "nsICacheSession.h" -#include "nsIOfflineCacheUpdate.h" -#include "nsContentUtils.h" -#include "nsDOMError.h" -#include "nsNetUtil.h" -#include "nsAutoPtr.h" - -#define LOADREQUESTED_STR "loadrequested" -#define LOADCOMPLETED_STR "loadcompleted" - -// -// nsDOMOfflineLoadStatus -// - -// XXX -// -// nsDOMOfflineLoadStatusList has an array wrapper in its classinfo struct -// (LoadStatusList) that exposes nsDOMOfflineLoadStatusList::Item() as -// array items. -// -// For scripts to recognize these as nsIDOMLoadStatus objects, I needed -// to add a LoadStatus classinfo. -// -// Because the prefetch service is outside the dom module, it can't -// actually use the LoadStatus classinfo. -// -// nsDOMOfflineLoadStatus is just a simple wrapper around the -// nsIDOMLoadStatus objects returned by the prefetch service that adds the -// LoadStatus classinfo implementation. -// -// Is there a better way around this? - -class nsDOMOfflineLoadStatus : public nsIDOMLoadStatus -{ -public: - NS_DECL_ISUPPORTS - NS_DECL_NSIDOMLOADSTATUS - - nsDOMOfflineLoadStatus(nsIDOMLoadStatus *status); - virtual ~nsDOMOfflineLoadStatus(); - - const nsIDOMLoadStatus *Implementation() { return mStatus; } -private: - nsCOMPtr mStatus; -}; - -NS_INTERFACE_MAP_BEGIN(nsDOMOfflineLoadStatus) - NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMLoadStatus) - NS_INTERFACE_MAP_ENTRY(nsIDOMLoadStatus) - NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(LoadStatus) -NS_INTERFACE_MAP_END - -NS_IMPL_ADDREF(nsDOMOfflineLoadStatus) -NS_IMPL_RELEASE(nsDOMOfflineLoadStatus) - -nsDOMOfflineLoadStatus::nsDOMOfflineLoadStatus(nsIDOMLoadStatus *aStatus) - : mStatus(aStatus) -{ -} - -nsDOMOfflineLoadStatus::~nsDOMOfflineLoadStatus() -{ -} - -NS_IMETHODIMP -nsDOMOfflineLoadStatus::GetSource(nsIDOMNode **aSource) -{ - return mStatus->GetSource(aSource); -} - -NS_IMETHODIMP -nsDOMOfflineLoadStatus::GetUri(nsAString &aURI) -{ - return mStatus->GetUri(aURI); -} - -NS_IMETHODIMP -nsDOMOfflineLoadStatus::GetTotalSize(PRInt32 *aTotalSize) -{ - return mStatus->GetTotalSize(aTotalSize); -} - -NS_IMETHODIMP -nsDOMOfflineLoadStatus::GetLoadedSize(PRInt32 *aLoadedSize) -{ - return mStatus->GetLoadedSize(aLoadedSize); -} - -NS_IMETHODIMP -nsDOMOfflineLoadStatus::GetReadyState(PRUint16 *aReadyState) -{ - return mStatus->GetReadyState(aReadyState); -} - -NS_IMETHODIMP -nsDOMOfflineLoadStatus::GetStatus(PRUint16 *aStatus) -{ - return mStatus->GetStatus(aStatus); -} - -// -// nsDOMOfflineLoadStatusList -// - -NS_INTERFACE_MAP_BEGIN(nsDOMOfflineLoadStatusList) - NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMLoadStatusList) - NS_INTERFACE_MAP_ENTRY(nsIDOMLoadStatusList) - NS_INTERFACE_MAP_ENTRY(nsIDOMEventTarget) - NS_INTERFACE_MAP_ENTRY(nsIObserver) - NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) - NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(LoadStatusList) -NS_INTERFACE_MAP_END - -NS_IMPL_ADDREF(nsDOMOfflineLoadStatusList) -NS_IMPL_RELEASE(nsDOMOfflineLoadStatusList) - -nsDOMOfflineLoadStatusList::nsDOMOfflineLoadStatusList(nsIURI *aURI) - : mInitialized(PR_FALSE) - , mURI(aURI) -{ -} - -nsDOMOfflineLoadStatusList::~nsDOMOfflineLoadStatusList() -{ - mLoadRequestedEventListeners.Clear(); - mLoadCompletedEventListeners.Clear(); -} - -nsresult -nsDOMOfflineLoadStatusList::Init() -{ - if (mInitialized) { - return NS_OK; - } - - mInitialized = PR_TRUE; - - nsresult rv = mURI->GetHostPort(mHostPort); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr cacheUpdateService = - do_GetService(NS_OFFLINECACHEUPDATESERVICE_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, rv); - - PRUint32 numUpdates; - rv = cacheUpdateService->GetNumUpdates(&numUpdates); - NS_ENSURE_SUCCESS(rv, rv); - - for (PRUint32 i = 0; i < numUpdates; i++) { - nsCOMPtr cacheUpdate; - rv = cacheUpdateService->GetUpdate(i, getter_AddRefs(cacheUpdate)); - NS_ENSURE_SUCCESS(rv, rv); - - UpdateAdded(cacheUpdate); - NS_ENSURE_SUCCESS(rv, rv); - } - - // watch for new offline cache updates - nsCOMPtr observerServ = - do_GetService("@mozilla.org/observer-service;1", &rv); - NS_ENSURE_SUCCESS(rv, rv); - - rv = observerServ->AddObserver(this, "offline-cache-update-added", PR_TRUE); - NS_ENSURE_SUCCESS(rv, rv); - rv = observerServ->AddObserver(this, "offline-cache-update-completed", PR_TRUE); - NS_ENSURE_SUCCESS(rv, rv); - - return NS_OK; -} - -nsIDOMLoadStatus * -nsDOMOfflineLoadStatusList::FindWrapper(nsIDOMLoadStatus *aStatus, - PRUint32 *index) -{ - for (int i = 0; i < mItems.Count(); i++) { - nsDOMOfflineLoadStatus *item = static_cast - (mItems[i]); - if (item->Implementation() == aStatus) { - *index = i; - return mItems[i]; - } - } - - return nsnull; -} - -nsresult -nsDOMOfflineLoadStatusList::UpdateAdded(nsIOfflineCacheUpdate *aUpdate) -{ - nsCAutoString owner; - nsresult rv = aUpdate->GetUpdateDomain(owner); - NS_ENSURE_SUCCESS(rv, rv); - - if (owner != mHostPort) { - // This update doesn't belong to us - return NS_OK; - } - - PRUint32 numItems; - rv = aUpdate->GetCount(&numItems); - NS_ENSURE_SUCCESS(rv, rv); - - for (PRUint32 i = 0; i < numItems; i++) { - nsCOMPtr status; - rv = aUpdate->Item(i, getter_AddRefs(status)); - NS_ENSURE_SUCCESS(rv, rv); - - nsDOMOfflineLoadStatus *wrapper = new nsDOMOfflineLoadStatus(status); - if (!wrapper) return NS_ERROR_OUT_OF_MEMORY; - - mItems.AppendObject(wrapper); - - SendLoadEvent(NS_LITERAL_STRING(LOADREQUESTED_STR), - mLoadRequestedEventListeners, - wrapper); - } - - return NS_OK; -} - -nsresult -nsDOMOfflineLoadStatusList::UpdateCompleted(nsIOfflineCacheUpdate *aUpdate) -{ - nsCAutoString owner; - nsresult rv = aUpdate->GetUpdateDomain(owner); - NS_ENSURE_SUCCESS(rv, rv); - - if (owner != mHostPort) { - // This update doesn't belong to us - return NS_OK; - } - - PRUint32 numItems; - rv = aUpdate->GetCount(&numItems); - NS_ENSURE_SUCCESS(rv, rv); - - for (PRUint32 i = 0; i < numItems; i++) { - nsCOMPtr status; - rv = aUpdate->Item(i, getter_AddRefs(status)); - NS_ENSURE_SUCCESS(rv, rv); - - PRUint32 index; - nsCOMPtr wrapper = FindWrapper(status, &index); - if (wrapper) { - mItems.RemoveObjectAt(index); - nsresult rv = SendLoadEvent(NS_LITERAL_STRING(LOADCOMPLETED_STR), - mLoadCompletedEventListeners, - wrapper); - NS_ENSURE_SUCCESS(rv, rv); - } - } - - return NS_OK; -} - - -// -// nsDOMOfflineLoadStatusList::nsIDOMLoadStatusList -// - -NS_IMETHODIMP -nsDOMOfflineLoadStatusList::GetLength(PRUint32 *aLength) -{ - nsresult rv = Init(); - NS_ENSURE_SUCCESS(rv, rv); - - *aLength = mItems.Count(); - return NS_OK; -} - -NS_IMETHODIMP -nsDOMOfflineLoadStatusList::Item(PRUint32 aItem, nsIDOMLoadStatus **aStatus) -{ - nsresult rv = Init(); - NS_ENSURE_SUCCESS(rv, rv); - - if ((PRInt32)aItem >= mItems.Count()) return NS_ERROR_DOM_INDEX_SIZE_ERR; - - NS_ADDREF(*aStatus = mItems[aItem]); - - return NS_OK; -} - -// -// nsDOMOfflineLoadStatusList::nsIDOMEventTarget -// - -static nsIScriptContext * -GetCurrentContext() -{ - // Get JSContext from stack. - nsCOMPtr stack = - do_GetService("@mozilla.org/js/xpc/ContextStack;1"); - - if (!stack) { - return nsnull; - } - - JSContext *cx; - - if (NS_FAILED(stack->Peek(&cx)) || !cx) { - return nsnull; - } - - return GetScriptContextFromJSContext(cx); -} - -NS_IMETHODIMP -nsDOMOfflineLoadStatusList::AddEventListener(const nsAString& aType, - nsIDOMEventListener *aListener, - PRBool aUseCapture) -{ - nsresult rv = Init(); - NS_ENSURE_SUCCESS(rv, rv); - - NS_ENSURE_ARG(aListener); - - nsCOMArray *array; - -#define IMPL_ADD_LISTENER(_type, _member) \ - if (aType.EqualsLiteral(_type)) { \ - array = &(_member); \ - } else - - IMPL_ADD_LISTENER(LOADREQUESTED_STR, mLoadRequestedEventListeners) - IMPL_ADD_LISTENER(LOADCOMPLETED_STR, mLoadCompletedEventListeners) - { - return NS_ERROR_INVALID_ARG; - } - - array->AppendObject(aListener); - mScriptContext = GetCurrentContext(); -#undef IMPL_ADD_LISTENER - - return NS_OK; -} - -NS_IMETHODIMP -nsDOMOfflineLoadStatusList::RemoveEventListener(const nsAString &aType, - nsIDOMEventListener *aListener, - PRBool aUseCapture) -{ - nsresult rv = Init(); - NS_ENSURE_SUCCESS(rv, rv); - - NS_ENSURE_ARG(aListener); - - nsCOMArray *array; - -#define IMPL_REMOVE_LISTENER(_type, _member) \ - if (aType.EqualsLiteral(_type)) { \ - array = &(_member); \ - } else - - IMPL_REMOVE_LISTENER(LOADREQUESTED_STR, mLoadRequestedEventListeners) - IMPL_REMOVE_LISTENER(LOADCOMPLETED_STR, mLoadCompletedEventListeners) - { - return NS_ERROR_INVALID_ARG; - } - - // Allow a caller to remove O(N^2) behavior by removing end-to-start. - for (PRUint32 i = array->Count() - 1; i != PRUint32(-1); --i) { - if (array->ObjectAt(i) == aListener) { - array->RemoveObjectAt(i); - break; - } - } - -#undef IMPL_ADD_LISTENER - - return NS_OK; -} - -NS_IMETHODIMP -nsDOMOfflineLoadStatusList::DispatchEvent(nsIDOMEvent *evt, PRBool *_retval) -{ - // Ignored - - return NS_OK; -} - -void -nsDOMOfflineLoadStatusList::NotifyEventListeners(const nsCOMArray& aListeners, - nsIDOMEvent* aEvent) -{ - // XXXbz wouldn't it be easier to just have an actual nsEventListenerManager - // to work with or something? I feel like we're duplicating code here... - // - // (and this was duplicated from XMLHttpRequest) - if (!aEvent) - return; - - nsCOMPtr stack; - JSContext *cx = nsnull; - - if (mScriptContext) { - stack = do_GetService("@mozilla.org/js/xpc/ContextStack;1"); - - if (stack) { - cx = (JSContext *)mScriptContext->GetNativeContext(); - - if (cx) { - stack->Push(cx); - } - } - } - - PRInt32 count = aListeners.Count(); - for (PRInt32 index = 0; index < count; ++index) { - nsIDOMEventListener* listener = aListeners[index]; - - if (listener) { - listener->HandleEvent(aEvent); - } - } - - if (cx) { - stack->Pop(&cx); - } -} - -nsresult -nsDOMOfflineLoadStatusList::SendLoadEvent(const nsAString &aEventName, - const nsCOMArray &aListeners, - nsIDOMLoadStatus *aStatus) -{ - NS_ENSURE_ARG(aStatus); - - if (aListeners.Count() == 0) return NS_OK; - - nsRefPtr event = new nsDOMLoadStatusEvent(aEventName, - aStatus); - if (!event) return NS_ERROR_OUT_OF_MEMORY; - - nsresult rv = event->Init(); - NS_ENSURE_SUCCESS(rv, rv); - - NotifyEventListeners(aListeners, - static_cast(event)); - - return NS_OK; -} - -// -// nsDOMLoadStatusList::nsIObserver -// -NS_IMETHODIMP -nsDOMOfflineLoadStatusList::Observe(nsISupports *aSubject, - const char *aTopic, - const PRUnichar *aData) -{ - if (!strcmp(aTopic, "offline-cache-update-added")) { - nsCOMPtr update = do_QueryInterface(aSubject); - if (update) { - UpdateAdded(update); - } - } else if (!strcmp(aTopic, "offline-cache-update-completed")) { - nsCOMPtr update = do_QueryInterface(aSubject); - if (update) { - UpdateCompleted(update); - } - } - - return NS_OK; -} - -// -// nsDOMLoadStatusEvent -// - -NS_INTERFACE_MAP_BEGIN(nsDOMLoadStatusEvent) - NS_INTERFACE_MAP_ENTRY(nsIDOMLoadStatusEvent) - NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(LoadStatusEvent) -NS_INTERFACE_MAP_END_INHERITING(nsDOMEvent) - -NS_IMPL_ADDREF_INHERITED(nsDOMLoadStatusEvent, nsDOMEvent) -NS_IMPL_RELEASE_INHERITED(nsDOMLoadStatusEvent, nsDOMEvent) - -nsresult -nsDOMLoadStatusEvent::Init() -{ - nsresult rv = InitEvent(mEventName, PR_TRUE, PR_FALSE); - NS_ENSURE_SUCCESS(rv, rv); - - // This init method is only called by native code, so set the - // trusted flag there. - SetTrusted(PR_TRUE); - - return NS_OK; -} - -NS_IMETHODIMP -nsDOMLoadStatusEvent::InitLoadStatusEvent(const nsAString& aTypeArg, - PRBool aCanBubbleArg, - PRBool aCancelableArg, - nsIDOMLoadStatus* aStatusArg) -{ - nsresult rv = InitEvent(aTypeArg, aCanBubbleArg, aCancelableArg); - NS_ENSURE_SUCCESS(rv, rv); - - mStatus = aStatusArg; - - return NS_OK; -} - - -NS_IMETHODIMP -nsDOMLoadStatusEvent::InitLoadStatusEventNS(const nsAString& aNamespaceURIArg, - const nsAString& aTypeArg, - PRBool aCanBubbleArg, - PRBool aCancelableArg, - nsIDOMLoadStatus* aStatusArg) -{ - // XXX: Figure out what to do with aNamespaceURIArg here! - nsresult rv = InitEvent(aTypeArg, aCanBubbleArg, aCancelableArg); - NS_ENSURE_SUCCESS(rv, rv); - - mStatus = aStatusArg; - - return NS_OK; -} - -NS_IMETHODIMP -nsDOMLoadStatusEvent::GetStatus(nsIDOMLoadStatus **aStatus) -{ - NS_ADDREF(*aStatus = mStatus); - - return NS_OK; -} diff --git a/layout/style/Makefile.in b/layout/style/Makefile.in index a3849994036..30b480b0d35 100644 --- a/layout/style/Makefile.in +++ b/layout/style/Makefile.in @@ -102,6 +102,7 @@ EXPORTS = \ nsICSSParser.h \ nsICSSPseudoComparator.h \ nsICSSRule.h \ + nsICSSRuleList.h \ nsICSSStyleRule.h \ nsICSSStyleRuleDOMWrapper.h \ nsICSSStyleSheet.h \ diff --git a/layout/style/nsCSSRules.cpp b/layout/style/nsCSSRules.cpp index a952423d1f5..a8045e99b21 100644 --- a/layout/style/nsCSSRules.cpp +++ b/layout/style/nsCSSRules.cpp @@ -61,7 +61,7 @@ #include "nsIDOMCSSStyleDeclaration.h" #include "nsIMediaList.h" #include "nsIDOMMediaList.h" -#include "nsIDOMCSSRuleList.h" +#include "nsICSSRuleList.h" #include "nsIDOMStyleSheet.h" #include "nsIDocument.h" #include "nsPresContext.h" @@ -76,19 +76,18 @@ NS_IMETHODIMP _class::GetStyleSheet(nsIStyleSheet*& aSheet) const { return super::GetStyleSheet(aSheet); } \ NS_IMETHODIMP _class::SetStyleSheet(nsICSSStyleSheet* aSheet) { return super::SetStyleSheet(aSheet); } \ NS_IMETHODIMP _class::SetParentRule(nsICSSGroupRule* aRule) { return super::SetParentRule(aRule); } \ -NS_IMETHODIMP _class::GetDOMRule(nsIDOMCSSRule** aDOMRule) { return CallQueryInterface(this, aDOMRule); } \ +nsIDOMCSSRule* _class::GetDOMRuleWeak(nsresult *aResult) { *aResult = NS_OK; return this; } \ NS_IMETHODIMP _class::MapRuleInfoInto(nsRuleData* aRuleData) { return NS_OK; } #define IMPL_STYLE_RULE_INHERIT2(_class, super) \ NS_IMETHODIMP _class::GetStyleSheet(nsIStyleSheet*& aSheet) const { return super::GetStyleSheet(aSheet); } \ NS_IMETHODIMP _class::SetParentRule(nsICSSGroupRule* aRule) { return super::SetParentRule(aRule); } \ -NS_IMETHODIMP _class::GetDOMRule(nsIDOMCSSRule** aDOMRule) { return CallQueryInterface(this, aDOMRule); } \ NS_IMETHODIMP _class::MapRuleInfoInto(nsRuleData* aRuleData) { return NS_OK; } // ------------------------------- // Style Rule List for group rules // -class CSSGroupRuleRuleListImpl : public nsIDOMCSSRuleList +class CSSGroupRuleRuleListImpl : public nsICSSRuleList { public: CSSGroupRuleRuleListImpl(nsICSSGroupRule *aGroupRule); @@ -97,6 +96,8 @@ public: NS_DECL_NSIDOMCSSRULELIST + virtual nsIDOMCSSRule* GetItemAt(PRUint32 aIndex, nsresult* aResult); + void DropReference() { mGroupRule = nsnull; } protected: @@ -119,6 +120,7 @@ CSSGroupRuleRuleListImpl::~CSSGroupRuleRuleListImpl() // QueryInterface implementation for CSSGroupRuleRuleList NS_INTERFACE_MAP_BEGIN(CSSGroupRuleRuleListImpl) + NS_INTERFACE_MAP_ENTRY(nsICSSRuleList) NS_INTERFACE_MAP_ENTRY(nsIDOMCSSRuleList) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(CSSGroupRuleRuleList) @@ -142,24 +144,39 @@ CSSGroupRuleRuleListImpl::GetLength(PRUint32* aLength) return NS_OK; } -NS_IMETHODIMP -CSSGroupRuleRuleListImpl::Item(PRUint32 aIndex, nsIDOMCSSRule** aReturn) +nsIDOMCSSRule* +CSSGroupRuleRuleListImpl::GetItemAt(PRUint32 aIndex, nsresult* aResult) { nsresult result = NS_OK; - *aReturn = nsnull; if (mGroupRule) { nsCOMPtr rule; result = mGroupRule->GetStyleRuleAt(aIndex, *getter_AddRefs(rule)); if (rule) { - result = rule->GetDOMRule(aReturn); - } else if (result == NS_ERROR_ILLEGAL_VALUE) { + return rule->GetDOMRuleWeak(aResult); + } + if (result == NS_ERROR_ILLEGAL_VALUE) { result = NS_OK; // per spec: "Return Value ... null if ... not a valid index." } } - - return result; + + *aResult = result; + + return nsnull; +} + +NS_IMETHODIMP +CSSGroupRuleRuleListImpl::Item(PRUint32 aIndex, nsIDOMCSSRule** aReturn) +{ + nsresult rv; + nsIDOMCSSRule* rule = GetItemAt(aIndex, &rv); + if (!rule) { + *aReturn = nsnull; + return rv; + } + + return CallQueryInterface(rule, aReturn); } // ------------------------------------------- diff --git a/layout/style/nsCSSRules.h b/layout/style/nsCSSRules.h index 53c88c64752..b340c929b28 100644 --- a/layout/style/nsCSSRules.h +++ b/layout/style/nsCSSRules.h @@ -56,13 +56,16 @@ class CSSGroupRuleRuleListImpl; class nsMediaList; -#define DECL_STYLE_RULE_INHERIT \ +#define DECL_STYLE_RULE_INHERIT_NO_DOMRULE \ NS_IMETHOD GetStyleSheet(nsIStyleSheet*& aSheet) const; \ NS_IMETHOD SetStyleSheet(nsICSSStyleSheet* aSheet); \ NS_IMETHOD SetParentRule(nsICSSGroupRule* aRule); \ -NS_IMETHOD GetDOMRule(nsIDOMCSSRule** aDOMRule); \ NS_IMETHOD MapRuleInfoInto(nsRuleData* aRuleData); +#define DECL_STYLE_RULE_INHERIT \ +DECL_STYLE_RULE_INHERIT_NO_DOMRULE \ +nsIDOMCSSRule* GetDOMRuleWeak(nsresult* aResult); + // inherits from nsCSSRule and also implements methods on nsICSSGroupRule // so they can be shared between nsCSSMediaRule and nsCSSDocumentRule class nsCSSGroupRule : public nsCSSRule, public nsICSSGroupRule @@ -73,7 +76,7 @@ protected: ~nsCSSGroupRule(); // implement part of nsIStyleRule and nsICSSRule - DECL_STYLE_RULE_INHERIT + DECL_STYLE_RULE_INHERIT_NO_DOMRULE // to help implement nsIStyleRule #ifdef DEBUG @@ -128,6 +131,11 @@ public: NS_IMETHOD SetStyleSheet(nsICSSStyleSheet* aSheet); //override nsCSSGroupRule NS_IMETHOD GetType(PRInt32& aType) const; NS_IMETHOD Clone(nsICSSRule*& aClone) const; + nsIDOMCSSRule* GetDOMRuleWeak(nsresult *aResult) + { + *aResult = NS_OK; + return this; + } // nsIDOMCSSRule interface NS_DECL_NSIDOMCSSRULE @@ -164,6 +172,11 @@ public: // nsICSSRule methods NS_IMETHOD GetType(PRInt32& aType) const; NS_IMETHOD Clone(nsICSSRule*& aClone) const; + nsIDOMCSSRule* GetDOMRuleWeak(nsresult *aResult) + { + *aResult = NS_OK; + return this; + } // nsIDOMCSSRule interface NS_DECL_NSIDOMCSSRULE diff --git a/layout/style/nsCSSStyleRule.cpp b/layout/style/nsCSSStyleRule.cpp index e185f17db30..f1632c6ddfa 100644 --- a/layout/style/nsCSSStyleRule.cpp +++ b/layout/style/nsCSSStyleRule.cpp @@ -1187,7 +1187,7 @@ public: NS_IMETHOD GetType(PRInt32& aType) const; NS_IMETHOD Clone(nsICSSRule*& aClone) const; - NS_IMETHOD GetDOMRule(nsIDOMCSSRule** aDOMRule); + nsIDOMCSSRule* GetDOMRuleWeak(nsresult* aResult); virtual already_AddRefed DeclarationChanged(PRBool aHandleContainer); @@ -1376,26 +1376,24 @@ CSSStyleRuleImpl::Clone(nsICSSRule*& aClone) const return CallQueryInterface(clone, &aClone); } -NS_IMETHODIMP -CSSStyleRuleImpl::GetDOMRule(nsIDOMCSSRule** aDOMRule) +nsIDOMCSSRule* +CSSStyleRuleImpl::GetDOMRuleWeak(nsresult *aResult) { + *aResult = NS_OK; if (!mSheet) { // inline style rules aren't supposed to have a DOM rule object, only // a declaration. - *aDOMRule = nsnull; - return NS_OK; + return nsnull; } if (!mDOMRule) { mDOMRule = new DOMCSSStyleRuleImpl(this); if (!mDOMRule) { - *aDOMRule = nsnull; - return NS_ERROR_OUT_OF_MEMORY; + *aResult = NS_ERROR_OUT_OF_MEMORY; + return nsnull; } NS_ADDREF(mDOMRule); } - *aDOMRule = mDOMRule; - NS_ADDREF(*aDOMRule); - return NS_OK; + return mDOMRule; } /* virtual */ already_AddRefed diff --git a/layout/style/nsCSSStyleSheet.cpp b/layout/style/nsCSSStyleSheet.cpp index e39b95f79a7..c35b42cabb4 100644 --- a/layout/style/nsCSSStyleSheet.cpp +++ b/layout/style/nsCSSStyleSheet.cpp @@ -61,7 +61,7 @@ #include "nsIDOMCSSStyleSheet.h" #include "nsIDOMCSSRule.h" #include "nsIDOMCSSImportRule.h" -#include "nsIDOMCSSRuleList.h" +#include "nsICSSRuleList.h" #include "nsIDOMMediaList.h" #include "nsIDOMNode.h" #include "nsDOMError.h" @@ -81,7 +81,7 @@ // ------------------------------- // Style Rule List for the DOM // -class CSSRuleListImpl : public nsIDOMCSSRuleList +class CSSRuleListImpl : public nsICSSRuleList { public: CSSRuleListImpl(nsCSSStyleSheet *aStyleSheet); @@ -92,6 +92,8 @@ public: NS_IMETHOD GetLength(PRUint32* aLength); NS_IMETHOD Item(PRUint32 aIndex, nsIDOMCSSRule** aReturn); + virtual nsIDOMCSSRule* GetItemAt(PRUint32 aIndex, nsresult* aResult); + void DropReference() { mStyleSheet = nsnull; } protected: @@ -116,6 +118,7 @@ CSSRuleListImpl::~CSSRuleListImpl() // QueryInterface implementation for CSSRuleList NS_INTERFACE_MAP_BEGIN(CSSRuleListImpl) + NS_INTERFACE_MAP_ENTRY(nsICSSRuleList) NS_INTERFACE_MAP_ENTRY(nsIDOMCSSRuleList) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(CSSRuleList) @@ -141,12 +144,11 @@ CSSRuleListImpl::GetLength(PRUint32* aLength) return NS_OK; } -NS_IMETHODIMP -CSSRuleListImpl::Item(PRUint32 aIndex, nsIDOMCSSRule** aReturn) +nsIDOMCSSRule* +CSSRuleListImpl::GetItemAt(PRUint32 aIndex, nsresult* aResult) { nsresult result = NS_OK; - *aReturn = nsnull; if (mStyleSheet) { result = mStyleSheet->EnsureUniqueInner(); // needed to ensure rules have correct parent if (NS_SUCCEEDED(result)) { @@ -154,15 +156,31 @@ CSSRuleListImpl::Item(PRUint32 aIndex, nsIDOMCSSRule** aReturn) result = mStyleSheet->GetStyleRuleAt(aIndex, *getter_AddRefs(rule)); if (rule) { - result = rule->GetDOMRule(aReturn); mRulesAccessed = PR_TRUE; // signal to never share rules again - } else if (result == NS_ERROR_ILLEGAL_VALUE) { + return rule->GetDOMRuleWeak(aResult); + } + if (result == NS_ERROR_ILLEGAL_VALUE) { result = NS_OK; // per spec: "Return Value ... null if ... not a valid index." } } } - - return result; + + *aResult = result; + return nsnull; +} + +NS_IMETHODIMP +CSSRuleListImpl::Item(PRUint32 aIndex, nsIDOMCSSRule** aReturn) +{ + nsresult rv; + nsIDOMCSSRule* rule = GetItemAt(aIndex, &rv); + if (!rule) { + *aReturn = nsnull; + + return rv; + } + + return CallQueryInterface(rule, aReturn); } template diff --git a/layout/style/nsDOMCSSValueList.cpp b/layout/style/nsDOMCSSValueList.cpp index cec738357d6..24982fc6584 100644 --- a/layout/style/nsDOMCSSValueList.cpp +++ b/layout/style/nsDOMCSSValueList.cpp @@ -84,8 +84,7 @@ nsDOMCSSValueList::Item(PRUint32 aIndex, nsIDOMCSSValue **aReturn) { NS_ENSURE_ARG_POINTER(aReturn); - *aReturn = mCSSValues[aIndex]; - NS_IF_ADDREF(*aReturn); + NS_IF_ADDREF(*aReturn = GetItemAt(aIndex)); return NS_OK; } diff --git a/layout/style/nsDOMCSSValueList.h b/layout/style/nsDOMCSSValueList.h index a1935768ec3..96abb612515 100644 --- a/layout/style/nsDOMCSSValueList.h +++ b/layout/style/nsDOMCSSValueList.h @@ -68,6 +68,28 @@ public: */ PRBool AppendCSSValue(nsIDOMCSSValue* aValue); + nsIDOMCSSValue* GetItemAt(PRUint32 aIndex) + { + return mCSSValues.SafeObjectAt(aIndex); + } + + static nsDOMCSSValueList* FromSupports(nsISupports* aSupports) + { +#ifdef DEBUG + { + nsCOMPtr list_qi = do_QueryInterface(aSupports); + + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsIDOMCSSValueList pointer as the nsISupports + // pointer. That must be fixed, or we'll crash... + NS_ASSERTION(list_qi == static_cast(aSupports), + "Uh, fix QI!"); + } +#endif + + return static_cast(aSupports); + } + private: PRPackedBool mCommaDelimited; // some value lists use a comma // as the delimiter, some just use diff --git a/layout/style/nsICSSRule.h b/layout/style/nsICSSRule.h index ad4b84bc9bf..c57926d6a97 100644 --- a/layout/style/nsICSSRule.h +++ b/layout/style/nsICSSRule.h @@ -41,15 +41,15 @@ #define nsICSSRule_h___ #include "nsIStyleRule.h" +#include "nsIDOMCSSRule.h" class nsICSSStyleSheet; class nsICSSGroupRule; -class nsIDOMCSSRule; class nsAString; -// IID for the nsICSSRule interface {b9791e20-1a04-11d3-805a-006008159b5a} +// IID for the nsICSSRule interface {e775eac0-b022-462c-b1f9-221c01aa2988} #define NS_ICSS_RULE_IID \ -{0xb9791e20, 0x1a04, 0x11d3, {0x80, 0x5a, 0x00, 0x60, 0x08, 0x15, 0x9b, 0x5a}} +{0xe775eac0, 0xb022, 0x462c, {0xb1, 0xf9, 0x22, 0x1c, 0x01, 0xaa, 0x29, 0x88}} // inheriting from nsIStyleRule is only for style rules, not other rule types class nsICSSRule : public nsIStyleRule { @@ -77,7 +77,13 @@ public: // Note that this returns null for inline style rules since they aren't // supposed to have a DOM rule representation (and our code wouldn't work). - NS_IMETHOD GetDOMRule(nsIDOMCSSRule** aDOMRule) = 0; + nsresult GetDOMRule(nsIDOMCSSRule** aDOMRule) + { + nsresult rv; + NS_IF_ADDREF(*aDOMRule = GetDOMRuleWeak(&rv)); + return rv; + } + virtual nsIDOMCSSRule* GetDOMRuleWeak(nsresult* aResult) = 0; }; NS_DEFINE_STATIC_IID_ACCESSOR(nsICSSRule, NS_ICSS_RULE_IID) diff --git a/dom/public/idl/offline/nsIDOMLoadStatusList.idl b/layout/style/nsICSSRuleList.h similarity index 66% rename from dom/public/idl/offline/nsIDOMLoadStatusList.idl rename to layout/style/nsICSSRuleList.h index bc1bd9820f6..a9223d8b324 100644 --- a/dom/public/idl/offline/nsIDOMLoadStatusList.idl +++ b/layout/style/nsICSSRuleList.h @@ -1,4 +1,4 @@ -/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * @@ -12,15 +12,14 @@ * for the specific language governing rights and limitations under the * License. * - * The Original Code is mozilla.org code. + * The Original Code is Mozilla layout code. * - * The Initial Developer of the Original Code is - * Mozilla Corporation - * Portions created by the Initial Developer are Copyright (C) 2007 + * The Initial Developer of the Original Code is Mozilla Corporation. + * Portions created by the Initial Developer are Copyright (C) 2008 * the Initial Developer. All Rights Reserved. * * Contributor(s): - * Dave Camp + * Peter Van der Beken (Original Author) * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -36,13 +35,24 @@ * * ***** END LICENSE BLOCK ***** */ -#include "domstubs.idl" +#ifndef nsICSSRuleList_h___ +#define nsICSSRuleList_h___ -interface nsIDOMLoadStatus; +#include "nsIDOMCSSRuleList.h" -[scriptable, uuid(d58bc0cf-e35c-4d22-9e21-9ada8fc4203a)] -interface nsIDOMLoadStatusList : nsISupports +// IID for the nsICSSRuleList interface +#define NS_ICSSRULELIST_IID \ +{ 0x7ae746fd, 0x259a, 0x4a69, \ + { 0x97, 0x2d, 0x2c, 0x10, 0xf7, 0xb0, 0x04, 0xa1 } } + +class nsICSSRuleList : public nsIDOMCSSRuleList { - readonly attribute unsigned long length; - nsIDOMLoadStatus item(in unsigned long index); +public: + NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICSSRULELIST_IID) + + virtual nsIDOMCSSRule* GetItemAt(PRUint32 aIndex, nsresult* aResult) = 0; }; + +NS_DEFINE_STATIC_IID_ACCESSOR(nsICSSRuleList, NS_ICSSRULELIST_IID) + +#endif /* nsICSSRuleList_h___ */ diff --git a/layout/xul/base/src/tree/src/nsTreeColumns.cpp b/layout/xul/base/src/tree/src/nsTreeColumns.cpp index de5ad229afe..b70bafc87a7 100644 --- a/layout/xul/base/src/tree/src/nsTreeColumns.cpp +++ b/layout/xul/base/src/tree/src/nsTreeColumns.cpp @@ -535,17 +535,23 @@ nsTreeColumns::GetNamedColumn(const nsAString& aId, nsITreeColumn** _retval) return NS_OK; } +nsITreeColumn* +nsTreeColumns::GetColumnAt(PRInt32 aIndex) +{ + EnsureColumns(); + for (nsTreeColumn* currCol = mFirstColumn; currCol; currCol = currCol->GetNext()) { + if (currCol->GetIndex() == aIndex) { + return currCol; + } + } + return nsnull; +} + NS_IMETHODIMP nsTreeColumns::GetColumnAt(PRInt32 aIndex, nsITreeColumn** _retval) { EnsureColumns(); - *_retval = nsnull; - for (nsTreeColumn* currCol = mFirstColumn; currCol; currCol = currCol->GetNext()) { - if (currCol->GetIndex() == aIndex) { - NS_ADDREF(*_retval = currCol); - break; - } - } + NS_IF_ADDREF(*_retval = GetColumnAt(aIndex)); return NS_OK; } diff --git a/layout/xul/base/src/tree/src/nsTreeColumns.h b/layout/xul/base/src/tree/src/nsTreeColumns.h index 8d29df8bc66..4794e748346 100644 --- a/layout/xul/base/src/tree/src/nsTreeColumns.h +++ b/layout/xul/base/src/tree/src/nsTreeColumns.h @@ -144,6 +144,25 @@ public: NS_DECL_ISUPPORTS NS_DECL_NSITREECOLUMNS + nsITreeColumn* GetColumnAt(PRInt32 aIndex); + + static nsTreeColumns* FromSupports(nsISupports* aSupports) + { +#ifdef DEBUG + { + nsCOMPtr columns_qi = do_QueryInterface(aSupports); + + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsITreeColumns pointer as the nsISupports + // pointer. That must be fixed, or we'll crash... + NS_ASSERTION(columns_qi == static_cast(aSupports), + "Uh, fix QI!"); + } +#endif + + return static_cast(aSupports); + } + friend class nsTreeBodyFrame; protected: void SetTree(nsITreeBoxObject* aTree) { mTree = aTree; }