1 // Copyright 2013 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 CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_IMPL_H_ 6 #define CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_IMPL_H_ 7 8 #include <map> 9 #include <vector> 10 11 #include "base/callback.h" 12 #include "base/compiler_specific.h" 13 #include "base/memory/weak_ptr.h" 14 #include "base/strings/string16.h" 15 #include "base/time/time.h" 16 #include "content/common/content_export.h" 17 #include "content/public/browser/render_frame_host.h" 18 #include "content/public/common/javascript_message_type.h" 19 #include "content/public/common/page_transition_types.h" 20 #include "third_party/WebKit/public/web/WebTextDirection.h" 21 22 class GURL; 23 struct FrameHostMsg_DidFailProvisionalLoadWithError_Params; 24 struct FrameHostMsg_OpenURL_Params; 25 struct FrameMsg_Navigate_Params; 26 27 namespace base { 28 class FilePath; 29 class ListValue; 30 } 31 32 namespace content { 33 34 class CrossProcessFrameConnector; 35 class CrossSiteTransferringRequest; 36 class FrameTree; 37 class FrameTreeNode; 38 class RenderFrameHostDelegate; 39 class RenderFrameProxyHost; 40 class RenderProcessHost; 41 class RenderViewHostImpl; 42 class RenderWidgetHostImpl; 43 struct ContextMenuParams; 44 struct GlobalRequestID; 45 struct Referrer; 46 struct ShowDesktopNotificationHostMsgParams; 47 48 class CONTENT_EXPORT RenderFrameHostImpl : public RenderFrameHost { 49 public: 50 static RenderFrameHostImpl* FromID(int process_id, int routing_id); 51 52 virtual ~RenderFrameHostImpl(); 53 54 // RenderFrameHost 55 virtual int GetRoutingID() OVERRIDE; 56 virtual SiteInstance* GetSiteInstance() OVERRIDE; 57 virtual RenderProcessHost* GetProcess() OVERRIDE; 58 virtual RenderFrameHost* GetParent() OVERRIDE; 59 virtual const std::string& GetFrameName() OVERRIDE; 60 virtual bool IsCrossProcessSubframe() OVERRIDE; 61 virtual GURL GetLastCommittedURL() OVERRIDE; 62 virtual gfx::NativeView GetNativeView() OVERRIDE; 63 virtual void ExecuteJavaScript( 64 const base::string16& javascript) OVERRIDE; 65 virtual void ExecuteJavaScript( 66 const base::string16& javascript, 67 const JavaScriptResultCallback& callback) OVERRIDE; 68 virtual RenderViewHost* GetRenderViewHost() OVERRIDE; 69 70 // IPC::Sender 71 virtual bool Send(IPC::Message* msg) OVERRIDE; 72 73 // IPC::Listener 74 virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; 75 76 void Init(); 77 int routing_id() const { return routing_id_; } 78 void OnCreateChildFrame(int new_routing_id, 79 const std::string& frame_name); 80 81 RenderViewHostImpl* render_view_host() { return render_view_host_; } 82 RenderFrameHostDelegate* delegate() { return delegate_; } 83 FrameTreeNode* frame_tree_node() { return frame_tree_node_; } 84 // TODO(nasko): The RenderWidgetHost will be owned by RenderFrameHost in 85 // the future, so update this accessor to return the right pointer. 86 RenderWidgetHostImpl* GetRenderWidgetHost(); 87 88 // This function is called when this is a swapped out RenderFrameHost that 89 // lives in the same process as the parent frame. The 90 // |cross_process_frame_connector| allows the non-swapped-out 91 // RenderFrameHost for a frame to communicate with the parent process 92 // so that it may composite drawing data. 93 // 94 // Ownership is not transfered. 95 void set_cross_process_frame_connector( 96 CrossProcessFrameConnector* cross_process_frame_connector) { 97 cross_process_frame_connector_ = cross_process_frame_connector; 98 } 99 100 void set_render_frame_proxy_host(RenderFrameProxyHost* proxy) { 101 render_frame_proxy_host_ = proxy; 102 } 103 104 // Returns a bitwise OR of bindings types that have been enabled for this 105 // RenderFrameHostImpl's RenderView. See BindingsPolicy for details. 106 // TODO(creis): Make bindings frame-specific, to support cases like <webview>. 107 int GetEnabledBindings(); 108 109 // Called on the pending RenderFrameHost when the network response is ready to 110 // commit. We should ensure that the old RenderFrameHost runs its unload 111 // handler and determine whether a transfer to a different RenderFrameHost is 112 // needed. 113 void OnCrossSiteResponse( 114 const GlobalRequestID& global_request_id, 115 scoped_ptr<CrossSiteTransferringRequest> cross_site_transferring_request, 116 const std::vector<GURL>& transfer_url_chain, 117 const Referrer& referrer, 118 PageTransition page_transition, 119 bool should_replace_current_entry); 120 121 // Tells the renderer that this RenderFrame is being swapped out for one in a 122 // different renderer process. It should run its unload handler, move to 123 // a blank document and create a RenderFrameProxy to replace the RenderFrame. 124 // The renderer should preserve the Proxy object until it exits, in case we 125 // come back. The renderer can exit if it has no other active RenderFrames, 126 // but not until WasSwappedOut is called (when it is no longer visible). 127 void SwapOut(RenderFrameProxyHost* proxy); 128 129 void OnSwappedOut(bool timed_out); 130 bool is_swapped_out() { return is_swapped_out_; } 131 void set_swapped_out(bool is_swapped_out) { 132 is_swapped_out_ = is_swapped_out; 133 } 134 135 // Sets the RVH for |this| as pending shutdown. |on_swap_out| will be called 136 // when the SwapOutACK is received. 137 void SetPendingShutdown(const base::Closure& on_swap_out); 138 139 // Sends the given navigation message. Use this rather than sending it 140 // yourself since this does the internal bookkeeping described below. This 141 // function takes ownership of the provided message pointer. 142 // 143 // If a cross-site request is in progress, we may be suspended while waiting 144 // for the onbeforeunload handler, so this function might buffer the message 145 // rather than sending it. 146 void Navigate(const FrameMsg_Navigate_Params& params); 147 148 // Load the specified URL; this is a shortcut for Navigate(). 149 void NavigateToURL(const GURL& url); 150 151 // Runs the beforeunload handler for this frame. |for_cross_site_transition| 152 // indicates whether this call is for the current frame during a cross-process 153 // navigation. False means we're closing the entire tab. 154 void DispatchBeforeUnload(bool for_cross_site_transition); 155 156 // Deletes the current selection plus the specified number of characters 157 // before and after the selection or caret. 158 void ExtendSelectionAndDelete(size_t before, size_t after); 159 160 // Notifies the RenderFrame that the JavaScript message that was shown was 161 // closed by the user. 162 void JavaScriptDialogClosed(IPC::Message* reply_msg, 163 bool success, 164 const base::string16& user_input, 165 bool dialog_was_suppressed); 166 167 // Called when an HTML5 notification is closed. 168 void NotificationClosed(int notification_id); 169 170 protected: 171 friend class RenderFrameHostFactory; 172 173 // TODO(nasko): Remove dependency on RenderViewHost here. RenderProcessHost 174 // should be the abstraction needed here, but we need RenderViewHost to pass 175 // into WebContentsObserver::FrameDetached for now. 176 RenderFrameHostImpl(RenderViewHostImpl* render_view_host, 177 RenderFrameHostDelegate* delegate, 178 FrameTree* frame_tree, 179 FrameTreeNode* frame_tree_node, 180 int routing_id, 181 bool is_swapped_out); 182 183 private: 184 friend class TestRenderFrameHost; 185 friend class TestRenderViewHost; 186 187 // IPC Message handlers. 188 void OnAddMessageToConsole(int32 level, 189 const base::string16& message, 190 int32 line_no, 191 const base::string16& source_id); 192 void OnDetach(); 193 void OnFrameFocused(); 194 void OnOpenURL(const FrameHostMsg_OpenURL_Params& params); 195 void OnDocumentOnLoadCompleted(); 196 void OnDidStartProvisionalLoadForFrame(int parent_routing_id, 197 const GURL& url); 198 void OnDidFailProvisionalLoadWithError( 199 const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params); 200 void OnDidFailLoadWithError( 201 const GURL& url, 202 int error_code, 203 const base::string16& error_description); 204 void OnDidRedirectProvisionalLoad(int32 page_id, 205 const GURL& source_url, 206 const GURL& target_url); 207 void OnNavigate(const IPC::Message& msg); 208 void OnBeforeUnloadACK( 209 bool proceed, 210 const base::TimeTicks& renderer_before_unload_start_time, 211 const base::TimeTicks& renderer_before_unload_end_time); 212 void OnSwapOutACK(); 213 void OnContextMenu(const ContextMenuParams& params); 214 void OnJavaScriptExecuteResponse(int id, const base::ListValue& result); 215 void OnRunJavaScriptMessage(const base::string16& message, 216 const base::string16& default_prompt, 217 const GURL& frame_url, 218 JavaScriptMessageType type, 219 IPC::Message* reply_msg); 220 void OnRunBeforeUnloadConfirm(const GURL& frame_url, 221 const base::string16& message, 222 bool is_reload, 223 IPC::Message* reply_msg); 224 void OnRequestDesktopNotificationPermission(const GURL& origin, 225 int callback_id); 226 void OnShowDesktopNotification( 227 int notification_id, 228 const ShowDesktopNotificationHostMsgParams& params); 229 void OnCancelDesktopNotification(int notification_id); 230 void OnTextSurroundingSelectionResponse(const base::string16& content, 231 size_t start_offset, 232 size_t end_offset); 233 void OnDidAccessInitialDocument(); 234 void OnDidDisownOpener(); 235 void OnUpdateTitle(int32 page_id, 236 const base::string16& title, 237 blink::WebTextDirection title_direction); 238 void OnUpdateEncoding(const std::string& encoding); 239 240 // Returns whether the given URL is allowed to commit in the current process. 241 // This is a more conservative check than RenderProcessHost::FilterURL, since 242 // it will be used to kill processes that commit unauthorized URLs. 243 bool CanCommitURL(const GURL& url); 244 245 void DesktopNotificationPermissionRequestDone(int callback_context); 246 247 // For now, RenderFrameHosts indirectly keep RenderViewHosts alive via a 248 // refcount that calls Shutdown when it reaches zero. This allows each 249 // RenderFrameHostManager to just care about RenderFrameHosts, while ensuring 250 // we have a RenderViewHost for each RenderFrameHost. 251 // TODO(creis): RenderViewHost will eventually go away and be replaced with 252 // some form of page context. 253 RenderViewHostImpl* render_view_host_; 254 255 RenderFrameHostDelegate* delegate_; 256 257 // |cross_process_frame_connector_| passes messages from an out-of-process 258 // child frame to the parent process for compositing. 259 // 260 // This is only non-NULL when this is the swapped out RenderFrameHost in 261 // the same site instance as this frame's parent. 262 // 263 // See the class comment above CrossProcessFrameConnector for more 264 // information. 265 // 266 // This will move to RenderFrameProxyHost when that class is created. 267 CrossProcessFrameConnector* cross_process_frame_connector_; 268 269 // The proxy created for this RenderFrameHost. It is used to send and receive 270 // IPC messages while in swapped out state. 271 // TODO(nasko): This can be removed once we don't have a swapped out state on 272 // RenderFrameHosts. See https://crbug.com/357747. 273 RenderFrameProxyHost* render_frame_proxy_host_; 274 275 // Reference to the whole frame tree that this RenderFrameHost belongs to. 276 // Allows this RenderFrameHost to add and remove nodes in response to 277 // messages from the renderer requesting DOM manipulation. 278 FrameTree* frame_tree_; 279 280 // The FrameTreeNode which this RenderFrameHostImpl is hosted in. 281 FrameTreeNode* frame_tree_node_; 282 283 // The mapping of pending JavaScript calls created by 284 // ExecuteJavaScript and their corresponding callbacks. 285 std::map<int, JavaScriptResultCallback> javascript_callbacks_; 286 287 // Map from notification_id to a callback to cancel them. 288 std::map<int, base::Closure> cancel_notification_callbacks_; 289 290 int routing_id_; 291 bool is_swapped_out_; 292 293 // When the last BeforeUnload message was sent. 294 base::TimeTicks send_before_unload_start_time_; 295 296 base::WeakPtrFactory<RenderFrameHostImpl> weak_ptr_factory_; 297 298 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostImpl); 299 }; 300 301 } // namespace content 302 303 #endif // CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_IMPL_H_ 304