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 <set> 9 #include <vector> 10 11 #include "base/basictypes.h" 12 #include "base/files/file_path.h" 13 #include "base/observer_list.h" 14 #include "base/process/process_handle.h" 15 #include "base/strings/string16.h" 16 #include "content/public/renderer/render_frame.h" 17 #include "ipc/ipc_message.h" 18 #include "third_party/WebKit/public/web/WebDataSource.h" 19 #include "third_party/WebKit/public/web/WebFrameClient.h" 20 21 class TransportDIB; 22 23 namespace blink { 24 class WebMouseEvent; 25 struct WebCompositionUnderline; 26 struct WebCursorInfo; 27 } 28 29 namespace gfx { 30 class Range; 31 class Rect; 32 } 33 34 namespace content { 35 36 class PepperPluginInstanceImpl; 37 class RendererPpapiHost; 38 class RenderFrameObserver; 39 class RenderViewImpl; 40 class RenderWidget; 41 class RenderWidgetFullscreenPepper; 42 43 class CONTENT_EXPORT RenderFrameImpl 44 : public RenderFrame, 45 NON_EXPORTED_BASE(public blink::WebFrameClient) { 46 public: 47 // Creates a new RenderFrame. |render_view| is the RenderView object that this 48 // frame belongs to. 49 static RenderFrameImpl* Create(RenderViewImpl* render_view, int32 routing_id); 50 51 // Used by content_layouttest_support to hook into the creation of 52 // RenderFrameImpls. 53 static void InstallCreateHook( 54 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)); 55 56 virtual ~RenderFrameImpl(); 57 58 // TODO(jam): this is a temporary getter until all the code is transitioned 59 // to using RenderFrame instead of RenderView. render_view()60 RenderViewImpl* render_view() { return render_view_; } 61 62 // Returns the RenderWidget associated with this frame. 63 RenderWidget* GetRenderWidget(); 64 65 #if defined(ENABLE_PLUGINS) 66 // Notification that a PPAPI plugin has been created. 67 void PepperPluginCreated(RendererPpapiHost* host); 68 69 // Indicates that the given instance has been created. 70 void PepperInstanceCreated(PepperPluginInstanceImpl* instance); 71 72 // Indicates that the given instance is being destroyed. This is called from 73 // the destructor, so it's important that the instance is not dereferenced 74 // from this call. 75 void PepperInstanceDeleted(PepperPluginInstanceImpl* instance); 76 77 // Notifies that |instance| has changed the cursor. 78 // This will update the cursor appearance if it is currently over the plugin 79 // instance. 80 void PepperDidChangeCursor(PepperPluginInstanceImpl* instance, 81 const blink::WebCursorInfo& cursor); 82 83 // Notifies that |instance| has received a mouse event. 84 void PepperDidReceiveMouseEvent(PepperPluginInstanceImpl* instance); 85 86 // Notification that the given plugin is focused or unfocused. 87 void PepperFocusChanged(PepperPluginInstanceImpl* instance, bool focused); 88 89 // Informs the render view that a PPAPI plugin has changed text input status. 90 void PepperTextInputTypeChanged(PepperPluginInstanceImpl* instance); 91 void PepperCaretPositionChanged(PepperPluginInstanceImpl* instance); 92 93 // Cancels current composition. 94 void PepperCancelComposition(PepperPluginInstanceImpl* instance); 95 96 // Informs the render view that a PPAPI plugin has changed selection. 97 void PepperSelectionChanged(PepperPluginInstanceImpl* instance); 98 99 // Creates a fullscreen container for a pepper plugin instance. 100 RenderWidgetFullscreenPepper* CreatePepperFullscreenContainer( 101 PepperPluginInstanceImpl* plugin); 102 103 bool IsPepperAcceptingCompositionEvents() const; 104 105 // Notification that the given plugin has crashed. 106 void PluginCrashed(const base::FilePath& plugin_path, 107 base::ProcessId plugin_pid); 108 109 // These map to virtual methods on RenderWidget that are used to call out to 110 // RenderView. 111 // TODO(jam): once we get rid of RenderView, RenderFrame will own RenderWidget 112 // and methods would be on a delegate interface. 113 void DidInitiatePaint(); 114 void DidFlushPaint(); 115 PepperPluginInstanceImpl* GetBitmapForOptimizedPluginPaint( 116 const gfx::Rect& paint_bounds, 117 TransportDIB** dib, 118 gfx::Rect* location, 119 gfx::Rect* clip, 120 float* scale_factor); 121 void PageVisibilityChanged(bool shown); 122 void OnSetFocus(bool enable); 123 void WillHandleMouseEvent(const blink::WebMouseEvent& event); 124 125 // Simulates IME events for testing purpose. 126 void SimulateImeSetComposition( 127 const base::string16& text, 128 const std::vector<blink::WebCompositionUnderline>& underlines, 129 int selection_start, 130 int selection_end); 131 void SimulateImeConfirmComposition(const base::string16& text, 132 const gfx::Range& replacement_range); 133 134 // TODO(jam): remove these once the IPC handler moves from RenderView to 135 // RenderFrame. 136 void OnImeSetComposition( 137 const base::string16& text, 138 const std::vector<blink::WebCompositionUnderline>& underlines, 139 int selection_start, 140 int selection_end); 141 void OnImeConfirmComposition( 142 const base::string16& text, 143 const gfx::Range& replacement_range, 144 bool keep_selection); 145 #endif // ENABLE_PLUGINS 146 147 // IPC::Sender 148 virtual bool Send(IPC::Message* msg) OVERRIDE; 149 150 // IPC::Listener 151 virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; 152 153 // RenderFrame implementation: 154 virtual RenderView* GetRenderView() OVERRIDE; 155 virtual int GetRoutingID() OVERRIDE; 156 virtual WebPreferences& GetWebkitPreferences() OVERRIDE; 157 virtual int ShowContextMenu(ContextMenuClient* client, 158 const ContextMenuParams& params) OVERRIDE; 159 virtual void CancelContextMenu(int request_id) OVERRIDE; 160 virtual blink::WebPlugin* CreatePlugin( 161 blink::WebFrame* frame, 162 const WebPluginInfo& info, 163 const blink::WebPluginParams& params) OVERRIDE; 164 virtual void LoadURLExternally( 165 blink::WebFrame* frame, 166 const blink::WebURLRequest& request, 167 blink::WebNavigationPolicy policy) OVERRIDE; 168 169 // blink::WebFrameClient implementation ------------------------------------- 170 virtual blink::WebPlugin* createPlugin( 171 blink::WebFrame* frame, 172 const blink::WebPluginParams& params); 173 virtual blink::WebMediaPlayer* createMediaPlayer( 174 blink::WebFrame* frame, 175 const blink::WebURL& url, 176 blink::WebMediaPlayerClient* client); 177 virtual blink::WebApplicationCacheHost* createApplicationCacheHost( 178 blink::WebFrame* frame, 179 blink::WebApplicationCacheHostClient* client); 180 virtual blink::WebWorkerPermissionClientProxy* 181 createWorkerPermissionClientProxy(blink::WebFrame* frame); 182 virtual blink::WebCookieJar* cookieJar(blink::WebFrame* frame); 183 virtual blink::WebServiceWorkerProvider* createServiceWorkerProvider( 184 blink::WebFrame* frame, 185 blink::WebServiceWorkerProviderClient*); 186 virtual void didAccessInitialDocument(blink::WebFrame* frame); 187 virtual blink::WebFrame* createChildFrame(blink::WebFrame* parent, 188 const blink::WebString& name); 189 virtual void didDisownOpener(blink::WebFrame* frame); 190 virtual void frameDetached(blink::WebFrame* frame); 191 virtual void willClose(blink::WebFrame* frame); 192 virtual void didChangeName(blink::WebFrame* frame, 193 const blink::WebString& name); 194 virtual void didMatchCSS( 195 blink::WebFrame* frame, 196 const blink::WebVector<blink::WebString>& newly_matching_selectors, 197 const blink::WebVector<blink::WebString>& stopped_matching_selectors); 198 virtual void loadURLExternally(blink::WebFrame* frame, 199 const blink::WebURLRequest& request, 200 blink::WebNavigationPolicy policy); 201 virtual void loadURLExternally( 202 blink::WebFrame* frame, 203 const blink::WebURLRequest& request, 204 blink::WebNavigationPolicy policy, 205 const blink::WebString& suggested_name); 206 virtual blink::WebNavigationPolicy decidePolicyForNavigation( 207 blink::WebFrame* frame, 208 blink::WebDataSource::ExtraData* extra_data, 209 const blink::WebURLRequest& request, 210 blink::WebNavigationType type, 211 blink::WebNavigationPolicy default_policy, 212 bool is_redirect); 213 // DEPRECATED 214 virtual blink::WebNavigationPolicy decidePolicyForNavigation( 215 blink::WebFrame* frame, 216 const blink::WebURLRequest& request, 217 blink::WebNavigationType type, 218 blink::WebNavigationPolicy default_policy, 219 bool is_redirect); 220 virtual void willSendSubmitEvent(blink::WebFrame* frame, 221 const blink::WebFormElement& form); 222 virtual void willSubmitForm(blink::WebFrame* frame, 223 const blink::WebFormElement& form); 224 virtual void didCreateDataSource(blink::WebFrame* frame, 225 blink::WebDataSource* datasource); 226 virtual void didStartProvisionalLoad(blink::WebFrame* frame); 227 virtual void didReceiveServerRedirectForProvisionalLoad( 228 blink::WebFrame* frame); 229 virtual void didFailProvisionalLoad( 230 blink::WebFrame* frame, 231 const blink::WebURLError& error); 232 virtual void didCommitProvisionalLoad(blink::WebFrame* frame, 233 bool is_new_navigation); 234 virtual void didClearWindowObject(blink::WebFrame* frame); 235 virtual void didCreateDocumentElement(blink::WebFrame* frame); 236 virtual void didReceiveTitle(blink::WebFrame* frame, 237 const blink::WebString& title, 238 blink::WebTextDirection direction); 239 virtual void didChangeIcon(blink::WebFrame* frame, 240 blink::WebIconURL::Type icon_type); 241 virtual void didFinishDocumentLoad(blink::WebFrame* frame); 242 virtual void didHandleOnloadEvents(blink::WebFrame* frame); 243 virtual void didFailLoad(blink::WebFrame* frame, 244 const blink::WebURLError& error); 245 virtual void didFinishLoad(blink::WebFrame* frame); 246 virtual void didNavigateWithinPage(blink::WebFrame* frame, 247 bool is_new_navigation); 248 virtual void didUpdateCurrentHistoryItem(blink::WebFrame* frame); 249 virtual void willRequestAfterPreconnect(blink::WebFrame* frame, 250 blink::WebURLRequest& request); 251 virtual void willSendRequest( 252 blink::WebFrame* frame, 253 unsigned identifier, 254 blink::WebURLRequest& request, 255 const blink::WebURLResponse& redirect_response); 256 virtual void didReceiveResponse( 257 blink::WebFrame* frame, 258 unsigned identifier, 259 const blink::WebURLResponse& response); 260 virtual void didFinishResourceLoad(blink::WebFrame* frame, 261 unsigned identifier); 262 virtual void didLoadResourceFromMemoryCache( 263 blink::WebFrame* frame, 264 const blink::WebURLRequest& request, 265 const blink::WebURLResponse& response); 266 virtual void didDisplayInsecureContent(blink::WebFrame* frame); 267 virtual void didRunInsecureContent(blink::WebFrame* frame, 268 const blink::WebSecurityOrigin& origin, 269 const blink::WebURL& target); 270 virtual void didAbortLoading(blink::WebFrame* frame); 271 virtual void didExhaustMemoryAvailableForScript( 272 blink::WebFrame* frame); 273 virtual void didCreateScriptContext(blink::WebFrame* frame, 274 v8::Handle<v8::Context> context, 275 int extension_group, 276 int world_id); 277 virtual void willReleaseScriptContext(blink::WebFrame* frame, 278 v8::Handle<v8::Context> context, 279 int world_id); 280 virtual void didFirstVisuallyNonEmptyLayout(blink::WebFrame* frame); 281 virtual void didChangeContentsSize(blink::WebFrame* frame, 282 const blink::WebSize& size); 283 virtual void didChangeScrollOffset(blink::WebFrame* frame); 284 virtual void willInsertBody(blink::WebFrame* frame); 285 virtual void reportFindInPageMatchCount(int request_id, 286 int count, 287 bool final_update); 288 virtual void reportFindInPageSelection(int request_id, 289 int active_match_ordinal, 290 const blink::WebRect& sel); 291 virtual void requestStorageQuota( 292 blink::WebFrame* frame, 293 blink::WebStorageQuotaType type, 294 unsigned long long requested_size, 295 blink::WebStorageQuotaCallbacks* callbacks); 296 virtual void willOpenSocketStream( 297 blink::WebSocketStreamHandle* handle); 298 virtual void willStartUsingPeerConnectionHandler( 299 blink::WebFrame* frame, 300 blink::WebRTCPeerConnectionHandler* handler); 301 virtual bool willCheckAndDispatchMessageEvent( 302 blink::WebFrame* sourceFrame, 303 blink::WebFrame* targetFrame, 304 blink::WebSecurityOrigin targetOrigin, 305 blink::WebDOMMessageEvent event); 306 virtual blink::WebString userAgentOverride( 307 blink::WebFrame* frame, 308 const blink::WebURL& url); 309 virtual blink::WebString doNotTrackValue(blink::WebFrame* frame); 310 virtual bool allowWebGL(blink::WebFrame* frame, bool default_value); 311 virtual void didLoseWebGLContext(blink::WebFrame* frame, 312 int arb_robustness_status_code); 313 314 protected: 315 RenderFrameImpl(RenderViewImpl* render_view, int32 routing_id); 316 317 private: 318 friend class RenderFrameObserver; 319 320 // Functions to add and remove observers for this object. 321 void AddObserver(RenderFrameObserver* observer); 322 void RemoveObserver(RenderFrameObserver* observer); 323 324 RenderViewImpl* render_view_; 325 int routing_id_; 326 bool is_swapped_out_; 327 bool is_detaching_; 328 329 #if defined(ENABLE_PLUGINS) 330 typedef std::set<PepperPluginInstanceImpl*> PepperPluginSet; 331 PepperPluginSet active_pepper_instances_; 332 333 // Current text input composition text. Empty if no composition is in 334 // progress. 335 base::string16 pepper_composition_text_; 336 #endif 337 338 // All the registered observers. 339 ObserverList<RenderFrameObserver> observers_; 340 341 DISALLOW_COPY_AND_ASSIGN(RenderFrameImpl); 342 }; 343 344 } // namespace content 345 346 #endif // CONTENT_RENDERER_RENDER_FRAME_IMPL_H_ 347