Chromium Code Reviews| Index: content/browser/accessibility/browser_accessibility_manager_win.cc |
| =================================================================== |
| --- content/browser/accessibility/browser_accessibility_manager_win.cc (revision 248647) |
| +++ content/browser/accessibility/browser_accessibility_manager_win.cc (working copy) |
| @@ -4,104 +4,24 @@ |
| #include "content/browser/accessibility/browser_accessibility_manager_win.h" |
| -#include <atlbase.h> |
| -#include <atlapp.h> |
| -#include <atlcom.h> |
| -#include <atlcrack.h> |
| -#include <oleacc.h> |
| - |
| #include "base/command_line.h" |
| #include "base/win/scoped_comptr.h" |
| #include "base/win/windows_version.h" |
| #include "content/browser/accessibility/browser_accessibility_state_impl.h" |
| #include "content/browser/accessibility/browser_accessibility_win.h" |
| +#include "content/browser/renderer_host/legacy_render_widget_host_win.h" |
| #include "content/common/accessibility_messages.h" |
| namespace content { |
| -// Some screen readers expect every tab / every unique web content container |
| -// to be in its own HWND, like it was before Aura, but with Aura there's just |
| -// one main HWND for a frame, or even for the whole desktop. So, we need a |
| -// fake HWND as the root of the accessibility tree for each tab. |
| -// We should get rid of this code when the latest two versions of all |
| -// supported screen readers no longer make this assumption. |
| -// |
| -// This class implements a child HWND with zero size, 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 AccessibleHWND |
| - : public ATL::CWindowImpl<AccessibleHWND, |
| - ATL::CWindow, |
| - ATL::CWinTraits<WS_CHILD> > { |
| - public: |
| - // Unfortunately, some screen readers look for this exact window class |
| - // to enable certain features. It'd be great to remove this. |
| - DECLARE_WND_CLASS_EX(L"Chrome_RenderWidgetHostHWND", CS_DBLCLKS, 0); |
| - |
| - BEGIN_MSG_MAP_EX(AccessibleHWND) |
| - MESSAGE_HANDLER_EX(WM_GETOBJECT, OnGetObject) |
| - END_MSG_MAP() |
| - |
| - AccessibleHWND(HWND parent, BrowserAccessibilityManagerWin* manager) |
| - : manager_(manager) { |
| - Create(parent); |
| - ShowWindow(true); |
| - MoveWindow(0, 0, 0, 0); |
| - |
| - HRESULT hr = ::CreateStdAccessibleObject( |
| - hwnd(), OBJID_WINDOW, IID_IAccessible, |
| - reinterpret_cast<void **>(window_accessible_.Receive())); |
| - DCHECK(SUCCEEDED(hr)); |
| - } |
| - |
| - HWND hwnd() { |
| - DCHECK(::IsWindow(m_hWnd)); |
| - return m_hWnd; |
| - } |
| - |
| - IAccessible* window_accessible() { return window_accessible_; } |
| - |
| - void OnManagerDeleted() { |
| - manager_ = NULL; |
| - } |
| - |
| - protected: |
| - virtual void OnFinalMessage(HWND hwnd) OVERRIDE { |
| - if (manager_) |
| - manager_->OnAccessibleHwndDeleted(); |
| - delete this; |
| - } |
| - |
| - private: |
| - LRESULT OnGetObject(UINT message, |
| - WPARAM w_param, |
| - LPARAM l_param) { |
| - if (OBJID_CLIENT != l_param || !manager_) |
| - return static_cast<LRESULT>(0L); |
| - |
| - base::win::ScopedComPtr<IAccessible> root( |
| - manager_->GetRoot()->ToBrowserAccessibilityWin()); |
| - return LresultFromObject(IID_IAccessible, w_param, |
| - static_cast<IAccessible*>(root.Detach())); |
| - } |
| - |
| - BrowserAccessibilityManagerWin* manager_; |
| - base::win::ScopedComPtr<IAccessible> window_accessible_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(AccessibleHWND); |
| -}; |
| - |
| - |
| // static |
| BrowserAccessibilityManager* BrowserAccessibilityManager::Create( |
| const ui::AXNodeData& src, |
| BrowserAccessibilityDelegate* delegate, |
| BrowserAccessibilityFactory* factory) { |
| return new BrowserAccessibilityManagerWin( |
| - GetDesktopWindow(), NULL, src, delegate, factory); |
| + new content::LegacyRenderWidgetHostHWND(GetDesktopWindow()), NULL, src, |
| + delegate, factory); |
| } |
| BrowserAccessibilityManagerWin* |
| @@ -110,16 +30,16 @@ |
| } |
| BrowserAccessibilityManagerWin::BrowserAccessibilityManagerWin( |
| - HWND parent_hwnd, |
| + LegacyRenderWidgetHostHWND* accessible_hwnd, |
| IAccessible* parent_iaccessible, |
| const ui::AXNodeData& src, |
| BrowserAccessibilityDelegate* delegate, |
| BrowserAccessibilityFactory* factory) |
| : BrowserAccessibilityManager(src, delegate, factory), |
| - parent_hwnd_(parent_hwnd), |
| + parent_hwnd_(accessible_hwnd->parent()), |
|
cpu_(ooo_6.6-7.5)
2014/02/04 22:35:58
I don't think parent_hwnd_ is used except in the p
ananta
2014/02/04 23:31:58
Leaving this as is for now. This is used by access
|
| parent_iaccessible_(parent_iaccessible), |
| tracked_scroll_object_(NULL), |
| - accessible_hwnd_(NULL) { |
| + accessible_hwnd_(accessible_hwnd) { |
| } |
| BrowserAccessibilityManagerWin::~BrowserAccessibilityManagerWin() { |
| @@ -149,16 +69,15 @@ |
| if (!parent_iaccessible()) |
| return; |
| - // If on Win 7 and complete accessibility is enabled, create a fake child HWND |
| + // If on Win 7 and complete accessibility is enabled, use the fake child HWND |
| // to use as the root of the accessibility tree. See comments above |
| - // AccessibleHWND for details. |
| - if (BrowserAccessibilityStateImpl::GetInstance()->IsAccessibleBrowser() && |
| - !accessible_hwnd_) { |
| - accessible_hwnd_ = new AccessibleHWND(parent_hwnd_, this); |
| + // LegacyRenderWidgetHostHWND for details. |
| + if (BrowserAccessibilityStateImpl::GetInstance()->IsAccessibleBrowser()) { |
| + DCHECK(accessible_hwnd_); |
| + accessible_hwnd_->set_browser_accessibility_manager(this); |
| parent_hwnd_ = accessible_hwnd_->hwnd(); |
| parent_iaccessible_ = accessible_hwnd_->window_accessible(); |
| } |
| - |
| ::NotifyWinEvent(event, parent_hwnd(), OBJID_CLIENT, child_id); |
| } |