// Copyright (c) 2009 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.

// This file will be processed by the MIDL tool to
// produce the type library (chrome_tab.tlb) and marshalling code.

#include "olectl.h"
import "oaidl.idl";
import "ocidl.idl";

[
  object,
  uuid(FB243E4B-8AC2-4840-95F2-91B9AF9CFF10),
  dual,
  nonextensible,
  helpstring("IChromeFrame Interface"),
  pointer_default(unique)
]
interface IChromeFrame : IDispatch {
  [propget, id(1)]
  HRESULT src([out, retval] BSTR* src);
  [propput, id(1)]
  HRESULT src([in] BSTR src);

  [id(3)]
  HRESULT postMessage([in] BSTR message, [in, optional] VARIANT target);

  [id(4), propget]
  HRESULT onload([out, retval] VARIANT* onload_handler);
  [id(4), propput]
  HRESULT onload([in] VARIANT onload_handler);

  [propget, id(5)]
  HRESULT onloaderror([out, retval] VARIANT* onerror_handler);
  [propput, id(5)]
  HRESULT onloaderror([in] VARIANT onerror_handler);

  [propget, id(6)]
  HRESULT onmessage([out, retval] VARIANT* onmessage_handler);
  [propput, id(6)]
  HRESULT onmessage([in] VARIANT onmessage_handler);

  [propget, id(DISPID_READYSTATE)]
  HRESULT readyState([out, retval] long* ready_state);

  [id(7)]
  HRESULT addEventListener([in] BSTR event_type, [in] IDispatch* listener,
                           [in, optional] VARIANT use_capture);

  [id(8)]
  HRESULT removeEventListener([in] BSTR event_type, [in] IDispatch* listener,
                              [in, optional] VARIANT use_capture);

  [propget, id(9)]
  HRESULT version([out, retval] BSTR* version);

  [id(10), hidden]
  // This method is available only when the control is in privileged mode.
  HRESULT postPrivateMessage([in] BSTR message,
                             [in] BSTR origin,
                             [in] BSTR target);

  [propget, id(11)]
  HRESULT useChromeNetwork([out, retval] VARIANT_BOOL* pVal);
  [propput, id(11)]
  HRESULT useChromeNetwork([in] VARIANT_BOOL newVal);

  [id(12), hidden]
  // Deprecated. Returns E_NOTIMPL.
  HRESULT installExtension([in] BSTR crx_path);

  [id(13), hidden]
  // Deprecated. Returns E_NOTIMPL.
  HRESULT loadExtension([in] BSTR extension_path);

  [id(14), hidden]
  // Deprecated. Returns E_NOTIMPL.
  HRESULT getEnabledExtensions();

  [id(15)]
  // This method bootstraps the BHO if it is not already loaded.
  HRESULT registerBhoIfNeeded();
};

[
  object,
  uuid(E98FDFD9-312B-444a-A640-8E88F3CC08B8),
  oleautomation,
  nonextensible,
  hidden
]
// Internal implementation interface. Not intended as an API. May change
// frequently, don't treat this as frozen.
interface IChromeFramePrivileged : IUnknown {
  // If the host returns false for wants_privileged, the control
  // won't enable privileged mode.
  HRESULT GetWantsPrivileged([out] boolean *wants_privileged);
  // The profile name we want to use.
  HRESULT GetChromeProfileName([out] BSTR *profile_name);
  // Called when an automation version mismatch occurs. Returns S_OK if
  // a dialog should be showed to the user by this CF instance, S_FALSE if
  // not.
  HRESULT ShouldShowVersionMismatchDialog();
  // Allows the host to return the navigation url during the creation of the
  // ChromeFrameActiveX instance.
  HRESULT GetNavigationUrl([out] BSTR* url);
};

// Expose this service to the ChromeFrame control to trigger privileged
// mode. If the control is in privileged mode, it will forward messages
// to the onmessage handler irrespective of origin.
cpp_quote("#define SID_ChromeFramePrivileged __uuidof(IChromeFramePrivileged)")

typedef enum {
  CF_EVENT_DISPID_ONLOAD = 1,
  CF_EVENT_DISPID_ONLOADERROR,
  CF_EVENT_DISPID_ONMESSAGE,
  CF_EVENT_DISPID_ONPRIVATEMESSAGE,
  CF_EVENT_DISPID_ONCHANNELERROR,
  CF_EVENT_DISPID_ONCLOSE,
  CF_EVENT_DISPID_ONREADYSTATECHANGED = DISPID_READYSTATECHANGE,
} ChromeFrameEventDispId;

[
  uuid(6F2664E1-FF6E-488A-BCD1-F4CA6001DFCC),
  version(1.0),
  helpstring("ChromeTab 1.0 Type Library")
]
library ChromeTabLib {
  importlib("stdole2.tlb");

  [uuid(388B5D64-CE67-415b-9B0F-745C56E868E7)]
  dispinterface DIChromeFrameEvents {
   properties:
    // None.

   methods:
    [id(CF_EVENT_DISPID_ONLOAD)]
    void onload();
    
    [id(CF_EVENT_DISPID_ONLOADERROR)]
    void onloaderror();
    
    [id(CF_EVENT_DISPID_ONMESSAGE)]
    void onmessage([in] IDispatch* event);
    
    [id(CF_EVENT_DISPID_ONREADYSTATECHANGED)]
    void onreadystatechanged();
    
    [id(CF_EVENT_DISPID_ONPRIVATEMESSAGE)]
    // This event is only fired when the control is in privileged mode.
    void onprivatemessage([in] IDispatch* event, [in] BSTR target);

    [id(CF_EVENT_DISPID_ONCHANNELERROR)]
    // This event is fired when there is an error in communication channel with
    // Chrome and Automation must be reconnected to continue.
    void onchannelerror();

    [id(CF_EVENT_DISPID_ONCLOSE)]
    // This event is fired when the script inside the page wants to close it.
    // This is just a notification, there is no way to prevent the script from
    // closing.
    void onclose();
  };

  [uuid(BB1176EE-20DD-41DC-9D1E-AC1335C7BBB0)]
  coclass HtmlFilter {
    [default] interface IUnknown;
  };

  [uuid(9875BFAF-B04D-445E-8A69-BE36838CDE3E)]
  coclass ChromeProtocol {
    [default] interface IUnknown;
  };

  [uuid(3E1D0E7F-F5E3-44CC-AA6A-C0A637619AB8), control]
  coclass ChromeActiveDocument {
    [default] interface IChromeFrame;
  };

  [uuid(E0A900DF-9611-4446-86BD-4B1D47E7DB2A), control]
  coclass ChromeFrame {
    [default] interface IChromeFrame;
    [default, source] dispinterface DIChromeFrameEvents;
  };

  [uuid(ECB3C477-1A0A-44bd-BB57-78F9EFE34FA7)]
  coclass ChromeFrameBHO {
    [default] interface IUnknown;
  };
};