Index: chrome_frame/chrome_active_document.h |
=================================================================== |
--- chrome_frame/chrome_active_document.h (revision 0) |
+++ chrome_frame/chrome_active_document.h (revision 0) |
@@ -0,0 +1,258 @@ |
+// 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_CHROME_ACTIVE_DOCUMENT_H_ |
+#define CHROME_FRAME_CHROME_ACTIVE_DOCUMENT_H_ |
+ |
+#include <atlbase.h> |
+#include <atlcom.h> |
+#include <atlctl.h> |
+#include <map> |
+ |
+#include "base/scoped_ptr.h" |
+#include "base/scoped_comptr_win.h" |
+#include "base/thread.h" |
+ |
+#include "chrome_frame/chrome_frame_activex_base.h" |
+#include "chrome_frame/com_type_info_holder.h" |
+#include "chrome_frame/find_dialog.h" |
+#include "chrome_frame/in_place_menu.h" |
+#include "chrome_frame/ole_document_impl.h" |
+#include "chrome_frame/resource.h" |
+#include "chrome_frame/extra_system_apis.h" |
+ |
+class Thread; |
+class TabProxy; |
+class ChromeActiveDocument; |
+ |
+// A call to IOleCommandTarget::Exec on the webbrowser with this command id |
+// and a command group of CGID_EXPLORER causes IE to finalize the current |
+// travel log entry and move to a new location (pruning any forward entries |
+// if needed) |
+#define INTERNAL_CMDID_FINALIZE_TRAVEL_LOG (38) |
+ |
+// To set the lock icon status call IOleCommandTarget::Exec on site with |
+// this command id and a command group of CGID_EXPLORER The in arg is one of |
+// the values: SECURELOCK_SET_UNSECURE, SECURELOCK_SET_MIXED, |
+// SECURELOCK_SET_SECURE128BIT etc declared in shdeprecated.h |
+#define INTERNAL_CMDID_SET_SSL_LOCK (37) |
+ |
+// A call to IOleCommandTarget::Exec on the webbrowser with this command id |
+// and a command group of CGID_EXPLORER causes IE to replace the URL in the |
+// current travel log entry |
+#define UNDOC_CMDID_REPLACE_CURRENT_TRAVEL_LOG_ENTRY_URL (40) |
+ |
+#define UNDOC_IE_CONTEXTMENU_ADDFAV (2261) |
+#define UNDOC_IE_CONTEXTMENU_VIEWSOURCE (2139) |
+#define UNDOC_IE_CONTEXTMENU_REFRESH (6042) |
+ |
+// This macro should be defined in the public section of the class. |
+#define BEGIN_EXEC_COMMAND_MAP(theClass) \ |
+ public: \ |
+ HRESULT ProcessExecCommand(const GUID* cmd_group_guid, DWORD command_id, \ |
+ DWORD cmd_exec_opt, VARIANT* in_args, \ |
+ VARIANT* out_args) { \ |
+ HRESULT hr = OLECMDERR_E_NOTSUPPORTED; \ |
+ switch (command_id) { |
+ |
+ |
+#define EXEC_COMMAND_HANDLER(id, handler) \ |
+ case id: { \ |
+ hr = S_OK; \ |
+ handler(cmd_group_guid, command_id, cmd_exec_opt, in_args, out_args) \ |
+ break; \ |
+ } |
+ |
+#define EXEC_COMMAND_HANDLER_NO_ARGS(id, handler) \ |
+ case id: { \ |
+ hr = S_OK; \ |
+ handler(); \ |
+ break; \ |
+ } |
+ |
+#define EXEC_COMMAND_HANDLER_GENERIC(id, code) \ |
+ case id: { \ |
+ hr = S_OK; \ |
+ code; \ |
+ break; \ |
+ } |
+ |
+#define END_EXEC_COMMAND_MAP() \ |
+ default: \ |
+ break; \ |
+ } \ |
+ return hr; \ |
+} |
+ |
+// ChromeActiveDocument: Implementation of the Active Document object that is |
+// responsible for rendering pages in Chrome. This object delegates to |
+// Chrome.exe (via the Chrome IPC-based automation mechanism) for the actual |
+// rendering |
+class ATL_NO_VTABLE ChromeActiveDocument |
+ : public ChromeFrameActivexBase<ChromeActiveDocument, |
+ CLSID_ChromeActiveDocument>, |
+ public IOleDocumentImpl<ChromeActiveDocument>, |
+ public IOleDocumentViewImpl<ChromeActiveDocument>, |
+ public IPersistMoniker, |
+ public IOleCommandTarget, |
+ public InPlaceMenu<ChromeActiveDocument>, |
+ public IWebBrowserEventsUrlService { |
+ public: |
+ typedef ChromeFrameActivexBase<ChromeActiveDocument, |
+ CLSID_ChromeActiveDocument> Base; |
+ ChromeActiveDocument(); |
+ ~ChromeActiveDocument(); |
+ |
+ DECLARE_REGISTRY_RESOURCEID(IDR_CHROMEACTIVEDOCUMENT) |
+ |
+BEGIN_COM_MAP(ChromeActiveDocument) |
+ COM_INTERFACE_ENTRY(IOleDocument) |
+ COM_INTERFACE_ENTRY(IOleDocumentView) |
+ COM_INTERFACE_ENTRY(IPersistMoniker) |
+ COM_INTERFACE_ENTRY(IOleCommandTarget) |
+ COM_INTERFACE_ENTRY(IWebBrowserEventsUrlService) |
+ COM_INTERFACE_ENTRY_CHAIN(Base) |
+END_COM_MAP() |
+ |
+BEGIN_MSG_MAP(ChromeActiveDocument) |
+ CHAIN_MSG_MAP(Base) |
+END_MSG_MAP() |
+ |
+ HRESULT FinalConstruct(); |
+ |
+#define FORWARD_TAB_COMMAND(id, command) \ |
+ EXEC_COMMAND_HANDLER_GENERIC(id, GetTabProxy() ? GetTabProxy()->command() : 1) |
+ |
+BEGIN_EXEC_COMMAND_MAP(ChromeActiveDocument) |
+ EXEC_COMMAND_HANDLER_GENERIC(OLECMDID_PRINT, automation_client_->PrintTab()) |
+ EXEC_COMMAND_HANDLER_NO_ARGS(OLECMDID_FIND, OnFindInPage) |
+ EXEC_COMMAND_HANDLER_NO_ARGS(UNDOC_IE_CONTEXTMENU_VIEWSOURCE, OnViewSource) |
+ FORWARD_TAB_COMMAND(OLECMDID_SELECTALL, SelectAll) |
+ FORWARD_TAB_COMMAND(OLECMDID_CUT, Cut) |
+ FORWARD_TAB_COMMAND(OLECMDID_COPY, Copy) |
+ FORWARD_TAB_COMMAND(OLECMDID_PASTE, Paste) |
+ FORWARD_TAB_COMMAND(OLECMDID_REFRESH, ReloadAsync) |
+ FORWARD_TAB_COMMAND(OLECMDID_STOP, StopAsync) |
+END_EXEC_COMMAND_MAP() |
+ |
+ // IPCs from automation server. |
+ virtual void OnNavigationStateChanged(int tab_handle, int flags, |
+ const IPC::NavigationInfo& nav_info); |
+ virtual void OnUpdateTargetUrl(int tab_handle, |
+ const std::wstring& new_target_url); |
+ virtual void OnAcceleratorPressed(int tab_handle, const MSG& accel_message); |
+ virtual void OnTabbedOut(int tab_handle, bool reverse); |
+ virtual void OnDidNavigate(int tab_handle, |
+ const IPC::NavigationInfo& nav_info); |
+ |
+ void OnFindInPage(); |
+ |
+ // Override DoVerb |
+ STDMETHOD(DoVerb)(LONG verb, |
+ LPMSG msg, |
+ IOleClientSite* active_site, |
+ LONG index, |
+ HWND parent_window, |
+ LPCRECT pos); |
+ STDMETHOD(InPlaceDeactivate)(void); |
+ |
+ // Override IOleInPlaceActiveObjectImpl::OnDocWindowActivate |
+ STDMETHOD(OnDocWindowActivate)(BOOL activate); |
+ STDMETHOD(TranslateAccelerator)(MSG* msg); |
+ |
+ // IPersistMoniker methods |
+ STDMETHOD(GetClassID)(CLSID* class_id); |
+ STDMETHOD(IsDirty)(); |
+ STDMETHOD(GetCurMoniker)(IMoniker** moniker_name); |
+ STDMETHOD(Load)(BOOL fully_avalable, |
+ IMoniker* moniker_name, |
+ LPBC bind_context, |
+ DWORD mode); |
+ STDMETHOD(Save)(IMoniker* moniker_name, |
+ LPBC bind_context, |
+ BOOL remember); |
+ STDMETHOD(SaveCompleted)(IMoniker* moniker_name, |
+ LPBC bind_context); |
+ |
+ // IOleCommandTarget methods |
+ STDMETHOD(QueryStatus)(const GUID* cmd_group_guid, |
+ ULONG number_of_commands, |
+ OLECMD commands[], |
+ OLECMDTEXT* command_text); |
+ STDMETHOD(Exec)(const GUID* cmd_group_guid, DWORD command_id, |
+ DWORD cmd_exec_opt, |
+ VARIANT* in_args, |
+ VARIANT* out_args); |
+ |
+ // IWebBrowserEventsUrlService methods |
+ STDMETHOD(GetUrlForEvents)(BSTR* url); |
+ |
+ // ChromeFrameActivexBase overrides |
+ HRESULT IOleObject_SetClientSite(IOleClientSite* client_site); |
+ |
+ HRESULT ActiveXDocActivate(LONG verb); |
+ |
+ // Callbacks from ChromeFramePlugin<T> |
+ bool PreProcessContextMenu(HMENU menu); |
+ bool HandleContextMenuCommand(UINT cmd); |
+ |
+ // Should connections initiated by this class try to block |
+ // responses served with the X-Frame-Options header? |
+ bool is_frame_busting_enabled(); |
+ |
+ protected: |
+ // ChromeFrameActivexBase overrides |
+ virtual void OnOpenURL(int tab_handle, const GURL& url_to_open, |
+ int open_disposition); |
+ |
+ virtual void OnLoad(int tab_handle, const GURL& url); |
+ |
+ // A helper method that updates our internal navigation state |
+ // as well as IE's navigation state (viz Title and current URL). |
+ // The navigation_flags is a TabContents::InvalidateTypes enum |
+ void UpdateNavigationState(const IPC::NavigationInfo& nav_info); |
+ |
+ TabProxy* GetTabProxy() const { |
+ if (automation_client_.get()) |
+ return automation_client_->tab(); |
+ return NULL; |
+ } |
+ |
+ // Exec command handlers |
+ void OnViewSource(); |
+ |
+ // Call exec on our site's command target |
+ HRESULT IEExec(const GUID* cmd_group_guid, DWORD command_id, |
+ DWORD cmd_exec_opt, VARIANT* in_args, VARIANT* out_args); |
+ |
+ protected: |
+ typedef std::map<int, bool> EnabledCommandsMap; |
+ |
+ IPC::NavigationInfo navigation_info_; |
+ bool is_doc_object_; |
+ |
+ // This indicates whether this is the first navigation in this |
+ // active document. It is initalize to true and it is set to false |
+ // after we get a navigation notification from Chrome |
+ bool first_navigation_; |
+ |
+ // Our find dialog |
+ CFFindDialog find_dialog_; |
+ |
+ // Contains the list of enabled commands ids. |
+ EnabledCommandsMap enabled_commands_map_; |
+ |
+ // Set to true if the automation_client_ member is initialized from |
+ // an existing ChromeActiveDocument instance which is going away and |
+ // a new ChromeActiveDocument instance is taking its place. |
+ bool is_automation_client_reused_; |
+ |
+ public: |
+ ScopedComPtr<IOleInPlaceFrame> in_place_frame_; |
+ OLEINPLACEFRAMEINFO frame_info_; |
+}; |
+ |
+OBJECT_ENTRY_AUTO(__uuidof(ChromeActiveDocument), ChromeActiveDocument) |
+ |
+#endif // CHROME_FRAME_CHROME_ACTIVE_DOCUMENT_H_ |