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