diff options
Diffstat (limited to 'chromium/ui/views/accessibility/native_view_accessibility_win.cc')
-rw-r--r-- | chromium/ui/views/accessibility/native_view_accessibility_win.cc | 297 |
1 files changed, 192 insertions, 105 deletions
diff --git a/chromium/ui/views/accessibility/native_view_accessibility_win.cc b/chromium/ui/views/accessibility/native_view_accessibility_win.cc index 3e20cbbc4a9..670de4dd8ec 100644 --- a/chromium/ui/views/accessibility/native_view_accessibility_win.cc +++ b/chromium/ui/views/accessibility/native_view_accessibility_win.cc @@ -4,8 +4,8 @@ #include "ui/views/accessibility/native_view_accessibility_win.h" -#include <UIAutomationClient.h> #include <oleacc.h> +#include <UIAutomationClient.h> #include <set> #include <vector> @@ -15,8 +15,9 @@ #include "base/win/scoped_comptr.h" #include "base/win/windows_version.h" #include "third_party/iaccessible2/ia2_api_all.h" -#include "ui/base/accessibility/accessible_text_utils.h" -#include "ui/base/accessibility/accessible_view_state.h" +#include "ui/accessibility/ax_enums.h" +#include "ui/accessibility/ax_text_utils.h" +#include "ui/accessibility/ax_view_state.h" #include "ui/base/win/accessibility_ids_win.h" #include "ui/base/win/accessibility_misc_utils.h" #include "ui/base/win/atl_module.h" @@ -26,8 +27,6 @@ #include "ui/views/widget/widget.h" #include "ui/views/win/hwnd_util.h" -using ui::AccessibilityTypes; - namespace views { namespace { @@ -190,6 +189,7 @@ void AccessibleWebViewRegistry::QueryIAccessible2Interface(View* web_view) { long NativeViewAccessibilityWin::next_unique_id_ = 1; int NativeViewAccessibilityWin::view_storage_ids_[kMaxViewStorageIds] = {0}; int NativeViewAccessibilityWin::next_view_storage_id_index_ = 0; +std::vector<int> NativeViewAccessibilityWin::alert_target_view_storage_ids_; // static NativeViewAccessibility* NativeViewAccessibility::Create(View* view) { @@ -211,10 +211,11 @@ NativeViewAccessibilityWin::NativeViewAccessibilityWin() } NativeViewAccessibilityWin::~NativeViewAccessibilityWin() { + RemoveAlertTarget(); } void NativeViewAccessibilityWin::NotifyAccessibilityEvent( - ui::AccessibilityTypes::Event event_type) { + ui::AXEvent event_type) { if (!view_) return; @@ -237,6 +238,10 @@ void NativeViewAccessibilityWin::NotifyAccessibilityEvent( ::NotifyWinEvent(MSAAEvent(event_type), hwnd, OBJID_CLIENT, child_id); next_view_storage_id_index_ = (next_view_storage_id_index_ + 1) % kMaxViewStorageIds; + + // Keep track of views that are a target of an alert event. + if (event_type == ui::AX_EVENT_ALERT) + AddAlertTarget(); } gfx::NativeViewAccessible NativeViewAccessibilityWin::GetNativeObject() { @@ -557,9 +562,9 @@ STDMETHODIMP NativeViewAccessibilityWin::get_accDefaultAction( if (!view_) return E_FAIL; - ui::AccessibleViewState state; + ui::AXViewState state; view_->GetAccessibleState(&state); - string16 temp_action = state.default_action; + base::string16 temp_action = state.default_action; if (!temp_action.empty()) { *def_action = SysAllocString(temp_action.c_str()); @@ -578,7 +583,7 @@ STDMETHODIMP NativeViewAccessibilityWin::get_accDescription( if (!view_) return E_FAIL; - string16 temp_desc; + base::string16 temp_desc; view_->GetTooltipText(gfx::Point(), &temp_desc); if (!temp_desc.empty()) { @@ -624,9 +629,9 @@ STDMETHODIMP NativeViewAccessibilityWin::get_accKeyboardShortcut( if (!view_) return E_FAIL; - ui::AccessibleViewState state; + ui::AXViewState state; view_->GetAccessibleState(&state); - string16 temp_key = state.keyboard_shortcut; + base::string16 temp_key = state.keyboard_shortcut; if (!temp_key.empty()) { *acc_key = SysAllocString(temp_key.c_str()); @@ -646,9 +651,9 @@ STDMETHODIMP NativeViewAccessibilityWin::get_accName( return E_FAIL; // Retrieve the current view's name. - ui::AccessibleViewState state; + ui::AXViewState state; view_->GetAccessibleState(&state); - string16 temp_name = state.name; + base::string16 temp_name = state.name; if (!temp_name.empty()) { // Return name retrieved. *name = SysAllocString(temp_name.c_str()); @@ -694,7 +699,7 @@ STDMETHODIMP NativeViewAccessibilityWin::get_accRole( if (!view_) return E_FAIL; - ui::AccessibleViewState state; + ui::AXViewState state; view_->GetAccessibleState(&state); role->vt = VT_I4; role->lVal = MSAARole(state.role); @@ -733,9 +738,9 @@ STDMETHODIMP NativeViewAccessibilityWin::get_accValue(VARIANT var_id, return E_FAIL; // Retrieve the current view's value. - ui::AccessibleViewState state; + ui::AXViewState state; view_->GetAccessibleState(&state); - string16 temp_value = state.value; + base::string16 temp_value = state.value; if (!temp_value.empty()) { // Return value retrieved. @@ -758,7 +763,7 @@ STDMETHODIMP NativeViewAccessibilityWin::put_accValue(VARIANT var_id, return E_FAIL; // Return an error if the view can't set the value. - ui::AccessibleViewState state; + ui::AXViewState state; view_->GetAccessibleState(&state); if (state.set_value_callback.is_null()) return E_FAIL; @@ -782,9 +787,9 @@ STDMETHODIMP NativeViewAccessibilityWin::accSelect( STDMETHODIMP NativeViewAccessibilityWin::get_accHelp( VARIANT var_id, BSTR* help) { - if (help) - *help = NULL; - return E_NOTIMPL; + base::string16 temp = base::UTF8ToUTF16(view_->GetClassName()); + *help = SysAllocString(temp.c_str()); + return S_OK; } STDMETHODIMP NativeViewAccessibilityWin::get_accHelpTopic( @@ -815,7 +820,7 @@ STDMETHODIMP NativeViewAccessibilityWin::role(LONG* role) { if (!role) return E_INVALIDARG; - ui::AccessibleViewState state; + ui::AXViewState state; view_->GetAccessibleState(&state); *role = MSAARole(state.role); return S_OK; @@ -831,14 +836,14 @@ STDMETHODIMP NativeViewAccessibilityWin::get_states(AccessibleStates* states) { if (!states) return E_INVALIDARG; - ui::AccessibleViewState state; + ui::AXViewState state; view_->GetAccessibleState(&state); // There are only a couple of states we need to support // in IAccessible2. If any more are added, we may want to // add a helper function like MSAAState. *states = IA2_STATE_OPAQUE; - if (state.state & AccessibilityTypes::STATE_EDITABLE) + if (state.HasStateFlag(ui::AX_STATE_EDITABLE)) *states |= IA2_STATE_EDITABLE; return S_OK; @@ -866,6 +871,59 @@ STDMETHODIMP NativeViewAccessibilityWin::get_windowHandle(HWND* window_handle) { return *window_handle ? S_OK : S_FALSE; } +STDMETHODIMP NativeViewAccessibilityWin::get_relationTargetsOfType( + BSTR type_bstr, + long max_targets, + IUnknown ***targets, + long *n_targets) { + if (!view_) + return E_FAIL; + + if (!targets || !n_targets) + return E_INVALIDARG; + + *n_targets = 0; + *targets = NULL; + + // Only respond to requests for relations of type "alerts" on the + // root view. + base::string16 type(type_bstr); + if (type != L"alerts" || view_->parent()) + return S_FALSE; + + // Collect all of the alert views that are still valid. + std::vector<View*> alert_views; + ViewStorage* view_storage = ViewStorage::GetInstance(); + for (size_t i = 0; i < alert_target_view_storage_ids_.size(); ++i) { + int view_storage_id = alert_target_view_storage_ids_[i]; + View* view = view_storage->RetrieveView(view_storage_id); + if (!view || !view_->Contains(view)) + continue; + alert_views.push_back(view); + } + + long count = alert_views.size(); + if (count == 0) + return S_FALSE; + + // Don't return more targets than max_targets - but note that the caller + // is allowed to specify max_targets=0 to mean no limit. + if (max_targets > 0 && count > max_targets) + count = max_targets; + + // Return the number of targets. + *n_targets = count; + + // Allocate COM memory for the result array and populate it. + *targets = static_cast<IUnknown**>( + CoTaskMemAlloc(count * sizeof(IUnknown*))); + for (long i = 0; i < count; ++i) { + (*targets)[i] = alert_views[i]->GetNativeViewAccessible(); + (*targets)[i]->AddRef(); + } + return S_OK; +} + // // IAccessibleText // @@ -877,7 +935,7 @@ STDMETHODIMP NativeViewAccessibilityWin::get_nCharacters(LONG* n_characters) { if (!n_characters) return E_INVALIDARG; - string16 text = TextForIAccessibleText(); + base::string16 text = TextForIAccessibleText(); *n_characters = static_cast<LONG>(text.size()); return S_OK; } @@ -889,7 +947,7 @@ STDMETHODIMP NativeViewAccessibilityWin::get_caretOffset(LONG* offset) { if (!offset) return E_INVALIDARG; - ui::AccessibleViewState state; + ui::AXViewState state; view_->GetAccessibleState(&state); *offset = static_cast<LONG>(state.selection_end); return S_OK; @@ -902,7 +960,7 @@ STDMETHODIMP NativeViewAccessibilityWin::get_nSelections(LONG* n_selections) { if (!n_selections) return E_INVALIDARG; - ui::AccessibleViewState state; + ui::AXViewState state; view_->GetAccessibleState(&state); if (state.selection_start != state.selection_end) *n_selections = 1; @@ -920,7 +978,7 @@ STDMETHODIMP NativeViewAccessibilityWin::get_selection(LONG selection_index, if (!start_offset || !end_offset || selection_index != 0) return E_INVALIDARG; - ui::AccessibleViewState state; + ui::AXViewState state; view_->GetAccessibleState(&state); *start_offset = static_cast<LONG>(state.selection_start); *end_offset = static_cast<LONG>(state.selection_end); @@ -933,9 +991,9 @@ STDMETHODIMP NativeViewAccessibilityWin::get_text(LONG start_offset, if (!view_) return E_FAIL; - ui::AccessibleViewState state; + ui::AXViewState state; view_->GetAccessibleState(&state); - string16 text_str = TextForIAccessibleText(); + base::string16 text_str = TextForIAccessibleText(); LONG len = static_cast<LONG>(text_str.size()); if (start_offset == IA2_TEXT_OFFSET_LENGTH) { @@ -963,7 +1021,8 @@ STDMETHODIMP NativeViewAccessibilityWin::get_text(LONG start_offset, if (end_offset > len) return E_INVALIDARG; - string16 substr = text_str.substr(start_offset, end_offset - start_offset); + base::string16 substr = + text_str.substr(start_offset, end_offset - start_offset); if (substr.empty()) return S_FALSE; @@ -989,7 +1048,7 @@ STDMETHODIMP NativeViewAccessibilityWin::get_textAtOffset( return S_FALSE; } - const string16& text_str = TextForIAccessibleText(); + const base::string16& text_str = TextForIAccessibleText(); *start_offset = FindBoundary( text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); @@ -1015,7 +1074,7 @@ STDMETHODIMP NativeViewAccessibilityWin::get_textBeforeOffset( return S_FALSE; } - const string16& text_str = TextForIAccessibleText(); + const base::string16& text_str = TextForIAccessibleText(); *start_offset = FindBoundary( text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); @@ -1040,7 +1099,7 @@ STDMETHODIMP NativeViewAccessibilityWin::get_textAfterOffset( return S_FALSE; } - const string16& text_str = TextForIAccessibleText(); + const base::string16& text_str = TextForIAccessibleText(); *start_offset = offset; *end_offset = FindBoundary( @@ -1071,11 +1130,12 @@ STDMETHODIMP NativeViewAccessibilityWin::QueryService( if (!view_) return E_FAIL; - if (riid == IID_IAccessible2) + if (riid == IID_IAccessible2 || riid == IID_IAccessible2_2) AccessibleWebViewRegistry::GetInstance()->EnableIAccessible2Support(); if (guidService == IID_IAccessible || guidService == IID_IAccessible2 || + guidService == IID_IAccessible2_2 || guidService == IID_IAccessibleText) { return QueryInterface(riid, object); } @@ -1100,13 +1160,14 @@ STDMETHODIMP NativeViewAccessibilityWin::GetPatternProvider( << " for pattern id: " << id; if (id == UIA_ValuePatternId || id == UIA_TextPatternId) { - ui::AccessibleViewState state; + ui::AXViewState state; view_->GetAccessibleState(&state); long role = MSAARole(state.role); if (role == ROLE_SYSTEM_TEXT) { DVLOG(1) << "Returning UIA text provider"; - base::win::UIATextProvider::CreateTextProvider(true, provider); + base::win::UIATextProvider::CreateTextProvider( + state.value, true, provider); return S_OK; } } @@ -1120,7 +1181,7 @@ STDMETHODIMP NativeViewAccessibilityWin::GetPropertyValue(PROPERTYID id, << " for property id: " << id; if (id == UIA_ControlTypePropertyId) { - ui::AccessibleViewState state; + ui::AXViewState state; view_->GetAccessibleState(&state); long role = MSAARole(state.role); if (role == ROLE_SYSTEM_TEXT) { @@ -1149,27 +1210,25 @@ void NativeViewAccessibility::UnregisterWebView(View* web_view) { AccessibleWebViewRegistry::GetInstance()->UnregisterWebView(web_view); } -int32 NativeViewAccessibilityWin::MSAAEvent(AccessibilityTypes::Event event) { +int32 NativeViewAccessibilityWin::MSAAEvent(ui::AXEvent event) { switch (event) { - case AccessibilityTypes::EVENT_ALERT: + case ui::AX_EVENT_ALERT: return EVENT_SYSTEM_ALERT; - case AccessibilityTypes::EVENT_FOCUS: + case ui::AX_EVENT_FOCUS: return EVENT_OBJECT_FOCUS; - case AccessibilityTypes::EVENT_MENUSTART: + case ui::AX_EVENT_MENU_START: return EVENT_SYSTEM_MENUSTART; - case AccessibilityTypes::EVENT_MENUEND: + case ui::AX_EVENT_MENU_END: return EVENT_SYSTEM_MENUEND; - case AccessibilityTypes::EVENT_MENUPOPUPSTART: + case ui::AX_EVENT_MENU_POPUP_START: return EVENT_SYSTEM_MENUPOPUPSTART; - case AccessibilityTypes::EVENT_MENUPOPUPEND: + case ui::AX_EVENT_MENU_POPUP_END: return EVENT_SYSTEM_MENUPOPUPEND; - case AccessibilityTypes::EVENT_NAME_CHANGED: + case ui::AX_EVENT_TEXT_CHANGED: return EVENT_OBJECT_NAMECHANGE; - case AccessibilityTypes::EVENT_TEXT_CHANGED: - return EVENT_OBJECT_VALUECHANGE; - case AccessibilityTypes::EVENT_SELECTION_CHANGED: + case ui::AX_EVENT_SELECTION_CHANGED: return IA2_EVENT_TEXT_CARET_MOVED; - case AccessibilityTypes::EVENT_VALUE_CHANGED: + case ui::AX_EVENT_VALUE_CHANGED: return EVENT_OBJECT_VALUECHANGE; default: // Not supported or invalid event. @@ -1178,109 +1237,109 @@ int32 NativeViewAccessibilityWin::MSAAEvent(AccessibilityTypes::Event event) { } } -int32 NativeViewAccessibilityWin::MSAARole(AccessibilityTypes::Role role) { +int32 NativeViewAccessibilityWin::MSAARole(ui::AXRole role) { switch (role) { - case AccessibilityTypes::ROLE_ALERT: + case ui::AX_ROLE_ALERT: return ROLE_SYSTEM_ALERT; - case AccessibilityTypes::ROLE_APPLICATION: + case ui::AX_ROLE_APPLICATION: return ROLE_SYSTEM_APPLICATION; - case AccessibilityTypes::ROLE_BUTTONDROPDOWN: + case ui::AX_ROLE_BUTTON_DROP_DOWN: return ROLE_SYSTEM_BUTTONDROPDOWN; - case AccessibilityTypes::ROLE_BUTTONMENU: + case ui::AX_ROLE_POP_UP_BUTTON: return ROLE_SYSTEM_BUTTONMENU; - case AccessibilityTypes::ROLE_CHECKBUTTON: + case ui::AX_ROLE_CHECK_BOX: return ROLE_SYSTEM_CHECKBUTTON; - case AccessibilityTypes::ROLE_COMBOBOX: + case ui::AX_ROLE_COMBO_BOX: return ROLE_SYSTEM_COMBOBOX; - case AccessibilityTypes::ROLE_DIALOG: + case ui::AX_ROLE_DIALOG: return ROLE_SYSTEM_DIALOG; - case AccessibilityTypes::ROLE_GRAPHIC: - return ROLE_SYSTEM_GRAPHIC; - case AccessibilityTypes::ROLE_GROUPING: + case ui::AX_ROLE_GROUP: return ROLE_SYSTEM_GROUPING; - case AccessibilityTypes::ROLE_LINK: + case ui::AX_ROLE_IMAGE: + return ROLE_SYSTEM_GRAPHIC; + case ui::AX_ROLE_LINK: return ROLE_SYSTEM_LINK; - case AccessibilityTypes::ROLE_LOCATION_BAR: + case ui::AX_ROLE_LOCATION_BAR: return ROLE_SYSTEM_GROUPING; - case AccessibilityTypes::ROLE_MENUBAR: + case ui::AX_ROLE_MENU_BAR: return ROLE_SYSTEM_MENUBAR; - case AccessibilityTypes::ROLE_MENUITEM: + case ui::AX_ROLE_MENU_ITEM: return ROLE_SYSTEM_MENUITEM; - case AccessibilityTypes::ROLE_MENUPOPUP: + case ui::AX_ROLE_MENU_LIST_POPUP: return ROLE_SYSTEM_MENUPOPUP; - case AccessibilityTypes::ROLE_OUTLINE: + case ui::AX_ROLE_TREE: return ROLE_SYSTEM_OUTLINE; - case AccessibilityTypes::ROLE_OUTLINEITEM: + case ui::AX_ROLE_TREE_ITEM: return ROLE_SYSTEM_OUTLINEITEM; - case AccessibilityTypes::ROLE_PAGETAB: + case ui::AX_ROLE_TAB: return ROLE_SYSTEM_PAGETAB; - case AccessibilityTypes::ROLE_PAGETABLIST: + case ui::AX_ROLE_TAB_LIST: return ROLE_SYSTEM_PAGETABLIST; - case AccessibilityTypes::ROLE_PANE: + case ui::AX_ROLE_PANE: return ROLE_SYSTEM_PANE; - case AccessibilityTypes::ROLE_PROGRESSBAR: + case ui::AX_ROLE_PROGRESS_INDICATOR: return ROLE_SYSTEM_PROGRESSBAR; - case AccessibilityTypes::ROLE_PUSHBUTTON: + case ui::AX_ROLE_BUTTON: return ROLE_SYSTEM_PUSHBUTTON; - case AccessibilityTypes::ROLE_RADIOBUTTON: + case ui::AX_ROLE_RADIO_BUTTON: return ROLE_SYSTEM_RADIOBUTTON; - case AccessibilityTypes::ROLE_SCROLLBAR: + case ui::AX_ROLE_SCROLL_BAR: return ROLE_SYSTEM_SCROLLBAR; - case AccessibilityTypes::ROLE_SEPARATOR: + case ui::AX_ROLE_SPLITTER: return ROLE_SYSTEM_SEPARATOR; - case AccessibilityTypes::ROLE_SLIDER: + case ui::AX_ROLE_SLIDER: return ROLE_SYSTEM_SLIDER; - case AccessibilityTypes::ROLE_STATICTEXT: + case ui::AX_ROLE_STATIC_TEXT: return ROLE_SYSTEM_STATICTEXT; - case AccessibilityTypes::ROLE_TEXT: + case ui::AX_ROLE_TEXT_FIELD: return ROLE_SYSTEM_TEXT; - case AccessibilityTypes::ROLE_TITLEBAR: + case ui::AX_ROLE_TITLE_BAR: return ROLE_SYSTEM_TITLEBAR; - case AccessibilityTypes::ROLE_TOOLBAR: + case ui::AX_ROLE_TOOLBAR: return ROLE_SYSTEM_TOOLBAR; - case AccessibilityTypes::ROLE_WINDOW: + case ui::AX_ROLE_WINDOW: return ROLE_SYSTEM_WINDOW; - case AccessibilityTypes::ROLE_CLIENT: + case ui::AX_ROLE_CLIENT: default: // This is the default role for MSAA. return ROLE_SYSTEM_CLIENT; } } -int32 NativeViewAccessibilityWin::MSAAState(AccessibilityTypes::State state) { +int32 NativeViewAccessibilityWin::MSAAState(const ui::AXViewState& state) { // This maps MSAA states for get_accState(). See also the IAccessible2 // interface get_states(). int32 msaa_state = 0; - if (state & AccessibilityTypes::STATE_CHECKED) + if (state.HasStateFlag(ui::AX_STATE_CHECKED)) msaa_state |= STATE_SYSTEM_CHECKED; - if (state & AccessibilityTypes::STATE_COLLAPSED) + if (state.HasStateFlag(ui::AX_STATE_COLLAPSED)) msaa_state |= STATE_SYSTEM_COLLAPSED; - if (state & AccessibilityTypes::STATE_DEFAULT) + if (state.HasStateFlag(ui::AX_STATE_DEFAULT)) msaa_state |= STATE_SYSTEM_DEFAULT; - if (state & AccessibilityTypes::STATE_EXPANDED) + if (state.HasStateFlag(ui::AX_STATE_EXPANDED)) msaa_state |= STATE_SYSTEM_EXPANDED; - if (state & AccessibilityTypes::STATE_HASPOPUP) + if (state.HasStateFlag(ui::AX_STATE_HASPOPUP)) msaa_state |= STATE_SYSTEM_HASPOPUP; - if (state & AccessibilityTypes::STATE_HOTTRACKED) + if (state.HasStateFlag(ui::AX_STATE_HOVERED)) msaa_state |= STATE_SYSTEM_HOTTRACKED; - if (state & AccessibilityTypes::STATE_INVISIBLE) + if (state.HasStateFlag(ui::AX_STATE_INVISIBLE)) msaa_state |= STATE_SYSTEM_INVISIBLE; - if (state & AccessibilityTypes::STATE_LINKED) + if (state.HasStateFlag(ui::AX_STATE_LINKED)) msaa_state |= STATE_SYSTEM_LINKED; - if (state & AccessibilityTypes::STATE_OFFSCREEN) + if (state.HasStateFlag(ui::AX_STATE_OFFSCREEN)) msaa_state |= STATE_SYSTEM_OFFSCREEN; - if (state & AccessibilityTypes::STATE_PRESSED) + if (state.HasStateFlag(ui::AX_STATE_PRESSED)) msaa_state |= STATE_SYSTEM_PRESSED; - if (state & AccessibilityTypes::STATE_PROTECTED) + if (state.HasStateFlag(ui::AX_STATE_PROTECTED)) msaa_state |= STATE_SYSTEM_PROTECTED; - if (state & AccessibilityTypes::STATE_READONLY) + if (state.HasStateFlag(ui::AX_STATE_READ_ONLY)) msaa_state |= STATE_SYSTEM_READONLY; - if (state & AccessibilityTypes::STATE_SELECTED) + if (state.HasStateFlag(ui::AX_STATE_SELECTED)) msaa_state |= STATE_SYSTEM_SELECTED; - if (state & AccessibilityTypes::STATE_FOCUSED) + if (state.HasStateFlag(ui::AX_STATE_FOCUSED)) msaa_state |= STATE_SYSTEM_FOCUSED; - if (state & AccessibilityTypes::STATE_UNAVAILABLE) + if (state.HasStateFlag(ui::AX_STATE_DISABLED)) msaa_state |= STATE_SYSTEM_UNAVAILABLE; return msaa_state; } @@ -1339,22 +1398,22 @@ void NativeViewAccessibilityWin::SetState( msaa_state->lVal |= STATE_SYSTEM_FOCUSED; // Add on any view-specific states. - ui::AccessibleViewState view_state; + ui::AXViewState view_state; view->GetAccessibleState(&view_state); - msaa_state->lVal |= MSAAState(view_state.state); + msaa_state->lVal |= MSAAState(view_state); } -string16 NativeViewAccessibilityWin::TextForIAccessibleText() { - ui::AccessibleViewState state; +base::string16 NativeViewAccessibilityWin::TextForIAccessibleText() { + ui::AXViewState state; view_->GetAccessibleState(&state); - if (state.role == AccessibilityTypes::ROLE_TEXT) + if (state.role == ui::AX_ROLE_TEXT_FIELD) return state.value; else return state.name; } void NativeViewAccessibilityWin::HandleSpecialTextOffset( - const string16& text, LONG* offset) { + const base::string16& text, LONG* offset) { if (*offset == IA2_TEXT_OFFSET_LENGTH) { *offset = static_cast<LONG>(text.size()); } else if (*offset == IA2_TEXT_OFFSET_CARET) { @@ -1378,7 +1437,7 @@ ui::TextBoundaryType NativeViewAccessibilityWin::IA2TextBoundaryToTextBoundary( } LONG NativeViewAccessibilityWin::FindBoundary( - const string16& text, + const base::string16& text, IA2TextBoundaryType ia2_boundary, LONG start_offset, ui::TextBoundaryDirection direction) { @@ -1414,4 +1473,32 @@ void NativeViewAccessibilityWin::PopulateChildWidgetVector( } } +void NativeViewAccessibilityWin::AddAlertTarget() { + ViewStorage* view_storage = ViewStorage::GetInstance(); + for (size_t i = 0; i < alert_target_view_storage_ids_.size(); ++i) { + int view_storage_id = alert_target_view_storage_ids_[i]; + View* view = view_storage->RetrieveView(view_storage_id); + if (view == view_) + return; + } + int view_storage_id = view_storage->CreateStorageID(); + view_storage->StoreView(view_storage_id, view_); + alert_target_view_storage_ids_.push_back(view_storage_id); +} + +void NativeViewAccessibilityWin::RemoveAlertTarget() { + ViewStorage* view_storage = ViewStorage::GetInstance(); + size_t i = 0; + while (i < alert_target_view_storage_ids_.size()) { + int view_storage_id = alert_target_view_storage_ids_[i]; + View* view = view_storage->RetrieveView(view_storage_id); + if (view == NULL || view == view_) { + alert_target_view_storage_ids_.erase( + alert_target_view_storage_ids_.begin() + i); + } else { + ++i; + } + } +} + } // namespace views |