1 // Copyright (c) 2012 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_CHROME_FRAME_ACTIVEX_H_ 6 #define CHROME_FRAME_CHROME_FRAME_ACTIVEX_H_ 7 8 #include <atlbase.h> 9 #include <atlcom.h> 10 #include <atlctl.h> 11 12 #include <set> 13 #include <string> 14 #include <vector> 15 16 #include "chrome_frame/chrome_frame_activex_base.h" 17 #include "chrome_frame/chrome_tab.h" 18 #include "chrome_frame/com_type_info_holder.h" 19 #include "grit/chrome_frame_resources.h" 20 21 #define WM_HOST_MOVED_NOTIFICATION (WM_APP + 1) 22 23 // ChromeFrameActivex: Implementation of the ActiveX control that is 24 // responsible for hosting a chrome frame, i.e. an iframe like widget which 25 // hosts the the chrome window. This object delegates to Chrome.exe 26 // (via the Chrome IPC-based automation mechanism) for the actual rendering. 27 class ATL_NO_VTABLE ChromeFrameActivex 28 : public ChromeFrameActivexBase<ChromeFrameActivex, CLSID_ChromeFrame>, 29 public IObjectSafetyImpl<ChromeFrameActivex, 30 INTERFACESAFE_FOR_UNTRUSTED_CALLER | 31 INTERFACESAFE_FOR_UNTRUSTED_DATA>, 32 public IObjectWithSiteImpl<ChromeFrameActivex>, 33 public IPersistPropertyBag { 34 public: 35 typedef ChromeFrameActivexBase<ChromeFrameActivex, CLSID_ChromeFrame> Base; 36 ChromeFrameActivex(); 37 ~ChromeFrameActivex(); 38 39 DECLARE_REGISTRY_RESOURCEID(IDR_CHROMEFRAME_ACTIVEX) 40 41 BEGIN_COM_MAP(ChromeFrameActivex) 42 COM_INTERFACE_ENTRY(IObjectWithSite) 43 COM_INTERFACE_ENTRY(IObjectSafety) 44 COM_INTERFACE_ENTRY(IPersist) 45 COM_INTERFACE_ENTRY(IPersistPropertyBag) 46 COM_INTERFACE_ENTRY_CHAIN(Base) 47 END_COM_MAP() 48 49 BEGIN_MSG_MAP(ChromeFrameActivex) 50 MESSAGE_HANDLER(WM_CREATE, OnCreate) 51 MESSAGE_HANDLER(WM_HOST_MOVED_NOTIFICATION, OnHostMoved) 52 CHAIN_MSG_MAP(Base) 53 END_MSG_MAP() 54 55 HRESULT FinalConstruct(); 56 57 virtual HRESULT OnDraw(ATL_DRAWINFO& draw_info); // NOLINT 58 59 // IPersistPropertyBag implementation 60 STDMETHOD(GetClassID)(CLSID* class_id) { 61 if (class_id != NULL) 62 *class_id = GetObjectCLSID(); 63 return S_OK; 64 } 65 66 STDMETHOD(InitNew)() { 67 return S_OK; 68 } 69 70 STDMETHOD(Load)(IPropertyBag* bag, IErrorLog* error_log); 71 72 STDMETHOD(Save)(IPropertyBag* bag, BOOL clear_dirty, BOOL save_all) { 73 return E_NOTIMPL; 74 } 75 76 // Used to setup the document_url_ member needed for completing navigation. 77 // Create external tab (possibly in incognito mode). 78 HRESULT IOleObject_SetClientSite(IOleClientSite* client_site); 79 80 // Overridden to perform security checks. 81 STDMETHOD(put_src)(BSTR src); 82 83 // IChromeFrame 84 // On a fresh install of ChromeFrame the BHO will not be loaded in existing 85 // IE tabs/windows. This function instantiates the BHO and registers it 86 // explicitly. 87 STDMETHOD(registerBhoIfNeeded)(); 88 89 protected: 90 // ChromeFrameDelegate overrides 91 virtual void OnLoad(const GURL& url); 92 virtual void OnMessageFromChromeFrame(const std::string& message, 93 const std::string& origin, 94 const std::string& target); 95 virtual void OnLoadFailed(int error_code, const std::string& url); 96 virtual void OnAutomationServerLaunchFailed( 97 AutomationLaunchResult reason, const std::string& server_version); 98 virtual void OnChannelError(); 99 100 // Separated to static function for unit testing this logic more easily. 101 static bool ShouldShowVersionMismatchDialog(bool is_privileged, 102 IOleClientSite* client_site); 103 104 private: 105 LRESULT OnCreate(UINT message, WPARAM wparam, LPARAM lparam, 106 BOOL& handled); // NO_LINT 107 LRESULT OnHostMoved(UINT message, WPARAM wparam, LPARAM lparam, 108 BOOL& handled); // NO_LINT 109 110 HRESULT GetContainingDocument(IHTMLDocument2** doc); 111 HRESULT GetDocumentWindow(IHTMLWindow2** window); 112 113 // Gets the value of the 'id' attribute of the object element. 114 HRESULT GetObjectScriptId(IHTMLObjectElement* object_elem, BSTR* id); 115 116 // Returns the object element in the HTML page. 117 // Note that if we're not being hosted inside an HTML 118 // document, then this call will fail. 119 HRESULT GetObjectElement(IHTMLObjectElement** element); 120 121 HRESULT CreateScriptBlockForEvent(IHTMLElement2* insert_after, 122 BSTR instance_id, BSTR script, 123 BSTR event_name); 124 125 // Utility function that checks the size of the vector and if > 0 creates 126 // a variant for the string argument and forwards the call to the other 127 // FireEvent method. 128 void FireEvent(const EventHandlers& handlers, const std::string& arg); 129 130 // Invokes all registered handlers in a vector of event handlers. 131 void FireEvent(const EventHandlers& handlers, IDispatch* event); 132 133 // This variant is used for the privatemessage handler only. 134 void FireEvent(const EventHandlers& handlers, IDispatch* event, 135 BSTR target); 136 137 // Installs a hook on the top-level window hosting the control. 138 HRESULT InstallTopLevelHook(IOleClientSite* client_site); 139 140 // A hook attached to the top-level window containing the ActiveX control. 141 HHOOK chrome_wndproc_hook_; 142 143 // Set to true if the current instance is attaching to an existing Chrome 144 // tab. This occurs when a window.open request is performed by Chrome. 145 bool attaching_to_existing_cf_tab_; 146 }; 147 148 #endif // CHROME_FRAME_CHROME_FRAME_ACTIVEX_H_ 149