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;
}
예제 #2
0
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;
}
예제 #3
0
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);
}
예제 #4
0
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);
}