// Copyright (c) 2012 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_CHROME_FRAME_ACTIVEX_H_ #define CHROME_FRAME_CHROME_FRAME_ACTIVEX_H_ #include #include #include #include #include #include #include "chrome_frame/chrome_frame_activex_base.h" #include "chrome_frame/chrome_tab.h" #include "chrome_frame/com_type_info_holder.h" #include "grit/chrome_frame_resources.h" #define WM_HOST_MOVED_NOTIFICATION (WM_APP + 1) // ChromeFrameActivex: Implementation of the ActiveX control that is // responsible for hosting a chrome frame, i.e. an iframe like widget which // hosts the the chrome window. This object delegates to Chrome.exe // (via the Chrome IPC-based automation mechanism) for the actual rendering. class ATL_NO_VTABLE ChromeFrameActivex : public ChromeFrameActivexBase, public IObjectSafetyImpl, public IObjectWithSiteImpl, public IPersistPropertyBag { public: typedef ChromeFrameActivexBase Base; ChromeFrameActivex(); ~ChromeFrameActivex(); DECLARE_REGISTRY_RESOURCEID(IDR_CHROMEFRAME_ACTIVEX) BEGIN_COM_MAP(ChromeFrameActivex) COM_INTERFACE_ENTRY(IObjectWithSite) COM_INTERFACE_ENTRY(IObjectSafety) COM_INTERFACE_ENTRY(IPersist) COM_INTERFACE_ENTRY(IPersistPropertyBag) COM_INTERFACE_ENTRY_CHAIN(Base) END_COM_MAP() BEGIN_MSG_MAP(ChromeFrameActivex) MESSAGE_HANDLER(WM_CREATE, OnCreate) MESSAGE_HANDLER(WM_HOST_MOVED_NOTIFICATION, OnHostMoved) CHAIN_MSG_MAP(Base) END_MSG_MAP() HRESULT FinalConstruct(); virtual HRESULT OnDraw(ATL_DRAWINFO& draw_info); // NOLINT // IPersistPropertyBag implementation STDMETHOD(GetClassID)(CLSID* class_id) { if (class_id != NULL) *class_id = GetObjectCLSID(); return S_OK; } STDMETHOD(InitNew)() { return S_OK; } STDMETHOD(Load)(IPropertyBag* bag, IErrorLog* error_log); STDMETHOD(Save)(IPropertyBag* bag, BOOL clear_dirty, BOOL save_all) { return E_NOTIMPL; } // Used to setup the document_url_ member needed for completing navigation. // Create external tab (possibly in incognito mode). HRESULT IOleObject_SetClientSite(IOleClientSite* client_site); // Overridden to perform security checks. STDMETHOD(put_src)(BSTR src); // IChromeFrame // On a fresh install of ChromeFrame the BHO will not be loaded in existing // IE tabs/windows. This function instantiates the BHO and registers it // explicitly. STDMETHOD(registerBhoIfNeeded)(); protected: // ChromeFrameDelegate overrides virtual void OnLoad(const GURL& url); virtual void OnMessageFromChromeFrame(const std::string& message, const std::string& origin, const std::string& target); virtual void OnLoadFailed(int error_code, const std::string& url); virtual void OnAutomationServerLaunchFailed( AutomationLaunchResult reason, const std::string& server_version); virtual void OnChannelError(); // Separated to static function for unit testing this logic more easily. static bool ShouldShowVersionMismatchDialog(bool is_privileged, IOleClientSite* client_site); private: LRESULT OnCreate(UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); // NO_LINT LRESULT OnHostMoved(UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); // NO_LINT HRESULT GetContainingDocument(IHTMLDocument2** doc); HRESULT GetDocumentWindow(IHTMLWindow2** window); // Gets the value of the 'id' attribute of the object element. HRESULT GetObjectScriptId(IHTMLObjectElement* object_elem, BSTR* id); // Returns the object element in the HTML page. // Note that if we're not being hosted inside an HTML // document, then this call will fail. HRESULT GetObjectElement(IHTMLObjectElement** element); HRESULT CreateScriptBlockForEvent(IHTMLElement2* insert_after, BSTR instance_id, BSTR script, BSTR event_name); // Utility function that checks the size of the vector and if > 0 creates // a variant for the string argument and forwards the call to the other // FireEvent method. void FireEvent(const EventHandlers& handlers, const std::string& arg); // Invokes all registered handlers in a vector of event handlers. void FireEvent(const EventHandlers& handlers, IDispatch* event); // This variant is used for the privatemessage handler only. void FireEvent(const EventHandlers& handlers, IDispatch* event, BSTR target); // Installs a hook on the top-level window hosting the control. HRESULT InstallTopLevelHook(IOleClientSite* client_site); // A hook attached to the top-level window containing the ActiveX control. HHOOK chrome_wndproc_hook_; // Set to true if the current instance is attaching to an existing Chrome // tab. This occurs when a window.open request is performed by Chrome. bool attaching_to_existing_cf_tab_; }; #endif // CHROME_FRAME_CHROME_FRAME_ACTIVEX_H_