| Index: src/plugin/WebBrowserEventsListener.h | 
| diff --git a/src/plugin/WebBrowserEventsListener.h b/src/plugin/WebBrowserEventsListener.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..d162a1f828e5a1a4044bffcac3ed59681597fc9b | 
| --- /dev/null | 
| +++ b/src/plugin/WebBrowserEventsListener.h | 
| @@ -0,0 +1,56 @@ | 
| +#pragma once | 
| +#include <functional> | 
| +#include <memory> | 
| + | 
| +class WebBrowserEventsListener; | 
| + | 
| +typedef ATL::IDispEventImpl <1, WebBrowserEventsListener, | 
| +  &__uuidof(DWebBrowserEvents2), &LIBID_SHDocVw, 1, 1> WebBrowserEvents2Listener; | 
| + | 
| +typedef ATL::IDispEventImpl <2, WebBrowserEventsListener, | 
| +  &__uuidof(HTMLDocumentEvents2), &LIBID_MSHTML, 4, 0> HTMLDocumentEvents2Listener; | 
| + | 
| +class ATL_NO_VTABLE WebBrowserEventsListener : | 
| +  public ATL::CComObjectRootEx<ATL::CComSingleThreadModel>, | 
| +  public WebBrowserEvents2Listener, | 
| +  public HTMLDocumentEvents2Listener, | 
| +  public IUnknown | 
| +{ | 
| +  enum class State | 
| +  { | 
| +    FirstTimeLoading, Loading, Loaded | 
| +  }; | 
| +public: | 
| +  typedef std::function<void()> OnDestroy; | 
| +  typedef std::function<void()> OnReloaded; | 
| + | 
| +  WebBrowserEventsListener(); | 
| +  ~WebBrowserEventsListener(); | 
| +  BEGIN_COM_MAP(WebBrowserEventsListener) | 
| +    COM_INTERFACE_ENTRY(IUnknown) | 
| +  END_COM_MAP() | 
| + | 
| +  DECLARE_NOT_AGGREGATABLE(WebBrowserEventsListener) | 
| +  BEGIN_SINK_MAP(WebBrowserEventsListener) | 
| +    SINK_ENTRY_EX(1, __uuidof(DWebBrowserEvents2), DISPID_DOCUMENTCOMPLETE, OnDocumentComplete) | 
| +    SINK_ENTRY_EX(2, __uuidof(HTMLDocumentEvents2), DISPID_HTMLDOCUMENTEVENTS2_ONREADYSTATECHANGE, OnReadyStateChange) | 
| +  END_SINK_MAP() | 
| + | 
| +  STDMETHOD(OnDocumentComplete)(IDispatch* pDisp, VARIANT* urlVariant); | 
| +  STDMETHOD_(void, OnReadyStateChange)(IHTMLEventObj* pEvtObj); | 
| + | 
| +  DECLARE_PROTECT_FINAL_CONSTRUCT() | 
| + | 
| +  HRESULT FinalConstruct(){ return S_OK; } | 
| +  void FinalRelease(){} | 
| +  HRESULT Init(IWebBrowser2* webBrowser, const OnDestroy& onDestroy); | 
| + | 
| +  OnReloaded reloaded; | 
| +private: | 
| +  void emitReloaded(); | 
| +private: | 
| +  ATL::CComPtr<IWebBrowser2> m_browser; | 
| +  OnDestroy m_onDestroy; | 
| +  bool m_isDocumentEvents2Connected; | 
| +  State m_state; | 
| +}; | 
|  |