// Test06.cpp

#include "nsCOMPtr.h"
#include "nsIBaseWindow.h"
#include "nsIDocShell.h"
#include "nsPIDOMWindow.h"

NS_DEF_PTR(nsPIDOMWindow);
NS_DEF_PTR(nsIBaseWindow);

/*
  Windows:
    nsCOMPtr_optimized           176
    nsCOMPtr_as_found            181
    nsCOMPtr_optimized*          182
    nsCOMPtr02*                  184
    nsCOMPtr02                   187
    nsCOMPtr02*                  188
    nsCOMPtr03                   189
    raw_optimized, nsCOMPtr00    191
    nsCOMPtr00*                  199
    nsCOMPtr_as_found*           201
    raw                          214

  Macintosh:
    nsCOMPtr_optimized           300    (1.0000)
    nsCOMPtr02                   320    (1.0667)  i.e., 6.67% bigger than
  nsCOMPtr_optimized nsCOMPtr00                   328    (1.0933) raw_optimized,
  nsCOMPtr03    332    (1.1067) nsCOMPtr_as_found            344    (1.1467) raw
  388    (1.2933)

*/

void  // nsresult
Test06_raw(nsIDOMWindow* aDOMWindow, nsIBaseWindow** aBaseWindow)
// m388, w214
{
  //  if (!aDOMWindow)
  //    return NS_ERROR_NULL_POINTER;
  nsPIDOMWindow* window = 0;
  nsresult status =
      aDOMWindow->QueryInterface(NS_GET_IID(nsPIDOMWindow), (void**)&window);
  nsIDocShell* docShell = 0;
  if (window) window->GetDocShell(&docShell);
  nsIWebShell* rootWebShell = 0;
  NS_IF_RELEASE(rootWebShell);
  NS_IF_RELEASE(docShell);
  NS_IF_RELEASE(window);
  //    return status;
}

void  // nsresult
Test06_raw_optimized(nsIDOMWindow* aDOMWindow, nsIBaseWindow** aBaseWindow)
// m332, w191
{
  //  if (!aDOMWindow)
  //    return NS_ERROR_NULL_POINTER;
  (*aBaseWindow) = 0;
  nsPIDOMWindow* window;
  nsresult status =
      aDOMWindow->QueryInterface(NS_GET_IID(nsPIDOMWindow), (void**)&window);
  if (NS_SUCCEEDED(status)) {
    nsIDocShell* docShell = 0;
    window->GetDocShell(&docShell);
    if (docShell) {
      NS_RELEASE(docShell);
    }
    NS_RELEASE(window);
  }
  //  return status;
}

void Test06_nsCOMPtr_as_found(nsIDOMWindow* aDOMWindow,
                              nsCOMPtr<nsIBaseWindow>* aBaseWindow)
// m344, w181/201
{
  //  if (!aDOMWindow)
  //    return;
  nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aDOMWindow);
  nsCOMPtr<nsIDocShell> docShell;
  if (window) window->GetDocShell(getter_AddRefs(docShell));
}

void  // nsresult
Test06_nsCOMPtr00(nsIDOMWindow* aDOMWindow, nsIBaseWindow** aBaseWindow)
// m328, w191/199
{
  //  if (!aDOMWindow)
  //    return NS_ERROR_NULL_POINTER;
  nsresult status;
  nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aDOMWindow, &status);
  nsIDocShell* temp0 = 0;
  if (window) window->GetDocShell(&temp0);
  nsCOMPtr<nsIDocShell> docShell = dont_AddRef(temp0);
  (*aBaseWindow) = 0;
  //    return status;
}

void  // nsresult
Test06_nsCOMPtr_optimized(nsIDOMWindow* aDOMWindow,
                          nsCOMPtr<nsIBaseWindow>* aBaseWindow)
// m300, w176/182
{
  //    if (!aDOMWindow)
  //      return NS_ERROR_NULL_POINTER;
  nsresult status;
  nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aDOMWindow, &status);
  nsIDocShell* temp0 = 0;
  if (window) window->GetDocShell(&temp0);
  (*aBaseWindow) = do_QueryInterface(nullptr, &status);
  //    return status;
}

void  // nsresult
Test06_nsCOMPtr02(nsIDOMWindow* aDOMWindow, nsIBaseWindow** aBaseWindow)
// m320, w187/184
{
  //    if (!aDOMWindow)
  //      return NS_ERROR_NULL_POINTER;
  (*aBaseWindow) = 0;
  nsresult status;
  nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aDOMWindow, &status);
  if (window) {
    nsIDocShell* temp0;
    window->GetDocShell(&temp0);
  }
  //    return status;
}

void  // nsresult
Test06_nsCOMPtr03(nsIDOMWindow* aDOMWindow,
                  nsCOMPtr<nsIBaseWindow>* aBaseWindow)
// m332, w189/188
{
  //    if (!aDOMWindow)
  //      return NS_ERROR_NULL_POINTER;
  (*aBaseWindow) = 0;
  nsresult status;
  nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aDOMWindow, &status);
  if (window) {
    nsIDocShell* temp0;
    window->GetDocShell(&temp0);
    nsCOMPtr<nsIDocShell> docShell = dont_AddRef(temp0);
    if (docShell) {
    }
  }
  //    return status;
}
