// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_FRAME_HTML_PRIVATE_WINDOW_IMPL_H_
#define CHROME_FRAME_HTML_PRIVATE_WINDOW_IMPL_H_

#include <atlbase.h>
#include <atlcom.h>
#include <mshtml.h>

#include "chrome_frame/chrome_tab.h"
#include "chrome_frame/resource.h"
#include "grit/chrome_frame_resources.h"

interface __declspec(uuid("3050F6DC-98B5-11CF-BB82-00AA00BDCE0B"))
IHTMLPrivateWindow : public IUnknown {
  STDMETHOD(SuperNavigate)(BSTR , BSTR, BSTR, BSTR , VARIANT*,
      VARIANT*, ULONG) = 0;
  STDMETHOD(GetPendingUrl)(BSTR*) = 0;
  STDMETHOD(SetPICSTarget)(IOleCommandTarget*) = 0;
  STDMETHOD(PICSComplete)(int) = 0;
  STDMETHOD(FindWindowByName)(PCWSTR, IHTMLWindow2**) = 0;
  STDMETHOD(GetAddressBarUrl)(BSTR* url) = 0;
};

template <typename T>
class ATL_NO_VTABLE HTMLPrivateWindowImpl : public T {
 public:
  HTMLPrivateWindowImpl() {}

  // IHTMLPrivateWindow
  STDMETHOD(SuperNavigate)(BSTR , BSTR, BSTR, BSTR , VARIANT*,
      VARIANT*, ULONG) {
    DLOG(INFO) << __FUNCTION__;
    return E_NOTIMPL;
  }

  STDMETHOD(GetPendingUrl)(BSTR*) {
    DLOG(INFO) << __FUNCTION__;
    return E_NOTIMPL;
  }

  STDMETHOD(SetPICSTarget)(IOleCommandTarget*) {
    DLOG(INFO) << __FUNCTION__;
    return E_NOTIMPL;
  }

  STDMETHOD(PICSComplete)(int) {
    DLOG(INFO) << __FUNCTION__;
    return E_NOTIMPL;
  }

  STDMETHOD(FindWindowByName)(LPCWSTR, IHTMLWindow2**) {
    DLOG(INFO) << __FUNCTION__;
    return E_NOTIMPL;
  }

  STDMETHOD(GetAddressBarUrl)(BSTR* url) {
    DLOG(INFO) << __FUNCTION__;
    return E_NOTIMPL;
  }
};

#endif  // CHROME_FRAME_HTML_PRIVATE_WINDOW_IMPL_H_

