• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_WIN_H_
6 #define CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_WIN_H_
7 #pragma once
8 
9 #include <atlbase.h>
10 #include <atlapp.h>
11 #include <atlcrack.h>
12 #include <atlmisc.h>
13 
14 #include <vector>
15 
16 #include "base/memory/scoped_ptr.h"
17 #include "base/memory/scoped_vector.h"
18 #include "base/task.h"
19 #include "base/win/scoped_comptr.h"
20 #include "chrome/browser/accessibility/browser_accessibility_manager.h"
21 #include "content/browser/renderer_host/render_widget_host_view.h"
22 #include "content/common/notification_observer.h"
23 #include "content/common/notification_registrar.h"
24 #include "ui/base/win/ime_input.h"
25 #include "ui/gfx/native_widget_types.h"
26 #include "webkit/glue/webcursor.h"
27 
28 class BackingStore;
29 class RenderWidgetHost;
30 
31 namespace gfx {
32 class Size;
33 class Rect;
34 }
35 
36 namespace IPC {
37 class Message;
38 }
39 
40 namespace ui {
41 class ViewProp;
42 }
43 
44 typedef CWinTraits<WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0>
45     RenderWidgetHostHWNDTraits;
46 
47 extern const wchar_t kRenderWidgetHostHWNDClass[];
48 
49 ///////////////////////////////////////////////////////////////////////////////
50 // RenderWidgetHostViewWin
51 //
52 //  An object representing the "View" of a rendered web page. This object is
53 //  responsible for displaying the content of the web page, receiving windows
54 //  messages, and containing plugins HWNDs. It is the implementation of the
55 //  RenderWidgetHostView that the cross-platform RenderWidgetHost object uses
56 //  to display the data.
57 //
58 //  Comment excerpted from render_widget_host.h:
59 //
60 //    "The lifetime of the RenderWidgetHostHWND is tied to the render process.
61 //     If the render process dies, the RenderWidgetHostHWND goes away and all
62 //     references to it must become NULL."
63 //
64 class RenderWidgetHostViewWin
65     : public CWindowImpl<RenderWidgetHostViewWin,
66                          CWindow,
67                          RenderWidgetHostHWNDTraits>,
68       public RenderWidgetHostView,
69       public NotificationObserver,
70       public BrowserAccessibilityDelegate {
71  public:
72   // The view will associate itself with the given widget.
73   explicit RenderWidgetHostViewWin(RenderWidgetHost* widget);
74   virtual ~RenderWidgetHostViewWin();
75 
76   void CreateWnd(HWND parent);
77 
78   DECLARE_WND_CLASS_EX(kRenderWidgetHostHWNDClass, CS_DBLCLKS, 0);
79 
80   BEGIN_MSG_MAP(RenderWidgetHostHWND)
81     MSG_WM_CREATE(OnCreate)
82     MSG_WM_ACTIVATE(OnActivate)
83     MSG_WM_DESTROY(OnDestroy)
84     MSG_WM_PAINT(OnPaint)
85     MSG_WM_NCPAINT(OnNCPaint)
86     MSG_WM_ERASEBKGND(OnEraseBkgnd)
87     MSG_WM_SETCURSOR(OnSetCursor)
88     MSG_WM_SETFOCUS(OnSetFocus)
89     MSG_WM_KILLFOCUS(OnKillFocus)
90     MSG_WM_CAPTURECHANGED(OnCaptureChanged)
91     MSG_WM_CANCELMODE(OnCancelMode)
92     MSG_WM_INPUTLANGCHANGE(OnInputLangChange)
93     MSG_WM_THEMECHANGED(OnThemeChanged)
94     MSG_WM_NOTIFY(OnNotify)
95     MESSAGE_HANDLER(WM_IME_SETCONTEXT, OnImeSetContext)
96     MESSAGE_HANDLER(WM_IME_STARTCOMPOSITION, OnImeStartComposition)
97     MESSAGE_HANDLER(WM_IME_COMPOSITION, OnImeComposition)
98     MESSAGE_HANDLER(WM_IME_ENDCOMPOSITION, OnImeEndComposition)
99     MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseEvent)
100     MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseEvent)
101     MESSAGE_HANDLER(WM_LBUTTONDOWN, OnMouseEvent)
102     MESSAGE_HANDLER(WM_MBUTTONDOWN, OnMouseEvent)
103     MESSAGE_HANDLER(WM_RBUTTONDOWN, OnMouseEvent)
104     MESSAGE_HANDLER(WM_LBUTTONUP, OnMouseEvent)
105     MESSAGE_HANDLER(WM_MBUTTONUP, OnMouseEvent)
106     MESSAGE_HANDLER(WM_RBUTTONUP, OnMouseEvent)
107     MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnMouseEvent)
108     MESSAGE_HANDLER(WM_MBUTTONDBLCLK, OnMouseEvent)
109     MESSAGE_HANDLER(WM_RBUTTONDBLCLK, OnMouseEvent)
110     MESSAGE_HANDLER(WM_SYSKEYDOWN, OnKeyEvent)
111     MESSAGE_HANDLER(WM_SYSKEYUP, OnKeyEvent)
112     MESSAGE_HANDLER(WM_KEYDOWN, OnKeyEvent)
113     MESSAGE_HANDLER(WM_KEYUP, OnKeyEvent)
114     MESSAGE_HANDLER(WM_MOUSEWHEEL, OnWheelEvent)
115     MESSAGE_HANDLER(WM_MOUSEHWHEEL, OnWheelEvent)
116     MESSAGE_HANDLER(WM_HSCROLL, OnWheelEvent)
117     MESSAGE_HANDLER(WM_VSCROLL, OnWheelEvent)
118     MESSAGE_HANDLER(WM_CHAR, OnKeyEvent)
119     MESSAGE_HANDLER(WM_SYSCHAR, OnKeyEvent)
120     MESSAGE_HANDLER(WM_IME_CHAR, OnKeyEvent)
121     MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate)
122     MESSAGE_HANDLER(WM_GETOBJECT, OnGetObject)
123     MESSAGE_HANDLER(WM_PARENTNOTIFY, OnParentNotify)
124   END_MSG_MAP()
125 
126   // Implementation of RenderWidgetHostView:
127   virtual void InitAsPopup(RenderWidgetHostView* parent_host_view,
128                            const gfx::Rect& pos);
129   virtual void InitAsFullscreen();
130   virtual RenderWidgetHost* GetRenderWidgetHost() const;
131   virtual void DidBecomeSelected();
132   virtual void WasHidden();
133   virtual void SetSize(const gfx::Size& size);
134   virtual void SetBounds(const gfx::Rect& rect);
135   virtual gfx::NativeView GetNativeView();
136   virtual void MovePluginWindows(
137       const std::vector<webkit::npapi::WebPluginGeometry>& moves);
138   virtual void Focus();
139   virtual void Blur();
140   virtual bool HasFocus();
141   virtual void Show();
142   virtual void Hide();
143   virtual bool IsShowing();
144   virtual gfx::Rect GetViewBounds() const;
145   virtual void UpdateCursor(const WebCursor& cursor);
146   virtual void SetIsLoading(bool is_loading);
147   virtual void ImeUpdateTextInputState(WebKit::WebTextInputType type,
148                                        const gfx::Rect& caret_rect);
149   virtual void ImeCancelComposition();
150   virtual void DidUpdateBackingStore(
151       const gfx::Rect& scroll_rect, int scroll_dx, int scroll_dy,
152       const std::vector<gfx::Rect>& copy_rects);
153   virtual void RenderViewGone(base::TerminationStatus status,
154                               int error_code);
155   virtual void WillWmDestroy();  // called by TabContents before DestroyWindow
156   virtual void WillDestroyRenderWidget(RenderWidgetHost* rwh);
157   virtual void Destroy();
158   virtual void SetTooltipText(const std::wstring& tooltip_text);
159   virtual BackingStore* AllocBackingStore(const gfx::Size& size);
160   virtual void SetBackground(const SkBitmap& background);
161   virtual bool ContainsNativeView(gfx::NativeView native_view) const;
162   virtual void SetVisuallyDeemphasized(const SkColor* color, bool animate);
163 
164   virtual gfx::PluginWindowHandle GetCompositingSurface();
165   virtual void ShowCompositorHostWindow(bool show);
166 
167   virtual void OnAccessibilityNotifications(
168       const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params);
169 
170   // Implementation of NotificationObserver:
171   virtual void Observe(NotificationType type,
172                        const NotificationSource& source,
173                        const NotificationDetails& details);
174 
175   // Implementation of BrowserAccessibilityDelegate:
176   virtual void SetAccessibilityFocus(int acc_obj_id);
177   virtual void AccessibilityDoDefaultAction(int acc_obj_id);
178 
179  protected:
180   // Windows Message Handlers
181   LRESULT OnCreate(CREATESTRUCT* create_struct);
182   void OnActivate(UINT, BOOL, HWND);
183   void OnDestroy();
184   void OnPaint(HDC unused_dc);
185   void OnNCPaint(HRGN update_region);
186   LRESULT OnEraseBkgnd(HDC dc);
187   LRESULT OnSetCursor(HWND window, UINT hittest_code, UINT mouse_message_id);
188   void OnSetFocus(HWND window);
189   void OnKillFocus(HWND window);
190   void OnCaptureChanged(HWND window);
191   void OnCancelMode();
192   void OnInputLangChange(DWORD character_set, HKL input_language_id);
193   void OnThemeChanged();
194   LRESULT OnNotify(int w_param, NMHDR* header);
195   LRESULT OnImeSetContext(
196       UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled);
197   LRESULT OnImeStartComposition(
198       UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled);
199   LRESULT OnImeComposition(
200       UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled);
201   LRESULT OnImeEndComposition(
202       UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled);
203   LRESULT OnMouseEvent(
204       UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled);
205   LRESULT OnKeyEvent(
206       UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled);
207   LRESULT OnWheelEvent(
208       UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled);
209   LRESULT OnMouseActivate(UINT message,
210                           WPARAM wparam,
211                           LPARAM lparam,
212                           BOOL& handled);
213   // Handle MSAA requests for accessibility information.
214   LRESULT OnGetObject(UINT message, WPARAM wparam, LPARAM lparam,
215                       BOOL& handled);
216   // Handle vertical scrolling
217   LRESULT OnVScroll(int code, short position, HWND scrollbar_control);
218   // Handle horizontal scrolling
219   LRESULT OnHScroll(int code, short position, HWND scrollbar_control);
220 
221   LRESULT OnParentNotify(UINT message, WPARAM wparam, LPARAM lparam,
222                          BOOL& handled);
223 
224   void OnFinalMessage(HWND window);
225 
226  private:
227   // Updates the display cursor to the current cursor if the cursor is over this
228   // render view.
229   void UpdateCursorIfOverSelf();
230 
231   // Tells Windows that we want to hear about mouse exit messages.
232   void TrackMouseLeave(bool start_tracking);
233 
234   // Sends a message to the RenderView in the renderer process.
235   bool Send(IPC::Message* message);
236 
237   // Set the tooltip region to the size of the window, creating the tooltip
238   // hwnd if it has not been created yet.
239   void EnsureTooltip();
240 
241   // Tooltips become invalid when the root ancestor changes. When the View
242   // becomes hidden, this method is called to reset the tooltip.
243   void ResetTooltip();
244 
245   // Sends the specified mouse event to the renderer.
246   void ForwardMouseEventToRenderer(UINT message, WPARAM wparam, LPARAM lparam);
247 
248   // Synthesize mouse wheel event.
249   LRESULT SynthesizeMouseWheel(bool is_vertical, int scroll_code,
250                                short scroll_position);
251 
252   // Shuts down the render_widget_host_.  This is a separate function so we can
253   // invoke it from the message loop.
254   void ShutdownHost();
255 
256   // Redraws the window synchronously, and any child windows (i.e. plugins)
257   // asynchronously.
258   void Redraw();
259 
260   // Draw our background over the given HDC in the given |rect|. The background
261   // will be tiled such that it lines up with existing tiles starting from the
262   // origin of |dc|.
263   void DrawBackground(const RECT& rect, CPaintDC* dc);
264 
265   // Create an intermediate window between the given HWND and its parent.
266   HWND ReparentWindow(HWND window);
267 
268   // Clean up the compositor window, if needed.
269   void CleanupCompositorWindow();
270 
271   // Whether the window should be activated.
272   bool IsActivatable() const;
273 
274   // The associated Model.
275   RenderWidgetHost* render_widget_host_;
276 
277   // When we are doing accelerated compositing
278   HWND compositor_host_window_;
279 
280   // true if the compositor host window must be hidden after the
281   // software renderered view is updated.
282   bool hide_compositor_window_at_next_paint_;
283 
284   // The cursor for the page. This is passed up from the renderer.
285   WebCursor current_cursor_;
286 
287   // Indicates if the page is loading.
288   bool is_loading_;
289 
290   // true if we are currently tracking WM_MOUSEEXIT messages.
291   bool track_mouse_leave_;
292 
293   // Wrapper class for IME input.
294   // (See "ui/base/win/ime_input.h" for its details.)
295   ui::ImeInput ime_input_;
296 
297   // Represents whether or not this browser process is receiving status
298   // messages about the focused edit control from a renderer process.
299   bool ime_notification_;
300 
301   // true if Enter was hit when render widget host was in focus.
302   bool capture_enter_key_;
303 
304   // true if the View is not visible.
305   bool is_hidden_;
306 
307   // True if we're in the midst of a paint operation and should respond to
308   // DidPaintRect() notifications by merely invalidating.  See comments on
309   // render_widget_host_view.h:DidPaintRect().
310   bool about_to_validate_and_paint_;
311 
312   // true if the View should be closed when its HWND is deactivated (used to
313   // support SELECT popups which are closed when they are deactivated).
314   bool close_on_deactivate_;
315 
316   // Whether Destroy() has been called.  Used to detect a crasher
317   // (http://crbug.com/24248) where render_view_host_ has been deleted when
318   // OnFinalMessage is called.
319   bool being_destroyed_;
320 
321   // Tooltips
322   // The text to be shown in the tooltip, supplied by the renderer.
323   std::wstring tooltip_text_;
324   // The tooltip control hwnd
325   HWND tooltip_hwnd_;
326   // Whether or not a tooltip is currently visible. We use this to track
327   // whether or not we want to force-close the tooltip when we receive mouse
328   // move notifications from the renderer. See comment in OnMsgSetTooltipText.
329   bool tooltip_showing_;
330 
331   // Factory used to safely scope delayed calls to ShutdownHost().
332   ScopedRunnableMethodFactory<RenderWidgetHostViewWin> shutdown_factory_;
333 
334   // Our parent HWND.  We keep a reference to it as we SetParent(NULL) when
335   // hidden to prevent getting messages (Paint, Resize...), and we reattach
336   // when shown again.
337   HWND parent_hwnd_;
338 
339   // Instance of accessibility information for the root of the MSAA
340   // tree representation of the WebKit render tree.
341   scoped_ptr<BrowserAccessibilityManager> browser_accessibility_manager_;
342 
343   // The time at which this view started displaying white pixels as a result of
344   // not having anything to paint (empty backing store from renderer). This
345   // value returns true for is_null() if we are not recording whiteout times.
346   base::TimeTicks whiteout_start_time_;
347 
348   // The time it took after this view was selected for it to be fully painted.
349   base::TimeTicks tab_switch_paint_time_;
350 
351   // A color we use to shade the entire render view. If 100% transparent, we do
352   // not shade the render view.
353   SkColor overlay_color_;
354 
355   // Registrar so we can listen to RENDERER_PROCESS_TERMINATED events.
356   NotificationRegistrar registrar_;
357 
358   // Stores the current text input type received by ImeUpdateTextInputState()
359   // method.
360   WebKit::WebTextInputType text_input_type_;
361 
362   ScopedVector<ui::ViewProp> props_;
363 
364   scoped_ptr<ui::ViewProp> accessibility_prop_;
365 
366   DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewWin);
367 };
368 
369 #endif  // CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_WIN_H_
370