Index: content/browser/renderer_host/legacy_render_widget_host_win.h |
=================================================================== |
--- content/browser/renderer_host/legacy_render_widget_host_win.h (revision 0) |
+++ content/browser/renderer_host/legacy_render_widget_host_win.h (revision 0) |
@@ -0,0 +1,128 @@ |
+// Copyright (c) 2014 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_BROWSER_RENDERER_HOST_LEGACY_RENDER_WIDGET_HOST_WIN_H_ |
+#define CONTENT_BROWSER_RENDERER_HOST_LEGACY_RENDER_WIDGET_HOST_WIN_H_ |
+ |
+#include <atlbase.h> |
+#include <atlwin.h> |
+#include <atlcrack.h> |
+#include <oleacc.h> |
+ |
+#include "base/basictypes.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/win/scoped_comptr.h" |
+#include "content/common/content_export.h" |
+#include "ui/gfx/rect.h" |
+ |
+namespace content { |
+class BrowserAccessibilityManagerWin; |
+ |
+// Reasons for the existence of this class outlined below:- |
+// 1. Some screen readers expect every tab / every unique web content container |
+// to be in its own HWND with class name Chrome_RenderWidgetHostHWND. |
+// With Aura there is one main HWND which comprises the whole browser window |
+// or the whole desktop. So, we need a fake HWND with the window class as |
+// Chrome_RenderWidgetHostHWND as the root of the accessibility tree for |
+// each tab. |
+// 2. There are legacy drivers for trackpads/trackpoints which have special |
+// code for sending mouse wheel and scroll events to the |
+// Chrome_RenderWidgetHostHWND window. |
+// 3. Windowless NPAPI plugins like Flash and Silverlight which expect the |
+// container window to have the same bounds as the web page. In Aura, the |
+// default container window is the whole window which includes the web page |
+// WebContents, etc. This causes the plugin mouse event calculations to |
+// fail. |
+// We should look to get rid of this code when all of the above are fixed. |
+ |
+// This class implements a child HWND with the same size as the content area, |
+// that delegates its accessibility implementation to the root of the |
+// BrowserAccessibilityManager tree. This HWND is hooked up as the parent of |
+// the root object in the BrowserAccessibilityManager tree, so when any |
+// accessibility client calls ::WindowFromAccessibleObject, they get this |
+// HWND instead of the DesktopWindowTreeHostWin. |
+class CONTENT_EXPORT LegacyRenderWidgetHostHWND |
+ : public ATL::CWindowImpl<LegacyRenderWidgetHostHWND, |
+ NON_EXPORTED_BASE(ATL::CWindow), |
+ ATL::CWinTraits<WS_CHILD> > { |
+ public: |
+ DECLARE_WND_CLASS_EX(L"Chrome_RenderWidgetHostHWND", CS_DBLCLKS, 0); |
+ |
+ typedef ATL::CWindowImpl<LegacyRenderWidgetHostHWND, |
+ NON_EXPORTED_BASE(ATL::CWindow), |
+ ATL::CWinTraits<WS_CHILD> > Base; |
+ |
+ ~LegacyRenderWidgetHostHWND(); |
+ |
+ // Creates and returns an instance of the LegacyRenderWidgetHostHWND class on |
+ // successful creation of a child window parented to the parent window passed |
+ // in. |
+ static scoped_ptr<LegacyRenderWidgetHostHWND> Create(HWND parent); |
+ |
+ BEGIN_MSG_MAP_EX(LegacyRenderWidgetHostHWND) |
+ MESSAGE_HANDLER_EX(WM_GETOBJECT, OnGetObject) |
+ MESSAGE_RANGE_HANDLER(WM_KEYFIRST, WM_KEYLAST, OnKeyboardRange) |
+ MESSAGE_HANDLER_EX(WM_PAINT, OnPaint) |
+ MESSAGE_HANDLER_EX(WM_NCPAINT, OnNCPaint) |
+ MESSAGE_HANDLER_EX(WM_ERASEBKGND, OnEraseBkGnd) |
+ MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange) |
+ MESSAGE_HANDLER_EX(WM_MOUSEACTIVATE, OnMouseActivate) |
+ MESSAGE_HANDLER_EX(WM_SETCURSOR, OnSetCursor) |
+ MESSAGE_HANDLER_EX(WM_TOUCH, OnTouch) |
+ END_MSG_MAP() |
+ |
+ HWND hwnd() { return m_hWnd; } |
+ |
+ // Called when the child window is to be reparented to a new window. |
+ // The |parent| parameter contains the new parent window. |
+ void UpdateParent(HWND parent); |
+ HWND GetParent(); |
+ |
+ IAccessible* window_accessible() { return window_accessible_; } |
+ |
+ void set_browser_accessibility_manager( |
+ content::BrowserAccessibilityManagerWin* manager) { |
+ manager_ = manager; |
+ } |
+ |
+ void OnManagerDeleted(); |
+ |
+ // Functions to show and hide the window. |
+ void Show(); |
+ void Hide(); |
+ |
+ // Resizes the window to the bounds passed in. |
+ void SetBounds(const gfx::Rect& bounds); |
+ |
+ protected: |
+ virtual void OnFinalMessage(HWND hwnd) OVERRIDE; |
+ |
+ private: |
+ LegacyRenderWidgetHostHWND(HWND parent); |
+ |
+ bool Init(); |
+ |
+ LRESULT OnEraseBkGnd(UINT message, WPARAM w_param, LPARAM l_param); |
+ LRESULT OnGetObject(UINT message, WPARAM w_param, LPARAM l_param); |
+ LRESULT OnKeyboardRange(UINT message, WPARAM w_param, LPARAM l_param, |
+ BOOL& handled); |
+ LRESULT OnMouseRange(UINT message, WPARAM w_param, LPARAM l_param, |
+ BOOL& handled); |
+ LRESULT OnMouseActivate(UINT message, WPARAM w_param, LPARAM l_param); |
+ LRESULT OnTouch(UINT message, WPARAM w_param, LPARAM l_param); |
+ |
+ LRESULT OnNCPaint(UINT message, WPARAM w_param, LPARAM l_param); |
+ LRESULT OnPaint(UINT message, WPARAM w_param, LPARAM l_param); |
+ LRESULT OnSetCursor(UINT message, WPARAM w_param, LPARAM l_param); |
+ |
+ content::BrowserAccessibilityManagerWin* manager_; |
+ base::win::ScopedComPtr<IAccessible> window_accessible_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(LegacyRenderWidgetHostHWND); |
+}; |
+ |
+} // namespace content |
+ |
+#endif // CONTENT_BROWSER_RENDERER_HOST_LEGACY_RENDER_WIDGET_HOST_WIN_H_ |
+ |