diff --git a/editor/libeditor/base/EditAggregateTxn.cpp b/editor/libeditor/base/EditAggregateTxn.cpp index a8433f39ea79..4561774baf1b 100644 --- a/editor/libeditor/base/EditAggregateTxn.cpp +++ b/editor/libeditor/base/EditAggregateTxn.cpp @@ -41,26 +41,18 @@ EditAggregateTxn::EditAggregateTxn() : EditTxn() { - nsresult res = NS_NewISupportsArray(getter_AddRefs(mChildren)); - NS_POSTCONDITION(NS_SUCCEEDED(res), "EditAggregateTxn failed in constructor"); } NS_IMETHODIMP EditAggregateTxn::DoTransaction(void) { nsresult result=NS_OK; // it's legal (but not very useful) to have an empty child list - if (mChildren) + for (PRUint32 i = 0, length = mChildren.Length(); i < length; ++i) { - PRInt32 i; - PRUint32 count; - mChildren->Count(&count); - for (i=0; i<((PRInt32)count); i++) - { - nsCOMPtr txn (do_QueryElementAt(mChildren, i)); - if (!txn) { return NS_ERROR_NULL_POINTER; } - result = txn->DoTransaction(); - if (NS_FAILED(result)) - break; - } + nsITransaction *txn = mChildren[i]; + if (!txn) { return NS_ERROR_NULL_POINTER; } + result = txn->DoTransaction(); + if (NS_FAILED(result)) + break; } return result; } @@ -68,20 +60,14 @@ NS_IMETHODIMP EditAggregateTxn::DoTransaction(void) NS_IMETHODIMP EditAggregateTxn::UndoTransaction(void) { nsresult result=NS_OK; // it's legal (but not very useful) to have an empty child list - if (mChildren) + // undo goes through children backwards + for (PRUint32 i = mChildren.Length(); i-- != 0; ) { - PRInt32 i; - PRUint32 count; - mChildren->Count(&count); - // undo goes through children backwards - for (i=count-1; i>=0; i--) - { - nsCOMPtr txn (do_QueryElementAt(mChildren, i)); - if (!txn) { return NS_ERROR_NULL_POINTER; } - result = txn->UndoTransaction(); - if (NS_FAILED(result)) - break; - } + nsITransaction *txn = mChildren[i]; + if (!txn) { return NS_ERROR_NULL_POINTER; } + result = txn->UndoTransaction(); + if (NS_FAILED(result)) + break; } return result; } @@ -89,19 +75,13 @@ NS_IMETHODIMP EditAggregateTxn::UndoTransaction(void) NS_IMETHODIMP EditAggregateTxn::RedoTransaction(void) { nsresult result=NS_OK; // it's legal (but not very useful) to have an empty child list - if (mChildren) + for (PRUint32 i = 0, length = mChildren.Length(); i < length; ++i) { - PRInt32 i; - PRUint32 count; - mChildren->Count(&count); - for (i=0; i<((PRInt32)count); i++) - { - nsCOMPtr txn (do_QueryElementAt(mChildren, i)); - if (!txn) { return NS_ERROR_NULL_POINTER; } - result = txn->RedoTransaction(); - if (NS_FAILED(result)) - break; - } + nsITransaction *txn = mChildren[i]; + if (!txn) { return NS_ERROR_NULL_POINTER; } + result = txn->RedoTransaction(); + if (NS_FAILED(result)) + break; } return result; } @@ -111,18 +91,13 @@ NS_IMETHODIMP EditAggregateTxn::Merge(nsITransaction *aTransaction, PRBool *aDid nsresult result=NS_OK; // it's legal (but not very useful) to have an empty child list if (aDidMerge) *aDidMerge = PR_FALSE; - if (mChildren) + // FIXME: Is this really intended not to loop? It looks like the code + // that used to be here sort of intended to loop, but didn't. + if (mChildren.Length() > 0) { - PRInt32 i=0; - PRUint32 count; - mChildren->Count(&count); - NS_ASSERTION(count>0, "bad count"); - if (0 txn (do_QueryElementAt(mChildren, i)); - if (!txn) { return NS_ERROR_NULL_POINTER; } - result = txn->Merge(aTransaction, aDidMerge); - } + nsITransaction *txn = mChildren[0]; + if (!txn) { return NS_ERROR_NULL_POINTER; } + result = txn->Merge(aTransaction, aDidMerge); } return result; } @@ -143,15 +118,17 @@ NS_IMETHODIMP EditAggregateTxn::GetTxnDescription(nsAString& aString) NS_IMETHODIMP EditAggregateTxn::AppendChild(EditTxn *aTxn) { - if (mChildren && aTxn) - { - // aaahhhh! broken interfaces drive me crazy!!! - nsCOMPtr isupports; - aTxn->QueryInterface(NS_GET_IID(nsISupports), getter_AddRefs(isupports)); - mChildren->AppendElement(isupports); - return NS_OK; + if (!aTxn) { + return NS_ERROR_NULL_POINTER; } - return NS_ERROR_NULL_POINTER; + + nsRefPtr *slot = mChildren.AppendElement(); + if (!slot) { + return NS_ERROR_OUT_OF_MEMORY; + } + + *slot = aTxn; + return NS_OK; } NS_IMETHODIMP EditAggregateTxn::GetCount(PRUint32 *aCount) @@ -159,10 +136,7 @@ NS_IMETHODIMP EditAggregateTxn::GetCount(PRUint32 *aCount) if (!aCount) { return NS_ERROR_NULL_POINTER; } - *aCount=0; - if (mChildren) { - mChildren->Count(aCount); - } + *aCount = mChildren.Length(); return NS_OK; } @@ -170,26 +144,21 @@ NS_IMETHODIMP EditAggregateTxn::GetTxnAt(PRInt32 aIndex, EditTxn **aTxn) { // preconditions NS_PRECONDITION(aTxn, "null out param"); - NS_PRECONDITION(mChildren, "bad internal state"); if (!aTxn) { return NS_ERROR_NULL_POINTER; } *aTxn = nsnull; // initialize out param as soon as we know it's a valid pointer - if (!mChildren) { - return NS_ERROR_UNEXPECTED; - } - // get the transaction at aIndex - PRUint32 txnCount; - mChildren->Count(&txnCount); + PRUint32 txnCount = mChildren.Length(); if (0>aIndex || ((PRInt32)txnCount)<=aIndex) { return NS_ERROR_UNEXPECTED; } // ugh, this is all wrong - what a mess we have with editor transaction interfaces - mChildren->QueryElementAt(aIndex, EditTxn::GetCID(), (void**)aTxn); + *aTxn = mChildren[aIndex]; if (!*aTxn) return NS_ERROR_UNEXPECTED; + NS_ADDREF(*aTxn); return NS_OK; } diff --git a/editor/libeditor/base/EditAggregateTxn.h b/editor/libeditor/base/EditAggregateTxn.h index db404c5b2227..f12b2caa391c 100644 --- a/editor/libeditor/base/EditAggregateTxn.h +++ b/editor/libeditor/base/EditAggregateTxn.h @@ -41,7 +41,8 @@ #include "EditTxn.h" #include "nsIAtom.h" #include "nsCOMPtr.h" -#include "nsISupportsArray.h" +#include "nsTArray.h" +#include "nsAutoPtr.h" #define EDIT_AGGREGATE_TXN_CID \ {/* 345921a0-ac49-11d2-86d8-000064657374 */ \ @@ -88,7 +89,7 @@ public: protected: - nsCOMPtr mChildren; + nsTArray< nsRefPtr > mChildren; nsCOMPtr mName; };