diff options
author | slightlyoff@chromium.org <slightlyoff@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-24 05:11:58 +0000 |
---|---|---|
committer | slightlyoff@chromium.org <slightlyoff@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-24 05:11:58 +0000 |
commit | f781782dd67077478e117c61dca4ea5eefce3544 (patch) | |
tree | 4801f724123cfdcbb69c4e7fe40a565b331723ae /chrome_frame/chrome_active_document.h | |
parent | 63cf4759efa2373e33436fb5df6849f930081226 (diff) | |
download | chromium_src-f781782dd67077478e117c61dca4ea5eefce3544.zip chromium_src-f781782dd67077478e117c61dca4ea5eefce3544.tar.gz chromium_src-f781782dd67077478e117c61dca4ea5eefce3544.tar.bz2 |
Initial import of the Chrome Frame codebase. Integration in chrome.gyp coming in a separate CL.
BUG=None
TEST=None
Review URL: http://codereview.chromium.org/218019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27042 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame/chrome_active_document.h')
-rw-r--r-- | chrome_frame/chrome_active_document.h | 258 |
1 files changed, 258 insertions, 0 deletions
diff --git a/chrome_frame/chrome_active_document.h b/chrome_frame/chrome_active_document.h new file mode 100644 index 0000000..b488bc5 --- /dev/null +++ b/chrome_frame/chrome_active_document.h @@ -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_ |