OLD | NEW |
| (Empty) |
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 "content/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 void ScheduleComposite(); | |
79 | |
80 IAccessible* GetIAccessible(); | |
81 | |
82 DECLARE_WND_CLASS_EX(kRenderWidgetHostHWNDClass, CS_DBLCLKS, 0); | |
83 | |
84 BEGIN_MSG_MAP(RenderWidgetHostHWND) | |
85 MSG_WM_CREATE(OnCreate) | |
86 MSG_WM_ACTIVATE(OnActivate) | |
87 MSG_WM_DESTROY(OnDestroy) | |
88 MSG_WM_PAINT(OnPaint) | |
89 MSG_WM_NCPAINT(OnNCPaint) | |
90 MSG_WM_ERASEBKGND(OnEraseBkgnd) | |
91 MSG_WM_SETCURSOR(OnSetCursor) | |
92 MSG_WM_SETFOCUS(OnSetFocus) | |
93 MSG_WM_KILLFOCUS(OnKillFocus) | |
94 MSG_WM_CAPTURECHANGED(OnCaptureChanged) | |
95 MSG_WM_CANCELMODE(OnCancelMode) | |
96 MSG_WM_INPUTLANGCHANGE(OnInputLangChange) | |
97 MSG_WM_THEMECHANGED(OnThemeChanged) | |
98 MSG_WM_NOTIFY(OnNotify) | |
99 MESSAGE_HANDLER(WM_IME_SETCONTEXT, OnImeSetContext) | |
100 MESSAGE_HANDLER(WM_IME_STARTCOMPOSITION, OnImeStartComposition) | |
101 MESSAGE_HANDLER(WM_IME_COMPOSITION, OnImeComposition) | |
102 MESSAGE_HANDLER(WM_IME_ENDCOMPOSITION, OnImeEndComposition) | |
103 MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseEvent) | |
104 MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseEvent) | |
105 MESSAGE_HANDLER(WM_LBUTTONDOWN, OnMouseEvent) | |
106 MESSAGE_HANDLER(WM_MBUTTONDOWN, OnMouseEvent) | |
107 MESSAGE_HANDLER(WM_RBUTTONDOWN, OnMouseEvent) | |
108 MESSAGE_HANDLER(WM_LBUTTONUP, OnMouseEvent) | |
109 MESSAGE_HANDLER(WM_MBUTTONUP, OnMouseEvent) | |
110 MESSAGE_HANDLER(WM_RBUTTONUP, OnMouseEvent) | |
111 MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnMouseEvent) | |
112 MESSAGE_HANDLER(WM_MBUTTONDBLCLK, OnMouseEvent) | |
113 MESSAGE_HANDLER(WM_RBUTTONDBLCLK, OnMouseEvent) | |
114 MESSAGE_HANDLER(WM_SYSKEYDOWN, OnKeyEvent) | |
115 MESSAGE_HANDLER(WM_SYSKEYUP, OnKeyEvent) | |
116 MESSAGE_HANDLER(WM_KEYDOWN, OnKeyEvent) | |
117 MESSAGE_HANDLER(WM_KEYUP, OnKeyEvent) | |
118 MESSAGE_HANDLER(WM_MOUSEWHEEL, OnWheelEvent) | |
119 MESSAGE_HANDLER(WM_MOUSEHWHEEL, OnWheelEvent) | |
120 MESSAGE_HANDLER(WM_HSCROLL, OnWheelEvent) | |
121 MESSAGE_HANDLER(WM_VSCROLL, OnWheelEvent) | |
122 MESSAGE_HANDLER(WM_CHAR, OnKeyEvent) | |
123 MESSAGE_HANDLER(WM_SYSCHAR, OnKeyEvent) | |
124 MESSAGE_HANDLER(WM_IME_CHAR, OnKeyEvent) | |
125 MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate) | |
126 MESSAGE_HANDLER(WM_GETOBJECT, OnGetObject) | |
127 MESSAGE_HANDLER(WM_PARENTNOTIFY, OnParentNotify) | |
128 END_MSG_MAP() | |
129 | |
130 // Implementation of RenderWidgetHostView: | |
131 virtual void InitAsPopup(RenderWidgetHostView* parent_host_view, | |
132 const gfx::Rect& pos) OVERRIDE; | |
133 virtual void InitAsFullscreen( | |
134 RenderWidgetHostView* reference_host_view) OVERRIDE; | |
135 virtual RenderWidgetHost* GetRenderWidgetHost() const OVERRIDE; | |
136 virtual void DidBecomeSelected() OVERRIDE; | |
137 virtual void WasHidden() OVERRIDE; | |
138 virtual void SetSize(const gfx::Size& size) OVERRIDE; | |
139 virtual void SetBounds(const gfx::Rect& rect) OVERRIDE; | |
140 virtual gfx::NativeView GetNativeView() const OVERRIDE; | |
141 virtual gfx::NativeViewId GetNativeViewId() const OVERRIDE; | |
142 virtual void MovePluginWindows( | |
143 const std::vector<webkit::npapi::WebPluginGeometry>& moves) OVERRIDE; | |
144 virtual void Focus() OVERRIDE; | |
145 virtual void Blur() OVERRIDE; | |
146 virtual bool HasFocus() OVERRIDE; | |
147 virtual void Show() OVERRIDE; | |
148 virtual void Hide() OVERRIDE; | |
149 virtual bool IsShowing() OVERRIDE; | |
150 virtual gfx::Rect GetViewBounds() const OVERRIDE; | |
151 virtual void UpdateCursor(const WebCursor& cursor) OVERRIDE; | |
152 virtual void SetIsLoading(bool is_loading) OVERRIDE; | |
153 virtual void ImeUpdateTextInputState(ui::TextInputType type, | |
154 bool can_compose_inline, | |
155 const gfx::Rect& caret_rect) OVERRIDE; | |
156 virtual void ImeCancelComposition() OVERRIDE; | |
157 virtual void DidUpdateBackingStore( | |
158 const gfx::Rect& scroll_rect, int scroll_dx, int scroll_dy, | |
159 const std::vector<gfx::Rect>& copy_rects) OVERRIDE; | |
160 virtual void RenderViewGone(base::TerminationStatus status, | |
161 int error_code) OVERRIDE; | |
162 // called by TabContents before DestroyWindow | |
163 virtual void WillWmDestroy() OVERRIDE; | |
164 virtual void Destroy() OVERRIDE; | |
165 virtual void SetTooltipText(const std::wstring& tooltip_text) OVERRIDE; | |
166 virtual BackingStore* AllocBackingStore(const gfx::Size& size) OVERRIDE; | |
167 virtual void SetBackground(const SkBitmap& background) OVERRIDE; | |
168 virtual void SetVisuallyDeemphasized(const SkColor* color, | |
169 bool animate) OVERRIDE; | |
170 virtual void UnhandledWheelEvent( | |
171 const WebKit::WebMouseWheelEvent& event) OVERRIDE; | |
172 virtual void SetHasHorizontalScrollbar( | |
173 bool has_horizontal_scrollbar) OVERRIDE; | |
174 virtual void SetScrollOffsetPinning( | |
175 bool is_pinned_to_left, bool is_pinned_to_right) OVERRIDE; | |
176 virtual gfx::PluginWindowHandle GetCompositingSurface() OVERRIDE; | |
177 virtual void ShowCompositorHostWindow(bool show) OVERRIDE; | |
178 virtual void OnAccessibilityNotifications( | |
179 const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params | |
180 ) OVERRIDE; | |
181 | |
182 // Implementation of NotificationObserver: | |
183 virtual void Observe(int type, | |
184 const NotificationSource& source, | |
185 const NotificationDetails& details) OVERRIDE; | |
186 | |
187 // Implementation of BrowserAccessibilityDelegate: | |
188 virtual void SetAccessibilityFocus(int acc_obj_id) OVERRIDE; | |
189 virtual void AccessibilityDoDefaultAction(int acc_obj_id) OVERRIDE; | |
190 | |
191 protected: | |
192 // Windows Message Handlers | |
193 LRESULT OnCreate(CREATESTRUCT* create_struct); | |
194 void OnActivate(UINT, BOOL, HWND); | |
195 void OnDestroy(); | |
196 void OnPaint(HDC unused_dc); | |
197 void OnNCPaint(HRGN update_region); | |
198 LRESULT OnEraseBkgnd(HDC dc); | |
199 LRESULT OnSetCursor(HWND window, UINT hittest_code, UINT mouse_message_id); | |
200 void OnSetFocus(HWND window); | |
201 void OnKillFocus(HWND window); | |
202 void OnCaptureChanged(HWND window); | |
203 void OnCancelMode(); | |
204 void OnInputLangChange(DWORD character_set, HKL input_language_id); | |
205 void OnThemeChanged(); | |
206 LRESULT OnNotify(int w_param, NMHDR* header); | |
207 LRESULT OnImeSetContext( | |
208 UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); | |
209 LRESULT OnImeStartComposition( | |
210 UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); | |
211 LRESULT OnImeComposition( | |
212 UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); | |
213 LRESULT OnImeEndComposition( | |
214 UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); | |
215 LRESULT OnMouseEvent( | |
216 UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); | |
217 LRESULT OnKeyEvent( | |
218 UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); | |
219 LRESULT OnWheelEvent( | |
220 UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled); | |
221 LRESULT OnMouseActivate(UINT message, | |
222 WPARAM wparam, | |
223 LPARAM lparam, | |
224 BOOL& handled); | |
225 // Handle MSAA requests for accessibility information. | |
226 LRESULT OnGetObject(UINT message, WPARAM wparam, LPARAM lparam, | |
227 BOOL& handled); | |
228 // Handle vertical scrolling | |
229 LRESULT OnVScroll(int code, short position, HWND scrollbar_control); | |
230 // Handle horizontal scrolling | |
231 LRESULT OnHScroll(int code, short position, HWND scrollbar_control); | |
232 | |
233 LRESULT OnParentNotify(UINT message, WPARAM wparam, LPARAM lparam, | |
234 BOOL& handled); | |
235 | |
236 void OnFinalMessage(HWND window); | |
237 | |
238 private: | |
239 // Updates the display cursor to the current cursor if the cursor is over this | |
240 // render view. | |
241 void UpdateCursorIfOverSelf(); | |
242 | |
243 // Tells Windows that we want to hear about mouse exit messages. | |
244 void TrackMouseLeave(bool start_tracking); | |
245 | |
246 // Sends a message to the RenderView in the renderer process. | |
247 bool Send(IPC::Message* message); | |
248 | |
249 // Set the tooltip region to the size of the window, creating the tooltip | |
250 // hwnd if it has not been created yet. | |
251 void EnsureTooltip(); | |
252 | |
253 // Tooltips become invalid when the root ancestor changes. When the View | |
254 // becomes hidden, this method is called to reset the tooltip. | |
255 void ResetTooltip(); | |
256 | |
257 // Sends the specified mouse event to the renderer. | |
258 void ForwardMouseEventToRenderer(UINT message, WPARAM wparam, LPARAM lparam); | |
259 | |
260 // Synthesize mouse wheel event. | |
261 LRESULT SynthesizeMouseWheel(bool is_vertical, int scroll_code, | |
262 short scroll_position); | |
263 | |
264 // Shuts down the render_widget_host_. This is a separate function so we can | |
265 // invoke it from the message loop. | |
266 void ShutdownHost(); | |
267 | |
268 // Redraws the window synchronously, and any child windows (i.e. plugins) | |
269 // asynchronously. | |
270 void Redraw(); | |
271 | |
272 // Draw our background over the given HDC in the given |rect|. The background | |
273 // will be tiled such that it lines up with existing tiles starting from the | |
274 // origin of |dc|. | |
275 void DrawBackground(const RECT& rect, CPaintDC* dc); | |
276 | |
277 // Create an intermediate window between the given HWND and its parent. | |
278 HWND ReparentWindow(HWND window); | |
279 | |
280 // Clean up the compositor window, if needed. | |
281 void CleanupCompositorWindow(); | |
282 | |
283 // Whether the window should be activated. | |
284 bool IsActivatable() const; | |
285 | |
286 // Do initialization needed by both InitAsPopup() and InitAsFullscreen(). | |
287 void DoPopupOrFullscreenInit(HWND parent_hwnd, | |
288 const gfx::Rect& pos, | |
289 DWORD ex_style); | |
290 | |
291 // The associated Model. While |this| is being Destroyed, | |
292 // |render_widget_host_| is NULL and the Windows message loop is run one last | |
293 // time. Message handlers must check for a NULL |render_widget_host_|. | |
294 RenderWidgetHost* render_widget_host_; | |
295 | |
296 // When we are doing accelerated compositing | |
297 HWND compositor_host_window_; | |
298 | |
299 // true if the compositor host window must be hidden after the | |
300 // software renderered view is updated. | |
301 bool hide_compositor_window_at_next_paint_; | |
302 | |
303 // The cursor for the page. This is passed up from the renderer. | |
304 WebCursor current_cursor_; | |
305 | |
306 // Indicates if the page is loading. | |
307 bool is_loading_; | |
308 | |
309 // true if we are currently tracking WM_MOUSEEXIT messages. | |
310 bool track_mouse_leave_; | |
311 | |
312 // Wrapper class for IME input. | |
313 // (See "ui/base/win/ime_input.h" for its details.) | |
314 ui::ImeInput ime_input_; | |
315 | |
316 // Represents whether or not this browser process is receiving status | |
317 // messages about the focused edit control from a renderer process. | |
318 bool ime_notification_; | |
319 | |
320 // true if Enter was hit when render widget host was in focus. | |
321 bool capture_enter_key_; | |
322 | |
323 // true if the View is not visible. | |
324 bool is_hidden_; | |
325 | |
326 // True if we're in the midst of a paint operation and should respond to | |
327 // DidPaintRect() notifications by merely invalidating. See comments on | |
328 // render_widget_host_view.h:DidPaintRect(). | |
329 bool about_to_validate_and_paint_; | |
330 | |
331 // true if the View should be closed when its HWND is deactivated (used to | |
332 // support SELECT popups which are closed when they are deactivated). | |
333 bool close_on_deactivate_; | |
334 | |
335 // Whether Destroy() has been called. Used to detect a crasher | |
336 // (http://crbug.com/24248) where render_view_host_ has been deleted when | |
337 // OnFinalMessage is called. | |
338 bool being_destroyed_; | |
339 | |
340 // Tooltips | |
341 // The text to be shown in the tooltip, supplied by the renderer. | |
342 std::wstring tooltip_text_; | |
343 // The tooltip control hwnd | |
344 HWND tooltip_hwnd_; | |
345 // Whether or not a tooltip is currently visible. We use this to track | |
346 // whether or not we want to force-close the tooltip when we receive mouse | |
347 // move notifications from the renderer. See comment in OnMsgSetTooltipText. | |
348 bool tooltip_showing_; | |
349 | |
350 // Factory used to safely scope delayed calls to ShutdownHost(). | |
351 ScopedRunnableMethodFactory<RenderWidgetHostViewWin> shutdown_factory_; | |
352 | |
353 // Our parent HWND. We keep a reference to it as we SetParent(NULL) when | |
354 // hidden to prevent getting messages (Paint, Resize...), and we reattach | |
355 // when shown again. | |
356 HWND parent_hwnd_; | |
357 | |
358 // Instance of accessibility information for the root of the MSAA | |
359 // tree representation of the WebKit render tree. | |
360 scoped_ptr<BrowserAccessibilityManager> browser_accessibility_manager_; | |
361 | |
362 // The time at which this view started displaying white pixels as a result of | |
363 // not having anything to paint (empty backing store from renderer). This | |
364 // value returns true for is_null() if we are not recording whiteout times. | |
365 base::TimeTicks whiteout_start_time_; | |
366 | |
367 // The time it took after this view was selected for it to be fully painted. | |
368 base::TimeTicks tab_switch_paint_time_; | |
369 | |
370 // A color we use to shade the entire render view. If 100% transparent, we do | |
371 // not shade the render view. | |
372 SkColor overlay_color_; | |
373 | |
374 // Registrar so we can listen to RENDERER_PROCESS_TERMINATED events. | |
375 NotificationRegistrar registrar_; | |
376 | |
377 // Stores the current text input type received by ImeUpdateTextInputState() | |
378 // method. | |
379 ui::TextInputType text_input_type_; | |
380 | |
381 ScopedVector<ui::ViewProp> props_; | |
382 | |
383 // Is the widget fullscreen? | |
384 bool is_fullscreen_; | |
385 | |
386 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewWin); | |
387 }; | |
388 | |
389 #endif // CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_WIN_H_ | |
OLD | NEW |