Home | History | Annotate | Download | only in internal
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_FRAME_READY_MODE_INTERNAL_READY_MODE_WEB_BROWSER_ADAPTER_H_
      6 #define CHROME_FRAME_READY_MODE_INTERNAL_READY_MODE_WEB_BROWSER_ADAPTER_H_
      7 
      8 #include <atlbase.h>
      9 #include <atlcom.h>
     10 #include <exdisp.h>
     11 #include <exdispid.h>
     12 
     13 #include <string>
     14 
     15 #include "base/basictypes.h"
     16 #include "base/memory/scoped_ptr.h"
     17 #include "base/win/scoped_comptr.h"
     18 
     19 // Observes navigation and rendering in an IWebBrowser2 instance and reports
     20 // activity to an observer.
     21 class ATL_NO_VTABLE ReadyModeWebBrowserAdapter
     22     : public CComObjectRootEx<CComSingleThreadModel>,
     23       public IDispEventSimpleImpl<0, ReadyModeWebBrowserAdapter,
     24                                   &DIID_DWebBrowserEvents2> {
     25  public:
     26   // Receives notification of navigation and rendering activity in the
     27   // IWebBrowser2 instance.
     28   class Observer {
     29    public:
     30     virtual ~Observer() {}
     31 
     32     // Receives notification when the browser begins navigating.
     33     virtual void OnNavigateTo(const std::wstring& url) = 0;
     34 
     35     // Receives notification when the browser has rendered a page in Chrome
     36     // Frame.
     37     virtual void OnRenderInChromeFrame(const std::wstring& url) = 0;
     38 
     39     // Receives notification when the browser has rendered a page in the host
     40     // renderer.
     41     virtual void OnRenderInHost(const std::wstring& url) = 0;
     42   };  // class Observer
     43 
     44   ReadyModeWebBrowserAdapter();
     45 
     46   // Begins observation of the specified IWebBrowser2 instance, reporting
     47   // activity to the observer. Takes ownership of observer and deletes it
     48   // either upon failure to initialize, during Uninstall(), or when the browser
     49   // quits.
     50   bool Initialize(IWebBrowser2* web_browser_, Observer* observer);
     51 
     52   // Stops observing the IWebBrowser2.
     53   void Uninitialize();
     54 
     55 DECLARE_NOT_AGGREGATABLE(ReadyModeWebBrowserAdapter)
     56 
     57 BEGIN_COM_MAP(ReadyModeWebBrowserAdapter)
     58 END_COM_MAP()
     59 
     60 BEGIN_SINK_MAP(ReadyModeWebBrowserAdapter)
     61   SINK_ENTRY_INFO(0, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2,
     62                   BeforeNavigate2, &kBeforeNavigate2Info)
     63   SINK_ENTRY_INFO(0, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE,
     64                   DocumentComplete, &kDocumentCompleteInfo)
     65   SINK_ENTRY_INFO(0, DIID_DWebBrowserEvents2, DISPID_ONQUIT,
     66                   OnQuit, &kOnQuitInfo)
     67 END_SINK_MAP()
     68 
     69  private:
     70   // IWebBrowser2 event handlers
     71   STDMETHOD(BeforeNavigate2)(IDispatch* dispatch, VARIANT* url, VARIANT* flags,
     72       VARIANT* target_frame_name, VARIANT* post_data, VARIANT* headers,
     73       VARIANT_BOOL* cancel);
     74   STDMETHOD_(void, DocumentComplete)(IDispatch* dispatch, VARIANT* url);
     75   STDMETHOD_(void, OnQuit)();
     76 
     77   scoped_ptr<Observer> observer_;
     78   base::win::ScopedComPtr<IWebBrowser2> web_browser_;
     79 
     80   static _ATL_FUNC_INFO kBeforeNavigate2Info;
     81   static _ATL_FUNC_INFO kDocumentCompleteInfo;
     82   static _ATL_FUNC_INFO kOnQuitInfo;
     83 
     84   DISALLOW_COPY_AND_ASSIGN(ReadyModeWebBrowserAdapter);
     85 };  // class ReadyModeWebBrowserAdapter
     86 
     87 #endif  // CHROME_FRAME_READY_MODE_INTERNAL_READY_MODE_WEB_BROWSER_ADAPTER_H_
     88