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_BHO_H_ 6 #define CHROME_FRAME_BHO_H_ 7 8 #include <atlbase.h> 9 #include <atlcom.h> 10 #include <deletebrowsinghistory.h> 11 #include <exdisp.h> 12 #include <exdispid.h> 13 #include <mshtml.h> 14 #include <shdeprecated.h> 15 16 #include <string> 17 18 #include "chrome_frame/chrome_tab.h" 19 #include "chrome_frame/delete_chrome_history.h" 20 #include "chrome_frame/resource.h" 21 #include "chrome_frame/urlmon_moniker.h" 22 #include "chrome_frame/urlmon_url_request.h" 23 #include "grit/chrome_frame_resources.h" 24 25 class DeleteChromeHistory; 26 27 class PatchHelper { 28 public: 29 enum State { UNKNOWN, PATCH_IBROWSER, PATCH_PROTOCOL, PATCH_MONIKER }; 30 PatchHelper() : state_(UNKNOWN) { 31 } 32 33 State state() const { 34 return state_; 35 } 36 37 // Returns true if protocols were patched, false if patching has already 38 // been done. 39 bool InitializeAndPatchProtocolsIfNeeded(); 40 41 void PatchBrowserService(IBrowserService* p); 42 void UnpatchIfNeeded(); 43 protected: 44 State state_; 45 }; 46 47 // Single global variable 48 extern PatchHelper g_patch_helper; 49 50 class ATL_NO_VTABLE Bho 51 : public CComObjectRootEx<CComSingleThreadModel>, 52 public CComCoClass<Bho, &CLSID_ChromeFrameBHO>, 53 public IObjectWithSiteImpl<Bho>, 54 public IDispEventSimpleImpl<0, Bho, &DIID_DWebBrowserEvents2>, 55 public NavigationManager { 56 public: 57 typedef HRESULT (STDMETHODCALLTYPE* IBrowserService_OnHttpEquiv_Fn)( 58 IBrowserService* browser, IShellView* shell_view, BOOL done, 59 VARIANT* in_arg, VARIANT* out_arg); 60 61 DECLARE_GET_CONTROLLING_UNKNOWN() 62 DECLARE_REGISTRY_RESOURCEID(IDR_BHO) 63 DECLARE_NOT_AGGREGATABLE(Bho) 64 DECLARE_PROTECT_FINAL_CONSTRUCT() 65 66 BEGIN_COM_MAP(Bho) 67 COM_INTERFACE_ENTRY(IObjectWithSite) 68 // When calling DeleteChromeHistory, ensure that only one instance 69 // is created to avoid mulitple message loops. 70 COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID_IDeleteBrowsingHistory, 71 DeleteChromeHistory, 72 delete_chrome_history_.p) 73 END_COM_MAP() 74 75 BEGIN_SINK_MAP(Bho) 76 SINK_ENTRY_INFO(0, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, 77 BeforeNavigate2, &kBeforeNavigate2Info) 78 SINK_ENTRY_INFO(0, DIID_DWebBrowserEvents2, DISPID_NAVIGATECOMPLETE2, 79 NavigateComplete2, &kNavigateComplete2Info) 80 SINK_ENTRY_INFO(0, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, 81 DocumentComplete, &kDocumentCompleteInfo) 82 END_SINK_MAP() 83 84 Bho(); 85 86 HRESULT FinalConstruct(); 87 void FinalRelease(); 88 89 // IObjectWithSite 90 STDMETHODIMP SetSite(IUnknown* site); 91 92 // WebBrowser2 event sinks. 93 STDMETHOD(BeforeNavigate2)(IDispatch* dispatch, VARIANT* url, VARIANT* flags, 94 VARIANT* target_frame_name, VARIANT* post_data, VARIANT* headers, 95 VARIANT_BOOL* cancel); 96 STDMETHOD_(void, NavigateComplete2)(IDispatch* dispatch, VARIANT* url); 97 STDMETHOD_(void, DocumentComplete)(IDispatch* dispatch, VARIANT* url); 98 99 // mshtml sends an IOleCommandTarget::Exec of OLECMDID_HTTPEQUIV 100 // (and OLECMDID_HTTPEQUIV_DONE) as soon as it parses a meta tag. 101 // It also sends contents of the meta tag as an argument. IEFrame 102 // handles this in IBrowserService::OnHttpEquiv. So this allows 103 // us to sniff the META tag by simply patching it. The renderer 104 // switching can be achieved by canceling original navigation 105 // and issuing a new one using IWebBrowser2->Navigate2. 106 static HRESULT STDMETHODCALLTYPE OnHttpEquiv( 107 IBrowserService_OnHttpEquiv_Fn original_httpequiv, 108 IBrowserService* browser, IShellView* shell_view, BOOL done, 109 VARIANT* in_arg, VARIANT* out_arg); 110 111 static void ProcessOptInUrls(IWebBrowser2* browser, BSTR url); 112 113 // COM_INTERFACE_ENTRY_CACHED_TEAR_OFF manages the raw pointer from CComPtr 114 // which base::win::ScopedComPtr doesn't expose. 115 CComPtr<IUnknown> delete_chrome_history_; 116 117 protected: 118 bool PatchProtocolHandler(const CLSID& handler_clsid); 119 120 static _ATL_FUNC_INFO kBeforeNavigate2Info; 121 static _ATL_FUNC_INFO kNavigateComplete2Info; 122 static _ATL_FUNC_INFO kDocumentCompleteInfo; 123 }; 124 125 #endif // CHROME_FRAME_BHO_H_ 126