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.
5 #ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_DELEGATE_H_
6 #define CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_DELEGATE_H_
10 #include "base/basictypes.h"
11 #include "base/callback.h"
12 #include "base/i18n/rtl.h"
13 #include "base/process/kill.h"
14 #include "base/strings/string16.h"
15 #include "content/common/content_export.h"
16 #include "content/public/common/javascript_message_type.h"
17 #include "content/public/common/media_stream_request.h"
18 #include "content/public/common/page_transition_types.h"
19 #include "net/base/load_states.h"
20 #include "third_party/WebKit/public/web/WebPopupType.h"
21 #include "ui/base/window_open_disposition.h"
25 class WebKeyboardEvent
;
26 struct ViewHostMsg_CreateWindow_Params
;
27 struct ViewHostMsg_DidFailProvisionalLoadWithError_Params
;
28 struct ViewHostMsg_FrameNavigate_Params
;
29 struct ViewMsg_PostMessage_Params
;
30 struct WebPreferences
;
53 class RenderViewHostDelegateView
;
54 class SessionStorageNamespace
;
57 class WebContentsImpl
;
58 struct ContextMenuParams
;
59 struct FileChooserParams
;
60 struct GlobalRequestID
;
61 struct NativeWebKeyboardEvent
;
63 struct RendererPreferences
;
64 struct ResourceRedirectDetails
;
65 struct ResourceRequestDetails
;
68 // RenderViewHostDelegate
70 // An interface implemented by an object interested in knowing about the state
71 // of the RenderViewHost.
73 // This interface currently encompasses every type of message that was
74 // previously being sent by WebContents itself. Some of these notifications
75 // may not be relevant to all users of RenderViewHost and we should consider
76 // exposing a more generic Send function on RenderViewHost and a response
77 // listener here to serve that need.
78 class CONTENT_EXPORT RenderViewHostDelegate
{
80 // RendererManagerment -------------------------------------------------------
81 // Functions for managing switching of Renderers. For WebContents, this is
82 // implemented by the RenderFrameHostManager.
84 class CONTENT_EXPORT RendererManagement
{
86 // Notification whether we should close the page, after an explicit call to
87 // AttemptToClosePage. This is called before a cross-site request or before
88 // a tab/window is closed (as indicated by the first parameter) to allow the
89 // appropriate renderer to approve or deny the request. |proceed| indicates
90 // whether the user chose to proceed. |proceed_time| is the time when the
91 // request was allowed to proceed.
92 virtual void ShouldClosePage(
93 bool for_cross_site_transition
,
95 const base::TimeTicks
& proceed_time
) = 0;
97 // The |pending_render_view_host| is ready to commit a page. The delegate
98 // should ensure that the old RenderViewHost runs its unload handler first
99 // and determine whether a RenderViewHost transfer is needed.
100 virtual void OnCrossSiteResponse(
101 RenderViewHost
* pending_render_view_host
,
102 const GlobalRequestID
& global_request_id
,
104 const std::vector
<GURL
>& transfer_url_chain
,
105 const Referrer
& referrer
,
106 PageTransition page_transition
,
108 bool should_replace_current_entry
) = 0;
111 virtual ~RendererManagement() {}
114 // ---------------------------------------------------------------------------
116 // Returns the current delegate associated with a feature. May return NULL if
117 // there is no corresponding delegate.
118 virtual RenderViewHostDelegateView
* GetDelegateView();
119 virtual RendererManagement
* GetRendererManagementDelegate();
121 // This is used to give the delegate a chance to filter IPC messages.
122 virtual bool OnMessageReceived(RenderViewHost
* render_view_host
,
123 const IPC::Message
& message
);
125 // Gets the URL that is currently being displayed, if there is one.
126 virtual const GURL
& GetURL() const;
128 // Return this object cast to a WebContents, if it is one. If the object is
129 // not a WebContents, returns NULL. DEPRECATED: Be sure to include brettw or
130 // jam as reviewers before you use this method. http://crbug.com/82582
131 virtual WebContents
* GetAsWebContents();
133 // Return the rect where to display the resize corner, if any, otherwise
135 virtual gfx::Rect
GetRootWindowResizerRect() const = 0;
137 // The RenderView is being constructed (message sent to the renderer process
138 // to construct a RenderView). Now is a good time to send other setup events
139 // to the RenderView. This precedes any other commands to the RenderView.
140 virtual void RenderViewCreated(RenderViewHost
* render_view_host
) {}
142 // The RenderView has been constructed.
143 virtual void RenderViewReady(RenderViewHost
* render_view_host
) {}
145 // The RenderView died somehow (crashed or was killed by the user).
146 virtual void RenderViewTerminated(RenderViewHost
* render_view_host
,
147 base::TerminationStatus status
,
150 // The RenderView is going to be deleted. This is called when each
151 // RenderView is going to be destroyed
152 virtual void RenderViewDeleted(RenderViewHost
* render_view_host
) {}
154 // The RenderView processed a redirect during a provisional load.
156 // TODO(creis): Remove this method and have the pre-rendering code listen to
157 // WebContentsObserver::DidGetRedirectForResourceRequest instead.
158 // See http://crbug.com/78512.
159 virtual void DidRedirectProvisionalLoad(
160 RenderViewHost
* render_view_host
,
162 const GURL
& source_url
,
163 const GURL
& target_url
) {}
165 // A provisional load in the RenderView failed.
166 virtual void DidFailProvisionalLoadWithError(
167 RenderViewHost
* render_view_host
,
168 const ViewHostMsg_DidFailProvisionalLoadWithError_Params
& params
) {}
170 // A response has been received for a resource request.
171 virtual void DidGetResourceResponseStart(
172 const ResourceRequestDetails
& details
) {}
174 // A redirect was received while requesting a resource.
175 virtual void DidGetRedirectForResourceRequest(
176 const ResourceRedirectDetails
& details
) {}
178 // The RenderView was navigated to a different page.
179 virtual void DidNavigate(RenderViewHost
* render_view_host
,
180 const ViewHostMsg_FrameNavigate_Params
& params
) {}
182 // The state for the page changed and should be updated.
183 virtual void UpdateState(RenderViewHost
* render_view_host
,
185 const PageState
& state
) {}
187 // The page's title was changed and should be updated.
188 virtual void UpdateTitle(RenderViewHost
* render_view_host
,
190 const base::string16
& title
,
191 base::i18n::TextDirection title_direction
) {}
193 // The page's encoding was changed and should be updated.
194 virtual void UpdateEncoding(RenderViewHost
* render_view_host
,
195 const std::string
& encoding
) {}
197 // The destination URL has changed should be updated
198 virtual void UpdateTargetURL(int32 page_id
, const GURL
& url
) {}
200 // The page is trying to close the RenderView's representation in the client.
201 virtual void Close(RenderViewHost
* render_view_host
) {}
203 // The RenderViewHost has been swapped out.
204 virtual void SwappedOut(RenderViewHost
* render_view_host
) {}
206 // The page is trying to move the RenderView's representation in the client.
207 virtual void RequestMove(const gfx::Rect
& new_bounds
) {}
209 // The RenderView began loading a new page. This corresponds to WebKit's
210 // notion of the throbber starting.
211 virtual void DidStartLoading(RenderViewHost
* render_view_host
) {}
213 // The RenderView stopped loading a page. This corresponds to WebKit's
214 // notion of the throbber stopping.
215 virtual void DidStopLoading(RenderViewHost
* render_view_host
) {}
217 // The pending page load was canceled.
218 virtual void DidCancelLoading() {}
220 // The RenderView made progress loading a page's top frame.
221 // |progress| is a value between 0 (nothing loaded) to 1.0 (top frame
223 virtual void DidChangeLoadProgress(double progress
) {}
225 // The RenderView set its opener to null, disowning it for the lifetime of
227 virtual void DidDisownOpener(RenderViewHost
* rvh
) {}
229 // Another page accessed the initial empty document of this RenderView,
230 // which means it is no longer safe to display a pending URL without
231 // risking a URL spoof.
232 virtual void DidAccessInitialDocument() {}
234 // The RenderView's main frame document element is ready. This happens when
235 // the document has finished parsing.
236 virtual void DocumentAvailableInMainFrame(RenderViewHost
* render_view_host
) {}
238 // The onload handler in the RenderView's main frame has completed.
239 virtual void DocumentOnLoadCompletedInMainFrame(
240 RenderViewHost
* render_view_host
,
243 // The page wants to open a URL with the specified disposition.
244 virtual void RequestOpenURL(RenderViewHost
* rvh
,
246 const Referrer
& referrer
,
247 WindowOpenDisposition disposition
,
248 int64 source_frame_id
,
250 bool user_gesture
) {}
252 // The page wants to transfer the request to a new renderer.
253 // |redirect_chain| contains any redirect URLs (excluding |url|) that happened
254 // before the transfer.
255 virtual void RequestTransferURL(
257 const std::vector
<GURL
>& redirect_chain
,
258 const Referrer
& referrer
,
259 PageTransition page_transition
,
260 WindowOpenDisposition disposition
,
261 int64 source_frame_id
,
262 const GlobalRequestID
& old_request_id
,
264 bool user_gesture
) {}
266 // The page wants to close the active view in this tab.
267 virtual void RouteCloseEvent(RenderViewHost
* rvh
) {}
269 // The page wants to post a message to the active view in this tab.
270 virtual void RouteMessageEvent(
272 const ViewMsg_PostMessage_Params
& params
) {}
274 // A javascript message, confirmation or prompt should be shown.
275 virtual void RunJavaScriptMessage(RenderViewHost
* rvh
,
276 const base::string16
& message
,
277 const base::string16
& default_prompt
,
278 const GURL
& frame_url
,
279 JavaScriptMessageType type
,
280 IPC::Message
* reply_msg
,
281 bool* did_suppress_message
) {}
283 virtual void RunBeforeUnloadConfirm(RenderViewHost
* rvh
,
284 const base::string16
& message
,
286 IPC::Message
* reply_msg
) {}
288 // A message was added to to the console.
289 virtual bool AddMessageToConsole(int32 level
,
290 const base::string16
& message
,
292 const base::string16
& source_id
);
294 // Return a dummy RendererPreferences object that will be used by the renderer
295 // associated with the owning RenderViewHost.
296 virtual RendererPreferences
GetRendererPrefs(
297 BrowserContext
* browser_context
) const = 0;
299 // Returns a WebPreferences object that will be used by the renderer
300 // associated with the owning render view host.
301 virtual WebPreferences
GetWebkitPrefs();
303 // Notification the user has made a gesture while focus was on the
304 // page. This is used to avoid uninitiated user downloads (aka carpet
305 // bombing), see DownloadRequestLimiter for details.
306 virtual void OnUserGesture() {}
308 // Notification from the renderer host that blocked UI event occurred.
309 // This happens when there are tab-modal dialogs. In this case, the
310 // notification is needed to let us draw attention to the dialog (i.e.
311 // refocus on the modal dialog, flash title etc).
312 virtual void OnIgnoredUIEvent() {}
314 // Notification that the renderer has become unresponsive. The
315 // delegate can use this notification to show a warning to the user.
316 virtual void RendererUnresponsive(RenderViewHost
* render_view_host
,
317 bool is_during_before_unload
,
318 bool is_during_unload
) {}
320 // Notification that a previously unresponsive renderer has become
321 // responsive again. The delegate can use this notification to end the
322 // warning shown to the user.
323 virtual void RendererResponsive(RenderViewHost
* render_view_host
) {}
325 // Notification that the RenderViewHost's load state changed.
326 virtual void LoadStateChanged(const GURL
& url
,
327 const net::LoadStateWithParam
& load_state
,
328 uint64 upload_position
,
329 uint64 upload_size
) {}
331 // Notification that a worker process has crashed.
332 virtual void WorkerCrashed() {}
334 // The page wants the hosting window to activate/deactivate itself (it
335 // called the JavaScript window.focus()/blur() method).
336 virtual void Activate() {}
337 virtual void Deactivate() {}
339 // Notification that the view has lost capture.
340 virtual void LostCapture() {}
342 // Notifications about mouse events in this view. This is useful for
343 // implementing global 'on hover' features external to the view.
344 virtual void HandleMouseMove() {}
345 virtual void HandleMouseDown() {}
346 virtual void HandleMouseLeave() {}
347 virtual void HandleMouseUp() {}
348 virtual void HandlePointerActivate() {}
349 virtual void HandleGestureBegin() {}
350 virtual void HandleGestureEnd() {}
352 // Called when a file selection is to be done.
353 virtual void RunFileChooser(
354 RenderViewHost
* render_view_host
,
355 const FileChooserParams
& params
) {}
357 // Notification that the page wants to go into or out of fullscreen mode.
358 virtual void ToggleFullscreenMode(bool enter_fullscreen
) {}
359 virtual bool IsFullscreenForCurrentTab() const;
361 // The contents' preferred size changed.
362 virtual void UpdatePreferredSize(const gfx::Size
& pref_size
) {}
364 // The contents auto-resized and the container should match it.
365 virtual void ResizeDueToAutoResize(const gfx::Size
& new_size
) {}
367 // Requests to lock the mouse. Once the request is approved or rejected,
368 // GotResponseToLockMouseRequest() will be called on the requesting render
370 virtual void RequestToLockMouse(bool user_gesture
,
371 bool last_unlocked_by_target
) {}
373 // Notification that the view has lost the mouse lock.
374 virtual void LostMouseLock() {}
376 // The page is trying to open a new page (e.g. a popup window). The window
377 // should be created associated with the given |route_id| in process
378 // |render_process_id|, but it should not be shown yet. That should happen in
379 // response to ShowCreatedWindow.
380 // |params.window_container_type| describes the type of RenderViewHost
381 // container that is requested -- in particular, the window.open call may
382 // have specified 'background' and 'persistent' in the feature string.
384 // The passed |params.frame_name| parameter is the name parameter that was
385 // passed to window.open(), and will be empty if none was passed.
387 // Note: this is not called "CreateWindow" because that will clash with
388 // the Windows function which is actually a #define.
389 virtual void CreateNewWindow(
390 int render_process_id
,
392 int main_frame_route_id
,
393 const ViewHostMsg_CreateWindow_Params
& params
,
394 SessionStorageNamespace
* session_storage_namespace
) {}
396 // The page is trying to open a new widget (e.g. a select popup). The
397 // widget should be created associated with the given |route_id| in the
398 // process |render_process_id|, but it should not be shown yet. That should
399 // happen in response to ShowCreatedWidget.
400 // |popup_type| indicates if the widget is a popup and what kind of popup it
401 // is (select, autofill...).
402 virtual void CreateNewWidget(int render_process_id
,
404 blink::WebPopupType popup_type
) {}
406 // Creates a full screen RenderWidget. Similar to above.
407 virtual void CreateNewFullscreenWidget(int render_process_id
, int route_id
) {}
409 // Show a previously created page with the specified disposition and bounds.
410 // The window is identified by the route_id passed to CreateNewWindow.
412 // Note: this is not called "ShowWindow" because that will clash with
413 // the Windows function which is actually a #define.
414 virtual void ShowCreatedWindow(int route_id
,
415 WindowOpenDisposition disposition
,
416 const gfx::Rect
& initial_pos
,
417 bool user_gesture
) {}
419 // Show the newly created widget with the specified bounds.
420 // The widget is identified by the route_id passed to CreateNewWidget.
421 virtual void ShowCreatedWidget(int route_id
,
422 const gfx::Rect
& initial_pos
) {}
424 // Show the newly created full screen widget. Similar to above.
425 virtual void ShowCreatedFullscreenWidget(int route_id
) {}
427 // A context menu should be shown, to be built using the context information
428 // provided in the supplied params.
429 virtual void ShowContextMenu(const ContextMenuParams
& params
) {}
431 // The render view has requested access to media devices listed in
432 // |request|, and the client should grant or deny that permission by
433 // calling |callback|.
434 virtual void RequestMediaAccessPermission(
435 const MediaStreamRequest
& request
,
436 const MediaResponseCallback
& callback
) {}
438 // Returns the SessionStorageNamespace the render view should use. Might
439 // create the SessionStorageNamespace on the fly.
440 virtual SessionStorageNamespace
* GetSessionStorageNamespace(
441 SiteInstance
* instance
);
443 // Returns the FrameTree the render view should use. Guaranteed to be constant
444 // for the lifetime of the render view.
446 // TODO(ajwong): Remove once the main frame RenderFrameHost is no longer
447 // created by the RenderViewHost.
448 virtual FrameTree
* GetFrameTree();
451 virtual ~RenderViewHostDelegate() {}
454 } // namespace content
456 #endif // CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_DELEGATE_H_