Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(625)

Side by Side Diff: content/browser/accessibility/browser_accessibility_win.cc

Issue 2692173003: Implemented SetSelection for the Web content on Windows. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/browser/accessibility/browser_accessibility_win.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/accessibility/browser_accessibility_win.h" 5 #include "content/browser/accessibility/browser_accessibility_win.h"
6 6
7 #include <UIAutomationClient.h> 7 #include <UIAutomationClient.h>
8 #include <UIAutomationCoreApi.h> 8 #include <UIAutomationCoreApi.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 return E_FAIL; 422 return E_FAIL;
423 423
424 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 424 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
425 if (!target) 425 if (!target)
426 return E_INVALIDARG; 426 return E_INVALIDARG;
427 427
428 // Return an error if it's not clickable. 428 // Return an error if it's not clickable.
429 if (!target->HasIntAttribute(ui::AX_ATTR_ACTION)) 429 if (!target->HasIntAttribute(ui::AX_ATTR_ACTION))
430 return DISP_E_MEMBERNOTFOUND; 430 return DISP_E_MEMBERNOTFOUND;
431 431
432 manager()->DoDefaultAction(*target); 432 manager_->DoDefaultAction(*target);
433 return S_OK; 433 return S_OK;
434 } 434 }
435 435
436 STDMETHODIMP BrowserAccessibilityWin::accHitTest(LONG x_left, 436 STDMETHODIMP BrowserAccessibilityWin::accHitTest(LONG x_left,
437 LONG y_top, 437 LONG y_top,
438 VARIANT* child) { 438 VARIANT* child) {
439 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_HIT_TEST); 439 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_HIT_TEST);
440 if (!instance_active()) 440 if (!instance_active())
441 return E_FAIL; 441 return E_FAIL;
442 442
443 if (!child) 443 if (!child)
444 return E_INVALIDARG; 444 return E_INVALIDARG;
445 445
446 gfx::Point point(x_left, y_top); 446 gfx::Point point(x_left, y_top);
447 if (!GetScreenBoundsRect().Contains(point)) { 447 if (!GetScreenBoundsRect().Contains(point)) {
448 // Return S_FALSE and VT_EMPTY when outside the object's boundaries. 448 // Return S_FALSE and VT_EMPTY when outside the object's boundaries.
449 child->vt = VT_EMPTY; 449 child->vt = VT_EMPTY;
450 return S_FALSE; 450 return S_FALSE;
451 } 451 }
452 452
453 BrowserAccessibility* result = manager()->CachingAsyncHitTest(point); 453 BrowserAccessibility* result = manager_->CachingAsyncHitTest(point);
454 if (result == this) { 454 if (result == this) {
455 // Point is within this object. 455 // Point is within this object.
456 child->vt = VT_I4; 456 child->vt = VT_I4;
457 child->lVal = CHILDID_SELF; 457 child->lVal = CHILDID_SELF;
458 } else { 458 } else {
459 child->vt = VT_DISPATCH; 459 child->vt = VT_DISPATCH;
460 child->pdispVal = ToBrowserAccessibilityWin(result)->NewReference(); 460 child->pdispVal = ToBrowserAccessibilityWin(result)->NewReference();
461 } 461 }
462 return S_OK; 462 return S_OK;
463 } 463 }
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 } 609 }
610 610
611 STDMETHODIMP BrowserAccessibilityWin::get_accFocus(VARIANT* focus_child) { 611 STDMETHODIMP BrowserAccessibilityWin::get_accFocus(VARIANT* focus_child) {
612 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_FOCUS); 612 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_FOCUS);
613 if (!instance_active()) 613 if (!instance_active())
614 return E_FAIL; 614 return E_FAIL;
615 615
616 if (!focus_child) 616 if (!focus_child)
617 return E_INVALIDARG; 617 return E_INVALIDARG;
618 618
619 BrowserAccessibilityWin* focus = static_cast<BrowserAccessibilityWin*>( 619 BrowserAccessibilityWin* focus =
620 manager()->GetFocus()); 620 static_cast<BrowserAccessibilityWin*>(manager_->GetFocus());
621 if (focus == this) { 621 if (focus == this) {
622 focus_child->vt = VT_I4; 622 focus_child->vt = VT_I4;
623 focus_child->lVal = CHILDID_SELF; 623 focus_child->lVal = CHILDID_SELF;
624 } else if (focus == NULL) { 624 } else if (focus == NULL) {
625 focus_child->vt = VT_EMPTY; 625 focus_child->vt = VT_EMPTY;
626 } else { 626 } else {
627 focus_child->vt = VT_DISPATCH; 627 focus_child->vt = VT_DISPATCH;
628 focus_child->pdispVal = focus->NewReference(); 628 focus_child->pdispVal = focus->NewReference();
629 } 629 }
630 630
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
695 return E_FAIL; 695 return E_FAIL;
696 696
697 if (!disp_parent) 697 if (!disp_parent)
698 return E_INVALIDARG; 698 return E_INVALIDARG;
699 699
700 IAccessible* parent_obj = ToBrowserAccessibilityWin(GetParent()); 700 IAccessible* parent_obj = ToBrowserAccessibilityWin(GetParent());
701 if (parent_obj == NULL) { 701 if (parent_obj == NULL) {
702 // This happens if we're the root of the tree; 702 // This happens if we're the root of the tree;
703 // return the IAccessible for the window. 703 // return the IAccessible for the window.
704 parent_obj = 704 parent_obj =
705 manager()->ToBrowserAccessibilityManagerWin()->GetParentIAccessible(); 705 manager_->ToBrowserAccessibilityManagerWin()->GetParentIAccessible();
706 // |parent| can only be NULL if the manager was created before the parent 706 // |parent| can only be NULL if the manager was created before the parent
707 // IAccessible was known and it wasn't subsequently set before a client 707 // IAccessible was known and it wasn't subsequently set before a client
708 // requested it. This has been fixed. |parent| may also be NULL during 708 // requested it. This has been fixed. |parent| may also be NULL during
709 // destruction. Possible cases where this could occur include tabs being 709 // destruction. Possible cases where this could occur include tabs being
710 // dragged to a new window, etc. 710 // dragged to a new window, etc.
711 if (!parent_obj) { 711 if (!parent_obj) {
712 DVLOG(1) << "In Function: " << __func__ 712 DVLOG(1) << "In Function: " << __func__
713 << ". Parent IAccessible interface is NULL. Returning failure"; 713 << ". Parent IAccessible interface is NULL. Returning failure";
714 return E_FAIL; 714 return E_FAIL;
715 } 715 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
750 750
751 if (!state) 751 if (!state)
752 return E_INVALIDARG; 752 return E_INVALIDARG;
753 753
754 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 754 BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
755 if (!target) 755 if (!target)
756 return E_INVALIDARG; 756 return E_INVALIDARG;
757 757
758 state->vt = VT_I4; 758 state->vt = VT_I4;
759 state->lVal = target->ia_state(); 759 state->lVal = target->ia_state();
760 if (manager()->GetFocus() == this) 760 if (manager_->GetFocus() == this)
761 state->lVal |= STATE_SYSTEM_FOCUSED; 761 state->lVal |= STATE_SYSTEM_FOCUSED;
762 762
763 return S_OK; 763 return S_OK;
764 } 764 }
765 765
766 STDMETHODIMP BrowserAccessibilityWin::get_accValue(VARIANT var_id, 766 STDMETHODIMP BrowserAccessibilityWin::get_accValue(VARIANT var_id,
767 BSTR* value) { 767 BSTR* value) {
768 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_VALUE); 768 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_VALUE);
769 if (!instance_active()) 769 if (!instance_active())
770 return E_FAIL; 770 return E_FAIL;
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
862 return S_OK; 862 return S_OK;
863 } 863 }
864 864
865 STDMETHODIMP BrowserAccessibilityWin::accSelect( 865 STDMETHODIMP BrowserAccessibilityWin::accSelect(
866 LONG flags_sel, VARIANT var_id) { 866 LONG flags_sel, VARIANT var_id) {
867 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_SELECT); 867 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ACC_SELECT);
868 if (!instance_active()) 868 if (!instance_active())
869 return E_FAIL; 869 return E_FAIL;
870 870
871 if (flags_sel & SELFLAG_TAKEFOCUS) { 871 if (flags_sel & SELFLAG_TAKEFOCUS) {
872 manager()->SetFocus(*this); 872 manager_->SetFocus(*this);
873 return S_OK; 873 return S_OK;
874 } 874 }
875 875
876 return S_FALSE; 876 return S_FALSE;
877 } 877 }
878 878
879 STDMETHODIMP 879 STDMETHODIMP
880 BrowserAccessibilityWin::put_accName(VARIANT var_id, BSTR put_name) { 880 BrowserAccessibilityWin::put_accName(VARIANT var_id, BSTR put_name) {
881 return E_NOTIMPL; 881 return E_NOTIMPL;
882 } 882 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
951 951
952 STDMETHODIMP BrowserAccessibilityWin::get_windowHandle(HWND* window_handle) { 952 STDMETHODIMP BrowserAccessibilityWin::get_windowHandle(HWND* window_handle) {
953 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_WINDOW_HANDLE); 953 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_WINDOW_HANDLE);
954 if (!instance_active()) 954 if (!instance_active())
955 return E_FAIL; 955 return E_FAIL;
956 956
957 if (!window_handle) 957 if (!window_handle)
958 return E_INVALIDARG; 958 return E_INVALIDARG;
959 959
960 *window_handle = 960 *window_handle =
961 manager()->ToBrowserAccessibilityManagerWin()->GetParentHWND(); 961 manager_->ToBrowserAccessibilityManagerWin()->GetParentHWND();
962 if (!*window_handle) 962 if (!*window_handle)
963 return E_FAIL; 963 return E_FAIL;
964 964
965 return S_OK; 965 return S_OK;
966 } 966 }
967 967
968 STDMETHODIMP BrowserAccessibilityWin::get_indexInParent(LONG* index_in_parent) { 968 STDMETHODIMP BrowserAccessibilityWin::get_indexInParent(LONG* index_in_parent) {
969 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_INDEX_IN_PARENT); 969 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_INDEX_IN_PARENT);
970 if (!instance_active()) 970 if (!instance_active())
971 return E_FAIL; 971 return E_FAIL;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1037 } 1037 }
1038 1038
1039 STDMETHODIMP BrowserAccessibilityWin::scrollTo(IA2ScrollType scroll_type) { 1039 STDMETHODIMP BrowserAccessibilityWin::scrollTo(IA2ScrollType scroll_type) {
1040 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_IA2_SCROLL_TO); 1040 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_IA2_SCROLL_TO);
1041 if (!instance_active()) 1041 if (!instance_active())
1042 return E_FAIL; 1042 return E_FAIL;
1043 1043
1044 gfx::Rect r = GetFrameBoundsRect(); 1044 gfx::Rect r = GetFrameBoundsRect();
1045 switch(scroll_type) { 1045 switch(scroll_type) {
1046 case IA2_SCROLL_TYPE_TOP_LEFT: 1046 case IA2_SCROLL_TYPE_TOP_LEFT:
1047 manager()->ScrollToMakeVisible(*this, gfx::Rect(r.x(), r.y(), 0, 0)); 1047 manager_->ScrollToMakeVisible(*this, gfx::Rect(r.x(), r.y(), 0, 0));
1048 break; 1048 break;
1049 case IA2_SCROLL_TYPE_BOTTOM_RIGHT: 1049 case IA2_SCROLL_TYPE_BOTTOM_RIGHT:
1050 manager()->ScrollToMakeVisible( 1050 manager_->ScrollToMakeVisible(*this,
1051 *this, gfx::Rect(r.right(), r.bottom(), 0, 0)); 1051 gfx::Rect(r.right(), r.bottom(), 0, 0));
1052 break; 1052 break;
1053 case IA2_SCROLL_TYPE_TOP_EDGE: 1053 case IA2_SCROLL_TYPE_TOP_EDGE:
1054 manager()->ScrollToMakeVisible( 1054 manager_->ScrollToMakeVisible(*this,
1055 *this, gfx::Rect(r.x(), r.y(), r.width(), 0)); 1055 gfx::Rect(r.x(), r.y(), r.width(), 0));
1056 break; 1056 break;
1057 case IA2_SCROLL_TYPE_BOTTOM_EDGE: 1057 case IA2_SCROLL_TYPE_BOTTOM_EDGE:
1058 manager()->ScrollToMakeVisible( 1058 manager_->ScrollToMakeVisible(*this,
1059 *this, gfx::Rect(r.x(), r.bottom(), r.width(), 0)); 1059 gfx::Rect(r.x(), r.bottom(), r.width(), 0));
1060 break; 1060 break;
1061 case IA2_SCROLL_TYPE_LEFT_EDGE: 1061 case IA2_SCROLL_TYPE_LEFT_EDGE:
1062 manager()->ScrollToMakeVisible( 1062 manager_->ScrollToMakeVisible(*this,
1063 *this, gfx::Rect(r.x(), r.y(), 0, r.height())); 1063 gfx::Rect(r.x(), r.y(), 0, r.height()));
1064 break; 1064 break;
1065 case IA2_SCROLL_TYPE_RIGHT_EDGE: 1065 case IA2_SCROLL_TYPE_RIGHT_EDGE:
1066 manager()->ScrollToMakeVisible( 1066 manager_->ScrollToMakeVisible(*this,
1067 *this, gfx::Rect(r.right(), r.y(), 0, r.height())); 1067 gfx::Rect(r.right(), r.y(), 0, r.height()));
1068 break; 1068 break;
1069 case IA2_SCROLL_TYPE_ANYWHERE: 1069 case IA2_SCROLL_TYPE_ANYWHERE:
1070 default: 1070 default:
1071 manager()->ScrollToMakeVisible(*this, r); 1071 manager_->ScrollToMakeVisible(*this, r);
1072 break; 1072 break;
1073 } 1073 }
1074 1074
1075 return S_OK; 1075 return S_OK;
1076 } 1076 }
1077 1077
1078 STDMETHODIMP BrowserAccessibilityWin::scrollToPoint( 1078 STDMETHODIMP BrowserAccessibilityWin::scrollToPoint(
1079 IA2CoordinateType coordinate_type, 1079 IA2CoordinateType coordinate_type,
1080 LONG x, 1080 LONG x,
1081 LONG y) { 1081 LONG y) {
1082 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_SCROLL_TO_POINT); 1082 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_SCROLL_TO_POINT);
1083 if (!instance_active()) 1083 if (!instance_active())
1084 return E_FAIL; 1084 return E_FAIL;
1085 1085
1086 gfx::Point scroll_to(x, y); 1086 gfx::Point scroll_to(x, y);
1087 1087
1088 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 1088 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) {
1089 scroll_to -= manager()->GetViewBounds().OffsetFromOrigin(); 1089 scroll_to -= manager_->GetViewBounds().OffsetFromOrigin();
1090 } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 1090 } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) {
1091 if (GetParent()) 1091 if (GetParent())
1092 scroll_to += GetParent()->GetFrameBoundsRect().OffsetFromOrigin(); 1092 scroll_to += GetParent()->GetFrameBoundsRect().OffsetFromOrigin();
1093 } else { 1093 } else {
1094 return E_INVALIDARG; 1094 return E_INVALIDARG;
1095 } 1095 }
1096 1096
1097 manager()->ScrollToPoint(*this, scroll_to); 1097 manager_->ScrollToPoint(*this, scroll_to);
1098 1098
1099 return S_OK; 1099 return S_OK;
1100 } 1100 }
1101 1101
1102 STDMETHODIMP BrowserAccessibilityWin::get_groupPosition( 1102 STDMETHODIMP BrowserAccessibilityWin::get_groupPosition(
1103 LONG* group_level, 1103 LONG* group_level,
1104 LONG* similar_items_in_group, 1104 LONG* similar_items_in_group,
1105 LONG* position_in_group) { 1105 LONG* position_in_group) {
1106 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_GROUP_POSITION); 1106 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_GROUP_POSITION);
1107 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER); 1107 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER);
(...skipping 941 matching lines...) Expand 10 before | Expand all | Expand 10 after
2049 BrowserAccessibilityWin* cell = GetFromID(cell_id); 2049 BrowserAccessibilityWin* cell = GetFromID(cell_id);
2050 if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) 2050 if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER)
2051 (*n_column_header_cells)++; 2051 (*n_column_header_cells)++;
2052 } 2052 }
2053 2053
2054 *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc( 2054 *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc(
2055 (*n_column_header_cells) * sizeof(cell_accessibles[0]))); 2055 (*n_column_header_cells) * sizeof(cell_accessibles[0])));
2056 int index = 0; 2056 int index = 0;
2057 for (int i = 0; i < rows; ++i) { 2057 for (int i = 0; i < rows; ++i) {
2058 int cell_id = cell_ids[i * columns + column]; 2058 int cell_id = cell_ids[i * columns + column];
2059 BrowserAccessibility* cell = manager()->GetFromID(cell_id); 2059 BrowserAccessibility* cell = manager_->GetFromID(cell_id);
2060 if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) { 2060 if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) {
2061 (*cell_accessibles)[index] = static_cast<IAccessible*>( 2061 (*cell_accessibles)[index] = static_cast<IAccessible*>(
2062 ToBrowserAccessibilityWin(cell)->NewReference()); 2062 ToBrowserAccessibilityWin(cell)->NewReference());
2063 ++index; 2063 ++index;
2064 } 2064 }
2065 } 2065 }
2066 2066
2067 return S_OK; 2067 return S_OK;
2068 } 2068 }
2069 2069
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
2142 return S_FALSE; 2142 return S_FALSE;
2143 } 2143 }
2144 if (columns <= 0 || rows <= 0 || row < 0 || row >= rows) 2144 if (columns <= 0 || rows <= 0 || row < 0 || row >= rows)
2145 return S_FALSE; 2145 return S_FALSE;
2146 2146
2147 const std::vector<int32_t>& cell_ids = 2147 const std::vector<int32_t>& cell_ids =
2148 table->GetIntListAttribute(ui::AX_ATTR_CELL_IDS); 2148 table->GetIntListAttribute(ui::AX_ATTR_CELL_IDS);
2149 2149
2150 for (int i = 0; i < columns; ++i) { 2150 for (int i = 0; i < columns; ++i) {
2151 int cell_id = cell_ids[row * columns + i]; 2151 int cell_id = cell_ids[row * columns + i];
2152 BrowserAccessibility* cell = manager()->GetFromID(cell_id); 2152 BrowserAccessibility* cell = manager_->GetFromID(cell_id);
2153 if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) 2153 if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER)
2154 (*n_row_header_cells)++; 2154 (*n_row_header_cells)++;
2155 } 2155 }
2156 2156
2157 *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc( 2157 *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc(
2158 (*n_row_header_cells) * sizeof(cell_accessibles[0]))); 2158 (*n_row_header_cells) * sizeof(cell_accessibles[0])));
2159 int index = 0; 2159 int index = 0;
2160 for (int i = 0; i < columns; ++i) { 2160 for (int i = 0; i < columns; ++i) {
2161 int cell_id = cell_ids[row * columns + i]; 2161 int cell_id = cell_ids[row * columns + i];
2162 BrowserAccessibility* cell = manager()->GetFromID(cell_id); 2162 BrowserAccessibility* cell = manager_->GetFromID(cell_id);
2163 if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) { 2163 if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) {
2164 (*cell_accessibles)[index] = static_cast<IAccessible*>( 2164 (*cell_accessibles)[index] = static_cast<IAccessible*>(
2165 ToBrowserAccessibilityWin(cell)->NewReference()); 2165 ToBrowserAccessibilityWin(cell)->NewReference());
2166 ++index; 2166 ++index;
2167 } 2167 }
2168 } 2168 }
2169 2169
2170 return S_OK; 2170 return S_OK;
2171 } 2171 }
2172 2172
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
2320 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_CHARACTER_EXTENTS); 2320 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_CHARACTER_EXTENTS);
2321 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER | 2321 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER |
2322 ACCESSIBILITY_MODE_FLAG_INLINE_TEXT_BOXES); 2322 ACCESSIBILITY_MODE_FLAG_INLINE_TEXT_BOXES);
2323 if (!instance_active()) 2323 if (!instance_active())
2324 return E_FAIL; 2324 return E_FAIL;
2325 2325
2326 if (!out_x || !out_y || !out_width || !out_height) 2326 if (!out_x || !out_y || !out_width || !out_height)
2327 return E_INVALIDARG; 2327 return E_INVALIDARG;
2328 2328
2329 const base::string16& text_str = GetText(); 2329 const base::string16& text_str = GetText();
2330 HandleSpecialTextOffset(text_str, &offset); 2330 HandleSpecialTextOffset(&offset);
2331
2332 if (offset < 0 || offset > static_cast<LONG>(text_str.size())) 2331 if (offset < 0 || offset > static_cast<LONG>(text_str.size()))
2333 return E_INVALIDARG; 2332 return E_INVALIDARG;
2334 2333
2335 gfx::Rect character_bounds; 2334 gfx::Rect character_bounds;
2336 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 2335 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) {
2337 character_bounds = GetScreenBoundsForRange(offset, 1); 2336 character_bounds = GetScreenBoundsForRange(offset, 1);
2338 } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 2337 } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) {
2339 character_bounds = GetPageBoundsForRange(offset, 1); 2338 character_bounds = GetPageBoundsForRange(offset, 1);
2340 if (GetParent()) 2339 if (GetParent())
2341 character_bounds -= GetParent()->GetPageBoundsRect().OffsetFromOrigin(); 2340 character_bounds -= GetParent()->GetPageBoundsRect().OffsetFromOrigin();
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2410 BSTR* text) { 2409 BSTR* text) {
2411 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_TEXT); 2410 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_TEXT);
2412 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER); 2411 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER);
2413 if (!instance_active()) 2412 if (!instance_active())
2414 return E_FAIL; 2413 return E_FAIL;
2415 2414
2416 if (!text) 2415 if (!text)
2417 return E_INVALIDARG; 2416 return E_INVALIDARG;
2418 2417
2419 const base::string16& text_str = GetText(); 2418 const base::string16& text_str = GetText();
2420 HandleSpecialTextOffset(text_str, &start_offset); 2419 HandleSpecialTextOffset(&start_offset);
2421 HandleSpecialTextOffset(text_str, &end_offset); 2420 HandleSpecialTextOffset(&end_offset);
2422 2421
2423 // The spec allows the arguments to be reversed. 2422 // The spec allows the arguments to be reversed.
2424 if (start_offset > end_offset) { 2423 if (start_offset > end_offset) {
2425 LONG tmp = start_offset; 2424 LONG tmp = start_offset;
2426 start_offset = end_offset; 2425 start_offset = end_offset;
2427 end_offset = tmp; 2426 end_offset = tmp;
2428 } 2427 }
2429 2428
2430 // The spec does not allow the start or end offsets to be out or range; 2429 // The spec does not allow the start or end offsets to be out or range;
2431 // we must return an error if so. 2430 // we must return an error if so.
(...skipping 23 matching lines...) Expand all
2455 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_TEXT_AT_OFFSET); 2454 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_TEXT_AT_OFFSET);
2456 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER | 2455 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER |
2457 ACCESSIBILITY_MODE_FLAG_INLINE_TEXT_BOXES); 2456 ACCESSIBILITY_MODE_FLAG_INLINE_TEXT_BOXES);
2458 if (!instance_active()) 2457 if (!instance_active())
2459 return E_FAIL; 2458 return E_FAIL;
2460 2459
2461 if (!start_offset || !end_offset || !text) 2460 if (!start_offset || !end_offset || !text)
2462 return E_INVALIDARG; 2461 return E_INVALIDARG;
2463 2462
2464 const base::string16& text_str = GetText(); 2463 const base::string16& text_str = GetText();
2465 HandleSpecialTextOffset(text_str, &offset); 2464 HandleSpecialTextOffset(&offset);
2466 if (offset < 0) 2465 if (offset < 0)
2467 return E_INVALIDARG; 2466 return E_INVALIDARG;
2468 2467
2469 LONG text_len = text_str.length(); 2468 LONG text_len = text_str.length();
2470 if (offset > text_len) 2469 if (offset > text_len)
2471 return E_INVALIDARG; 2470 return E_INVALIDARG;
2472 2471
2473 // The IAccessible2 spec says we don't have to implement the "sentence" 2472 // The IAccessible2 spec says we don't have to implement the "sentence"
2474 // boundary type, we can just let the screenreader handle it. 2473 // boundary type, we can just let the screenreader handle it.
2475 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 2474 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) {
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
2666 return scrollToPoint(coordinate_type, x, y); 2665 return scrollToPoint(coordinate_type, x, y);
2667 } 2666 }
2668 2667
2669 STDMETHODIMP BrowserAccessibilityWin::addSelection(LONG start_offset, 2668 STDMETHODIMP BrowserAccessibilityWin::addSelection(LONG start_offset,
2670 LONG end_offset) { 2669 LONG end_offset) {
2671 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ADD_SELECTION); 2670 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_ADD_SELECTION);
2672 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER); 2671 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER);
2673 if (!instance_active()) 2672 if (!instance_active())
2674 return E_FAIL; 2673 return E_FAIL;
2675 2674
2676 const base::string16& text_str = GetText(); 2675 // We only support one selection.
2677 HandleSpecialTextOffset(text_str, &start_offset); 2676 SetIA2HypertextSelection(start_offset, end_offset);
2678 HandleSpecialTextOffset(text_str, &end_offset);
2679
2680 manager()->SetTextSelection(*this, start_offset, end_offset);
2681 return S_OK; 2677 return S_OK;
2682 } 2678 }
2683 2679
2684 STDMETHODIMP BrowserAccessibilityWin::removeSelection(LONG selection_index) { 2680 STDMETHODIMP BrowserAccessibilityWin::removeSelection(LONG selection_index) {
2685 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_REMOVE_SELECTION); 2681 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_REMOVE_SELECTION);
2686 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER); 2682 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER);
2687 if (!instance_active()) 2683 if (!instance_active())
2688 return E_FAIL; 2684 return E_FAIL;
2689 2685
2690 if (selection_index != 0) 2686 if (selection_index != 0)
2691 return E_INVALIDARG; 2687 return E_INVALIDARG;
2692 2688
2693 manager()->SetTextSelection(*this, 0, 0); 2689 // Simply collapse the selection to the position of the caret if a caret is
2690 // visible, otherwise set the selection to 0.
2691 LONG caret_offset = 0;
2692 int selection_start, selection_end;
2693 GetSelectionOffsets(&selection_start, &selection_end);
2694 if (HasCaret() && selection_end >= 0)
2695 caret_offset = selection_end;
2696 SetIA2HypertextSelection(caret_offset, caret_offset);
2694 return S_OK; 2697 return S_OK;
2695 } 2698 }
2696 2699
2697 STDMETHODIMP BrowserAccessibilityWin::setCaretOffset(LONG offset) { 2700 STDMETHODIMP BrowserAccessibilityWin::setCaretOffset(LONG offset) {
2698 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_SET_CARET_OFFSET); 2701 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_SET_CARET_OFFSET);
2699 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER); 2702 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER);
2700 if (!instance_active()) 2703 if (!instance_active())
2701 return E_FAIL; 2704 return E_FAIL;
2702 2705 SetIA2HypertextSelection(offset, offset);
2703 const base::string16& text_str = GetText();
2704 HandleSpecialTextOffset(text_str, &offset);
2705 manager()->SetTextSelection(*this, offset, offset);
2706 return S_OK; 2706 return S_OK;
2707 } 2707 }
2708 2708
2709 STDMETHODIMP BrowserAccessibilityWin::setSelection(LONG selection_index, 2709 STDMETHODIMP BrowserAccessibilityWin::setSelection(LONG selection_index,
2710 LONG start_offset, 2710 LONG start_offset,
2711 LONG end_offset) { 2711 LONG end_offset) {
2712 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_SET_SELECTION); 2712 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_SET_SELECTION);
2713 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER); 2713 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER);
2714 if (!instance_active()) 2714 if (!instance_active())
2715 return E_FAIL; 2715 return E_FAIL;
2716
2717 if (selection_index != 0) 2716 if (selection_index != 0)
2718 return E_INVALIDARG; 2717 return E_INVALIDARG;
2719 2718 SetIA2HypertextSelection(start_offset, end_offset);
2720 const base::string16& text_str = GetText();
2721 HandleSpecialTextOffset(text_str, &start_offset);
2722 HandleSpecialTextOffset(text_str, &end_offset);
2723
2724 manager()->SetTextSelection(*this, start_offset, end_offset);
2725 return S_OK; 2719 return S_OK;
2726 } 2720 }
2727 2721
2728 STDMETHODIMP BrowserAccessibilityWin::get_attributes(LONG offset, 2722 STDMETHODIMP BrowserAccessibilityWin::get_attributes(LONG offset,
2729 LONG* start_offset, 2723 LONG* start_offset,
2730 LONG* end_offset, 2724 LONG* end_offset,
2731 BSTR* text_attributes) { 2725 BSTR* text_attributes) {
2732 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_IATEXT_GET_ATTRIBUTES); 2726 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_IATEXT_GET_ATTRIBUTES);
2733 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER); 2727 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER);
2734 if (!start_offset || !end_offset || !text_attributes) 2728 if (!start_offset || !end_offset || !text_attributes)
2735 return E_INVALIDARG; 2729 return E_INVALIDARG;
2736 2730
2737 *start_offset = *end_offset = 0; 2731 *start_offset = *end_offset = 0;
2738 *text_attributes = nullptr; 2732 *text_attributes = nullptr;
2739 if (!instance_active()) 2733 if (!instance_active())
2740 return E_FAIL; 2734 return E_FAIL;
2741 2735
2742 const base::string16& text = GetText(); 2736 const base::string16 text = GetText();
2743 HandleSpecialTextOffset(text, &offset); 2737 HandleSpecialTextOffset(&offset);
2744 if (offset < 0 || offset > static_cast<LONG>(text.size())) 2738 if (offset < 0 || offset > static_cast<LONG>(text.size()))
2745 return E_INVALIDARG; 2739 return E_INVALIDARG;
2746 2740
2747 ComputeStylesIfNeeded(); 2741 ComputeStylesIfNeeded();
2748 *start_offset = FindStartOfStyle(offset, ui::BACKWARDS_DIRECTION); 2742 *start_offset = FindStartOfStyle(offset, ui::BACKWARDS_DIRECTION);
2749 *end_offset = FindStartOfStyle(offset, ui::FORWARDS_DIRECTION); 2743 *end_offset = FindStartOfStyle(offset, ui::FORWARDS_DIRECTION);
2750 2744
2751 base::string16 attributes_str; 2745 base::string16 attributes_str;
2752 const std::vector<base::string16>& attributes = 2746 const std::vector<base::string16>& attributes =
2753 offset_to_text_attributes().find(*start_offset)->second; 2747 offset_to_text_attributes().find(*start_offset)->second;
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
2951 2945
2952 STDMETHODIMP BrowserAccessibilityWin::doAction(long action_index) { 2946 STDMETHODIMP BrowserAccessibilityWin::doAction(long action_index) {
2953 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_DO_ACTION); 2947 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_DO_ACTION);
2954 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER); 2948 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER);
2955 if (!instance_active()) 2949 if (!instance_active())
2956 return E_FAIL; 2950 return E_FAIL;
2957 2951
2958 if (!HasIntAttribute(ui::AX_ATTR_ACTION) || action_index != 0) 2952 if (!HasIntAttribute(ui::AX_ATTR_ACTION) || action_index != 0)
2959 return E_INVALIDARG; 2953 return E_INVALIDARG;
2960 2954
2961 manager()->DoDefaultAction(*this); 2955 manager_->DoDefaultAction(*this);
2962 return S_OK; 2956 return S_OK;
2963 } 2957 }
2964 2958
2965 STDMETHODIMP 2959 STDMETHODIMP
2966 BrowserAccessibilityWin::get_description(long action_index, BSTR* description) { 2960 BrowserAccessibilityWin::get_description(long action_index, BSTR* description) {
2967 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_IAACTION_GET_DESCRIPTION); 2961 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_IAACTION_GET_DESCRIPTION);
2968 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER); 2962 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER);
2969 return E_NOTIMPL; 2963 return E_NOTIMPL;
2970 } 2964 }
2971 2965
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
3113 // 3107 //
3114 3108
3115 STDMETHODIMP BrowserAccessibilityWin::get_URL(BSTR* url) { 3109 STDMETHODIMP BrowserAccessibilityWin::get_URL(BSTR* url) {
3116 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_URL); 3110 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_URL);
3117 if (!instance_active()) 3111 if (!instance_active())
3118 return E_FAIL; 3112 return E_FAIL;
3119 3113
3120 if (!url) 3114 if (!url)
3121 return E_INVALIDARG; 3115 return E_INVALIDARG;
3122 3116
3123 if (this != manager()->GetRoot()) 3117 if (this != manager_->GetRoot())
3124 return E_FAIL; 3118 return E_FAIL;
3125 3119
3126 std::string str = manager()->GetTreeData().url; 3120 std::string str = manager_->GetTreeData().url;
3127 if (str.empty()) 3121 if (str.empty())
3128 return S_FALSE; 3122 return S_FALSE;
3129 3123
3130 *url = SysAllocString(base::UTF8ToUTF16(str).c_str()); 3124 *url = SysAllocString(base::UTF8ToUTF16(str).c_str());
3131 DCHECK(*url); 3125 DCHECK(*url);
3132 3126
3133 return S_OK; 3127 return S_OK;
3134 } 3128 }
3135 3129
3136 STDMETHODIMP BrowserAccessibilityWin::get_title(BSTR* title) { 3130 STDMETHODIMP BrowserAccessibilityWin::get_title(BSTR* title) {
3137 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_TITLE); 3131 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_TITLE);
3138 if (!instance_active()) 3132 if (!instance_active())
3139 return E_FAIL; 3133 return E_FAIL;
3140 3134
3141 if (!title) 3135 if (!title)
3142 return E_INVALIDARG; 3136 return E_INVALIDARG;
3143 3137
3144 std::string str = manager()->GetTreeData().title; 3138 std::string str = manager_->GetTreeData().title;
3145 if (str.empty()) 3139 if (str.empty())
3146 return S_FALSE; 3140 return S_FALSE;
3147 3141
3148 *title = SysAllocString(base::UTF8ToUTF16(str).c_str()); 3142 *title = SysAllocString(base::UTF8ToUTF16(str).c_str());
3149 DCHECK(*title); 3143 DCHECK(*title);
3150 3144
3151 return S_OK; 3145 return S_OK;
3152 } 3146 }
3153 3147
3154 STDMETHODIMP BrowserAccessibilityWin::get_mimeType(BSTR* mime_type) { 3148 STDMETHODIMP BrowserAccessibilityWin::get_mimeType(BSTR* mime_type) {
3155 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_MIME_TYPE); 3149 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_MIME_TYPE);
3156 if (!instance_active()) 3150 if (!instance_active())
3157 return E_FAIL; 3151 return E_FAIL;
3158 3152
3159 if (!mime_type) 3153 if (!mime_type)
3160 return E_INVALIDARG; 3154 return E_INVALIDARG;
3161 3155
3162 std::string str = manager()->GetTreeData().mimetype; 3156 std::string str = manager_->GetTreeData().mimetype;
3163 if (str.empty()) 3157 if (str.empty())
3164 return S_FALSE; 3158 return S_FALSE;
3165 3159
3166 *mime_type = SysAllocString(base::UTF8ToUTF16(str).c_str()); 3160 *mime_type = SysAllocString(base::UTF8ToUTF16(str).c_str());
3167 DCHECK(*mime_type); 3161 DCHECK(*mime_type);
3168 3162
3169 return S_OK; 3163 return S_OK;
3170 } 3164 }
3171 3165
3172 STDMETHODIMP BrowserAccessibilityWin::get_docType(BSTR* doc_type) { 3166 STDMETHODIMP BrowserAccessibilityWin::get_docType(BSTR* doc_type) {
3173 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_DOC_TYPE); 3167 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_DOC_TYPE);
3174 if (!instance_active()) 3168 if (!instance_active())
3175 return E_FAIL; 3169 return E_FAIL;
3176 3170
3177 if (!doc_type) 3171 if (!doc_type)
3178 return E_INVALIDARG; 3172 return E_INVALIDARG;
3179 3173
3180 std::string str = manager()->GetTreeData().doctype; 3174 std::string str = manager_->GetTreeData().doctype;
3181 if (str.empty()) 3175 if (str.empty())
3182 return S_FALSE; 3176 return S_FALSE;
3183 3177
3184 *doc_type = SysAllocString(base::UTF8ToUTF16(str).c_str()); 3178 *doc_type = SysAllocString(base::UTF8ToUTF16(str).c_str());
3185 DCHECK(*doc_type); 3179 DCHECK(*doc_type);
3186 3180
3187 return S_OK; 3181 return S_OK;
3188 } 3182 }
3189 3183
3190 STDMETHODIMP 3184 STDMETHODIMP
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
3585 ACCESSIBILITY_MODE_FLAG_INLINE_TEXT_BOXES); 3579 ACCESSIBILITY_MODE_FLAG_INLINE_TEXT_BOXES);
3586 if (!instance_active()) 3580 if (!instance_active())
3587 return E_FAIL; 3581 return E_FAIL;
3588 3582
3589 unsigned int text_length = static_cast<unsigned int>(GetText().size()); 3583 unsigned int text_length = static_cast<unsigned int>(GetText().size());
3590 if (start_index > text_length || end_index > text_length || 3584 if (start_index > text_length || end_index > text_length ||
3591 start_index > end_index) { 3585 start_index > end_index) {
3592 return E_INVALIDARG; 3586 return E_INVALIDARG;
3593 } 3587 }
3594 3588
3595 manager()->ScrollToMakeVisible(*this, GetPageBoundsForRange( 3589 manager_->ScrollToMakeVisible(
3596 start_index, end_index - start_index)); 3590 *this, GetPageBoundsForRange(start_index, end_index - start_index));
3597 3591
3598 return S_OK; 3592 return S_OK;
3599 } 3593 }
3600 3594
3601 STDMETHODIMP BrowserAccessibilityWin::get_fontFamily(BSTR* font_family) { 3595 STDMETHODIMP BrowserAccessibilityWin::get_fontFamily(BSTR* font_family) {
3602 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_FONT_FAMILY); 3596 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_FONT_FAMILY);
3603 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER); 3597 AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER);
3604 if (!font_family) 3598 if (!font_family)
3605 return E_INVALIDARG; 3599 return E_INVALIDARG;
3606 *font_family = nullptr; 3600 *font_family = nullptr;
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
4005 } 3999 }
4006 4000
4007 win_attributes_->name = GetString16Attribute(ui::AX_ATTR_NAME); 4001 win_attributes_->name = GetString16Attribute(ui::AX_ATTR_NAME);
4008 win_attributes_->description = GetString16Attribute(ui::AX_ATTR_DESCRIPTION); 4002 win_attributes_->description = GetString16Attribute(ui::AX_ATTR_DESCRIPTION);
4009 StringAttributeToIA2(ui::AX_ATTR_PLACEHOLDER, "placeholder"); 4003 StringAttributeToIA2(ui::AX_ATTR_PLACEHOLDER, "placeholder");
4010 4004
4011 base::string16 value = GetValue(); 4005 base::string16 value = GetValue();
4012 // On Windows, the value of a document should be its url. 4006 // On Windows, the value of a document should be its url.
4013 if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA || 4007 if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA ||
4014 GetRole() == ui::AX_ROLE_WEB_AREA) { 4008 GetRole() == ui::AX_ROLE_WEB_AREA) {
4015 value = base::UTF8ToUTF16(manager()->GetTreeData().url); 4009 value = base::UTF8ToUTF16(manager_->GetTreeData().url);
4016 } 4010 }
4017 // If this doesn't have a value and is linked then set its value to the url 4011 // If this doesn't have a value and is linked then set its value to the url
4018 // attribute. This allows screen readers to read an empty link's destination. 4012 // attribute. This allows screen readers to read an empty link's destination.
4019 if (value.empty() && (ia_state() & STATE_SYSTEM_LINKED)) 4013 if (value.empty() && (ia_state() & STATE_SYSTEM_LINKED))
4020 value = GetString16Attribute(ui::AX_ATTR_URL); 4014 value = GetString16Attribute(ui::AX_ATTR_URL);
4021 win_attributes_->value = value; 4015 win_attributes_->value = value;
4022 4016
4023 ClearOwnRelations(); 4017 ClearOwnRelations();
4024 AddBidirectionalRelations(IA2_RELATION_CONTROLLER_FOR, 4018 AddBidirectionalRelations(IA2_RELATION_CONTROLLER_FOR,
4025 IA2_RELATION_CONTROLLED_BY, 4019 IA2_RELATION_CONTROLLED_BY,
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
4188 } 4182 }
4189 4183
4190 bool BrowserAccessibilityWin::IsNative() const { 4184 bool BrowserAccessibilityWin::IsNative() const {
4191 return true; 4185 return true;
4192 } 4186 }
4193 4187
4194 void BrowserAccessibilityWin::OnLocationChanged() { 4188 void BrowserAccessibilityWin::OnLocationChanged() {
4195 FireNativeEvent(EVENT_OBJECT_LOCATIONCHANGE); 4189 FireNativeEvent(EVENT_OBJECT_LOCATIONCHANGE);
4196 } 4190 }
4197 4191
4192 // |offset| could either be a text character or a child index in case of
4193 // non-text objects.
4194 BrowserAccessibilityWin::AXPlatformPositionInstance
dmazzoni 2017/02/14 20:17:58 can you make this shorter with the "using" keyword
4195 BrowserAccessibilityWin::CreatePositionAt(int offset) const {
4196 if (!IsTextOnlyObject()) {
4197 DCHECK(manager_);
4198 return AXPlatformPosition::CreateTreePosition(manager_->ax_tree_id(),
4199 GetId(), offset);
4200 }
4201 return BrowserAccessibility::CreatePositionAt(offset);
4202 }
4203
4198 std::vector<base::string16> BrowserAccessibilityWin::ComputeTextAttributes() 4204 std::vector<base::string16> BrowserAccessibilityWin::ComputeTextAttributes()
4199 const { 4205 const {
4200 std::vector<base::string16> attributes; 4206 std::vector<base::string16> attributes;
4201 4207
4202 // We include list markers for now, but there might be other objects that are 4208 // We include list markers for now, but there might be other objects that are
4203 // auto generated. 4209 // auto generated.
4204 // TODO(nektar): Compute what objects are auto-generated in Blink. 4210 // TODO(nektar): Compute what objects are auto-generated in Blink.
4205 if (GetRole() == ui::AX_ROLE_LIST_MARKER) 4211 if (GetRole() == ui::AX_ROLE_LIST_MARKER)
4206 attributes.push_back(L"auto-generated:true"); 4212 attributes.push_back(L"auto-generated:true");
4207 else 4213 else
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
4465 // According to the IA2 Spec, these characters need to be escaped with a 4471 // According to the IA2 Spec, these characters need to be escaped with a
4466 // backslash: backslash, colon, comma, equals and semicolon. 4472 // backslash: backslash, colon, comma, equals and semicolon.
4467 // Note that backslash must be replaced first. 4473 // Note that backslash must be replaced first.
4468 base::ReplaceChars(input, L"\\", L"\\\\", output); 4474 base::ReplaceChars(input, L"\\", L"\\\\", output);
4469 base::ReplaceChars(*output, L":", L"\\:", output); 4475 base::ReplaceChars(*output, L":", L"\\:", output);
4470 base::ReplaceChars(*output, L",", L"\\,", output); 4476 base::ReplaceChars(*output, L",", L"\\,", output);
4471 base::ReplaceChars(*output, L"=", L"\\=", output); 4477 base::ReplaceChars(*output, L"=", L"\\=", output);
4472 base::ReplaceChars(*output, L";", L"\\;", output); 4478 base::ReplaceChars(*output, L";", L"\\;", output);
4473 } 4479 }
4474 4480
4481 void BrowserAccessibilityWin::SetIA2HypertextSelection(LONG start_offset,
4482 LONG end_offset) {
4483 HandleSpecialTextOffset(&start_offset);
4484 HandleSpecialTextOffset(&end_offset);
4485 AXPlatformPositionInstance start_position =
4486 CreatePositionAt(static_cast<int>(start_offset));
4487 AXPlatformPositionInstance end_position =
4488 CreatePositionAt(static_cast<int>(end_offset));
4489 manager_->SetSelection(AXPlatformRange(start_position->AsLeafTextPosition(),
4490 end_position->AsLeafTextPosition()));
4491 }
4492
4475 void BrowserAccessibilityWin::StringAttributeToIA2( 4493 void BrowserAccessibilityWin::StringAttributeToIA2(
4476 ui::AXStringAttribute attribute, 4494 ui::AXStringAttribute attribute,
4477 const char* ia2_attr) { 4495 const char* ia2_attr) {
4478 base::string16 value; 4496 base::string16 value;
4479 if (GetString16Attribute(attribute, &value)) { 4497 if (GetString16Attribute(attribute, &value)) {
4480 SanitizeStringAttributeForIA2(value, &value); 4498 SanitizeStringAttributeForIA2(value, &value);
4481 win_attributes_->ia2_attributes.push_back( 4499 win_attributes_->ia2_attributes.push_back(
4482 base::ASCIIToUTF16(ia2_attr) + L":" + value); 4500 base::ASCIIToUTF16(ia2_attr) + L":" + value);
4483 } 4501 }
4484 } 4502 }
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
4671 if (endpoint_index_in_common_parent < index_in_common_parent) 4689 if (endpoint_index_in_common_parent < index_in_common_parent)
4672 return 0; 4690 return 0;
4673 if (endpoint_index_in_common_parent > index_in_common_parent) 4691 if (endpoint_index_in_common_parent > index_in_common_parent)
4674 return GetText().size(); 4692 return GetText().size();
4675 4693
4676 NOTREACHED(); 4694 NOTREACHED();
4677 return -1; 4695 return -1;
4678 } 4696 }
4679 4697
4680 int BrowserAccessibilityWin::GetSelectionAnchor() const { 4698 int BrowserAccessibilityWin::GetSelectionAnchor() const {
4681 int32_t anchor_id = manager()->GetTreeData().sel_anchor_object_id; 4699 int32_t anchor_id = manager_->GetTreeData().sel_anchor_object_id;
4682 const BrowserAccessibilityWin* anchor_object = GetFromID(anchor_id); 4700 const BrowserAccessibilityWin* anchor_object = GetFromID(anchor_id);
4683 if (!anchor_object) 4701 if (!anchor_object)
4684 return -1; 4702 return -1;
4685 4703
4686 int anchor_offset = manager()->GetTreeData().sel_anchor_offset; 4704 int anchor_offset = manager_->GetTreeData().sel_anchor_offset;
4687 return GetHypertextOffsetFromEndpoint(*anchor_object, anchor_offset); 4705 return GetHypertextOffsetFromEndpoint(*anchor_object, anchor_offset);
4688 } 4706 }
4689 4707
4690 int BrowserAccessibilityWin::GetSelectionFocus() const { 4708 int BrowserAccessibilityWin::GetSelectionFocus() const {
4691 int32_t focus_id = manager()->GetTreeData().sel_focus_object_id; 4709 int32_t focus_id = manager_->GetTreeData().sel_focus_object_id;
4692 const BrowserAccessibilityWin* focus_object = GetFromID(focus_id); 4710 const BrowserAccessibilityWin* focus_object = GetFromID(focus_id);
4693 if (!focus_object) 4711 if (!focus_object)
4694 return -1; 4712 return -1;
4695 4713
4696 int focus_offset = manager()->GetTreeData().sel_focus_offset; 4714 int focus_offset = manager_->GetTreeData().sel_focus_offset;
4697 return GetHypertextOffsetFromEndpoint(*focus_object, focus_offset); 4715 return GetHypertextOffsetFromEndpoint(*focus_object, focus_offset);
4698 } 4716 }
4699 4717
4700 void BrowserAccessibilityWin::GetSelectionOffsets( 4718 void BrowserAccessibilityWin::GetSelectionOffsets(
4701 int* selection_start, int* selection_end) const { 4719 int* selection_start, int* selection_end) const {
4702 DCHECK(selection_start && selection_end); 4720 DCHECK(selection_start && selection_end);
4703 4721
4704 if (IsSimpleTextControl() && 4722 if (IsSimpleTextControl() &&
4705 GetIntAttribute(ui::AX_ATTR_TEXT_SEL_START, selection_start) && 4723 GetIntAttribute(ui::AX_ATTR_TEXT_SEL_START, selection_start) &&
4706 GetIntAttribute(ui::AX_ATTR_TEXT_SEL_END, selection_end)) { 4724 GetIntAttribute(ui::AX_ATTR_TEXT_SEL_END, selection_end)) {
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
4823 old_text.size() - common_suffix - 1, 4841 old_text.size() - common_suffix - 1,
4824 new_text.size() - common_suffix - 1)) { 4842 new_text.size() - common_suffix - 1)) {
4825 ++common_suffix; 4843 ++common_suffix;
4826 } 4844 }
4827 4845
4828 *start = common_prefix; 4846 *start = common_prefix;
4829 *old_len = old_text.size() - common_prefix - common_suffix; 4847 *old_len = old_text.size() - common_prefix - common_suffix;
4830 *new_len = new_text.size() - common_prefix - common_suffix; 4848 *new_len = new_text.size() - common_prefix - common_suffix;
4831 } 4849 }
4832 4850
4833 void BrowserAccessibilityWin::HandleSpecialTextOffset( 4851 void BrowserAccessibilityWin::HandleSpecialTextOffset(LONG* offset) {
4834 const base::string16& text, 4852 if (*offset == IA2_TEXT_OFFSET_LENGTH) {
4835 LONG* offset) { 4853 *offset = static_cast<LONG>(GetText().length());
4836 if (*offset == IA2_TEXT_OFFSET_LENGTH) 4854 } else if (*offset == IA2_TEXT_OFFSET_CARET) {
4837 *offset = static_cast<LONG>(text.size()); 4855 // We shouldn't call |get_caretOffset| here as it affects UMA counts.
4838 else if (*offset == IA2_TEXT_OFFSET_CARET) 4856 int selection_start, selection_end;
4839 get_caretOffset(offset); 4857 GetSelectionOffsets(&selection_start, &selection_end);
4858 *offset = selection_end;
4859 }
4840 } 4860 }
4841 4861
4842 ui::TextBoundaryType BrowserAccessibilityWin::IA2TextBoundaryToTextBoundary( 4862 ui::TextBoundaryType BrowserAccessibilityWin::IA2TextBoundaryToTextBoundary(
4843 IA2TextBoundaryType ia2_boundary) { 4863 IA2TextBoundaryType ia2_boundary) {
4844 switch(ia2_boundary) { 4864 switch(ia2_boundary) {
4845 case IA2_TEXT_BOUNDARY_CHAR: 4865 case IA2_TEXT_BOUNDARY_CHAR:
4846 return ui::CHAR_BOUNDARY; 4866 return ui::CHAR_BOUNDARY;
4847 case IA2_TEXT_BOUNDARY_WORD: 4867 case IA2_TEXT_BOUNDARY_WORD:
4848 return ui::WORD_BOUNDARY; 4868 return ui::WORD_BOUNDARY;
4849 case IA2_TEXT_BOUNDARY_LINE: 4869 case IA2_TEXT_BOUNDARY_LINE:
4850 return ui::LINE_BOUNDARY; 4870 return ui::LINE_BOUNDARY;
4851 case IA2_TEXT_BOUNDARY_SENTENCE: 4871 case IA2_TEXT_BOUNDARY_SENTENCE:
4852 return ui::SENTENCE_BOUNDARY; 4872 return ui::SENTENCE_BOUNDARY;
4853 case IA2_TEXT_BOUNDARY_PARAGRAPH: 4873 case IA2_TEXT_BOUNDARY_PARAGRAPH:
4854 return ui::PARAGRAPH_BOUNDARY; 4874 return ui::PARAGRAPH_BOUNDARY;
4855 case IA2_TEXT_BOUNDARY_ALL: 4875 case IA2_TEXT_BOUNDARY_ALL:
4856 return ui::ALL_BOUNDARY; 4876 return ui::ALL_BOUNDARY;
4857 } 4877 }
4858 NOTREACHED(); 4878 NOTREACHED();
4859 return ui::CHAR_BOUNDARY; 4879 return ui::CHAR_BOUNDARY;
4860 } 4880 }
4861 4881
4862 LONG BrowserAccessibilityWin::FindBoundary( 4882 LONG BrowserAccessibilityWin::FindBoundary(
4863 const base::string16& text, 4883 const base::string16& text,
4864 IA2TextBoundaryType ia2_boundary, 4884 IA2TextBoundaryType ia2_boundary,
4865 LONG start_offset, 4885 LONG start_offset,
4866 ui::TextBoundaryDirection direction) { 4886 ui::TextBoundaryDirection direction) {
4867 // If the boundary is relative to the caret, use the selection 4887 // If the boundary is relative to the caret, use the selection
4868 // affinity, otherwise default to downstream affinity. 4888 // affinity, otherwise default to downstream affinity.
4869 ui::AXTextAffinity affinity = 4889 ui::AXTextAffinity affinity = start_offset == IA2_TEXT_OFFSET_CARET
4870 start_offset == IA2_TEXT_OFFSET_CARET ? 4890 ? manager_->GetTreeData().sel_focus_affinity
4871 manager()->GetTreeData().sel_focus_affinity : 4891 : ui::AX_TEXT_AFFINITY_DOWNSTREAM;
4872 ui::AX_TEXT_AFFINITY_DOWNSTREAM;
4873 4892
4874 HandleSpecialTextOffset(text, &start_offset); 4893 HandleSpecialTextOffset(&start_offset);
4875 if (ia2_boundary == IA2_TEXT_BOUNDARY_WORD) 4894 if (ia2_boundary == IA2_TEXT_BOUNDARY_WORD)
4876 return GetWordStartBoundary(static_cast<int>(start_offset), direction); 4895 return GetWordStartBoundary(static_cast<int>(start_offset), direction);
4877 if (ia2_boundary == IA2_TEXT_BOUNDARY_LINE) { 4896 if (ia2_boundary == IA2_TEXT_BOUNDARY_LINE) {
4878 return GetLineStartBoundary( 4897 return GetLineStartBoundary(
4879 static_cast<int>(start_offset), direction, affinity); 4898 static_cast<int>(start_offset), direction, affinity);
4880 } 4899 }
4881 4900
4882 ui::TextBoundaryType boundary = IA2TextBoundaryToTextBoundary(ia2_boundary); 4901 ui::TextBoundaryType boundary = IA2TextBoundaryToTextBoundary(ia2_boundary);
4883 return ui::FindAccessibleTextBoundary(text, GetLineStartOffsets(), boundary, 4902 return ui::FindAccessibleTextBoundary(text, GetLineStartOffsets(), boundary,
4884 start_offset, direction, affinity); 4903 start_offset, direction, affinity);
(...skipping 24 matching lines...) Expand all
4909 } 4928 }
4910 } 4929 }
4911 4930
4912 NOTREACHED(); 4931 NOTREACHED();
4913 return start_offset; 4932 return start_offset;
4914 } 4933 }
4915 4934
4916 BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromID(int32_t id) const { 4935 BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromID(int32_t id) const {
4917 if (!instance_active()) 4936 if (!instance_active())
4918 return nullptr; 4937 return nullptr;
4919 return ToBrowserAccessibilityWin(manager()->GetFromID(id)); 4938 return ToBrowserAccessibilityWin(manager_->GetFromID(id));
4920 } 4939 }
4921 4940
4922 bool BrowserAccessibilityWin::IsListBoxOptionOrMenuListOption() { 4941 bool BrowserAccessibilityWin::IsListBoxOptionOrMenuListOption() {
4923 if (!GetParent()) 4942 if (!GetParent())
4924 return false; 4943 return false;
4925 4944
4926 int32_t role = GetRole(); 4945 int32_t role = GetRole();
4927 int32_t parent_role = GetParent()->GetRole(); 4946 int32_t parent_role = GetParent()->GetRole();
4928 4947
4929 if (role == ui::AX_ROLE_LIST_BOX_OPTION && 4948 if (role == ui::AX_ROLE_LIST_BOX_OPTION &&
(...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after
5713 return static_cast<BrowserAccessibilityWin*>(obj); 5732 return static_cast<BrowserAccessibilityWin*>(obj);
5714 } 5733 }
5715 5734
5716 const BrowserAccessibilityWin* 5735 const BrowserAccessibilityWin*
5717 ToBrowserAccessibilityWin(const BrowserAccessibility* obj) { 5736 ToBrowserAccessibilityWin(const BrowserAccessibility* obj) {
5718 DCHECK(!obj || obj->IsNative()); 5737 DCHECK(!obj || obj->IsNative());
5719 return static_cast<const BrowserAccessibilityWin*>(obj); 5738 return static_cast<const BrowserAccessibilityWin*>(obj);
5720 } 5739 }
5721 5740
5722 } // namespace content 5741 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/accessibility/browser_accessibility_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698