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.
5 #ifndef CHROME_FRAME_BHO_H_
6 #define CHROME_FRAME_BHO_H_
10 #include <deletebrowsinghistory.h>
14 #include <shdeprecated.h>
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"
25 class DeleteChromeHistory
;
29 enum State
{ UNKNOWN
, PATCH_IBROWSER
, PATCH_PROTOCOL
, PATCH_MONIKER
};
30 PatchHelper() : state_(UNKNOWN
) {
37 // Returns true if protocols were patched, false if patching has already
39 bool InitializeAndPatchProtocolsIfNeeded();
41 void PatchBrowserService(IBrowserService
* p
);
42 void UnpatchIfNeeded();
47 // Single global variable
48 extern PatchHelper g_patch_helper
;
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
{
57 typedef HRESULT (STDMETHODCALLTYPE
* IBrowserService_OnHttpEquiv_Fn
)(
58 IBrowserService
* browser
, IShellView
* shell_view
, BOOL done
,
59 VARIANT
* in_arg
, VARIANT
* out_arg
);
61 DECLARE_GET_CONTROLLING_UNKNOWN()
62 DECLARE_REGISTRY_RESOURCEID(IDR_BHO
)
63 DECLARE_NOT_AGGREGATABLE(Bho
)
64 DECLARE_PROTECT_FINAL_CONSTRUCT()
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
,
72 delete_chrome_history_
.p
)
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
)
86 HRESULT
FinalConstruct();
90 STDMETHODIMP
SetSite(IUnknown
* site
);
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
);
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
);
111 static void ProcessOptInUrls(IWebBrowser2
* browser
, BSTR url
);
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_
;
118 bool PatchProtocolHandler(const CLSID
& handler_clsid
);
120 static _ATL_FUNC_INFO kBeforeNavigate2Info
;
121 static _ATL_FUNC_INFO kNavigateComplete2Info
;
122 static _ATL_FUNC_INFO kDocumentCompleteInfo
;
125 #endif // CHROME_FRAME_BHO_H_