| OLD | NEW |
| (Empty) |
| 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_ | |
| OLD | NEW |