nsresult nsDocShellBackwardsEnumerator::BuildArrayRecursive(nsIDocShellTreeItem* inItem, nsTArray<nsIDocShellTreeItem*>& inItemArray) { nsresult rv; nsCOMPtr<nsIDocShellTreeNode> itemAsNode = do_QueryInterface(inItem, &rv); if (NS_FAILED(rv)) return rv; PRInt32 numChildren; rv = itemAsNode->GetChildCount(&numChildren); if (NS_FAILED(rv)) return rv; for (PRInt32 i = numChildren - 1; i >= 0; --i) { nsCOMPtr<nsIDocShellTreeItem> curChild; rv = itemAsNode->GetChildAt(i, getter_AddRefs(curChild)); if (NS_FAILED(rv)) return rv; rv = BuildArrayRecursive(curChild, inItemArray); if (NS_FAILED(rv)) return rv; } PRInt32 itemType; // add this item to the array if ((mDocShellType == nsIDocShellTreeItem::typeAll) || (NS_SUCCEEDED(inItem->GetItemType(&itemType)) && (itemType == mDocShellType))) { if (!inItemArray.AppendElement(inItem)) return NS_ERROR_OUT_OF_MEMORY; } return NS_OK; }
nsresult nsDocShellBackwardsEnumerator::BuildArrayRecursive(nsIDocShellTreeItem* inItem, nsTArray<nsWeakPtr>& inItemArray) { nsresult rv; int32_t numChildren; rv = inItem->GetChildCount(&numChildren); if (NS_FAILED(rv)) return rv; for (int32_t i = numChildren - 1; i >= 0; --i) { nsCOMPtr<nsIDocShellTreeItem> curChild; rv = inItem->GetChildAt(i, getter_AddRefs(curChild)); if (NS_FAILED(rv)) return rv; rv = BuildArrayRecursive(curChild, inItemArray); if (NS_FAILED(rv)) return rv; } // add this item to the array if (mDocShellType == nsIDocShellTreeItem::typeAll || inItem->ItemType() == mDocShellType) { if (!inItemArray.AppendElement(do_GetWeakReference(inItem))) return NS_ERROR_OUT_OF_MEMORY; } return NS_OK; }
nsresult nsDocShellEnumerator::BuildDocShellArray(nsTArray<nsWeakPtr>& inItemArray) { NS_ENSURE_TRUE(mRootItem, NS_ERROR_NOT_INITIALIZED); inItemArray.Clear(); nsCOMPtr<nsIDocShellTreeItem> item = do_QueryReferent(mRootItem); return BuildArrayRecursive(item, inItemArray); }
nsresult nsDocShellForwardsEnumerator::BuildArrayRecursive( nsIDocShellTreeItem* aItem, nsTArray<nsWeakPtr>& aItemArray) { nsresult rv; // add this item to the array if (mDocShellType == nsIDocShellTreeItem::typeAll || aItem->ItemType() == mDocShellType) { if (!aItemArray.AppendElement(do_GetWeakReference(aItem))) { return NS_ERROR_OUT_OF_MEMORY; } } int32_t numChildren; rv = aItem->GetChildCount(&numChildren); if (NS_FAILED(rv)) { return rv; } for (int32_t i = 0; i < numChildren; ++i) { nsCOMPtr<nsIDocShellTreeItem> curChild; rv = aItem->GetChildAt(i, getter_AddRefs(curChild)); if (NS_FAILED(rv)) { return rv; } rv = BuildArrayRecursive(curChild, aItemArray); if (NS_FAILED(rv)) { return rv; } } return NS_OK; }
nsresult nsDocShellEnumerator::BuildDocShellArray(nsTArray<nsIDocShellTreeItem*>& inItemArray) { NS_ENSURE_TRUE(mRootItem, NS_ERROR_NOT_INITIALIZED); inItemArray.Clear(); return BuildArrayRecursive(mRootItem, inItemArray); }