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.
4
5#ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_DELEGATE_H_
6#define CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_DELEGATE_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/callback.h"
12#include "base/process/kill.h"
13#include "base/strings/string16.h"
14#include "content/browser/dom_storage/session_storage_namespace_impl.h"
15#include "content/common/content_export.h"
16#include "net/base/load_states.h"
17#include "third_party/WebKit/public/web/WebPopupType.h"
18#include "ui/base/window_open_disposition.h"
19
20class GURL;
21class SkBitmap;
22struct ViewHostMsg_CreateWindow_Params;
23struct FrameHostMsg_DidCommitProvisionalLoad_Params;
24struct ViewMsg_PostMessage_Params;
25
26namespace base {
27class ListValue;
28class TimeTicks;
29}
30
31namespace IPC {
32class Message;
33}
34
35namespace gfx {
36class Point;
37class Rect;
38class Size;
39}
40
41namespace content {
42
43class BrowserContext;
44class CrossSiteTransferringRequest;
45class FrameTree;
46class PageState;
47class RenderViewHost;
48class RenderViewHostDelegateView;
49class SessionStorageNamespace;
50class SiteInstance;
51class WebContents;
52class WebContentsImpl;
53struct FileChooserParams;
54struct GlobalRequestID;
55struct NativeWebKeyboardEvent;
56struct Referrer;
57struct RendererPreferences;
58struct WebPreferences;
59
60//
61// RenderViewHostDelegate
62//
63//  An interface implemented by an object interested in knowing about the state
64//  of the RenderViewHost.
65//
66//  This interface currently encompasses every type of message that was
67//  previously being sent by WebContents itself. Some of these notifications
68//  may not be relevant to all users of RenderViewHost and we should consider
69//  exposing a more generic Send function on RenderViewHost and a response
70//  listener here to serve that need.
71class CONTENT_EXPORT RenderViewHostDelegate {
72 public:
73  // Returns the current delegate associated with a feature. May return NULL if
74  // there is no corresponding delegate.
75  virtual RenderViewHostDelegateView* GetDelegateView();
76
77  // This is used to give the delegate a chance to filter IPC messages.
78  virtual bool OnMessageReceived(RenderViewHost* render_view_host,
79                                 const IPC::Message& message);
80
81  // Return this object cast to a WebContents, if it is one. If the object is
82  // not a WebContents, returns NULL. DEPRECATED: Be sure to include brettw or
83  // jam as reviewers before you use this method. http://crbug.com/82582
84  virtual WebContents* GetAsWebContents();
85
86  // Return the rect where to display the resize corner, if any, otherwise
87  // an empty rect.
88  virtual gfx::Rect GetRootWindowResizerRect() const = 0;
89
90  // The RenderView is being constructed (message sent to the renderer process
91  // to construct a RenderView).  Now is a good time to send other setup events
92  // to the RenderView.  This precedes any other commands to the RenderView.
93  virtual void RenderViewCreated(RenderViewHost* render_view_host) {}
94
95  // The RenderView has been constructed.
96  virtual void RenderViewReady(RenderViewHost* render_view_host) {}
97
98  // The RenderView died somehow (crashed or was killed by the user).
99  virtual void RenderViewTerminated(RenderViewHost* render_view_host,
100                                    base::TerminationStatus status,
101                                    int error_code) {}
102
103  // The RenderView is going to be deleted. This is called when each
104  // RenderView is going to be destroyed
105  virtual void RenderViewDeleted(RenderViewHost* render_view_host) {}
106
107  // The state for the page changed and should be updated.
108  virtual void UpdateState(RenderViewHost* render_view_host,
109                           int32 page_id,
110                           const PageState& state) {}
111
112  // The destination URL has changed should be updated.
113  virtual void UpdateTargetURL(const GURL& url) {}
114
115  // The page is trying to close the RenderView's representation in the client.
116  virtual void Close(RenderViewHost* render_view_host) {}
117
118  // The page is trying to move the RenderView's representation in the client.
119  virtual void RequestMove(const gfx::Rect& new_bounds) {}
120
121  // The pending page load was canceled.
122  virtual void DidCancelLoading() {}
123
124  // The RenderView's main frame document element is ready. This happens when
125  // the document has finished parsing.
126  virtual void DocumentAvailableInMainFrame(RenderViewHost* render_view_host) {}
127
128  // The page wants to close the active view in this tab.
129  virtual void RouteCloseEvent(RenderViewHost* rvh) {}
130
131  // The page wants to post a message to the active view in this tab.
132  virtual void RouteMessageEvent(
133      RenderViewHost* rvh,
134      const ViewMsg_PostMessage_Params& params) {}
135
136  // Return a dummy RendererPreferences object that will be used by the renderer
137  // associated with the owning RenderViewHost.
138  virtual RendererPreferences GetRendererPrefs(
139      BrowserContext* browser_context) const = 0;
140
141  // Computes a WebPreferences object that will be used by the renderer
142  // associated with the owning render view host.
143  virtual WebPreferences ComputeWebkitPrefs();
144
145  // Notification the user has made a gesture while focus was on the
146  // page. This is used to avoid uninitiated user downloads (aka carpet
147  // bombing), see DownloadRequestLimiter for details.
148  virtual void OnUserGesture() {}
149
150  // Notification from the renderer host that blocked UI event occurred.
151  // This happens when there are tab-modal dialogs. In this case, the
152  // notification is needed to let us draw attention to the dialog (i.e.
153  // refocus on the modal dialog, flash title etc).
154  virtual void OnIgnoredUIEvent() {}
155
156  // Notification that the renderer has become unresponsive. The
157  // delegate can use this notification to show a warning to the user.
158  virtual void RendererUnresponsive(RenderViewHost* render_view_host,
159                                    bool is_during_before_unload,
160                                    bool is_during_unload) {}
161
162  // Notification that a previously unresponsive renderer has become
163  // responsive again. The delegate can use this notification to end the
164  // warning shown to the user.
165  virtual void RendererResponsive(RenderViewHost* render_view_host) {}
166
167  // Notification that the RenderViewHost's load state changed.
168  virtual void LoadStateChanged(const GURL& url,
169                                const net::LoadStateWithParam& load_state,
170                                uint64 upload_position,
171                                uint64 upload_size) {}
172
173  // The page wants the hosting window to activate/deactivate itself (it
174  // called the JavaScript window.focus()/blur() method).
175  virtual void Activate() {}
176  virtual void Deactivate() {}
177
178  // Notification that the view has lost capture.
179  virtual void LostCapture() {}
180
181  // Notifications about mouse events in this view.  This is useful for
182  // implementing global 'on hover' features external to the view.
183  virtual void HandleMouseMove() {}
184  virtual void HandleMouseDown() {}
185  virtual void HandleMouseLeave() {}
186  virtual void HandleMouseUp() {}
187  virtual void HandlePointerActivate() {}
188  virtual void HandleGestureBegin() {}
189  virtual void HandleGestureEnd() {}
190
191  // Called when a file selection is to be done.
192  virtual void RunFileChooser(
193      RenderViewHost* render_view_host,
194      const FileChooserParams& params) {}
195
196  // Notification that the page wants to go into or out of fullscreen mode.
197  virtual void ToggleFullscreenMode(bool enter_fullscreen) {}
198  virtual bool IsFullscreenForCurrentTab() const;
199
200  // The contents' preferred size changed.
201  virtual void UpdatePreferredSize(const gfx::Size& pref_size) {}
202
203  // The contents auto-resized and the container should match it.
204  virtual void ResizeDueToAutoResize(const gfx::Size& new_size) {}
205
206  // Requests to lock the mouse. Once the request is approved or rejected,
207  // GotResponseToLockMouseRequest() will be called on the requesting render
208  // view host.
209  virtual void RequestToLockMouse(bool user_gesture,
210                                  bool last_unlocked_by_target) {}
211
212  // Notification that the view has lost the mouse lock.
213  virtual void LostMouseLock() {}
214
215  // The page is trying to open a new page (e.g. a popup window). The window
216  // should be created associated with the given |route_id| in process
217  // |render_process_id|, but it should not be shown yet. That should happen in
218  // response to ShowCreatedWindow.
219  // |params.window_container_type| describes the type of RenderViewHost
220  // container that is requested -- in particular, the window.open call may
221  // have specified 'background' and 'persistent' in the feature string.
222  //
223  // The passed |params.frame_name| parameter is the name parameter that was
224  // passed to window.open(), and will be empty if none was passed.
225  //
226  // Note: this is not called "CreateWindow" because that will clash with
227  // the Windows function which is actually a #define.
228  virtual void CreateNewWindow(
229      int render_process_id,
230      int route_id,
231      int main_frame_route_id,
232      const ViewHostMsg_CreateWindow_Params& params,
233      SessionStorageNamespace* session_storage_namespace) {}
234
235  // The page is trying to open a new widget (e.g. a select popup). The
236  // widget should be created associated with the given |route_id| in the
237  // process |render_process_id|, but it should not be shown yet. That should
238  // happen in response to ShowCreatedWidget.
239  // |popup_type| indicates if the widget is a popup and what kind of popup it
240  // is (select, autofill...).
241  virtual void CreateNewWidget(int render_process_id,
242                               int route_id,
243                               blink::WebPopupType popup_type) {}
244
245  // Creates a full screen RenderWidget. Similar to above.
246  virtual void CreateNewFullscreenWidget(int render_process_id, int route_id) {}
247
248  // Show a previously created page with the specified disposition and bounds.
249  // The window is identified by the route_id passed to CreateNewWindow.
250  //
251  // Note: this is not called "ShowWindow" because that will clash with
252  // the Windows function which is actually a #define.
253  virtual void ShowCreatedWindow(int route_id,
254                                 WindowOpenDisposition disposition,
255                                 const gfx::Rect& initial_pos,
256                                 bool user_gesture) {}
257
258  // Show the newly created widget with the specified bounds.
259  // The widget is identified by the route_id passed to CreateNewWidget.
260  virtual void ShowCreatedWidget(int route_id,
261                                 const gfx::Rect& initial_pos) {}
262
263  // Show the newly created full screen widget. Similar to above.
264  virtual void ShowCreatedFullscreenWidget(int route_id) {}
265
266  // Returns the SessionStorageNamespace the render view should use. Might
267  // create the SessionStorageNamespace on the fly.
268  virtual SessionStorageNamespace* GetSessionStorageNamespace(
269      SiteInstance* instance);
270
271  // Returns a copy of the map of all session storage namespaces related
272  // to this view.
273  virtual SessionStorageNamespaceMap GetSessionStorageNamespaceMap();
274
275  // Returns true if the RenderViewHost will never be visible.
276  virtual bool IsNeverVisible();
277
278  // Returns the FrameTree the render view should use. Guaranteed to be constant
279  // for the lifetime of the render view.
280  //
281  // TODO(ajwong): Remove once the main frame RenderFrameHost is no longer
282  // created by the RenderViewHost.
283  virtual FrameTree* GetFrameTree();
284
285  // Optional state storage for if the Virtual Keyboard has been requested by
286  // this page or not. If it has, this can be used to suppress things like the
287  // link disambiguation dialog, which doesn't interact well with the virtual
288  // keyboard.
289  virtual void SetIsVirtualKeyboardRequested(bool requested) {}
290  virtual bool IsVirtualKeyboardRequested();
291
292 protected:
293  virtual ~RenderViewHostDelegate() {}
294};
295
296}  // namespace content
297
298#endif  // CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_DELEGATE_H_
299