Index: chrome_frame/bho.h |
=================================================================== |
--- chrome_frame/bho.h (revision 0) |
+++ chrome_frame/bho.h (revision 0) |
@@ -0,0 +1,102 @@ |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CHROME_FRAME_BHO_H_ |
+#define CHROME_FRAME_BHO_H_ |
+ |
+#include <string> |
+ |
+#include <atlbase.h> |
+#include <atlcom.h> |
+#include <exdisp.h> |
+#include <exdispid.h> |
+#include <mshtml.h> |
+#include <shdeprecated.h> |
+ |
+#include "chrome_tab.h" // NOLINT |
+#include "chrome_frame/resource.h" |
+#include "grit/chrome_frame_resources.h" |
+ |
+class PatchHelper { |
+ public: |
+ enum State { UNKNOWN, PATCH_IBROWSER, PATCH_IBROWSER_OK, PATCH_PROTOCOL }; |
+ PatchHelper() : state_(UNKNOWN) { |
+ } |
+ |
+ State state() const { |
+ return state_; |
+ } |
+ |
+ void InitializeAndPatchProtocolsIfNeeded(); |
+ void PatchBrowserService(IBrowserService* p); |
+ void UnpatchIfNeeded(); |
+ protected: |
+ State state_; |
+}; |
+ |
+// Single global variable |
+extern PatchHelper g_patch_helper; |
+ |
+class ATL_NO_VTABLE Bho |
+ : public CComObjectRootEx<CComSingleThreadModel>, |
+ public CComCoClass<Bho, &CLSID_ChromeFrameBHO>, |
+ public IObjectWithSiteImpl<Bho>, |
+ public IDispEventSimpleImpl<0, Bho, &DIID_DWebBrowserEvents2> { |
+ public: |
+ typedef HRESULT (STDMETHODCALLTYPE* IBrowserService_OnHttpEquiv_Fn)( |
+ IBrowserService* browser, IShellView* shell_view, BOOL done, |
+ VARIANT* in_arg, VARIANT* out_arg); |
+ |
+DECLARE_REGISTRY_RESOURCEID(IDR_BHO) |
+DECLARE_NOT_AGGREGATABLE(Bho) |
+DECLARE_PROTECT_FINAL_CONSTRUCT() |
+ |
+BEGIN_COM_MAP(Bho) |
+ COM_INTERFACE_ENTRY(IObjectWithSite) |
+END_COM_MAP() |
+ |
+BEGIN_SINK_MAP(Bho) |
+ SINK_ENTRY_INFO(0, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, |
+ BeforeNavigate2, &kBeforeNavigate2Info) |
+END_SINK_MAP() |
+ |
+ // Lifetime management methods |
+ Bho(); |
+ |
+ HRESULT FinalConstruct(); |
+ void FinalRelease(); |
+ |
+ // IObjectWithSite |
+ STDMETHODIMP SetSite(IUnknown* site); |
+ STDMETHOD(BeforeNavigate2)(IDispatch* dispatch, VARIANT* url, VARIANT* flags, |
+ VARIANT* target_frame_name, VARIANT* post_data, VARIANT* headers, |
+ VARIANT_BOOL* cancel); |
+ |
+ // mshtml sends an IOleCommandTarget::Exec of OLECMDID_HTTPEQUIV |
+ // (and OLECMDID_HTTPEQUIV_DONE) as soon as it parses a meta tag. |
+ // It also sends contents of the meta tag as an argument. IEFrame |
+ // handles this in IBrowserService::OnHttpEquiv. So this allows |
+ // us to sniff the META tag by simply patching it. The renderer |
+ // switching can be achieved by cancelling original navigation |
+ // and issuing a new one using IWebBrowser2->Navigate2. |
+ static HRESULT STDMETHODCALLTYPE OnHttpEquiv( |
+ IBrowserService_OnHttpEquiv_Fn original_httpequiv, |
+ IBrowserService* browser, IShellView* shell_view, BOOL done, |
+ VARIANT* in_arg, VARIANT* out_arg); |
+ |
+ protected: |
+ bool PatchProtocolHandler(const CLSID& handler_clsid); |
+ static bool HasSubFrames(IWebBrowser2* web_browser2); |
+ static HRESULT SwitchRenderer(IWebBrowser2* web_browser2, |
+ IBrowserService* browser, IShellView* shell_view, |
+ const wchar_t* meta_tag); |
+ |
+ static _ATL_FUNC_INFO kBeforeNavigate2Info; |
+}; |
+ |
+// Add Bho to class library table so IE can CoCreate it. |
+OBJECT_ENTRY_AUTO(CLSID_ChromeFrameBHO, Bho); |
+ |
+#endif // CHROME_FRAME_BHO_H_ |
+ |