diff options
author | ctguil@chromium.org <ctguil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-22 00:03:22 +0000 |
---|---|---|
committer | ctguil@chromium.org <ctguil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-22 00:03:22 +0000 |
commit | 5fe1572eaaec0f18f8126b9d6d48e7f575e9bcb2 (patch) | |
tree | 185fc94efbf78529bd3cbfdf9fb04f04f8e64fe3 /views | |
parent | 3b12395d378c0740947438ddeb770de52ad3162a (diff) | |
download | chromium_src-5fe1572eaaec0f18f8126b9d6d48e7f575e9bcb2.zip chromium_src-5fe1572eaaec0f18f8126b9d6d48e7f575e9bcb2.tar.gz chromium_src-5fe1572eaaec0f18f8126b9d6d48e7f575e9bcb2.tar.bz2 |
Some cleanup of view accessibility and view accessibility wrapper.
1. Remove the ViewAccessibilityWrapper class. The view can directly manage it's ViewAccessibility.
2. Always use GetAccessibleForView to retrieve a view's associated accessibility object. This ensures that the correct accessibility object is returned for native view host objects.
3. Update get_accFocus to use FocusManager.
4. Move oleacc guid definitions to view_win.cc.
BUG=none
TEST=interactive_ui_tests:BrowserViewsAccessibilityTest.TestBrowserRootViewAccObj
TEST=Manual: I can select the accessibility object of a native view host within AccExplorer32.exe.
Review URL: http://codereview.chromium.org/4047001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@63451 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r-- | views/accessibility/view_accessibility.cc | 245 | ||||
-rw-r--r-- | views/accessibility/view_accessibility.h | 31 | ||||
-rw-r--r-- | views/accessibility/view_accessibility_wrapper.cc | 93 | ||||
-rw-r--r-- | views/accessibility/view_accessibility_wrapper.h | 61 | ||||
-rw-r--r-- | views/view.cc | 9 | ||||
-rw-r--r-- | views/view.h | 11 | ||||
-rw-r--r-- | views/view_gtk.cc | 2 | ||||
-rw-r--r-- | views/view_win.cc | 15 | ||||
-rw-r--r-- | views/views.gyp | 2 | ||||
-rw-r--r-- | views/widget/widget_win.cc | 36 |
10 files changed, 132 insertions, 373 deletions
diff --git a/views/accessibility/view_accessibility.cc b/views/accessibility/view_accessibility.cc index 72042c4..c092895 100644 --- a/views/accessibility/view_accessibility.cc +++ b/views/accessibility/view_accessibility.cc @@ -4,24 +4,51 @@ #include "views/accessibility/view_accessibility.h" -#include "views/accessibility/view_accessibility_wrapper.h" #include "views/widget/widget.h" #include "views/widget/widget_win.h" -const wchar_t kViewsUninitializeAccessibilityInstance[] = - L"Views_Uninitialize_AccessibilityInstance"; - const wchar_t kViewsNativeHostPropForAccessibility[] = L"Views_NativeViewHostHWNDForAccessibility"; +// static +scoped_refptr<ViewAccessibility> ViewAccessibility::Create(views::View* view) { + CComObject<ViewAccessibility>* instance = NULL; + HRESULT hr = CComObject<ViewAccessibility>::CreateInstance(&instance); + DCHECK(SUCCEEDED(hr)); + instance->set_view(view); + return scoped_refptr<ViewAccessibility>(instance); +} -HRESULT ViewAccessibility::Initialize(views::View* view) { - if (!view) { - return E_INVALIDARG; +// static +IAccessible* ViewAccessibility::GetAccessibleForView(views::View* view) { + IAccessible* accessible = NULL; + + // First, check to see if the view is a native view. + if (view->GetClassName() == views::NativeViewHost::kViewClassName) { + views::NativeViewHost* native_host = + static_cast<views::NativeViewHost*>(view); + if (GetNativeIAccessibleInterface(native_host, &accessible) == S_OK) + return accessible; } - view_ = view; - return S_OK; + // Next, see if the view is a widget container. + if (view->child_widget()) { + views::WidgetWin* native_widget = + reinterpret_cast<views::WidgetWin*>(view->child_widget()); + if (GetNativeIAccessibleInterface( + native_widget->GetNativeView(), &accessible) == S_OK) { + return accessible; + } + } + + // Finally, use our ViewAccessibility implementation. + return view->GetViewAccessibility(); +} + +ViewAccessibility::ViewAccessibility() : view_(NULL) { +} + +ViewAccessibility::~ViewAccessibility() { } // TODO(ctguil): Handle case where child View is not contained by parent. @@ -49,25 +76,16 @@ STDMETHODIMP ViewAccessibility::accHitTest( child->lVal = CHILDID_SELF; } else { child->vt = VT_DISPATCH; - if ((GetViewAccessibilityWrapper(view))-> - GetInstance(IID_IAccessible, - reinterpret_cast<void**>(&child->pdispVal)) == S_OK) { - // Increment the reference count for the retrieved interface. - child->pdispVal->AddRef(); - return S_OK; - } else { - return E_NOINTERFACE; - } + child->pdispVal = GetAccessibleForView(view); + child->pdispVal->AddRef(); } - return S_OK; } STDMETHODIMP ViewAccessibility::accLocation( LONG* x_left, LONG* y_top, LONG* width, LONG* height, VARIANT var_id) { - if (!IsValidId(var_id) || !x_left || !y_top || !width || !height) { + if (!IsValidId(var_id) || !x_left || !y_top || !width || !height) return E_INVALIDARG; - } if (!view_) return E_FAIL; @@ -101,9 +119,8 @@ STDMETHODIMP ViewAccessibility::accLocation( STDMETHODIMP ViewAccessibility::accNavigate(LONG nav_dir, VARIANT start, VARIANT* end) { - if (start.vt != VT_I4 || !end) { + if (start.vt != VT_I4 || !end) return E_INVALIDARG; - } if (!view_) return E_FAIL; @@ -126,25 +143,10 @@ STDMETHODIMP ViewAccessibility::accNavigate(LONG nav_dir, VARIANT start, } views::View* child = view_->GetChildViewAt(child_id); - - if (child->GetChildViewCount() != 0) { - end->vt = VT_DISPATCH; - if ((GetViewAccessibilityWrapper(child))-> - GetInstance(IID_IAccessible, - reinterpret_cast<void**>(&end->pdispVal)) == S_OK) { - // Increment the reference count for the retrieved interface. - end->pdispVal->AddRef(); - return S_OK; - } else { - return E_NOINTERFACE; - } - } else { - end->vt = VT_I4; - // Set return child lVal, adjusted for MSAA indexing. (MSAA - // child indexing starts with 1, whereas View indexing starts with 0). - end->lVal = child_id + 1; - } - break; + end->vt = VT_DISPATCH; + end->pdispVal = GetAccessibleForView(child); + end->pdispVal->AddRef(); + return S_OK; } case NAVDIR_LEFT: case NAVDIR_UP: @@ -176,24 +178,10 @@ STDMETHODIMP ViewAccessibility::accNavigate(LONG nav_dir, VARIANT start, } views::View* child = parent->GetChildViewAt(view_index); - if (child->GetChildViewCount() != 0) { - end->vt = VT_DISPATCH; - // Retrieve IDispatch for non-leaf child. - if ((GetViewAccessibilityWrapper(child))-> - GetInstance(IID_IAccessible, - reinterpret_cast<void**>(&end->pdispVal)) == S_OK) { - // Increment the reference count for the retrieved interface. - end->pdispVal->AddRef(); - return S_OK; - } else { - return E_NOINTERFACE; - } - } else { - end->vt = VT_I4; - // Modifying view_index to give lVal correct MSAA-based value. (MSAA - // child indexing starts with 1, whereas View indexing starts with 0). - end->lVal = view_index + 1; - } + end->pdispVal = GetAccessibleForView(child); + end->vt = VT_DISPATCH; + end->pdispVal->AddRef(); + return S_OK; } else { // Check navigation bounds, adjusting for MSAA child indexing (MSAA // child indexing starts with 1, whereas View indexing starts with 0). @@ -269,42 +257,14 @@ STDMETHODIMP ViewAccessibility::get_accChild(VARIANT var_child, return E_FAIL; } - // First, check to see if the child is a native view. - if (child_view->GetClassName() == views::NativeViewHost::kViewClassName) { - views::NativeViewHost* native_host = - static_cast<views::NativeViewHost*>(child_view); - if (GetNativeIAccessibleInterface(native_host, disp_child) == S_OK) - return S_OK; - } - - // Next, see if the child view is a widget container. - if (child_view->child_widget()) { - views::WidgetWin* native_widget = - reinterpret_cast<views::WidgetWin*>(child_view->child_widget()); - if (GetNativeIAccessibleInterface( - native_widget->GetNativeView(), disp_child) == S_OK) { - return S_OK; - } - } - - // Finally, try our ViewAccessibility implementation. - // Retrieve the IUnknown interface for the requested child view, and - // assign the IDispatch returned. - HRESULT hr = GetViewAccessibilityWrapper(child_view)-> - GetInstance(IID_IAccessible, reinterpret_cast<void**>(disp_child)); - if (hr == S_OK) { - // Increment the reference count for the retrieved interface. - (*disp_child)->AddRef(); - return S_OK; - } else { - return E_NOINTERFACE; - } + *disp_child = GetAccessibleForView(child_view); + (*disp_child)->AddRef(); + return S_OK; } STDMETHODIMP ViewAccessibility::get_accChildCount(LONG* child_count) { - if (!child_count || !view_) { + if (!child_count || !view_) return E_INVALIDARG; - } if (!view_) return E_FAIL; @@ -315,9 +275,8 @@ STDMETHODIMP ViewAccessibility::get_accChildCount(LONG* child_count) { STDMETHODIMP ViewAccessibility::get_accDefaultAction( VARIANT var_id, BSTR* def_action) { - if (!IsValidId(var_id) || !def_action) { + if (!IsValidId(var_id) || !def_action) return E_INVALIDARG; - } if (!view_) return E_FAIL; @@ -334,9 +293,11 @@ STDMETHODIMP ViewAccessibility::get_accDefaultAction( } STDMETHODIMP ViewAccessibility::get_accDescription(VARIANT var_id, BSTR* desc) { - if (!IsValidId(var_id) || !desc) { + if (!IsValidId(var_id) || !desc) return E_INVALIDARG; - } + + if (!view_) + return E_FAIL; std::wstring temp_desc; @@ -351,42 +312,29 @@ STDMETHODIMP ViewAccessibility::get_accDescription(VARIANT var_id, BSTR* desc) { } STDMETHODIMP ViewAccessibility::get_accFocus(VARIANT* focus_child) { - if (!focus_child) { + if (!focus_child) return E_INVALIDARG; - } if (!view_) return E_FAIL; - if (view_->GetChildViewCount() == 0 && view_->HasFocus()) { - // Parent view has focus. + views::View* focus = NULL; + views::FocusManager* focus_manager = view_->GetFocusManager(); + if (focus_manager) + focus = focus_manager->GetFocusedView(); + if (focus == view_) { + // This view has focus. focus_child->vt = VT_I4; focus_child->lVal = CHILDID_SELF; + } else if (focus && view_->IsParentOf(focus)) { + // Return the child object that has the keyboard focus. + focus_child->pdispVal = GetAccessibleForView(focus); + focus_child->pdispVal->AddRef(); + return S_OK; } else { - bool has_focus = false; - int child_count = view_->GetChildViewCount(); - // Search for child view with focus. - for (int child_id = 0; child_id < child_count; ++child_id) { - if (view_->GetChildViewAt(child_id)->HasFocus()) { - focus_child->vt = VT_I4; - focus_child->lVal = child_id + 1; - - // If child view is no leaf, retrieve IDispatch. - if (view_->GetChildViewAt(child_id)->GetChildViewCount() != 0) { - focus_child->vt = VT_DISPATCH; - this->get_accChild(*focus_child, &focus_child->pdispVal); - } - has_focus = true; - break; - } - } - // No current focus on any of the children. - if (!has_focus) { - focus_child->vt = VT_EMPTY; - return S_FALSE; - } + // Neither this object nor any of its children has the keyboard focus. + focus_child->vt = VT_EMPTY; } - return S_OK; } @@ -410,9 +358,8 @@ STDMETHODIMP ViewAccessibility::get_accKeyboardShortcut( } STDMETHODIMP ViewAccessibility::get_accName(VARIANT var_id, BSTR* name) { - if (!IsValidId(var_id) || !name) { + if (!IsValidId(var_id) || !name) return E_INVALIDARG; - } if (!view_) return E_FAIL; @@ -433,9 +380,8 @@ STDMETHODIMP ViewAccessibility::get_accName(VARIANT var_id, BSTR* name) { } STDMETHODIMP ViewAccessibility::get_accParent(IDispatch** disp_parent) { - if (!disp_parent) { + if (!disp_parent) return E_INVALIDARG; - } if (!view_) return E_FAIL; @@ -466,37 +412,34 @@ STDMETHODIMP ViewAccessibility::get_accParent(IDispatch** disp_parent) { return S_OK; } - // Retrieve the IUnknown interface for the parent view, and assign the - // IDispatch returned. - if ((GetViewAccessibilityWrapper(parent_view))-> - GetInstance(IID_IAccessible, - reinterpret_cast<void**>(disp_parent)) == S_OK) { - // Increment the reference count for the retrieved interface. - (*disp_parent)->AddRef(); - return S_OK; - } else { - return E_NOINTERFACE; - } + *disp_parent = GetAccessibleForView(parent_view); + (*disp_parent)->AddRef(); + return S_OK; } STDMETHODIMP ViewAccessibility::get_accRole(VARIANT var_id, VARIANT* role) { if (!IsValidId(var_id) || !role) return E_INVALIDARG; + if (!view_) + return E_FAIL; + role->vt = VT_I4; role->lVal = MSAARole(view_->GetAccessibleRole()); return S_OK; } STDMETHODIMP ViewAccessibility::get_accState(VARIANT var_id, VARIANT* state) { - if (!IsValidId(var_id) || !state) { + if (!IsValidId(var_id) || !state) return E_INVALIDARG; - } + + if (!view_) + return E_FAIL; state->vt = VT_I4; // Retrieve all currently applicable states of the parent. - this->SetState(state, view_); + SetState(state, view_); // Make sure that state is not empty, and has the proper type. if (state->vt == VT_EMPTY) @@ -628,13 +571,6 @@ STDMETHODIMP ViewAccessibility::put_accName(VARIANT var_id, BSTR put_name) { } STDMETHODIMP ViewAccessibility::put_accValue(VARIANT var_id, BSTR put_val) { - // TODO(ctguil): This use looks incorrect. var_id should be of type VT_I4. - if (V_VT(&var_id) == VT_BSTR) { - if (!lstrcmpi(var_id.bstrVal, kViewsUninitializeAccessibilityInstance)) { - view_ = NULL; - return S_OK; - } - } // Deprecated. return E_NOTIMPL; } @@ -768,11 +704,11 @@ int32 ViewAccessibility::MSAAState(AccessibilityTypes::State state) { return msaa_state; } +// static HRESULT ViewAccessibility::GetNativeIAccessibleInterface( - views::NativeViewHost* native_host, IDispatch** disp_child) { - if (!native_host || !disp_child) { + views::NativeViewHost* native_host, IAccessible** accessible) { + if (!native_host || !accessible) return E_INVALIDARG; - } HWND native_view_window = static_cast<HWND>(GetProp(native_host->native_view(), @@ -781,16 +717,17 @@ HRESULT ViewAccessibility::GetNativeIAccessibleInterface( native_view_window = native_host->native_view(); } - return GetNativeIAccessibleInterface(native_view_window, disp_child); + return GetNativeIAccessibleInterface(native_view_window, accessible); } +// static HRESULT ViewAccessibility::GetNativeIAccessibleInterface( - HWND native_view_window , IDispatch** disp_child) { + HWND native_view_window , IAccessible** accessible) { if (IsWindow(native_view_window)) { LRESULT ret = SendMessage(native_view_window, WM_GETOBJECT, 0, OBJID_CLIENT); return ObjectFromLresult(ret, IID_IDispatch, 0, - reinterpret_cast<void**>(disp_child)); + reinterpret_cast<void**>(accessible)); } return E_FAIL; diff --git a/views/accessibility/view_accessibility.h b/views/accessibility/view_accessibility.h index 010eeb4..9803cba 100644 --- a/views/accessibility/view_accessibility.h +++ b/views/accessibility/view_accessibility.h @@ -11,6 +11,7 @@ #include <oleacc.h> +#include "base/scoped_ptr.h" #include "views/controls/native/native_view_host.h" #include "views/view.h" @@ -32,10 +33,15 @@ class ATL_NO_VTABLE ViewAccessibility COM_INTERFACE_ENTRY(IAccessible) END_COM_MAP() - ViewAccessibility() {} - ~ViewAccessibility() {} + // Create method for view accessibility. + static scoped_refptr<ViewAccessibility> Create(views::View* view); - HRESULT Initialize(views::View* view); + // Returns the IAccessible interface for a view. + static IAccessible* GetAccessibleForView(views::View* view); + + virtual ~ViewAccessibility(); + + void set_view(views::View* view) { view_ = view; } // Supported IAccessible methods. @@ -117,6 +123,8 @@ class ATL_NO_VTABLE ViewAccessibility static int32 MSAAState(AccessibilityTypes::State state); private: + ViewAccessibility(); + // Determines navigation direction for accNavigate, based on left, up and // previous being mapped all to previous and right, down, next being mapped // to next. Returns true if navigation direction is next, false otherwise. @@ -132,21 +140,19 @@ class ATL_NO_VTABLE ViewAccessibility // Determines if the child id variant is valid. bool IsValidId(const VARIANT& child) const; - // Wrapper to retrieve the view's instance of IAccessible. - ViewAccessibilityWrapper* GetViewAccessibilityWrapper(views::View* v) const { - return v->GetViewAccessibilityWrapper(); - } - // Helper function which sets applicable states of view. void SetState(VARIANT* msaa_state, views::View* view); // Returns the IAccessible interface for a native view if applicable. // Returns S_OK on success. - HRESULT GetNativeIAccessibleInterface(views::NativeViewHost* native_host, - IDispatch** disp_child); + static HRESULT GetNativeIAccessibleInterface( + views::NativeViewHost* native_host, IAccessible** accessible); + + static HRESULT GetNativeIAccessibleInterface( + HWND native_view_window, IAccessible** accessible); - HRESULT GetNativeIAccessibleInterface(HWND native_view_window, - IDispatch** disp_child); + // Give CComObject access to the class constructor. + template <class Base> friend class CComObject; // Member View needed for view-specific calls. views::View* view_; @@ -154,7 +160,6 @@ class ATL_NO_VTABLE ViewAccessibility DISALLOW_COPY_AND_ASSIGN(ViewAccessibility); }; -extern const wchar_t kViewsUninitializeAccessibilityInstance[]; extern const wchar_t kViewsNativeHostPropForAccessibility[]; #endif // VIEWS_ACCESSIBILITY_VIEW_ACCESSIBILITY_H_ diff --git a/views/accessibility/view_accessibility_wrapper.cc b/views/accessibility/view_accessibility_wrapper.cc deleted file mode 100644 index 989c90a..0000000 --- a/views/accessibility/view_accessibility_wrapper.cc +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (c) 2006-2008 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. - -#include "views/accessibility/view_accessibility_wrapper.h" - -#include "base/scoped_variant_win.h" - -#include "views/accessibility/view_accessibility.h" - -//////////////////////////////////////////////////////////////////////////////// -// -// ViewAccessibilityWrapper - constructors, destructors -// -//////////////////////////////////////////////////////////////////////////////// - -ViewAccessibilityWrapper::ViewAccessibilityWrapper(views::View* view) - : accessibility_info_(NULL), - view_(view) { -} - -STDMETHODIMP ViewAccessibilityWrapper::CreateDefaultInstance(REFIID iid) { - if (IID_IUnknown == iid || IID_IDispatch == iid || IID_IAccessible == iid) { - // If there is no instance of ViewAccessibility created, create it - // now. Otherwise reuse previous instance. - if (!accessibility_info_) { - CComObject<ViewAccessibility>* instance = NULL; - - HRESULT hr = CComObject<ViewAccessibility>::CreateInstance(&instance); - - if (!SUCCEEDED(hr) || !instance) - return E_FAIL; - - ScopedComPtr<IAccessible> accessibility_instance(instance); - - if (!SUCCEEDED(instance->Initialize(view_))) - return E_FAIL; - - // All is well, assign the temp instance to the class smart pointer. - accessibility_info_.Attach(accessibility_instance.Detach()); - } - return S_OK; - } - // Interface not supported. - return E_NOINTERFACE; -} - -HRESULT ViewAccessibilityWrapper::Uninitialize() { - view_ = NULL; - if (accessibility_info_.get()) { - accessibility_info_->put_accValue( - ScopedVariant(kViewsUninitializeAccessibilityInstance), NULL); - ::CoDisconnectObject(accessibility_info_.get(), 0); - accessibility_info_ = NULL; - } - - return S_OK; -} - -STDMETHODIMP ViewAccessibilityWrapper::GetInstance(REFIID iid, - void** interface_ptr) { - if (IID_IUnknown == iid || IID_IDispatch == iid || IID_IAccessible == iid) { - // If there is no accessibility instance created, create a default now. - // Otherwise reuse previous instance. - if (!accessibility_info_) { - HRESULT hr = CreateDefaultInstance(iid); - - if (hr != S_OK) { - // Interface creation failed. - *interface_ptr = NULL; - return E_NOINTERFACE; - } - } - *interface_ptr = static_cast<IAccessible*>(accessibility_info_); - return S_OK; - } - // No supported interface found, return error. - *interface_ptr = NULL; - return E_NOINTERFACE; -} - -STDMETHODIMP ViewAccessibilityWrapper::SetInstance(IAccessible* interface_ptr) { - if (!interface_ptr) - return E_NOINTERFACE; - - accessibility_info_.Attach(interface_ptr); - - // Paranoia check, to make sure we do have a valid IAccessible pointer stored. - if (!accessibility_info_) - return E_FAIL; - - return S_OK; -} diff --git a/views/accessibility/view_accessibility_wrapper.h b/views/accessibility/view_accessibility_wrapper.h deleted file mode 100644 index ae4b563..0000000 --- a/views/accessibility/view_accessibility_wrapper.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2006-2008 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 VIEWS_ACCESSIBILITY_VIEW_ACCESSIBILITY_WRAPPER_H_ -#define VIEWS_ACCESSIBILITY_VIEW_ACCESSIBILITY_WRAPPER_H_ -#pragma once - -#include <atlcomcli.h> -// Necessary to define OleAcc GUID's used in window_win.cc. -#include <initguid.h> -#include <oleacc.h> - -#include "base/basictypes.h" -#include "base/scoped_comptr_win.h" - -namespace views { -class View; -} - -//////////////////////////////////////////////////////////////////////////////// -// -// ViewAccessibilityWrapper -// -// Wrapper class for returning a pointer to the appropriate (platform-specific) -// accessibility interface for a given View. Needed to keep platform-specific -// code out of the View class, when answering calls for child/parent IAccessible -// implementations, for instance. -// -//////////////////////////////////////////////////////////////////////////////// -class ViewAccessibilityWrapper { - public: - explicit ViewAccessibilityWrapper(views::View* view); - ~ViewAccessibilityWrapper() {} - - STDMETHODIMP CreateDefaultInstance(REFIID iid); - - HRESULT Uninitialize(); - - // Returns a pointer to a specified interface on an object to which a client - // currently holds an interface pointer. If pointer exists, it is reused, - // otherwise a new pointer is created. Used by accessibility implementation to - // retrieve MSAA implementation for child or parent, when navigating MSAA - // hierarchy. - STDMETHODIMP GetInstance(REFIID iid, void** interface_ptr); - - // Sets the accessibility interface implementation of this wrapper to be - // anything the user specifies. - STDMETHODIMP SetInstance(IAccessible* interface_ptr); - - private: - // Instance of accessibility information and handling for a View. - ScopedComPtr<IAccessible> accessibility_info_; - - // View needed to initialize IAccessible. - views::View* view_; - - DISALLOW_COPY_AND_ASSIGN(ViewAccessibilityWrapper); -}; - -#endif // VIEWS_ACCESSIBILITY_VIEW_ACCESSIBILITY_WRAPPER_H_ diff --git a/views/view.cc b/views/view.cc index 739fd6c..8235f25 100644 --- a/views/view.cc +++ b/views/view.cc @@ -26,7 +26,7 @@ #include "views/window/window.h" #if defined(OS_WIN) -#include "views/accessibility/view_accessibility_wrapper.h" +#include "views/accessibility/view_accessibility.h" #endif #if defined(OS_LINUX) #include "app/scoped_handle_gtk.h" @@ -68,9 +68,6 @@ View::View() accelerator_focus_manager_(NULL), registered_accelerator_count_(0), context_menu_controller_(NULL), -#if defined(OS_WIN) - accessibility_(NULL), -#endif drag_controller_(NULL), flip_canvas_on_paint_for_rtl_ui_(false) { } @@ -87,8 +84,8 @@ View::~View() { } #if defined(OS_WIN) - if (accessibility_.get()) - accessibility_->Uninitialize(); + if (view_accessibility_.get()) + view_accessibility_->set_view(NULL); #endif } diff --git a/views/view.h b/views/view.h index dbff72b..ce9fcea 100644 --- a/views/view.h +++ b/views/view.h @@ -30,8 +30,8 @@ class Insets; class Path; } -class ViewAccessibilityWrapper; class ThemeProvider; +class ViewAccessibility; namespace views { @@ -601,10 +601,9 @@ class View : public AcceleratorTarget { // certain type. void SetAccessibleName(const std::wstring& name); - // Returns an instance of a wrapper class implementing the (platform-specific) - // accessibility interface for a given View. If one exists, it will be - // re-used, otherwise a new instance will be created. - ViewAccessibilityWrapper* GetViewAccessibilityWrapper(); + // Returns an instance of the (platform-specific) accessibility interface for + // the View. + ViewAccessibility* GetViewAccessibility(); // Utility functions @@ -1316,7 +1315,7 @@ class View : public AcceleratorTarget { #if defined(OS_WIN) // The accessibility implementation for this View. - scoped_ptr<ViewAccessibilityWrapper> accessibility_; + scoped_refptr<ViewAccessibility> view_accessibility_; #endif DragController* drag_controller_; diff --git a/views/view_gtk.cc b/views/view_gtk.cc index 602e4c0..464534a 100644 --- a/views/view_gtk.cc +++ b/views/view_gtk.cc @@ -31,7 +31,7 @@ void View::NotifyAccessibilityEvent(AccessibilityTypes::Event event_type, // notification should be sent here. } -ViewAccessibilityWrapper* View::GetViewAccessibilityWrapper() { +ViewAccessibility* View::GetViewAccessibility() { NOTIMPLEMENTED(); return NULL; } diff --git a/views/view_win.cc b/views/view_win.cc index 79492bb..3ecf13b 100644 --- a/views/view_win.cc +++ b/views/view_win.cc @@ -4,12 +4,16 @@ #include "views/view.h" +#include <atlcomcli.h> +// Necessary to define oleacc GUID's used in window_win.cc. +#include <initguid.h> +#include <oleacc.h> + #include "app/drag_drop_types.h" #include "base/string_util.h" #include "gfx/canvas.h" #include "gfx/path.h" #include "views/accessibility/view_accessibility.h" -#include "views/accessibility/view_accessibility_wrapper.h" #include "views/border.h" #include "views/views_delegate.h" #include "views/widget/root_view.h" @@ -49,11 +53,10 @@ void View::NotifyAccessibilityEvent(AccessibilityTypes::Event event_type, } } -ViewAccessibilityWrapper* View::GetViewAccessibilityWrapper() { - if (accessibility_.get() == NULL) { - accessibility_.reset(new ViewAccessibilityWrapper(this)); - } - return accessibility_.get(); +ViewAccessibility* View::GetViewAccessibility() { + if (!view_accessibility_.get()) + view_accessibility_.swap(ViewAccessibility::Create(this)); + return view_accessibility_.get(); } int View::GetHorizontalDragThreshold() { diff --git a/views/views.gyp b/views/views.gyp index 077d842..14a6a5a 100644 --- a/views/views.gyp +++ b/views/views.gyp @@ -57,8 +57,6 @@ 'accessibility/accessibility_types.h', 'accessibility/view_accessibility.cc', 'accessibility/view_accessibility.h', - 'accessibility/view_accessibility_wrapper.cc', - 'accessibility/view_accessibility_wrapper.h', 'animation/bounds_animator.cc', 'animation/bounds_animator.h', 'background.cc', diff --git a/views/widget/widget_win.cc b/views/widget/widget_win.cc index 5db4c82..102b48d 100644 --- a/views/widget/widget_win.cc +++ b/views/widget/widget_win.cc @@ -631,39 +631,13 @@ LRESULT WidgetWin::OnGetObject(UINT uMsg, WPARAM w_param, LPARAM l_param) { // Accessibility readers will send an OBJID_CLIENT message if (OBJID_CLIENT == l_param) { - // If our MSAA root is already created, reuse that pointer. Otherwise, - // create a new one. - if (!accessibility_root_) { - CComObject<ViewAccessibility>* instance = NULL; + // Retrieve MSAA dispatch object for the root view. + ScopedComPtr<IAccessible> root( + ViewAccessibility::GetAccessibleForView(GetRootView())); - HRESULT hr = CComObject<ViewAccessibility>::CreateInstance(&instance); - DCHECK(SUCCEEDED(hr)); - - if (!instance) { - // Return with failure. - return static_cast<LRESULT>(0L); - } - - ScopedComPtr<IAccessible> accessibility_instance(instance); - - if (!SUCCEEDED(instance->Initialize(root_view_.get()))) { - // Return with failure. - return static_cast<LRESULT>(0L); - } - - // All is well, assign the temp instance to the class smart pointer - accessibility_root_.Attach(accessibility_instance.Detach()); - - if (!accessibility_root_) { - // Return with failure. - return static_cast<LRESULT>(0L); - } - } - - // Create a reference to ViewAccessibility that MSAA will marshall - // to the client. + // Create a reference that MSAA will marshall to the client. reference_result = LresultFromObject(IID_IAccessible, w_param, - static_cast<IAccessible*>(accessibility_root_)); + static_cast<IAccessible*>(root.Detach())); } if (OBJID_CUSTOM == l_param) { |