Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2188)

Unified Diff: content/renderer/render_frame_impl.h

Issue 112203003: Fix renderer crashes when frame gets detached while injectng user scripts. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Defer frame destruction until event loop. Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/render_frame_impl.h
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 430fe201434d3a1fb3ae0b28428e6b57142af6de..2c9660dffe4c595a1f53fc41c6a69fa676e83ef7 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -1,414 +1,417 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_RENDER_FRAME_IMPL_H_
-#define CONTENT_RENDERER_RENDER_FRAME_IMPL_H_
-
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/files/file_path.h"
-#include "base/gtest_prod_util.h"
-#include "base/id_map.h"
-#include "base/memory/weak_ptr.h"
-#include "base/observer_list.h"
-#include "base/process/process_handle.h"
-#include "base/strings/string16.h"
-#include "content/public/renderer/render_frame.h"
-#include "content/renderer/renderer_webcookiejar_impl.h"
-#include "ipc/ipc_message.h"
-#include "third_party/WebKit/public/web/WebDataSource.h"
-#include "third_party/WebKit/public/web/WebFrameClient.h"
-
-class TransportDIB;
-struct FrameMsg_BuffersSwapped_Params;
-struct FrameMsg_CompositorFrameSwapped_Params;
-struct FrameMsg_Navigate_Params;
-
-namespace blink {
-class WebInputEvent;
-class WebMouseEvent;
-struct WebCompositionUnderline;
-struct WebContextMenuData;
-struct WebCursorInfo;
-}
-
-namespace gfx {
-class Point;
-class Range;
-class Rect;
-}
-
-namespace content {
-
-class ChildFrameCompositingHelper;
-class PepperPluginInstanceImpl;
-class RendererPpapiHost;
-class RenderFrameObserver;
-class RenderViewImpl;
-class RenderWidget;
-class RenderWidgetFullscreenPepper;
-struct CustomContextMenuContext;
-
-class CONTENT_EXPORT RenderFrameImpl
- : public RenderFrame,
- NON_EXPORTED_BASE(public blink::WebFrameClient) {
- public:
- // Creates a new RenderFrame. |render_view| is the RenderView object that this
- // frame belongs to.
- // Callers *must* call |SetWebFrame| immediately after creation.
- // TODO(creis): We should structure this so that |SetWebFrame| isn't needed.
- static RenderFrameImpl* Create(RenderViewImpl* render_view, int32 routing_id);
-
- // Just like RenderFrame::FromWebFrame but returns the implementation.
- static RenderFrameImpl* FromWebFrame(blink::WebFrame* web_frame);
-
- // Used by content_layouttest_support to hook into the creation of
- // RenderFrameImpls.
- static void InstallCreateHook(
- RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32));
-
- virtual ~RenderFrameImpl();
-
- bool is_swapped_out() const {
- return is_swapped_out_;
- }
-
- // Out-of-process child frames receive a signal from RenderWidgetCompositor
- // when a compositor frame has committed.
- void DidCommitCompositorFrame();
-
- // TODO(jam): this is a temporary getter until all the code is transitioned
- // to using RenderFrame instead of RenderView.
- RenderViewImpl* render_view() { return render_view_.get(); }
-
- RendererWebCookieJarImpl* cookie_jar() { return &cookie_jar_; }
-
- // Returns the RenderWidget associated with this frame.
- RenderWidget* GetRenderWidget();
-
- // This is called right after creation with the WebFrame for this RenderFrame.
- void SetWebFrame(blink::WebFrame* web_frame);
-
- // Notification from RenderView.
- virtual void OnStop();
-
- // Start/Stop loading notifications.
- // TODO(nasko): Those are page-level methods at this time and come from
- // WebViewClient. We should move them to be WebFrameClient calls and put
- // logic in the browser side to balance starts/stops.
- void didStartLoading();
- void didStopLoading();
-
-#if defined(ENABLE_PLUGINS)
- // Notification that a PPAPI plugin has been created.
- void PepperPluginCreated(RendererPpapiHost* host);
-
- // Notifies that |instance| has changed the cursor.
- // This will update the cursor appearance if it is currently over the plugin
- // instance.
- void PepperDidChangeCursor(PepperPluginInstanceImpl* instance,
- const blink::WebCursorInfo& cursor);
-
- // Notifies that |instance| has received a mouse event.
- void PepperDidReceiveMouseEvent(PepperPluginInstanceImpl* instance);
-
- // Informs the render view that a PPAPI plugin has changed text input status.
- void PepperTextInputTypeChanged(PepperPluginInstanceImpl* instance);
- void PepperCaretPositionChanged(PepperPluginInstanceImpl* instance);
-
- // Cancels current composition.
- void PepperCancelComposition(PepperPluginInstanceImpl* instance);
-
- // Informs the render view that a PPAPI plugin has changed selection.
- void PepperSelectionChanged(PepperPluginInstanceImpl* instance);
-
- // Creates a fullscreen container for a pepper plugin instance.
- RenderWidgetFullscreenPepper* CreatePepperFullscreenContainer(
- PepperPluginInstanceImpl* plugin);
-
- bool IsPepperAcceptingCompositionEvents() const;
-
- // Notification that the given plugin has crashed.
- void PluginCrashed(const base::FilePath& plugin_path,
- base::ProcessId plugin_pid);
-
- // Simulates IME events for testing purpose.
- void SimulateImeSetComposition(
- const base::string16& text,
- const std::vector<blink::WebCompositionUnderline>& underlines,
- int selection_start,
- int selection_end);
- void SimulateImeConfirmComposition(const base::string16& text,
- const gfx::Range& replacement_range);
-
- // TODO(jam): remove these once the IPC handler moves from RenderView to
- // RenderFrame.
- void OnImeSetComposition(
- const base::string16& text,
- const std::vector<blink::WebCompositionUnderline>& underlines,
- int selection_start,
- int selection_end);
- void OnImeConfirmComposition(
- const base::string16& text,
- const gfx::Range& replacement_range,
- bool keep_selection);
-#endif // ENABLE_PLUGINS
-
- // IPC::Sender
- virtual bool Send(IPC::Message* msg) OVERRIDE;
-
- // IPC::Listener
- virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
-
- // RenderFrame implementation:
- virtual RenderView* GetRenderView() OVERRIDE;
- virtual int GetRoutingID() OVERRIDE;
- virtual blink::WebFrame* GetWebFrame() OVERRIDE;
- virtual WebPreferences& GetWebkitPreferences() OVERRIDE;
- virtual int ShowContextMenu(ContextMenuClient* client,
- const ContextMenuParams& params) OVERRIDE;
- virtual void CancelContextMenu(int request_id) OVERRIDE;
- virtual blink::WebPlugin* CreatePlugin(
- blink::WebFrame* frame,
- const WebPluginInfo& info,
- const blink::WebPluginParams& params) OVERRIDE;
- virtual void LoadURLExternally(
- blink::WebFrame* frame,
- const blink::WebURLRequest& request,
- blink::WebNavigationPolicy policy) OVERRIDE;
-
- // blink::WebFrameClient implementation -------------------------------------
- virtual blink::WebPlugin* createPlugin(
- blink::WebFrame* frame,
- const blink::WebPluginParams& params);
- virtual blink::WebMediaPlayer* createMediaPlayer(
- blink::WebFrame* frame,
- const blink::WebURL& url,
- blink::WebMediaPlayerClient* client);
- virtual blink::WebApplicationCacheHost* createApplicationCacheHost(
- blink::WebFrame* frame,
- blink::WebApplicationCacheHostClient* client);
- virtual blink::WebWorkerPermissionClientProxy*
- createWorkerPermissionClientProxy(blink::WebFrame* frame);
- virtual blink::WebCookieJar* cookieJar(blink::WebFrame* frame);
- virtual blink::WebServiceWorkerProvider* createServiceWorkerProvider(
- blink::WebFrame* frame,
- blink::WebServiceWorkerProviderClient*);
- virtual void didAccessInitialDocument(blink::WebFrame* frame);
- virtual blink::WebFrame* createChildFrame(blink::WebFrame* parent,
- const blink::WebString& name);
- virtual void didDisownOpener(blink::WebFrame* frame);
- virtual void frameDetached(blink::WebFrame* frame);
- virtual void willClose(blink::WebFrame* frame);
- virtual void didChangeName(blink::WebFrame* frame,
- const blink::WebString& name);
- virtual void didMatchCSS(
- blink::WebFrame* frame,
- const blink::WebVector<blink::WebString>& newly_matching_selectors,
- const blink::WebVector<blink::WebString>& stopped_matching_selectors);
- virtual void loadURLExternally(blink::WebFrame* frame,
- const blink::WebURLRequest& request,
- blink::WebNavigationPolicy policy);
- virtual void loadURLExternally(
- blink::WebFrame* frame,
- const blink::WebURLRequest& request,
- blink::WebNavigationPolicy policy,
- const blink::WebString& suggested_name);
- // The WebDataSource::ExtraData* is assumed to be a DocumentState* subclass.
- virtual blink::WebNavigationPolicy decidePolicyForNavigation(
- blink::WebFrame* frame,
- blink::WebDataSource::ExtraData* extra_data,
- const blink::WebURLRequest& request,
- blink::WebNavigationType type,
- blink::WebNavigationPolicy default_policy,
- bool is_redirect);
- // DEPRECATED
- virtual blink::WebNavigationPolicy decidePolicyForNavigation(
- blink::WebFrame* frame,
- const blink::WebURLRequest& request,
- blink::WebNavigationType type,
- blink::WebNavigationPolicy default_policy,
- bool is_redirect);
- virtual void willSendSubmitEvent(blink::WebFrame* frame,
- const blink::WebFormElement& form);
- virtual void willSubmitForm(blink::WebFrame* frame,
- const blink::WebFormElement& form);
- virtual void didCreateDataSource(blink::WebFrame* frame,
- blink::WebDataSource* datasource);
- virtual void didStartProvisionalLoad(blink::WebFrame* frame);
- virtual void didReceiveServerRedirectForProvisionalLoad(
- blink::WebFrame* frame);
- virtual void didFailProvisionalLoad(
- blink::WebFrame* frame,
- const blink::WebURLError& error);
- virtual void didCommitProvisionalLoad(blink::WebFrame* frame,
- bool is_new_navigation);
- virtual void didClearWindowObject(blink::WebFrame* frame, int world_id);
- virtual void didCreateDocumentElement(blink::WebFrame* frame);
- virtual void didReceiveTitle(blink::WebFrame* frame,
- const blink::WebString& title,
- blink::WebTextDirection direction);
- virtual void didChangeIcon(blink::WebFrame* frame,
- blink::WebIconURL::Type icon_type);
- virtual void didFinishDocumentLoad(blink::WebFrame* frame);
- virtual void didHandleOnloadEvents(blink::WebFrame* frame);
- virtual void didFailLoad(blink::WebFrame* frame,
- const blink::WebURLError& error);
- virtual void didFinishLoad(blink::WebFrame* frame);
- virtual void didNavigateWithinPage(blink::WebFrame* frame,
- bool is_new_navigation);
- virtual void didUpdateCurrentHistoryItem(blink::WebFrame* frame);
- virtual void willRequestAfterPreconnect(blink::WebFrame* frame,
- blink::WebURLRequest& request);
- virtual void willSendRequest(
- blink::WebFrame* frame,
- unsigned identifier,
- blink::WebURLRequest& request,
- const blink::WebURLResponse& redirect_response);
- virtual void didReceiveResponse(
- blink::WebFrame* frame,
- unsigned identifier,
- const blink::WebURLResponse& response);
- virtual void didFinishResourceLoad(blink::WebFrame* frame,
- unsigned identifier);
- virtual void didLoadResourceFromMemoryCache(
- blink::WebFrame* frame,
- const blink::WebURLRequest& request,
- const blink::WebURLResponse& response);
- virtual void didDisplayInsecureContent(blink::WebFrame* frame);
- virtual void didRunInsecureContent(blink::WebFrame* frame,
- const blink::WebSecurityOrigin& origin,
- const blink::WebURL& target);
- virtual void didAbortLoading(blink::WebFrame* frame);
- virtual void didExhaustMemoryAvailableForScript(
- blink::WebFrame* frame);
- virtual void didCreateScriptContext(blink::WebFrame* frame,
- v8::Handle<v8::Context> context,
- int extension_group,
- int world_id);
- virtual void willReleaseScriptContext(blink::WebFrame* frame,
- v8::Handle<v8::Context> context,
- int world_id);
- virtual void didFirstVisuallyNonEmptyLayout(blink::WebFrame* frame);
- virtual void didChangeContentsSize(blink::WebFrame* frame,
- const blink::WebSize& size);
- virtual void didChangeScrollOffset(blink::WebFrame* frame);
- virtual void willInsertBody(blink::WebFrame* frame);
- virtual void reportFindInPageMatchCount(int request_id,
- int count,
- bool final_update);
- virtual void reportFindInPageSelection(int request_id,
- int active_match_ordinal,
- const blink::WebRect& sel);
- virtual void requestStorageQuota(
- blink::WebFrame* frame,
- blink::WebStorageQuotaType type,
- unsigned long long requested_size,
- blink::WebStorageQuotaCallbacks callbacks);
- virtual void willOpenSocketStream(
- blink::WebSocketStreamHandle* handle);
- virtual void willStartUsingPeerConnectionHandler(
- blink::WebFrame* frame,
- blink::WebRTCPeerConnectionHandler* handler);
- virtual bool willCheckAndDispatchMessageEvent(
- blink::WebFrame* sourceFrame,
- blink::WebFrame* targetFrame,
- blink::WebSecurityOrigin targetOrigin,
- blink::WebDOMMessageEvent event);
- virtual blink::WebString userAgentOverride(
- blink::WebFrame* frame,
- const blink::WebURL& url);
- virtual blink::WebString doNotTrackValue(blink::WebFrame* frame);
- virtual bool allowWebGL(blink::WebFrame* frame, bool default_value);
- virtual void didLoseWebGLContext(blink::WebFrame* frame,
- int arb_robustness_status_code);
- virtual void forwardInputEvent(const blink::WebInputEvent* event);
- virtual void initializeChildFrame(const blink::WebRect& frame_rect,
- float scale_factor);
-
- // TODO(jam): move this to WebFrameClient
- virtual void showContextMenu(const blink::WebContextMenuData& data);
-
- // TODO(nasko): Make all tests in RenderViewImplTest friends and then move
- // this back to private member.
- void OnNavigate(const FrameMsg_Navigate_Params& params);
-
- protected:
- RenderFrameImpl(RenderViewImpl* render_view, int32 routing_id);
-
- private:
- friend class RenderFrameObserver;
- FRIEND_TEST_ALL_PREFIXES(RenderFrameImplTest,
- ShouldUpdateSelectionTextFromContextMenuParams);
-
- typedef std::map<GURL, double> HostZoomLevels;
-
- // Functions to add and remove observers for this object.
- void AddObserver(RenderFrameObserver* observer);
- void RemoveObserver(RenderFrameObserver* observer);
-
- void UpdateURL(blink::WebFrame* frame);
-
- // IPC message handlers ------------------------------------------------------
- //
- // The documentation for these functions should be in
- // content/common/*_messages.h for the message that the function is handling.
- void OnSwapOut();
- void OnChildFrameProcessGone();
- void OnBuffersSwapped(const FrameMsg_BuffersSwapped_Params& params);
- void OnCompositorFrameSwapped(const IPC::Message& message);
- void OnShowContextMenu(const gfx::Point& location);
- void OnContextMenuClosed(const CustomContextMenuContext& custom_context);
- void OnCustomContextMenuAction(const CustomContextMenuContext& custom_context,
- unsigned action);
-
- // Returns whether |params.selection_text| should be synchronized to the
- // browser before bringing up the context menu. Static for testing.
- static bool ShouldUpdateSelectionTextFromContextMenuParams(
- const base::string16& selection_text,
- size_t selection_text_offset,
- const gfx::Range& selection_range,
- const ContextMenuParams& params);
-
- // Stores the WebFrame we are associated with.
- blink::WebFrame* frame_;
-
- base::WeakPtr<RenderViewImpl> render_view_;
- int routing_id_;
- bool is_swapped_out_;
- bool is_detaching_;
-
-#if defined(ENABLE_PLUGINS)
- // Current text input composition text. Empty if no composition is in
- // progress.
- base::string16 pepper_composition_text_;
-#endif
-
- RendererWebCookieJarImpl cookie_jar_;
-
- // All the registered observers.
- ObserverList<RenderFrameObserver> observers_;
-
- scoped_refptr<ChildFrameCompositingHelper> compositing_helper_;
-
- // External context menu requests we're waiting for. "Internal"
- // (WebKit-originated) context menu events will have an ID of 0 and will not
- // be in this map.
- //
- // We don't want to add internal ones since some of the "special" page
- // handlers in the browser process just ignore the context menu requests so
- // avoid showing context menus, and so this will cause right clicks to leak
- // entries in this map. Most users of the custom context menu (e.g. Pepper
- // plugins) are normally only on "regular" pages and the regular pages will
- // always respond properly to the request, so we don't have to worry so
- // much about leaks.
- IDMap<ContextMenuClient, IDMapExternalPointer> pending_context_menus_;
-
- DISALLOW_COPY_AND_ASSIGN(RenderFrameImpl);
-};
-
-} // namespace content
-
-#endif // CONTENT_RENDERER_RENDER_FRAME_IMPL_H_
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_RENDERER_RENDER_FRAME_IMPL_H_
+#define CONTENT_RENDERER_RENDER_FRAME_IMPL_H_
+
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/files/file_path.h"
+#include "base/gtest_prod_util.h"
+#include "base/id_map.h"
+#include "base/memory/weak_ptr.h"
+#include "base/observer_list.h"
+#include "base/process/process_handle.h"
+#include "base/strings/string16.h"
+#include "content/public/renderer/render_frame.h"
+#include "content/renderer/renderer_webcookiejar_impl.h"
+#include "ipc/ipc_message.h"
+#include "third_party/WebKit/public/web/WebDataSource.h"
+#include "third_party/WebKit/public/web/WebFrameClient.h"
+
+class TransportDIB;
+struct FrameMsg_BuffersSwapped_Params;
+struct FrameMsg_CompositorFrameSwapped_Params;
+struct FrameMsg_Navigate_Params;
+
+namespace blink {
+class WebInputEvent;
+class WebMouseEvent;
+struct WebCompositionUnderline;
+struct WebContextMenuData;
+struct WebCursorInfo;
+}
+
+namespace gfx {
+class Point;
+class Range;
+class Rect;
+}
+
+namespace content {
+
+class ChildFrameCompositingHelper;
+class PepperPluginInstanceImpl;
+class RendererPpapiHost;
+class RenderFrameObserver;
+class RenderViewImpl;
+class RenderWidget;
+class RenderWidgetFullscreenPepper;
+struct CustomContextMenuContext;
+
+class CONTENT_EXPORT RenderFrameImpl
+ : public RenderFrame,
+ NON_EXPORTED_BASE(public blink::WebFrameClient) {
+ public:
+ // Creates a new RenderFrame. |render_view| is the RenderView object that this
+ // frame belongs to.
+ // Callers *must* call |SetWebFrame| immediately after creation.
+ // TODO(creis): We should structure this so that |SetWebFrame| isn't needed.
+ static RenderFrameImpl* Create(RenderViewImpl* render_view, int32 routing_id);
+
+ // Just like RenderFrame::FromWebFrame but returns the implementation.
+ static RenderFrameImpl* FromWebFrame(blink::WebFrame* web_frame);
+
+ // Used by content_layouttest_support to hook into the creation of
+ // RenderFrameImpls.
+ static void InstallCreateHook(
+ RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32));
+
+ virtual ~RenderFrameImpl();
+
+ bool is_swapped_out() const {
+ return is_swapped_out_;
+ }
+
+ // Out-of-process child frames receive a signal from RenderWidgetCompositor
+ // when a compositor frame has committed.
+ void DidCommitCompositorFrame();
+
+ // TODO(jam): this is a temporary getter until all the code is transitioned
+ // to using RenderFrame instead of RenderView.
+ RenderViewImpl* render_view() { return render_view_.get(); }
+
+ RendererWebCookieJarImpl* cookie_jar() { return &cookie_jar_; }
+
+ // Returns the RenderWidget associated with this frame.
+ RenderWidget* GetRenderWidget();
+
+ // This is called right after creation with the WebFrame for this RenderFrame.
+ void SetWebFrame(blink::WebFrame* web_frame);
+
+ // Notification from RenderView.
+ virtual void OnStop();
+
+ // Start/Stop loading notifications.
+ // TODO(nasko): Those are page-level methods at this time and come from
+ // WebViewClient. We should move them to be WebFrameClient calls and put
+ // logic in the browser side to balance starts/stops.
+ void didStartLoading();
+ void didStopLoading();
+
+#if defined(ENABLE_PLUGINS)
+ // Notification that a PPAPI plugin has been created.
+ void PepperPluginCreated(RendererPpapiHost* host);
+
+ // Notifies that |instance| has changed the cursor.
+ // This will update the cursor appearance if it is currently over the plugin
+ // instance.
+ void PepperDidChangeCursor(PepperPluginInstanceImpl* instance,
+ const blink::WebCursorInfo& cursor);
+
+ // Notifies that |instance| has received a mouse event.
+ void PepperDidReceiveMouseEvent(PepperPluginInstanceImpl* instance);
+
+ // Informs the render view that a PPAPI plugin has changed text input status.
+ void PepperTextInputTypeChanged(PepperPluginInstanceImpl* instance);
+ void PepperCaretPositionChanged(PepperPluginInstanceImpl* instance);
+
+ // Cancels current composition.
+ void PepperCancelComposition(PepperPluginInstanceImpl* instance);
+
+ // Informs the render view that a PPAPI plugin has changed selection.
+ void PepperSelectionChanged(PepperPluginInstanceImpl* instance);
+
+ // Creates a fullscreen container for a pepper plugin instance.
+ RenderWidgetFullscreenPepper* CreatePepperFullscreenContainer(
+ PepperPluginInstanceImpl* plugin);
+
+ bool IsPepperAcceptingCompositionEvents() const;
+
+ // Notification that the given plugin has crashed.
+ void PluginCrashed(const base::FilePath& plugin_path,
+ base::ProcessId plugin_pid);
+
+ // Simulates IME events for testing purpose.
+ void SimulateImeSetComposition(
+ const base::string16& text,
+ const std::vector<blink::WebCompositionUnderline>& underlines,
+ int selection_start,
+ int selection_end);
+ void SimulateImeConfirmComposition(const base::string16& text,
+ const gfx::Range& replacement_range);
+
+ // TODO(jam): remove these once the IPC handler moves from RenderView to
+ // RenderFrame.
+ void OnImeSetComposition(
+ const base::string16& text,
+ const std::vector<blink::WebCompositionUnderline>& underlines,
+ int selection_start,
+ int selection_end);
+ void OnImeConfirmComposition(
+ const base::string16& text,
+ const gfx::Range& replacement_range,
+ bool keep_selection);
+#endif // ENABLE_PLUGINS
+
+ // IPC::Sender
+ virtual bool Send(IPC::Message* msg) OVERRIDE;
+
+ // IPC::Listener
+ virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
+
+ // RenderFrame implementation:
+ virtual RenderView* GetRenderView() OVERRIDE;
+ virtual int GetRoutingID() OVERRIDE;
+ virtual blink::WebFrame* GetWebFrame() OVERRIDE;
+ virtual WebPreferences& GetWebkitPreferences() OVERRIDE;
+ virtual int ShowContextMenu(ContextMenuClient* client,
+ const ContextMenuParams& params) OVERRIDE;
+ virtual void CancelContextMenu(int request_id) OVERRIDE;
+ virtual blink::WebPlugin* CreatePlugin(
+ blink::WebFrame* frame,
+ const WebPluginInfo& info,
+ const blink::WebPluginParams& params) OVERRIDE;
+ virtual void LoadURLExternally(
+ blink::WebFrame* frame,
+ const blink::WebURLRequest& request,
+ blink::WebNavigationPolicy policy) OVERRIDE;
+
+ // blink::WebFrameClient implementation -------------------------------------
+ virtual blink::WebPlugin* createPlugin(
+ blink::WebFrame* frame,
+ const blink::WebPluginParams& params);
+ virtual blink::WebMediaPlayer* createMediaPlayer(
+ blink::WebFrame* frame,
+ const blink::WebURL& url,
+ blink::WebMediaPlayerClient* client);
+ virtual blink::WebApplicationCacheHost* createApplicationCacheHost(
+ blink::WebFrame* frame,
+ blink::WebApplicationCacheHostClient* client);
+ virtual blink::WebWorkerPermissionClientProxy*
+ createWorkerPermissionClientProxy(blink::WebFrame* frame);
+ virtual blink::WebCookieJar* cookieJar(blink::WebFrame* frame);
+ virtual blink::WebServiceWorkerProvider* createServiceWorkerProvider(
+ blink::WebFrame* frame,
+ blink::WebServiceWorkerProviderClient*);
+ virtual void didAccessInitialDocument(blink::WebFrame* frame);
+ virtual blink::WebFrame* createChildFrame(blink::WebFrame* parent,
+ const blink::WebString& name);
+ virtual void didDisownOpener(blink::WebFrame* frame);
+ virtual void frameDetached(blink::WebFrame* frame);
+ virtual void willClose(blink::WebFrame* frame);
+ virtual void didChangeName(blink::WebFrame* frame,
+ const blink::WebString& name);
+ virtual void didMatchCSS(
+ blink::WebFrame* frame,
+ const blink::WebVector<blink::WebString>& newly_matching_selectors,
+ const blink::WebVector<blink::WebString>& stopped_matching_selectors);
+ virtual void loadURLExternally(blink::WebFrame* frame,
+ const blink::WebURLRequest& request,
+ blink::WebNavigationPolicy policy);
+ virtual void loadURLExternally(
+ blink::WebFrame* frame,
+ const blink::WebURLRequest& request,
+ blink::WebNavigationPolicy policy,
+ const blink::WebString& suggested_name);
+ // The WebDataSource::ExtraData* is assumed to be a DocumentState* subclass.
+ virtual blink::WebNavigationPolicy decidePolicyForNavigation(
+ blink::WebFrame* frame,
+ blink::WebDataSource::ExtraData* extra_data,
+ const blink::WebURLRequest& request,
+ blink::WebNavigationType type,
+ blink::WebNavigationPolicy default_policy,
+ bool is_redirect);
+ // DEPRECATED
+ virtual blink::WebNavigationPolicy decidePolicyForNavigation(
+ blink::WebFrame* frame,
+ const blink::WebURLRequest& request,
+ blink::WebNavigationType type,
+ blink::WebNavigationPolicy default_policy,
+ bool is_redirect);
+ virtual void willSendSubmitEvent(blink::WebFrame* frame,
+ const blink::WebFormElement& form);
+ virtual void willSubmitForm(blink::WebFrame* frame,
+ const blink::WebFormElement& form);
+ virtual void didCreateDataSource(blink::WebFrame* frame,
+ blink::WebDataSource* datasource);
+ virtual void didStartProvisionalLoad(blink::WebFrame* frame);
+ virtual void didReceiveServerRedirectForProvisionalLoad(
+ blink::WebFrame* frame);
+ virtual void didFailProvisionalLoad(
+ blink::WebFrame* frame,
+ const blink::WebURLError& error);
+ virtual void didCommitProvisionalLoad(blink::WebFrame* frame,
+ bool is_new_navigation);
+ virtual void didClearWindowObject(blink::WebFrame* frame, int world_id);
+ virtual void didCreateDocumentElement(blink::WebFrame* frame);
+ virtual void didReceiveTitle(blink::WebFrame* frame,
+ const blink::WebString& title,
+ blink::WebTextDirection direction);
+ virtual void didChangeIcon(blink::WebFrame* frame,
+ blink::WebIconURL::Type icon_type);
+ virtual void didFinishDocumentLoad(blink::WebFrame* frame);
+ virtual void didHandleOnloadEvents(blink::WebFrame* frame);
+ virtual void didFailLoad(blink::WebFrame* frame,
+ const blink::WebURLError& error);
+ virtual void didFinishLoad(blink::WebFrame* frame);
+ virtual void didNavigateWithinPage(blink::WebFrame* frame,
+ bool is_new_navigation);
+ virtual void didUpdateCurrentHistoryItem(blink::WebFrame* frame);
+ virtual void willRequestAfterPreconnect(blink::WebFrame* frame,
+ blink::WebURLRequest& request);
+ virtual void willSendRequest(
+ blink::WebFrame* frame,
+ unsigned identifier,
+ blink::WebURLRequest& request,
+ const blink::WebURLResponse& redirect_response);
+ virtual void didReceiveResponse(
+ blink::WebFrame* frame,
+ unsigned identifier,
+ const blink::WebURLResponse& response);
+ virtual void didFinishResourceLoad(blink::WebFrame* frame,
+ unsigned identifier);
+ virtual void didLoadResourceFromMemoryCache(
+ blink::WebFrame* frame,
+ const blink::WebURLRequest& request,
+ const blink::WebURLResponse& response);
+ virtual void didDisplayInsecureContent(blink::WebFrame* frame);
+ virtual void didRunInsecureContent(blink::WebFrame* frame,
+ const blink::WebSecurityOrigin& origin,
+ const blink::WebURL& target);
+ virtual void didAbortLoading(blink::WebFrame* frame);
+ virtual void didExhaustMemoryAvailableForScript(
+ blink::WebFrame* frame);
+ virtual void didCreateScriptContext(blink::WebFrame* frame,
+ v8::Handle<v8::Context> context,
+ int extension_group,
+ int world_id);
+ virtual void willReleaseScriptContext(blink::WebFrame* frame,
+ v8::Handle<v8::Context> context,
+ int world_id);
+ virtual void didFirstVisuallyNonEmptyLayout(blink::WebFrame* frame);
+ virtual void didChangeContentsSize(blink::WebFrame* frame,
+ const blink::WebSize& size);
+ virtual void didChangeScrollOffset(blink::WebFrame* frame);
+ virtual void willInsertBody(blink::WebFrame* frame);
+ virtual void reportFindInPageMatchCount(int request_id,
+ int count,
+ bool final_update);
+ virtual void reportFindInPageSelection(int request_id,
+ int active_match_ordinal,
+ const blink::WebRect& sel);
+ virtual void requestStorageQuota(
+ blink::WebFrame* frame,
+ blink::WebStorageQuotaType type,
+ unsigned long long requested_size,
+ blink::WebStorageQuotaCallbacks callbacks);
+ virtual void willOpenSocketStream(
+ blink::WebSocketStreamHandle* handle);
+ virtual void willStartUsingPeerConnectionHandler(
+ blink::WebFrame* frame,
+ blink::WebRTCPeerConnectionHandler* handler);
+ virtual bool willCheckAndDispatchMessageEvent(
+ blink::WebFrame* sourceFrame,
+ blink::WebFrame* targetFrame,
+ blink::WebSecurityOrigin targetOrigin,
+ blink::WebDOMMessageEvent event);
+ virtual blink::WebString userAgentOverride(
+ blink::WebFrame* frame,
+ const blink::WebURL& url);
+ virtual blink::WebString doNotTrackValue(blink::WebFrame* frame);
+ virtual bool allowWebGL(blink::WebFrame* frame, bool default_value);
+ virtual void didLoseWebGLContext(blink::WebFrame* frame,
+ int arb_robustness_status_code);
+ virtual void forwardInputEvent(const blink::WebInputEvent* event);
+ virtual void initializeChildFrame(const blink::WebRect& frame_rect,
+ float scale_factor);
+
+ // TODO(jam): move this to WebFrameClient
+ virtual void showContextMenu(const blink::WebContextMenuData& data);
+
+ // TODO(nasko): Make all tests in RenderViewImplTest friends and then move
+ // this back to private member.
+ void OnNavigate(const FrameMsg_Navigate_Params& params);
+
+ protected:
+ RenderFrameImpl(RenderViewImpl* render_view, int32 routing_id);
+
+ private:
+ friend class RenderFrameObserver;
+ FRIEND_TEST_ALL_PREFIXES(RenderFrameImplTest,
+ ShouldUpdateSelectionTextFromContextMenuParams);
+
+ typedef std::map<GURL, double> HostZoomLevels;
+
+ // Function used to close frame asynchronously.
+ static void closeFrame(blink::WebFrame* frame);
+
+ // Functions to add and remove observers for this object.
+ void AddObserver(RenderFrameObserver* observer);
+ void RemoveObserver(RenderFrameObserver* observer);
+
+ void UpdateURL(blink::WebFrame* frame);
+
+ // IPC message handlers ------------------------------------------------------
+ //
+ // The documentation for these functions should be in
+ // content/common/*_messages.h for the message that the function is handling.
+ void OnSwapOut();
+ void OnChildFrameProcessGone();
+ void OnBuffersSwapped(const FrameMsg_BuffersSwapped_Params& params);
+ void OnCompositorFrameSwapped(const IPC::Message& message);
+ void OnShowContextMenu(const gfx::Point& location);
+ void OnContextMenuClosed(const CustomContextMenuContext& custom_context);
+ void OnCustomContextMenuAction(const CustomContextMenuContext& custom_context,
+ unsigned action);
+
+ // Returns whether |params.selection_text| should be synchronized to the
+ // browser before bringing up the context menu. Static for testing.
+ static bool ShouldUpdateSelectionTextFromContextMenuParams(
+ const base::string16& selection_text,
+ size_t selection_text_offset,
+ const gfx::Range& selection_range,
+ const ContextMenuParams& params);
+
+ // Stores the WebFrame we are associated with.
+ blink::WebFrame* frame_;
+
+ base::WeakPtr<RenderViewImpl> render_view_;
+ int routing_id_;
+ bool is_swapped_out_;
+ bool is_detaching_;
+
+#if defined(ENABLE_PLUGINS)
+ // Current text input composition text. Empty if no composition is in
+ // progress.
+ base::string16 pepper_composition_text_;
+#endif
+
+ RendererWebCookieJarImpl cookie_jar_;
+
+ // All the registered observers.
+ ObserverList<RenderFrameObserver> observers_;
+
+ scoped_refptr<ChildFrameCompositingHelper> compositing_helper_;
+
+ // External context menu requests we're waiting for. "Internal"
+ // (WebKit-originated) context menu events will have an ID of 0 and will not
+ // be in this map.
+ //
+ // We don't want to add internal ones since some of the "special" page
+ // handlers in the browser process just ignore the context menu requests so
+ // avoid showing context menus, and so this will cause right clicks to leak
+ // entries in this map. Most users of the custom context menu (e.g. Pepper
+ // plugins) are normally only on "regular" pages and the regular pages will
+ // always respond properly to the request, so we don't have to worry so
+ // much about leaks.
+ IDMap<ContextMenuClient, IDMapExternalPointer> pending_context_menus_;
+
+ DISALLOW_COPY_AND_ASSIGN(RenderFrameImpl);
+};
+
+} // namespace content
+
+#endif // CONTENT_RENDERER_RENDER_FRAME_IMPL_H_

Powered by Google App Engine
This is Rietveld 408576698