render_frame_impl.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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_RENDERER_RENDER_FRAME_IMPL_H_
6#define CONTENT_RENDERER_RENDER_FRAME_IMPL_H_
7
8#include <vector>
9
10#include "base/basictypes.h"
11#include "base/files/file_path.h"
12#include "base/gtest_prod_util.h"
13#include "base/id_map.h"
14#include "base/memory/weak_ptr.h"
15#include "base/observer_list.h"
16#include "base/process/process_handle.h"
17#include "base/strings/string16.h"
18#include "content/public/renderer/render_frame.h"
19#include "content/renderer/renderer_webcookiejar_impl.h"
20#include "ipc/ipc_message.h"
21#include "third_party/WebKit/public/web/WebDataSource.h"
22#include "third_party/WebKit/public/web/WebFrameClient.h"
23
24class TransportDIB;
25struct FrameMsg_BuffersSwapped_Params;
26struct FrameMsg_CompositorFrameSwapped_Params;
27struct FrameMsg_Navigate_Params;
28
29namespace blink {
30class WebInputEvent;
31class WebMouseEvent;
32struct WebCompositionUnderline;
33struct WebContextMenuData;
34struct WebCursorInfo;
35}
36
37namespace gfx {
38class Point;
39class Range;
40class Rect;
41}
42
43namespace content {
44
45class ChildFrameCompositingHelper;
46class PepperPluginInstanceImpl;
47class RendererPpapiHost;
48class RenderFrameObserver;
49class RenderViewImpl;
50class RenderWidget;
51class RenderWidgetFullscreenPepper;
52struct CustomContextMenuContext;
53
54class CONTENT_EXPORT RenderFrameImpl
55    : public RenderFrame,
56      NON_EXPORTED_BASE(public blink::WebFrameClient) {
57 public:
58  // Creates a new RenderFrame. |render_view| is the RenderView object that this
59  // frame belongs to.
60  // Callers *must* call |SetWebFrame| immediately after creation.
61  // TODO(creis): We should structure this so that |SetWebFrame| isn't needed.
62  static RenderFrameImpl* Create(RenderViewImpl* render_view, int32 routing_id);
63
64  // Just like RenderFrame::FromWebFrame but returns the implementation.
65  static RenderFrameImpl* FromWebFrame(blink::WebFrame* web_frame);
66
67  // Used by content_layouttest_support to hook into the creation of
68  // RenderFrameImpls.
69  static void InstallCreateHook(
70      RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32));
71
72  virtual ~RenderFrameImpl();
73
74  bool is_swapped_out() const {
75    return is_swapped_out_;
76  }
77
78  // Out-of-process child frames receive a signal from RenderWidgetCompositor
79  // when a compositor frame has committed.
80  void DidCommitCompositorFrame();
81
82  // TODO(jam): this is a temporary getter until all the code is transitioned
83  // to using RenderFrame instead of RenderView.
84  RenderViewImpl* render_view() { return render_view_.get(); }
85
86  RendererWebCookieJarImpl* cookie_jar() { return &cookie_jar_; }
87
88  // Returns the RenderWidget associated with this frame.
89  RenderWidget* GetRenderWidget();
90
91  // This is called right after creation with the WebFrame for this RenderFrame.
92  void SetWebFrame(blink::WebFrame* web_frame);
93
94  // Notification from RenderView.
95  virtual void OnStop();
96
97  // Start/Stop loading notifications.
98  // TODO(nasko): Those are page-level methods at this time and come from
99  // WebViewClient. We should move them to be WebFrameClient calls and put
100  // logic in the browser side to balance starts/stops.
101  void didStartLoading();
102  void didStopLoading();
103
104#if defined(ENABLE_PLUGINS)
105  // Notification that a PPAPI plugin has been created.
106  void PepperPluginCreated(RendererPpapiHost* host);
107
108  // Notifies that |instance| has changed the cursor.
109  // This will update the cursor appearance if it is currently over the plugin
110  // instance.
111  void PepperDidChangeCursor(PepperPluginInstanceImpl* instance,
112                             const blink::WebCursorInfo& cursor);
113
114  // Notifies that |instance| has received a mouse event.
115  void PepperDidReceiveMouseEvent(PepperPluginInstanceImpl* instance);
116
117  // Informs the render view that a PPAPI plugin has changed text input status.
118  void PepperTextInputTypeChanged(PepperPluginInstanceImpl* instance);
119  void PepperCaretPositionChanged(PepperPluginInstanceImpl* instance);
120
121  // Cancels current composition.
122  void PepperCancelComposition(PepperPluginInstanceImpl* instance);
123
124  // Informs the render view that a PPAPI plugin has changed selection.
125  void PepperSelectionChanged(PepperPluginInstanceImpl* instance);
126
127  // Creates a fullscreen container for a pepper plugin instance.
128  RenderWidgetFullscreenPepper* CreatePepperFullscreenContainer(
129      PepperPluginInstanceImpl* plugin);
130
131  bool IsPepperAcceptingCompositionEvents() const;
132
133  // Notification that the given plugin has crashed.
134  void PluginCrashed(const base::FilePath& plugin_path,
135                     base::ProcessId plugin_pid);
136
137  // Simulates IME events for testing purpose.
138  void SimulateImeSetComposition(
139      const base::string16& text,
140      const std::vector<blink::WebCompositionUnderline>& underlines,
141      int selection_start,
142      int selection_end);
143  void SimulateImeConfirmComposition(const base::string16& text,
144                                     const gfx::Range& replacement_range);
145
146  // TODO(jam): remove these once the IPC handler moves from RenderView to
147  // RenderFrame.
148  void OnImeSetComposition(
149    const base::string16& text,
150    const std::vector<blink::WebCompositionUnderline>& underlines,
151    int selection_start,
152    int selection_end);
153 void OnImeConfirmComposition(
154    const base::string16& text,
155    const gfx::Range& replacement_range,
156    bool keep_selection);
157#endif  // ENABLE_PLUGINS
158
159  // IPC::Sender
160  virtual bool Send(IPC::Message* msg) OVERRIDE;
161
162  // IPC::Listener
163  virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
164
165  // RenderFrame implementation:
166  virtual RenderView* GetRenderView() OVERRIDE;
167  virtual int GetRoutingID() OVERRIDE;
168  virtual blink::WebFrame* GetWebFrame() OVERRIDE;
169  virtual WebPreferences& GetWebkitPreferences() OVERRIDE;
170  virtual int ShowContextMenu(ContextMenuClient* client,
171                              const ContextMenuParams& params) OVERRIDE;
172  virtual void CancelContextMenu(int request_id) OVERRIDE;
173  virtual blink::WebPlugin* CreatePlugin(
174      blink::WebFrame* frame,
175      const WebPluginInfo& info,
176      const blink::WebPluginParams& params) OVERRIDE;
177  virtual void LoadURLExternally(
178      blink::WebFrame* frame,
179      const blink::WebURLRequest& request,
180      blink::WebNavigationPolicy policy) OVERRIDE;
181
182  // blink::WebFrameClient implementation -------------------------------------
183  virtual blink::WebPlugin* createPlugin(
184      blink::WebFrame* frame,
185      const blink::WebPluginParams& params);
186  virtual blink::WebMediaPlayer* createMediaPlayer(
187      blink::WebFrame* frame,
188      const blink::WebURL& url,
189      blink::WebMediaPlayerClient* client);
190  virtual blink::WebApplicationCacheHost* createApplicationCacheHost(
191      blink::WebFrame* frame,
192      blink::WebApplicationCacheHostClient* client);
193  virtual blink::WebWorkerPermissionClientProxy*
194      createWorkerPermissionClientProxy(blink::WebFrame* frame);
195  virtual blink::WebCookieJar* cookieJar(blink::WebFrame* frame);
196  virtual blink::WebServiceWorkerProvider* createServiceWorkerProvider(
197      blink::WebFrame* frame,
198      blink::WebServiceWorkerProviderClient*);
199  virtual void didAccessInitialDocument(blink::WebFrame* frame);
200  virtual blink::WebFrame* createChildFrame(blink::WebFrame* parent,
201                                             const blink::WebString& name);
202  virtual void didDisownOpener(blink::WebFrame* frame);
203  virtual void frameDetached(blink::WebFrame* frame);
204  virtual void willClose(blink::WebFrame* frame);
205  virtual void didChangeName(blink::WebFrame* frame,
206                             const blink::WebString& name);
207  virtual void didMatchCSS(
208      blink::WebFrame* frame,
209      const blink::WebVector<blink::WebString>& newly_matching_selectors,
210      const blink::WebVector<blink::WebString>& stopped_matching_selectors);
211  virtual void loadURLExternally(blink::WebFrame* frame,
212                                 const blink::WebURLRequest& request,
213                                 blink::WebNavigationPolicy policy);
214  virtual void loadURLExternally(
215      blink::WebFrame* frame,
216      const blink::WebURLRequest& request,
217      blink::WebNavigationPolicy policy,
218      const blink::WebString& suggested_name);
219  // The WebDataSource::ExtraData* is assumed to be a DocumentState* subclass.
220  virtual blink::WebNavigationPolicy decidePolicyForNavigation(
221      blink::WebFrame* frame,
222      blink::WebDataSource::ExtraData* extra_data,
223      const blink::WebURLRequest& request,
224      blink::WebNavigationType type,
225      blink::WebNavigationPolicy default_policy,
226      bool is_redirect);
227  // DEPRECATED
228  virtual blink::WebNavigationPolicy decidePolicyForNavigation(
229      blink::WebFrame* frame,
230      const blink::WebURLRequest& request,
231      blink::WebNavigationType type,
232      blink::WebNavigationPolicy default_policy,
233      bool is_redirect);
234  virtual void willSendSubmitEvent(blink::WebFrame* frame,
235                                   const blink::WebFormElement& form);
236  virtual void willSubmitForm(blink::WebFrame* frame,
237                              const blink::WebFormElement& form);
238  virtual void didCreateDataSource(blink::WebFrame* frame,
239                                   blink::WebDataSource* datasource);
240  virtual void didStartProvisionalLoad(blink::WebFrame* frame);
241  virtual void didReceiveServerRedirectForProvisionalLoad(
242      blink::WebFrame* frame);
243  virtual void didFailProvisionalLoad(
244      blink::WebFrame* frame,
245      const blink::WebURLError& error);
246  virtual void didCommitProvisionalLoad(blink::WebFrame* frame,
247                                        bool is_new_navigation);
248  virtual void didClearWindowObject(blink::WebFrame* frame, int world_id);
249  virtual void didCreateDocumentElement(blink::WebFrame* frame);
250  virtual void didReceiveTitle(blink::WebFrame* frame,
251                               const blink::WebString& title,
252                               blink::WebTextDirection direction);
253  virtual void didChangeIcon(blink::WebFrame* frame,
254                             blink::WebIconURL::Type icon_type);
255  virtual void didFinishDocumentLoad(blink::WebFrame* frame);
256  virtual void didHandleOnloadEvents(blink::WebFrame* frame);
257  virtual void didFailLoad(blink::WebFrame* frame,
258                           const blink::WebURLError& error);
259  virtual void didFinishLoad(blink::WebFrame* frame);
260  virtual void didNavigateWithinPage(blink::WebFrame* frame,
261                                     bool is_new_navigation);
262  virtual void didUpdateCurrentHistoryItem(blink::WebFrame* frame);
263  virtual void willRequestAfterPreconnect(blink::WebFrame* frame,
264                                          blink::WebURLRequest& request);
265  virtual void willSendRequest(
266      blink::WebFrame* frame,
267      unsigned identifier,
268      blink::WebURLRequest& request,
269      const blink::WebURLResponse& redirect_response);
270  virtual void didReceiveResponse(
271      blink::WebFrame* frame,
272      unsigned identifier,
273      const blink::WebURLResponse& response);
274  virtual void didFinishResourceLoad(blink::WebFrame* frame,
275                                     unsigned identifier);
276  virtual void didLoadResourceFromMemoryCache(
277      blink::WebFrame* frame,
278      const blink::WebURLRequest& request,
279      const blink::WebURLResponse& response);
280  virtual void didDisplayInsecureContent(blink::WebFrame* frame);
281  virtual void didRunInsecureContent(blink::WebFrame* frame,
282                                     const blink::WebSecurityOrigin& origin,
283                                     const blink::WebURL& target);
284  virtual void didAbortLoading(blink::WebFrame* frame);
285  virtual void didExhaustMemoryAvailableForScript(
286      blink::WebFrame* frame);
287  virtual void didCreateScriptContext(blink::WebFrame* frame,
288                                      v8::Handle<v8::Context> context,
289                                      int extension_group,
290                                      int world_id);
291  virtual void willReleaseScriptContext(blink::WebFrame* frame,
292                                        v8::Handle<v8::Context> context,
293                                        int world_id);
294  virtual void didFirstVisuallyNonEmptyLayout(blink::WebFrame* frame);
295  virtual void didChangeContentsSize(blink::WebFrame* frame,
296                                     const blink::WebSize& size);
297  virtual void didChangeScrollOffset(blink::WebFrame* frame);
298  virtual void willInsertBody(blink::WebFrame* frame);
299  virtual void reportFindInPageMatchCount(int request_id,
300                                          int count,
301                                          bool final_update);
302  virtual void reportFindInPageSelection(int request_id,
303                                         int active_match_ordinal,
304                                         const blink::WebRect& sel);
305  virtual void requestStorageQuota(
306      blink::WebFrame* frame,
307      blink::WebStorageQuotaType type,
308      unsigned long long requested_size,
309      blink::WebStorageQuotaCallbacks callbacks);
310  virtual void willOpenSocketStream(
311      blink::WebSocketStreamHandle* handle);
312  virtual void willStartUsingPeerConnectionHandler(
313      blink::WebFrame* frame,
314      blink::WebRTCPeerConnectionHandler* handler);
315  virtual bool willCheckAndDispatchMessageEvent(
316      blink::WebFrame* sourceFrame,
317      blink::WebFrame* targetFrame,
318      blink::WebSecurityOrigin targetOrigin,
319      blink::WebDOMMessageEvent event);
320  virtual blink::WebString userAgentOverride(
321      blink::WebFrame* frame,
322      const blink::WebURL& url);
323  virtual blink::WebString doNotTrackValue(blink::WebFrame* frame);
324  virtual bool allowWebGL(blink::WebFrame* frame, bool default_value);
325  virtual void didLoseWebGLContext(blink::WebFrame* frame,
326                                   int arb_robustness_status_code);
327  virtual void forwardInputEvent(const blink::WebInputEvent* event);
328
329  // TODO(jam): move this to WebFrameClient
330  virtual void showContextMenu(const blink::WebContextMenuData& data);
331
332  // TODO(nasko): Make all tests in RenderViewImplTest friends and then move
333  // this back to private member.
334  void OnNavigate(const FrameMsg_Navigate_Params& params);
335
336 protected:
337  RenderFrameImpl(RenderViewImpl* render_view, int32 routing_id);
338
339 private:
340  friend class RenderFrameObserver;
341  FRIEND_TEST_ALL_PREFIXES(RenderFrameImplTest,
342                           ShouldUpdateSelectionTextFromContextMenuParams);
343
344  typedef std::map<GURL, double> HostZoomLevels;
345
346  // Functions to add and remove observers for this object.
347  void AddObserver(RenderFrameObserver* observer);
348  void RemoveObserver(RenderFrameObserver* observer);
349
350  void UpdateURL(blink::WebFrame* frame);
351
352  // IPC message handlers ------------------------------------------------------
353  //
354  // The documentation for these functions should be in
355  // content/common/*_messages.h for the message that the function is handling.
356  void OnSwapOut();
357  void OnChildFrameProcessGone();
358  void OnBuffersSwapped(const FrameMsg_BuffersSwapped_Params& params);
359  void OnCompositorFrameSwapped(const IPC::Message& message);
360  void OnShowContextMenu(const gfx::Point& location);
361  void OnContextMenuClosed(const CustomContextMenuContext& custom_context);
362  void OnCustomContextMenuAction(const CustomContextMenuContext& custom_context,
363                                 unsigned action);
364
365  // Returns whether |params.selection_text| should be synchronized to the
366  // browser before bringing up the context menu. Static for testing.
367  static bool ShouldUpdateSelectionTextFromContextMenuParams(
368      const base::string16& selection_text,
369      size_t selection_text_offset,
370      const gfx::Range& selection_range,
371      const ContextMenuParams& params);
372
373  // Stores the WebFrame we are associated with.
374  blink::WebFrame* frame_;
375
376  base::WeakPtr<RenderViewImpl> render_view_;
377  int routing_id_;
378  bool is_swapped_out_;
379  bool is_detaching_;
380
381#if defined(ENABLE_PLUGINS)
382  // Current text input composition text. Empty if no composition is in
383  // progress.
384  base::string16 pepper_composition_text_;
385#endif
386
387  RendererWebCookieJarImpl cookie_jar_;
388
389  // All the registered observers.
390  ObserverList<RenderFrameObserver> observers_;
391
392  scoped_refptr<ChildFrameCompositingHelper> compositing_helper_;
393
394  // External context menu requests we're waiting for. "Internal"
395  // (WebKit-originated) context menu events will have an ID of 0 and will not
396  // be in this map.
397  //
398  // We don't want to add internal ones since some of the "special" page
399  // handlers in the browser process just ignore the context menu requests so
400  // avoid showing context menus, and so this will cause right clicks to leak
401  // entries in this map. Most users of the custom context menu (e.g. Pepper
402  // plugins) are normally only on "regular" pages and the regular pages will
403  // always respond properly to the request, so we don't have to worry so
404  // much about leaks.
405  IDMap<ContextMenuClient, IDMapExternalPointer> pending_context_menus_;
406
407  DISALLOW_COPY_AND_ASSIGN(RenderFrameImpl);
408};
409
410}  // namespace content
411
412#endif  // CONTENT_RENDERER_RENDER_FRAME_IMPL_H_
413