Index: content/browser/renderer_host/render_widget_host.h |
diff --git a/content/browser/renderer_host/render_widget_host.h b/content/browser/renderer_host/render_widget_host.h |
index 31fb45e275691a4e0bf53784bfca0008d2ff6963..f92d204cd2c8e092d47020a87684f5f02b399e6b 100644 |
--- a/content/browser/renderer_host/render_widget_host.h |
+++ b/content/browser/renderer_host/render_widget_host.h |
@@ -32,6 +32,7 @@ |
class BackingStore; |
struct EditCommand; |
class RenderViewHost; |
+class RenderWidgetHostImpl; |
class TransportDIB; |
struct ViewHostMsg_UpdateRect_Params; |
class WebCursor; |
@@ -68,11 +69,99 @@ struct WebScreenInfo; |
// TODO(joi): Once I finish defining this interface (once |
// RenderViewHost interface is also in place), group together |
// implementation functions in subclasses. |
-class CONTENT_EXPORT RenderWidgetHost { |
+// |
+// TODO(joi): Move to file render_widget_host_impl.h |
+class CONTENT_EXPORT RenderWidgetHost : public IPC::Channel::Sender { |
public: |
- explicit RenderWidgetHost(content::RenderProcessHost* process); |
virtual ~RenderWidgetHost() {} |
+ // Edit operations. |
+ virtual void Undo() = 0; |
+ virtual void Redo() = 0; |
+ virtual void Cut() = 0; |
+ virtual void Copy() = 0; |
+ virtual void CopyToFindPboard() = 0; |
+ virtual void Paste() = 0; |
+ virtual void PasteAndMatchStyle() = 0; |
+ virtual void Delete() = 0; |
+ virtual void SelectAll() = 0; |
+ |
+ // Update the text direction of the focused input element and notify it to a |
+ // renderer process. |
+ // These functions have two usage scenarios: changing the text direction |
+ // from a menu (as Safari does), and; changing the text direction when a user |
+ // presses a set of keys (as IE and Firefox do). |
+ // 1. Change the text direction from a menu. |
+ // In this scenario, we receive a menu event only once and we should update |
+ // the text direction immediately when a user chooses a menu item. So, we |
+ // should call both functions at once as listed in the following snippet. |
+ // void RenderViewHost::SetTextDirection(WebTextDirection direction) { |
+ // UpdateTextDirection(direction); |
+ // NotifyTextDirection(); |
+ // } |
+ // 2. Change the text direction when pressing a set of keys. |
+ // Because of auto-repeat, we may receive the same key-press event many |
+ // times while we presses the keys and it is nonsense to send the same IPC |
+ // message every time when we receive a key-press event. |
+ // To suppress the number of IPC messages, we just update the text direction |
+ // when receiving a key-press event and send an IPC message when we release |
+ // the keys as listed in the following snippet. |
+ // if (key_event.type == WebKeyboardEvent::KEY_DOWN) { |
+ // if (key_event.windows_key_code == 'A' && |
+ // key_event.modifiers == WebKeyboardEvent::CTRL_KEY) { |
+ // UpdateTextDirection(dir); |
+ // } else { |
+ // CancelUpdateTextDirection(); |
+ // } |
+ // } else if (key_event.type == WebKeyboardEvent::KEY_UP) { |
+ // NotifyTextDirection(); |
+ // } |
+ // Once we cancel updating the text direction, we have to ignore all |
+ // succeeding UpdateTextDirection() requests until calling |
+ // NotifyTextDirection(). (We may receive keydown events even after we |
+ // canceled updating the text direction because of auto-repeat.) |
+ // Note: we cannot undo this change for compatibility with Firefox and IE. |
+ virtual void UpdateTextDirection(WebKit::WebTextDirection direction) = 0; |
+ virtual void NotifyTextDirection() = 0; |
+ |
+ virtual void Blur() = 0; |
+ |
+ // Enable renderer accessibility. This should only be called when a |
+ // screenreader is detected. |
+ virtual void EnableRendererAccessibility() = 0; |
+ |
+ // Forwards the given message to the renderer. These are called by |
+ // the view when it has received a message. |
+ virtual void ForwardMouseEvent( |
+ const WebKit::WebMouseEvent& mouse_event) = 0; |
+ virtual void ForwardWheelEvent( |
+ const WebKit::WebMouseWheelEvent& wheel_event) = 0; |
+ virtual void ForwardKeyboardEvent( |
+ const NativeWebKeyboardEvent& key_event) = 0; |
+ |
+ // Get access to the widget's backing store. If a resize is in progress, |
+ // then the current size of the backing store may be less than the size of |
+ // the widget's view. If you pass |force_create| as true, then the backing |
+ // store will be created if it doesn't exist. Otherwise, NULL will be returned |
+ // if the backing store doesn't already exist. It will also return NULL if the |
+ // backing store could not be created. |
+ virtual BackingStore* GetBackingStore(bool force_create) = 0; |
jam
2012/02/29 01:40:47
sorry my change conflicted with this!
Jói
2012/03/02 10:40:36
Hehe, no worries :)
|
+ |
+ virtual const gfx::Point& GetLastScrollOffset() const = 0; |
+ |
+ virtual content::RenderProcessHost* GetProcess() const = 0; |
+ |
+ virtual int GetRoutingID() const = 0; |
+ |
+ // Gets the View of this RenderWidgetHost. Can be NULL, e.g. if the |
+ // RenderWidget is being destroyed or the render process crashed. You should |
+ // never cache this pointer since it can become NULL if the renderer crashes, |
+ // instead you should always ask for it using the accessor. |
+ virtual content::RenderWidgetHostView* GetView() const = 0; |
+ |
+ // Returns true if this is a RenderViewHost, false if not. |
+ virtual bool IsRenderView() const = 0; |
+ |
// Used as the details object for a |
// RENDER_WIDGET_HOST_DID_RECEIVE_PAINT_AT_SIZE_ACK notification. |
// TODO(joi): Switch out for a std::pair. |
@@ -97,49 +186,46 @@ class CONTENT_EXPORT RenderWidgetHost { |
const gfx::Size& page_size, |
const gfx::Size& desired_size) = 0; |
- // Get access to the widget's backing store. If a resize is in progress, |
- // then the current size of the backing store may be less than the size of |
- // the widget's view. If you pass |force_create| as true, then the backing |
- // store will be created if it doesn't exist. Otherwise, NULL will be returned |
- // if the backing store doesn't already exist. It will also return NULL if the |
- // backing store could not be created. |
- virtual BackingStore* GetBackingStore(bool force_create) = 0; |
+ // Makes an IPC call to tell webkit to replace the currently selected word |
+ // or a word around the cursor. |
+ virtual void Replace(const string16& word) = 0; |
- // Returns true if this is a RenderViewHost, false if not. |
- virtual bool IsRenderView() const = 0; |
+ // Called to notify the RenderWidget that the resize rect has changed without |
+ // the size of the RenderWidget itself changing. |
+ virtual void ResizeRectChanged(const gfx::Rect& new_rect) = 0; |
+ |
+ // Restart the active hang monitor timeout. Clears all existing timeouts and |
+ // starts with a new one. This can be because the renderer has become |
+ // active, the tab is being hidden, or the user has chosen to wait some more |
+ // to give the tab a chance to become active and we don't want to display a |
+ // warning too soon. |
+ virtual void RestartHangMonitorTimeout() = 0; |
+ |
+ virtual void SetIgnoreInputEvents(bool ignore_input_events) = 0; |
+ |
+ // Stops loading the page. |
+ virtual void Stop() = 0; |
// Called to notify the RenderWidget that it has been resized. |
virtual void WasResized() = 0; |
- // TODO(joi): Get rid of these inline accessors and the associated |
- // data from the interface, make them into pure virtual GetFoo |
- // methods instead. |
- content::RenderProcessHost* process() const { return process_; } |
+ // Access to the implementation's |
+ // IPC::Channel::Listener::OnMessageReceived. Intended only for |
+ // test code. |
+ virtual bool OnMessageReceivedForTesting(const IPC::Message& msg) = 0; |
- // Gets the View of this RenderWidgetHost. Can be NULL, e.g. if the |
- // RenderWidget is being destroyed or the render process crashed. You should |
- // never cache this pointer since it can become NULL if the renderer crashes, |
- // instead you should always ask for it using the accessor. |
- content::RenderWidgetHostView* view() const; |
+ // Retrieves the implementation class. Intended only for code |
+ // within content/. This method is necessary because |
+ // RenderWidgetHost is the root of a diamond inheritance pattern, so |
+ // subclasses inherit it virtually, which removes our ability to |
+ // static_cast to the subclass. |
+ virtual RenderWidgetHostImpl* AsRWHImpl() = 0; |
// Gets a RenderVidgetHost pointer from an IPC::Channel::Listener pointer. |
static RenderWidgetHost* FromIPCChannelListener( |
IPC::Channel::Listener* listener); |
static const RenderWidgetHost* FromIPCChannelListener( |
const IPC::Channel::Listener* listener); |
- |
- protected: |
- // Created during construction but initialized during Init*(). Therefore, it |
- // is guaranteed never to be NULL, but its channel may be NULL if the |
- // renderer crashed, so you must always check that. |
- content::RenderProcessHost* process_; |
- |
- // The View associated with the RenderViewHost. The lifetime of this object |
- // is associated with the lifetime of the Render process. If the Renderer |
- // crashes, its View is destroyed and this pointer becomes NULL, even though |
- // render_view_host_ lives on to load another URL (creating a new View while |
- // doing so). |
- content::RenderWidgetHostViewPort* view_; |
}; |
// This class manages the browser side of a browser<->renderer HWND connection. |
@@ -217,9 +303,8 @@ class CONTENT_EXPORT RenderWidgetHost { |
// the RenderWidgetHost's IPC message map. |
// |
// TODO(joi): Move to content namespace. |
-class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, |
- public IPC::Channel::Listener, |
- public IPC::Channel::Sender { |
+class CONTENT_EXPORT RenderWidgetHostImpl : virtual public RenderWidgetHost, |
+ public IPC::Channel::Listener { |
public: |
// routing_id can be MSG_ROUTING_NONE, in which case the next available |
// routing id is taken from the RenderProcessHost. |
@@ -228,10 +313,48 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, |
static RenderWidgetHostImpl* FromRWHV(content::RenderWidgetHostView* rwhv); |
+ // RenderWidgetHost implementation. |
+ virtual void Undo() OVERRIDE; |
+ virtual void Redo() OVERRIDE; |
+ virtual void Cut() OVERRIDE; |
+ virtual void Copy() OVERRIDE; |
+ virtual void CopyToFindPboard() OVERRIDE; |
+ virtual void Paste() OVERRIDE; |
+ virtual void PasteAndMatchStyle() OVERRIDE; |
+ virtual void Delete() OVERRIDE; |
+ virtual void SelectAll() OVERRIDE; |
+ virtual void UpdateTextDirection(WebKit::WebTextDirection direction) OVERRIDE; |
+ virtual void NotifyTextDirection() OVERRIDE; |
+ virtual void Blur() OVERRIDE; |
+ virtual void EnableRendererAccessibility() OVERRIDE; |
+ virtual void ForwardMouseEvent( |
+ const WebKit::WebMouseEvent& mouse_event) OVERRIDE; |
+ virtual void ForwardWheelEvent( |
+ const WebKit::WebMouseWheelEvent& wheel_event) OVERRIDE; |
+ virtual void ForwardKeyboardEvent( |
+ const NativeWebKeyboardEvent& key_event) OVERRIDE; |
+ virtual BackingStore* GetBackingStore(bool force_create) OVERRIDE; |
+ virtual const gfx::Point& GetLastScrollOffset() const OVERRIDE; |
+ virtual content::RenderProcessHost* GetProcess() const OVERRIDE; |
+ virtual int GetRoutingID() const OVERRIDE; |
+ virtual content::RenderWidgetHostView* GetView() const OVERRIDE; |
+ virtual bool IsRenderView() const OVERRIDE; |
+ virtual void PaintAtSize(TransportDIB::Handle dib_handle, |
+ int tag, |
+ const gfx::Size& page_size, |
+ const gfx::Size& desired_size) OVERRIDE; |
+ virtual void Replace(const string16& word) OVERRIDE; |
+ virtual void ResizeRectChanged(const gfx::Rect& new_rect) OVERRIDE; |
+ virtual void RestartHangMonitorTimeout() OVERRIDE; |
+ virtual void SetIgnoreInputEvents(bool ignore_input_events) OVERRIDE; |
+ virtual void Stop() OVERRIDE; |
+ virtual void WasResized() OVERRIDE; |
+ virtual bool OnMessageReceivedForTesting(const IPC::Message& msg) OVERRIDE; |
+ virtual RenderWidgetHostImpl* AsRWHImpl() OVERRIDE; |
+ |
// Sets the View of this RenderWidgetHost. |
void SetView(content::RenderWidgetHostView* view); |
- int routing_id() const { return routing_id_; } |
int surface_id() const { return surface_id_; } |
bool renderer_accessible() { return renderer_accessible_; } |
@@ -251,9 +374,6 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, |
// Tells the renderer to die and then calls Destroy(). |
virtual void Shutdown(); |
- // Manual RTTI FTW. We are not hosting a web page. |
- virtual bool IsRenderView() const OVERRIDE; |
- |
// IPC::Channel::Listener |
virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; |
@@ -265,19 +385,12 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, |
void WasHidden(); |
void WasRestored(); |
- virtual void WasResized() OVERRIDE; |
- |
- // Called to notify the RenderWidget that the resize rect has changed without |
- // the size of the RenderWidget itself changing. |
- void ResizeRectChanged(const gfx::Rect& new_rect); |
- |
// Called to notify the RenderWidget that its associated native window got |
// focused. |
virtual void GotFocus(); |
// Tells the renderer it got/lost focus. |
void Focus(); |
- void Blur(); |
virtual void LostCapture(); |
// Sets whether the renderer should show controls in an active state. On all |
@@ -300,13 +413,6 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, |
// Indicates if the page has finished loading. |
void SetIsLoading(bool is_loading); |
- virtual void PaintAtSize(TransportDIB::Handle dib_handle, |
- int tag, |
- const gfx::Size& page_size, |
- const gfx::Size& desired_size) OVERRIDE; |
- |
- virtual BackingStore* GetBackingStore(bool force_create) OVERRIDE; |
- |
// Allocate a new backing store of the given size. Returns NULL on failure |
// (for example, if we don't currently have a RenderWidgetHostView.) |
BackingStore* AllocBackingStore(const gfx::Size& size); |
@@ -326,65 +432,19 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, |
// left on the existing timeouts. |
void StartHangMonitorTimeout(base::TimeDelta delay); |
- // Restart the active hang monitor timeout. Clears all existing timeouts and |
- // starts with a new one. This can be because the renderer has become |
- // active, the tab is being hidden, or the user has chosen to wait some more |
- // to give the tab a chance to become active and we don't want to display a |
- // warning too soon. |
- void RestartHangMonitorTimeout(); |
- |
// Stops all existing hang monitor timeouts and assumes the renderer is |
// responsive. |
void StopHangMonitorTimeout(); |
// Forwards the given message to the renderer. These are called by the view |
// when it has received a message. |
- virtual void ForwardMouseEvent(const WebKit::WebMouseEvent& mouse_event); |
- // Called when a mouse click activates the renderer. |
- virtual void OnMouseActivate(); |
- void ForwardWheelEvent(const WebKit::WebMouseWheelEvent& wheel_event); |
void ForwardGestureEvent(const WebKit::WebGestureEvent& gesture_event); |
- virtual void ForwardKeyboardEvent(const NativeWebKeyboardEvent& key_event); |
virtual void ForwardTouchEvent(const WebKit::WebTouchEvent& touch_event); |
- // Update the text direction of the focused input element and notify it to a |
- // renderer process. |
- // These functions have two usage scenarios: changing the text direction |
- // from a menu (as Safari does), and; changing the text direction when a user |
- // presses a set of keys (as IE and Firefox do). |
- // 1. Change the text direction from a menu. |
- // In this scenario, we receive a menu event only once and we should update |
- // the text direction immediately when a user chooses a menu item. So, we |
- // should call both functions at once as listed in the following snippet. |
- // void RenderViewHost::SetTextDirection(WebTextDirection direction) { |
- // UpdateTextDirection(direction); |
- // NotifyTextDirection(); |
- // } |
- // 2. Change the text direction when pressing a set of keys. |
- // Because of auto-repeat, we may receive the same key-press event many |
- // times while we presses the keys and it is nonsense to send the same IPC |
- // message every time when we receive a key-press event. |
- // To suppress the number of IPC messages, we just update the text direction |
- // when receiving a key-press event and send an IPC message when we release |
- // the keys as listed in the following snippet. |
- // if (key_event.type == WebKeyboardEvent::KEY_DOWN) { |
- // if (key_event.windows_key_code == 'A' && |
- // key_event.modifiers == WebKeyboardEvent::CTRL_KEY) { |
- // UpdateTextDirection(dir); |
- // } else { |
- // CancelUpdateTextDirection(); |
- // } |
- // } else if (key_event.type == WebKeyboardEvent::KEY_UP) { |
- // NotifyTextDirection(); |
- // } |
- // Once we cancel updating the text direction, we have to ignore all |
- // succeeding UpdateTextDirection() requests until calling |
- // NotifyTextDirection(). (We may receive keydown events even after we |
- // canceled updating the text direction because of auto-repeat.) |
- // Note: we cannot undo this change for compatibility with Firefox and IE. |
- void UpdateTextDirection(WebKit::WebTextDirection direction); |
void CancelUpdateTextDirection(); |
- void NotifyTextDirection(); |
+ |
+ // Called when a mouse click activates the renderer. |
+ virtual void OnMouseActivate(); |
// Notifies the renderer whether or not the input method attached to this |
// process is activated. |
@@ -436,17 +496,6 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, |
// And to also expose it to the RenderWidgetHostView. |
virtual gfx::Rect GetRootWindowResizerRect() const; |
- // Makes an IPC call to tell webkit to replace the currently selected word |
- // or a word around the cursor. |
- void Replace(const string16& word); |
- |
- // Enable renderer accessibility. This should only be called when a |
- // screenreader is detected. |
- void EnableRendererAccessibility(); |
- |
- void set_ignore_input_events(bool ignore_input_events) { |
- ignore_input_events_ = ignore_input_events; |
- } |
bool ignore_input_events() const { |
return ignore_input_events_; |
} |
@@ -454,17 +503,12 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, |
// Activate deferred plugin handles. |
void ActivateDeferredPluginHandles(); |
- const gfx::Point& last_scroll_offset() const { return last_scroll_offset_; } |
- |
bool has_touch_handler() const { return has_touch_handler_; } |
// Notification that the user has made some kind of input that could |
// perform an action. See OnUserGesture for more details. |
void StartUserGesture(); |
- // Stops loading the page. |
- void Stop(); |
- |
// Set the RenderView background. |
void SetBackground(const SkBitmap& background); |
@@ -509,17 +553,6 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, |
// Requests the renderer to select the region between two points. |
void SelectRange(const gfx::Point& start, const gfx::Point& end); |
- // Edit operations. |
- void Undo(); |
- void Redo(); |
- void Cut(); |
- void Copy(); |
- void CopyToFindPboard(); |
- void Paste(); |
- void PasteAndMatchStyle(); |
- void Delete(); |
- void SelectAll(); |
- |
// Called when the reponse to a pending mouse lock request has arrived. |
// Returns true if |allowed| is true and the mouse has been successfully |
// locked. |
@@ -599,6 +632,13 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, |
void SetShouldAutoResize(bool enable); |
protected: |
+ // The View associated with the RenderViewHost. The lifetime of this object |
+ // is associated with the lifetime of the Render process. If the Renderer |
+ // crashes, its View is destroyed and this pointer becomes NULL, even though |
+ // render_view_host_ lives on to load another URL (creating a new View while |
+ // doing so). |
+ content::RenderWidgetHostViewPort* view_; |
+ |
// true if a renderer has once been valid. We use this flag to display a sad |
// tab only when we lose our renderer and not if a paint occurs during |
// initialization. |
@@ -716,6 +756,14 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, |
// renderer. |
void ProcessTouchAck(bool processed); |
+ // Created during construction but initialized during Init*(). Therefore, it |
+ // is guaranteed never to be NULL, but its channel may be NULL if the |
+ // renderer crashed, so you must always check that. |
+ content::RenderProcessHost* process_; |
+ |
+ // The ID of the corresponding object in the Renderer Instance. |
+ int routing_id_; |
+ |
// True if renderer accessibility is enabled. This should only be set when a |
// screenreader is detected as it can potentially slow down Chrome. |
bool renderer_accessible_; |
@@ -723,9 +771,6 @@ class CONTENT_EXPORT RenderWidgetHostImpl : public RenderWidgetHost, |
// Stores random bits of data for others to associate with this object. |
base::PropertyBag property_bag_; |
- // The ID of the corresponding object in the Renderer Instance. |
- int routing_id_; |
- |
// The ID of the surface corresponding to this render widget. |
int surface_id_; |