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

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

Issue 1598583002: Fixed algorithms that compute bounding rectangles and word start offsets to take into account IA2 h… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 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
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 808 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 return S_FALSE; 819 return S_FALSE;
820 820
821 for (long i = 0; i < count; ++i) { 821 for (long i = 0; i < count; ++i) {
822 relations_[i]->AddRef(); 822 relations_[i]->AddRef();
823 relations[i] = relations_[i]; 823 relations[i] = relations_[i];
824 } 824 }
825 825
826 return S_OK; 826 return S_OK;
827 } 827 }
828 828
829 STDMETHODIMP BrowserAccessibilityWin::scrollTo(enum IA2ScrollType scroll_type) { 829 STDMETHODIMP BrowserAccessibilityWin::scrollTo(IA2ScrollType scroll_type) {
830 if (!instance_active()) 830 if (!instance_active())
831 return E_FAIL; 831 return E_FAIL;
832 832
833 gfx::Rect r = GetLocation(); 833 gfx::Rect r = GetLocation();
834 switch(scroll_type) { 834 switch(scroll_type) {
835 case IA2_SCROLL_TYPE_TOP_LEFT: 835 case IA2_SCROLL_TYPE_TOP_LEFT:
836 manager()->ScrollToMakeVisible(*this, gfx::Rect(r.x(), r.y(), 0, 0)); 836 manager()->ScrollToMakeVisible(*this, gfx::Rect(r.x(), r.y(), 0, 0));
837 break; 837 break;
838 case IA2_SCROLL_TYPE_BOTTOM_RIGHT: 838 case IA2_SCROLL_TYPE_BOTTOM_RIGHT:
839 manager()->ScrollToMakeVisible( 839 manager()->ScrollToMakeVisible(
(...skipping 20 matching lines...) Expand all
860 manager()->ScrollToMakeVisible(*this, r); 860 manager()->ScrollToMakeVisible(*this, r);
861 break; 861 break;
862 } 862 }
863 863
864 manager()->ToBrowserAccessibilityManagerWin()->TrackScrollingObject(this); 864 manager()->ToBrowserAccessibilityManagerWin()->TrackScrollingObject(this);
865 865
866 return S_OK; 866 return S_OK;
867 } 867 }
868 868
869 STDMETHODIMP BrowserAccessibilityWin::scrollToPoint( 869 STDMETHODIMP BrowserAccessibilityWin::scrollToPoint(
870 enum IA2CoordinateType coordinate_type, 870 IA2CoordinateType coordinate_type,
871 LONG x, 871 LONG x,
872 LONG y) { 872 LONG y) {
873 if (!instance_active()) 873 if (!instance_active())
874 return E_FAIL; 874 return E_FAIL;
875 875
876 gfx::Point scroll_to(x, y); 876 gfx::Point scroll_to(x, y);
877 877
878 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 878 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) {
879 scroll_to -= manager()->GetViewBounds().OffsetFromOrigin(); 879 scroll_to -= manager()->GetViewBounds().OffsetFromOrigin();
880 } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 880 } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
948 // global, and doesn't depend on any local state. 948 // global, and doesn't depend on any local state.
949 949
950 if (!app_name) 950 if (!app_name)
951 return E_INVALIDARG; 951 return E_INVALIDARG;
952 952
953 // GetProduct() returns a string like "Chrome/aa.bb.cc.dd", split out 953 // GetProduct() returns a string like "Chrome/aa.bb.cc.dd", split out
954 // the part before the "/". 954 // the part before the "/".
955 std::vector<std::string> product_components = base::SplitString( 955 std::vector<std::string> product_components = base::SplitString(
956 GetContentClient()->GetProduct(), "/", 956 GetContentClient()->GetProduct(), "/",
957 base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); 957 base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
958 DCHECK_EQ(2U, product_components.size()); 958 // DCHECK_EQ(2U, product_components.size());
dmazzoni 2016/01/20 01:10:43 Remove this? Where did this fail, can you fix it i
959 if (product_components.size() != 2) 959 if (product_components.size() != 2)
960 return E_FAIL; 960 return E_FAIL;
961 *app_name = SysAllocString(base::UTF8ToUTF16(product_components[0]).c_str()); 961 *app_name = SysAllocString(base::UTF8ToUTF16(product_components[0]).c_str());
962 DCHECK(*app_name); 962 DCHECK(*app_name);
963 return *app_name ? S_OK : E_FAIL; 963 return *app_name ? S_OK : E_FAIL;
964 } 964 }
965 965
966 STDMETHODIMP BrowserAccessibilityWin::get_appVersion(BSTR* app_version) { 966 STDMETHODIMP BrowserAccessibilityWin::get_appVersion(BSTR* app_version) {
967 // No need to check |instance_active()| because this interface is 967 // No need to check |instance_active()| because this interface is
968 // global, and doesn't depend on any local state. 968 // global, and doesn't depend on any local state.
969 969
970 if (!app_version) 970 if (!app_version)
971 return E_INVALIDARG; 971 return E_INVALIDARG;
972 972
973 // GetProduct() returns a string like "Chrome/aa.bb.cc.dd", split out 973 // GetProduct() returns a string like "Chrome/aa.bb.cc.dd", split out
974 // the part after the "/". 974 // the part after the "/".
975 std::vector<std::string> product_components = base::SplitString( 975 std::vector<std::string> product_components = base::SplitString(
976 GetContentClient()->GetProduct(), "/", 976 GetContentClient()->GetProduct(), "/",
977 base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); 977 base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
978 DCHECK_EQ(2U, product_components.size()); 978 // DCHECK_EQ(2U, product_components.size());
979 if (product_components.size() != 2) 979 if (product_components.size() != 2)
980 return E_FAIL; 980 return E_FAIL;
981 *app_version = 981 *app_version =
982 SysAllocString(base::UTF8ToUTF16(product_components[1]).c_str()); 982 SysAllocString(base::UTF8ToUTF16(product_components[1]).c_str());
983 DCHECK(*app_version); 983 DCHECK(*app_version);
984 return *app_version ? S_OK : E_FAIL; 984 return *app_version ? S_OK : E_FAIL;
985 } 985 }
986 986
987 STDMETHODIMP BrowserAccessibilityWin::get_toolkitName(BSTR* toolkit_name) { 987 STDMETHODIMP BrowserAccessibilityWin::get_toolkitName(BSTR* toolkit_name) {
988 // No need to check |instance_active()| because this interface is 988 // No need to check |instance_active()| because this interface is
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1027 if (description().empty()) 1027 if (description().empty())
1028 return S_FALSE; 1028 return S_FALSE;
1029 1029
1030 *desc = SysAllocString(description().c_str()); 1030 *desc = SysAllocString(description().c_str());
1031 1031
1032 DCHECK(*desc); 1032 DCHECK(*desc);
1033 return S_OK; 1033 return S_OK;
1034 } 1034 }
1035 1035
1036 STDMETHODIMP BrowserAccessibilityWin::get_imagePosition( 1036 STDMETHODIMP BrowserAccessibilityWin::get_imagePosition(
1037 enum IA2CoordinateType coordinate_type, 1037 IA2CoordinateType coordinate_type,
1038 LONG* x, 1038 LONG* x,
1039 LONG* y) { 1039 LONG* y) {
1040 if (!instance_active()) 1040 if (!instance_active())
1041 return E_FAIL; 1041 return E_FAIL;
1042 1042
1043 if (!x || !y) 1043 if (!x || !y)
1044 return E_INVALIDARG; 1044 return E_INVALIDARG;
1045 1045
1046 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 1046 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) {
1047 HWND parent_hwnd = 1047 HWND parent_hwnd =
(...skipping 923 matching lines...) Expand 10 before | Expand all | Expand 10 after
1971 // IAccessibleText methods. 1971 // IAccessibleText methods.
1972 // 1972 //
1973 1973
1974 STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) { 1974 STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) {
1975 if (!instance_active()) 1975 if (!instance_active())
1976 return E_FAIL; 1976 return E_FAIL;
1977 1977
1978 if (!n_characters) 1978 if (!n_characters)
1979 return E_INVALIDARG; 1979 return E_INVALIDARG;
1980 1980
1981 *n_characters = hypertext().length(); 1981 *n_characters = static_cast<LONG>(GetText().size());
1982 return S_OK; 1982 return S_OK;
1983 } 1983 }
1984 1984
1985 STDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) { 1985 STDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) {
1986 if (!instance_active()) 1986 if (!instance_active())
1987 return E_FAIL; 1987 return E_FAIL;
1988 1988
1989 if (!offset) 1989 if (!offset)
1990 return E_INVALIDARG; 1990 return E_INVALIDARG;
1991 1991
1992 if (!HasCaret()) 1992 if (!HasCaret())
1993 return S_FALSE; 1993 return S_FALSE;
1994 1994
1995 int selection_start, selection_end; 1995 int selection_start, selection_end;
1996 GetSelectionOffsets(&selection_start, &selection_end); 1996 GetSelectionOffsets(&selection_start, &selection_end);
1997 // The caret is always at the end of the selection. 1997 // The caret is always at the end of the selection.
1998 *offset = selection_end; 1998 *offset = selection_end;
1999 if (*offset < 0) 1999 if (*offset < 0)
2000 return S_FALSE; 2000 return S_FALSE;
2001 2001
2002 return S_OK; 2002 return S_OK;
2003 } 2003 }
2004 2004
2005 STDMETHODIMP BrowserAccessibilityWin::get_characterExtents( 2005 STDMETHODIMP BrowserAccessibilityWin::get_characterExtents(
2006 LONG offset, 2006 LONG offset,
2007 enum IA2CoordinateType coordinate_type, 2007 IA2CoordinateType coordinate_type,
2008 LONG* out_x, 2008 LONG* out_x,
2009 LONG* out_y, 2009 LONG* out_y,
2010 LONG* out_width, 2010 LONG* out_width,
2011 LONG* out_height) { 2011 LONG* out_height) {
2012 if (!instance_active()) 2012 if (!instance_active())
2013 return E_FAIL; 2013 return E_FAIL;
2014 2014
2015 if (!out_x || !out_y || !out_width || !out_height) 2015 if (!out_x || !out_y || !out_width || !out_height)
2016 return E_INVALIDARG; 2016 return E_INVALIDARG;
2017 2017
2018 const base::string16& text_str = hypertext(); 2018 const base::string16& text_str = GetText();
2019 HandleSpecialTextOffset(text_str, &offset); 2019 HandleSpecialTextOffset(text_str, &offset);
2020 2020
2021 if (offset < 0 || offset > static_cast<LONG>(text_str.size())) 2021 if (offset < 0 || offset > static_cast<LONG>(text_str.size()))
2022 return E_INVALIDARG; 2022 return E_INVALIDARG;
2023 2023
2024 gfx::Rect character_bounds; 2024 gfx::Rect character_bounds;
2025 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 2025 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) {
2026 character_bounds = GetGlobalBoundsForRange(offset, 1); 2026 character_bounds = GetGlobalBoundsForRange(offset, 1);
2027 } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 2027 } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) {
2028 character_bounds = GetLocalBoundsForRange(offset, 1); 2028 character_bounds = GetLocalBoundsForRange(offset, 1);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
2091 2091
2092 STDMETHODIMP BrowserAccessibilityWin::get_text(LONG start_offset, 2092 STDMETHODIMP BrowserAccessibilityWin::get_text(LONG start_offset,
2093 LONG end_offset, 2093 LONG end_offset,
2094 BSTR* text) { 2094 BSTR* text) {
2095 if (!instance_active()) 2095 if (!instance_active())
2096 return E_FAIL; 2096 return E_FAIL;
2097 2097
2098 if (!text) 2098 if (!text)
2099 return E_INVALIDARG; 2099 return E_INVALIDARG;
2100 2100
2101 const base::string16& text_str = hypertext(); 2101 const base::string16& text_str = GetText();
2102
2103 // Handle special text offsets.
2104 HandleSpecialTextOffset(text_str, &start_offset); 2102 HandleSpecialTextOffset(text_str, &start_offset);
2105 HandleSpecialTextOffset(text_str, &end_offset); 2103 HandleSpecialTextOffset(text_str, &end_offset);
2106 2104
2107 // The spec allows the arguments to be reversed. 2105 // The spec allows the arguments to be reversed.
2108 if (start_offset > end_offset) { 2106 if (start_offset > end_offset) {
2109 LONG tmp = start_offset; 2107 LONG tmp = start_offset;
2110 start_offset = end_offset; 2108 start_offset = end_offset;
2111 end_offset = tmp; 2109 end_offset = tmp;
2112 } 2110 }
2113 2111
(...skipping 11 matching lines...) Expand all
2125 if (substr.empty()) 2123 if (substr.empty())
2126 return S_FALSE; 2124 return S_FALSE;
2127 2125
2128 *text = SysAllocString(substr.c_str()); 2126 *text = SysAllocString(substr.c_str());
2129 DCHECK(*text); 2127 DCHECK(*text);
2130 return S_OK; 2128 return S_OK;
2131 } 2129 }
2132 2130
2133 STDMETHODIMP BrowserAccessibilityWin::get_textAtOffset( 2131 STDMETHODIMP BrowserAccessibilityWin::get_textAtOffset(
2134 LONG offset, 2132 LONG offset,
2135 enum IA2TextBoundaryType boundary_type, 2133 IA2TextBoundaryType boundary_type,
2136 LONG* start_offset, 2134 LONG* start_offset,
2137 LONG* end_offset, 2135 LONG* end_offset,
2138 BSTR* text) { 2136 BSTR* text) {
2139 if (!instance_active()) 2137 if (!instance_active())
2140 return E_FAIL; 2138 return E_FAIL;
2141 2139
2142 if (!start_offset || !end_offset || !text) 2140 if (!start_offset || !end_offset || !text)
2143 return E_INVALIDARG; 2141 return E_INVALIDARG;
2144 2142
2145 const base::string16& text_str = hypertext(); 2143 const base::string16& text_str = GetText();
2146 HandleSpecialTextOffset(text_str, &offset); 2144 HandleSpecialTextOffset(text_str, &offset);
2147 if (offset < 0) 2145 if (offset < 0)
2148 return E_INVALIDARG; 2146 return E_INVALIDARG;
2149 2147
2150 LONG text_len = text_str.length(); 2148 LONG text_len = text_str.length();
2151 if (offset > text_len) 2149 if (offset > text_len)
2152 return E_INVALIDARG; 2150 return E_INVALIDARG;
2153 2151
2154 // The IAccessible2 spec says we don't have to implement the "sentence" 2152 // The IAccessible2 spec says we don't have to implement the "sentence"
2155 // boundary type, we can just let the screenreader handle it. 2153 // boundary type, we can just let the screenreader handle it.
(...skipping 15 matching lines...) Expand all
2171 2169
2172 *start_offset = FindBoundary( 2170 *start_offset = FindBoundary(
2173 text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); 2171 text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION);
2174 *end_offset = FindBoundary( 2172 *end_offset = FindBoundary(
2175 text_str, boundary_type, offset, ui::FORWARDS_DIRECTION); 2173 text_str, boundary_type, offset, ui::FORWARDS_DIRECTION);
2176 return get_text(*start_offset, *end_offset, text); 2174 return get_text(*start_offset, *end_offset, text);
2177 } 2175 }
2178 2176
2179 STDMETHODIMP BrowserAccessibilityWin::get_textBeforeOffset( 2177 STDMETHODIMP BrowserAccessibilityWin::get_textBeforeOffset(
2180 LONG offset, 2178 LONG offset,
2181 enum IA2TextBoundaryType boundary_type, 2179 IA2TextBoundaryType boundary_type,
2182 LONG* start_offset, 2180 LONG* start_offset,
2183 LONG* end_offset, 2181 LONG* end_offset,
2184 BSTR* text) { 2182 BSTR* text) {
2185 if (!instance_active()) 2183 if (!instance_active())
2186 return E_FAIL; 2184 return E_FAIL;
2187 2185
2188 if (!start_offset || !end_offset || !text) 2186 if (!start_offset || !end_offset || !text)
2189 return E_INVALIDARG; 2187 return E_INVALIDARG;
2190 2188
2191 // The IAccessible2 spec says we don't have to implement the "sentence" 2189 // The IAccessible2 spec says we don't have to implement the "sentence"
2192 // boundary type, we can just let the screenreader handle it. 2190 // boundary type, we can just let the screenreader handle it.
2193 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 2191 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) {
2194 *start_offset = 0; 2192 *start_offset = 0;
2195 *end_offset = 0; 2193 *end_offset = 0;
2196 *text = NULL; 2194 *text = NULL;
2197 return S_FALSE; 2195 return S_FALSE;
2198 } 2196 }
2199 2197
2200 const base::string16& text_str = hypertext(); 2198 const base::string16& text_str = GetText();
2201 2199
2202 *start_offset = FindBoundary( 2200 *start_offset = FindBoundary(
2203 text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); 2201 text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION);
2204 *end_offset = offset; 2202 *end_offset = offset;
2205 return get_text(*start_offset, *end_offset, text); 2203 return get_text(*start_offset, *end_offset, text);
2206 } 2204 }
2207 2205
2208 STDMETHODIMP BrowserAccessibilityWin::get_textAfterOffset( 2206 STDMETHODIMP BrowserAccessibilityWin::get_textAfterOffset(
2209 LONG offset, 2207 LONG offset,
2210 enum IA2TextBoundaryType boundary_type, 2208 IA2TextBoundaryType boundary_type,
2211 LONG* start_offset, 2209 LONG* start_offset,
2212 LONG* end_offset, 2210 LONG* end_offset,
2213 BSTR* text) { 2211 BSTR* text) {
2214 if (!instance_active()) 2212 if (!instance_active())
2215 return E_FAIL; 2213 return E_FAIL;
2216 2214
2217 if (!start_offset || !end_offset || !text) 2215 if (!start_offset || !end_offset || !text)
2218 return E_INVALIDARG; 2216 return E_INVALIDARG;
2219 2217
2220 // The IAccessible2 spec says we don't have to implement the "sentence" 2218 // The IAccessible2 spec says we don't have to implement the "sentence"
2221 // boundary type, we can just let the screenreader handle it. 2219 // boundary type, we can just let the screenreader handle it.
2222 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 2220 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) {
2223 *start_offset = 0; 2221 *start_offset = 0;
2224 *end_offset = 0; 2222 *end_offset = 0;
2225 *text = NULL; 2223 *text = NULL;
2226 return S_FALSE; 2224 return S_FALSE;
2227 } 2225 }
2228 2226
2229 const base::string16& text_str = hypertext(); 2227 const base::string16& text_str = GetText();
2230 2228
2231 *start_offset = offset; 2229 *start_offset = offset;
2232 *end_offset = FindBoundary( 2230 *end_offset = FindBoundary(
2233 text_str, boundary_type, offset, ui::FORWARDS_DIRECTION); 2231 text_str, boundary_type, offset, ui::FORWARDS_DIRECTION);
2234 return get_text(*start_offset, *end_offset, text); 2232 return get_text(*start_offset, *end_offset, text);
2235 } 2233 }
2236 2234
2237 STDMETHODIMP BrowserAccessibilityWin::get_newText(IA2TextSegment* new_text) { 2235 STDMETHODIMP BrowserAccessibilityWin::get_newText(IA2TextSegment* new_text) {
2238 if (!instance_active()) 2236 if (!instance_active())
2239 return E_FAIL; 2237 return E_FAIL;
2240 2238
2241 if (!new_text) 2239 if (!new_text)
2242 return E_INVALIDARG; 2240 return E_INVALIDARG;
2243 2241
2244 if (!old_win_attributes_) 2242 if (!old_win_attributes_)
2245 return E_FAIL; 2243 return E_FAIL;
2246 2244
2247 int start, old_len, new_len; 2245 int start, old_len, new_len;
2248 ComputeHypertextRemovedAndInserted(&start, &old_len, &new_len); 2246 ComputeHypertextRemovedAndInserted(&start, &old_len, &new_len);
2249 if (new_len == 0) 2247 if (new_len == 0)
2250 return E_FAIL; 2248 return E_FAIL;
2251 2249
2252 base::string16 substr = hypertext().substr(start, new_len); 2250 base::string16 substr = GetText().substr(start, new_len);
2253 new_text->text = SysAllocString(substr.c_str()); 2251 new_text->text = SysAllocString(substr.c_str());
2254 new_text->start = static_cast<long>(start); 2252 new_text->start = static_cast<long>(start);
2255 new_text->end = static_cast<long>(start + new_len); 2253 new_text->end = static_cast<long>(start + new_len);
2256 return S_OK; 2254 return S_OK;
2257 } 2255 }
2258 2256
2259 STDMETHODIMP BrowserAccessibilityWin::get_oldText(IA2TextSegment* old_text) { 2257 STDMETHODIMP BrowserAccessibilityWin::get_oldText(IA2TextSegment* old_text) {
2260 if (!instance_active()) 2258 if (!instance_active())
2261 return E_FAIL; 2259 return E_FAIL;
2262 2260
(...skipping 12 matching lines...) Expand all
2275 base::string16 substr = old_hypertext.substr(start, old_len); 2273 base::string16 substr = old_hypertext.substr(start, old_len);
2276 old_text->text = SysAllocString(substr.c_str()); 2274 old_text->text = SysAllocString(substr.c_str());
2277 old_text->start = static_cast<long>(start); 2275 old_text->start = static_cast<long>(start);
2278 old_text->end = static_cast<long>(start + old_len); 2276 old_text->end = static_cast<long>(start + old_len);
2279 return S_OK; 2277 return S_OK;
2280 } 2278 }
2281 2279
2282 STDMETHODIMP BrowserAccessibilityWin::get_offsetAtPoint( 2280 STDMETHODIMP BrowserAccessibilityWin::get_offsetAtPoint(
2283 LONG x, 2281 LONG x,
2284 LONG y, 2282 LONG y,
2285 enum IA2CoordinateType coord_type, 2283 IA2CoordinateType coord_type,
2286 LONG* offset) { 2284 LONG* offset) {
2287 if (!instance_active()) 2285 if (!instance_active())
2288 return E_FAIL; 2286 return E_FAIL;
2289 2287
2290 if (!offset) 2288 if (!offset)
2291 return E_INVALIDARG; 2289 return E_INVALIDARG;
2292 2290
2293 // TODO(dmazzoni): implement this. We're returning S_OK for now so that 2291 // TODO(dmazzoni): implement this. We're returning S_OK for now so that
2294 // screen readers still return partially accurate results rather than 2292 // screen readers still return partially accurate results rather than
2295 // completely failing. 2293 // completely failing.
2296 *offset = 0; 2294 *offset = 0;
2297 return S_OK; 2295 return S_OK;
2298 } 2296 }
2299 2297
2300 STDMETHODIMP BrowserAccessibilityWin::scrollSubstringTo( 2298 STDMETHODIMP BrowserAccessibilityWin::scrollSubstringTo(
2301 LONG start_index, 2299 LONG start_index,
2302 LONG end_index, 2300 LONG end_index,
2303 enum IA2ScrollType scroll_type) { 2301 IA2ScrollType scroll_type) {
2304 // TODO(dmazzoni): adjust this for the start and end index, too. 2302 // TODO(dmazzoni): adjust this for the start and end index, too.
2305 return scrollTo(scroll_type); 2303 return scrollTo(scroll_type);
2306 } 2304 }
2307 2305
2308 STDMETHODIMP BrowserAccessibilityWin::scrollSubstringToPoint( 2306 STDMETHODIMP BrowserAccessibilityWin::scrollSubstringToPoint(
2309 LONG start_index, 2307 LONG start_index,
2310 LONG end_index, 2308 LONG end_index,
2311 enum IA2CoordinateType coordinate_type, 2309 IA2CoordinateType coordinate_type,
2312 LONG x, LONG y) { 2310 LONG x,
2311 LONG y) {
2313 // TODO(dmazzoni): adjust this for the start and end index, too. 2312 // TODO(dmazzoni): adjust this for the start and end index, too.
2314 return scrollToPoint(coordinate_type, x, y); 2313 return scrollToPoint(coordinate_type, x, y);
2315 } 2314 }
2316 2315
2317 STDMETHODIMP BrowserAccessibilityWin::addSelection(LONG start_offset, 2316 STDMETHODIMP BrowserAccessibilityWin::addSelection(LONG start_offset,
2318 LONG end_offset) { 2317 LONG end_offset) {
2319 if (!instance_active()) 2318 if (!instance_active())
2320 return E_FAIL; 2319 return E_FAIL;
2321 2320
2322 const base::string16& text_str = hypertext(); 2321 const base::string16& text_str = GetText();
2323 HandleSpecialTextOffset(text_str, &start_offset); 2322 HandleSpecialTextOffset(text_str, &start_offset);
2324 HandleSpecialTextOffset(text_str, &end_offset); 2323 HandleSpecialTextOffset(text_str, &end_offset);
2325 2324
2326 manager()->SetTextSelection(*this, start_offset, end_offset); 2325 manager()->SetTextSelection(*this, start_offset, end_offset);
2327 return S_OK; 2326 return S_OK;
2328 } 2327 }
2329 2328
2330 STDMETHODIMP BrowserAccessibilityWin::removeSelection(LONG selection_index) { 2329 STDMETHODIMP BrowserAccessibilityWin::removeSelection(LONG selection_index) {
2331 if (!instance_active()) 2330 if (!instance_active())
2332 return E_FAIL; 2331 return E_FAIL;
2333 2332
2334 if (selection_index != 0) 2333 if (selection_index != 0)
2335 return E_INVALIDARG; 2334 return E_INVALIDARG;
2336 2335
2337 manager()->SetTextSelection(*this, 0, 0); 2336 manager()->SetTextSelection(*this, 0, 0);
2338 return S_OK; 2337 return S_OK;
2339 } 2338 }
2340 2339
2341 STDMETHODIMP BrowserAccessibilityWin::setCaretOffset(LONG offset) { 2340 STDMETHODIMP BrowserAccessibilityWin::setCaretOffset(LONG offset) {
2342 if (!instance_active()) 2341 if (!instance_active())
2343 return E_FAIL; 2342 return E_FAIL;
2344 2343
2345 const base::string16& text_str = hypertext(); 2344 const base::string16& text_str = GetText();
2346 HandleSpecialTextOffset(text_str, &offset); 2345 HandleSpecialTextOffset(text_str, &offset);
2347 manager()->SetTextSelection(*this, offset, offset); 2346 manager()->SetTextSelection(*this, offset, offset);
2348 return S_OK; 2347 return S_OK;
2349 } 2348 }
2350 2349
2351 STDMETHODIMP BrowserAccessibilityWin::setSelection(LONG selection_index, 2350 STDMETHODIMP BrowserAccessibilityWin::setSelection(LONG selection_index,
2352 LONG start_offset, 2351 LONG start_offset,
2353 LONG end_offset) { 2352 LONG end_offset) {
2354 if (!instance_active()) 2353 if (!instance_active())
2355 return E_FAIL; 2354 return E_FAIL;
2356 2355
2357 if (selection_index != 0) 2356 if (selection_index != 0)
2358 return E_INVALIDARG; 2357 return E_INVALIDARG;
2359 2358
2360 const base::string16& text_str = hypertext(); 2359 const base::string16& text_str = GetText();
2361 HandleSpecialTextOffset(text_str, &start_offset); 2360 HandleSpecialTextOffset(text_str, &start_offset);
2362 HandleSpecialTextOffset(text_str, &end_offset); 2361 HandleSpecialTextOffset(text_str, &end_offset);
2363 2362
2364 manager()->SetTextSelection(*this, start_offset, end_offset); 2363 manager()->SetTextSelection(*this, start_offset, end_offset);
2365 return S_OK; 2364 return S_OK;
2366 } 2365 }
2367 2366
2368 // 2367 //
2369 // IAccessibleText methods not implemented. 2368 // IAccessibleText methods not implemented.
2370 // 2369 //
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2416 2415
2417 STDMETHODIMP BrowserAccessibilityWin::get_hyperlinkIndex( 2416 STDMETHODIMP BrowserAccessibilityWin::get_hyperlinkIndex(
2418 long char_index, 2417 long char_index,
2419 long* hyperlink_index) { 2418 long* hyperlink_index) {
2420 if (!instance_active()) 2419 if (!instance_active())
2421 return E_FAIL; 2420 return E_FAIL;
2422 2421
2423 if (!hyperlink_index) 2422 if (!hyperlink_index)
2424 return E_INVALIDARG; 2423 return E_INVALIDARG;
2425 2424
2426 if (char_index < 0 || 2425 if (char_index < 0 || char_index >= static_cast<long>(GetText().size())) {
2427 char_index >= static_cast<long>(hypertext().size())) {
2428 return E_INVALIDARG; 2426 return E_INVALIDARG;
2429 } 2427 }
2430 2428
2431 std::map<int32_t, int32_t>::iterator it = 2429 std::map<int32_t, int32_t>::iterator it =
2432 hyperlink_offset_to_index().find(char_index); 2430 hyperlink_offset_to_index().find(char_index);
2433 if (it == hyperlink_offset_to_index().end()) { 2431 if (it == hyperlink_offset_to_index().end()) {
2434 *hyperlink_index = -1; 2432 *hyperlink_index = -1;
2435 return S_FALSE; 2433 return S_FALSE;
2436 } 2434 }
2437 2435
2438 *hyperlink_index = it->second; 2436 *hyperlink_index = it->second;
2439 return S_OK; 2437 return S_OK;
2440 } 2438 }
2441 2439
2442 // 2440 //
2443 // IAccessibleHyperlink methods. 2441 // IAccessibleHyperlink methods.
2444 // 2442 //
2445 2443
2446 // Currently, only text links are supported. 2444 // Currently, only text links are supported.
2447 STDMETHODIMP BrowserAccessibilityWin::get_anchor(long index, VARIANT* anchor) { 2445 STDMETHODIMP BrowserAccessibilityWin::get_anchor(long index, VARIANT* anchor) {
2448 if (!instance_active() || !IsHyperlink()) 2446 if (!instance_active() || !IsHyperlink())
2449 return E_FAIL; 2447 return E_FAIL;
2450 2448
2451 // IA2 text links can have only one anchor, that is the text inside them. 2449 // IA2 text links can have only one anchor, that is the text inside them.
2452 if (index != 0 || !anchor) 2450 if (index != 0 || !anchor)
2453 return E_INVALIDARG; 2451 return E_INVALIDARG;
2454 2452
2455 BSTR ia2_hypertext = SysAllocString(hypertext().c_str()); 2453 BSTR ia2_hypertext = SysAllocString(GetText().c_str());
2456 DCHECK(ia2_hypertext); 2454 DCHECK(ia2_hypertext);
2457 anchor->vt = VT_BSTR; 2455 anchor->vt = VT_BSTR;
2458 anchor->bstrVal = ia2_hypertext; 2456 anchor->bstrVal = ia2_hypertext;
2459 2457
2460 // Returning S_FALSE is not mentioned in the IA2 Spec, but it might have been 2458 // Returning S_FALSE is not mentioned in the IA2 Spec, but it might have been
2461 // an oversight. 2459 // an oversight.
2462 if (!SysStringLen(ia2_hypertext)) 2460 if (!SysStringLen(ia2_hypertext))
2463 return S_FALSE; 2461 return S_FALSE;
2464 2462
2465 return S_OK; 2463 return S_OK;
(...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after
3027 int* out_x, 3025 int* out_x,
3028 int* out_y, 3026 int* out_y,
3029 int* out_width, 3027 int* out_width,
3030 int* out_height) { 3028 int* out_height) {
3031 if (!instance_active()) 3029 if (!instance_active())
3032 return E_FAIL; 3030 return E_FAIL;
3033 3031
3034 if (!out_x || !out_y || !out_width || !out_height) 3032 if (!out_x || !out_y || !out_width || !out_height)
3035 return E_INVALIDARG; 3033 return E_INVALIDARG;
3036 3034
3037 const base::string16& text_str = hypertext(); 3035 unsigned int text_length = static_cast<unsigned int>(GetText().size());
3038 if (start_index > text_str.size() || 3036 if (start_index > text_length || end_index > text_length ||
3039 end_index > text_str.size() ||
3040 start_index > end_index) { 3037 start_index > end_index) {
3041 return E_INVALIDARG; 3038 return E_INVALIDARG;
3042 } 3039 }
3043 3040
3044 gfx::Rect bounds = GetGlobalBoundsForRange( 3041 gfx::Rect bounds = GetGlobalBoundsForRange(
3045 start_index, end_index - start_index); 3042 start_index, end_index - start_index);
3046 *out_x = bounds.x(); 3043 *out_x = bounds.x();
3047 *out_y = bounds.y(); 3044 *out_y = bounds.y();
3048 *out_width = bounds.width(); 3045 *out_width = bounds.width();
3049 *out_height = bounds.height(); 3046 *out_height = bounds.height();
3050 return S_OK; 3047 return S_OK;
3051 } 3048 }
3052 3049
3053 STDMETHODIMP BrowserAccessibilityWin::scrollToSubstring( 3050 STDMETHODIMP BrowserAccessibilityWin::scrollToSubstring(
3054 unsigned int start_index, 3051 unsigned int start_index,
3055 unsigned int end_index) { 3052 unsigned int end_index) {
3056 if (!instance_active()) 3053 if (!instance_active())
3057 return E_FAIL; 3054 return E_FAIL;
3058 3055
3059 const base::string16& text_str = hypertext(); 3056 unsigned int text_length = static_cast<unsigned int>(GetText().size());
3060 if (start_index > text_str.size() || 3057 if (start_index > text_length || end_index > text_length ||
3061 end_index > text_str.size() ||
3062 start_index > end_index) { 3058 start_index > end_index) {
3063 return E_INVALIDARG; 3059 return E_INVALIDARG;
3064 } 3060 }
3065 3061
3066 manager()->ScrollToMakeVisible(*this, GetLocalBoundsForRange( 3062 manager()->ScrollToMakeVisible(*this, GetLocalBoundsForRange(
3067 start_index, end_index - start_index)); 3063 start_index, end_index - start_index));
3068 manager()->ToBrowserAccessibilityManagerWin()->TrackScrollingObject(this); 3064 manager()->ToBrowserAccessibilityManagerWin()->TrackScrollingObject(this);
3069 3065
3070 return S_OK; 3066 return S_OK;
3071 } 3067 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
3154 return E_NOTIMPL; 3150 return E_NOTIMPL;
3155 } 3151 }
3156 3152
3157 STDMETHODIMP BrowserAccessibilityWin::GetPatternProvider(PATTERNID id, 3153 STDMETHODIMP BrowserAccessibilityWin::GetPatternProvider(PATTERNID id,
3158 IUnknown** provider) { 3154 IUnknown** provider) {
3159 DVLOG(1) << "In Function: " 3155 DVLOG(1) << "In Function: "
3160 << __FUNCTION__ 3156 << __FUNCTION__
3161 << " for pattern id: " 3157 << " for pattern id: "
3162 << id; 3158 << id;
3163 if (id == UIA_ValuePatternId || id == UIA_TextPatternId) { 3159 if (id == UIA_ValuePatternId || id == UIA_TextPatternId) {
3164 if (IsEditableText()) { 3160 if (HasState(ui::AX_STATE_EDITABLE)) {
3165 DVLOG(1) << "Returning UIA text provider"; 3161 DVLOG(1) << "Returning UIA text provider";
3166 base::win::UIATextProvider::CreateTextProvider( 3162 base::win::UIATextProvider::CreateTextProvider(
3167 GetValueText(), true, provider); 3163 GetValueText(), true, provider);
3168 return S_OK; 3164 return S_OK;
3169 } 3165 }
3170 } 3166 }
3171 return E_NOTIMPL; 3167 return E_NOTIMPL;
3172 } 3168 }
3173 3169
3174 STDMETHODIMP BrowserAccessibilityWin::GetPropertyValue(PROPERTYID id, 3170 STDMETHODIMP BrowserAccessibilityWin::GetPropertyValue(PROPERTYID id,
3175 VARIANT* ret) { 3171 VARIANT* ret) {
3176 DVLOG(1) << "In Function: " 3172 DVLOG(1) << "In Function: "
3177 << __FUNCTION__ 3173 << __FUNCTION__
3178 << " for property id: " 3174 << " for property id: "
3179 << id; 3175 << id;
3180 V_VT(ret) = VT_EMPTY; 3176 V_VT(ret) = VT_EMPTY;
3181 if (id == UIA_ControlTypePropertyId) { 3177 if (id == UIA_ControlTypePropertyId) {
3182 if (IsEditableText()) { 3178 if (HasState(ui::AX_STATE_EDITABLE)) {
3183 V_VT(ret) = VT_I4; 3179 V_VT(ret) = VT_I4;
3184 ret->lVal = UIA_EditControlTypeId; 3180 ret->lVal = UIA_EditControlTypeId;
3185 DVLOG(1) << "Returning Edit control type"; 3181 DVLOG(1) << "Returning Edit control type";
3186 } else { 3182 } else {
3187 DVLOG(1) << "Returning empty control type"; 3183 DVLOG(1) << "Returning empty control type";
3188 } 3184 }
3189 } 3185 }
3190 return S_OK; 3186 return S_OK;
3191 } 3187 }
3192 3188
3193 STDMETHODIMP BrowserAccessibilityWin::get_ProviderOptions( 3189 STDMETHODIMP BrowserAccessibilityWin::get_ProviderOptions(
3194 enum ProviderOptions* ret) { 3190 ProviderOptions* ret) {
3195 return E_NOTIMPL; 3191 return E_NOTIMPL;
3196 } 3192 }
3197 3193
3198 STDMETHODIMP BrowserAccessibilityWin::get_HostRawElementProvider( 3194 STDMETHODIMP BrowserAccessibilityWin::get_HostRawElementProvider(
3199 IRawElementProviderSimple** provider) { 3195 IRawElementProviderSimple** provider) {
3200 return E_NOTIMPL; 3196 return E_NOTIMPL;
3201 } 3197 }
3202 3198
3203 // 3199 //
3204 // CComObjectRootEx methods. 3200 // CComObjectRootEx methods.
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
3439 // the character index of each embedded object character to the id of the 3435 // the character index of each embedded object character to the id of the
3440 // child object it points to. 3436 // child object it points to.
3441 for (unsigned int i = 0; i < PlatformChildCount(); ++i) { 3437 for (unsigned int i = 0; i < PlatformChildCount(); ++i) {
3442 BrowserAccessibilityWin* child = 3438 BrowserAccessibilityWin* child =
3443 PlatformGetChild(i)->ToBrowserAccessibilityWin(); 3439 PlatformGetChild(i)->ToBrowserAccessibilityWin();
3444 DCHECK(child); 3440 DCHECK(child);
3445 // Similar to Firefox, we don't expose text-only objects in IA2 hypertext. 3441 // Similar to Firefox, we don't expose text-only objects in IA2 hypertext.
3446 if (child->IsTextOnlyObject()) { 3442 if (child->IsTextOnlyObject()) {
3447 win_attributes_->hypertext += child->name(); 3443 win_attributes_->hypertext += child->name();
3448 } else { 3444 } else {
3449 int32_t char_offset = hypertext().size(); 3445 int32_t char_offset = static_cast<int32_t>(GetText().size());
3450 int32_t child_id = child->GetId(); 3446 int32_t child_id = child->GetId();
3451 int32_t index = hyperlinks().size(); 3447 int32_t index = hyperlinks().size();
3452 win_attributes_->hyperlink_offset_to_index[char_offset] = index; 3448 win_attributes_->hyperlink_offset_to_index[char_offset] = index;
3453 win_attributes_->hyperlinks.push_back(child_id); 3449 win_attributes_->hyperlinks.push_back(child_id);
3454 win_attributes_->hypertext += kEmbeddedCharacter; 3450 win_attributes_->hypertext += kEmbeddedCharacter;
3455 } 3451 }
3456 } 3452 }
3457 } 3453 }
3458 3454
3459 void BrowserAccessibilityWin::UpdateStep3FireEvents(bool is_subtree_creation) { 3455 void BrowserAccessibilityWin::UpdateStep3FireEvents(bool is_subtree_creation) {
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
3712 if (child.IsTextOnlyObject()) { 3708 if (child.IsTextOnlyObject()) {
3713 int32_t hypertextOffset = 0; 3709 int32_t hypertextOffset = 0;
3714 int32_t index_in_parent = child.GetIndexInParent(); 3710 int32_t index_in_parent = child.GetIndexInParent();
3715 DCHECK_GE(index_in_parent, 0); 3711 DCHECK_GE(index_in_parent, 0);
3716 DCHECK_LT(index_in_parent, static_cast<int32_t>(InternalChildCount())); 3712 DCHECK_LT(index_in_parent, static_cast<int32_t>(InternalChildCount()));
3717 for (uint32_t i = 0; i < static_cast<uint32_t>(index_in_parent); ++i) { 3713 for (uint32_t i = 0; i < static_cast<uint32_t>(index_in_parent); ++i) {
3718 const BrowserAccessibilityWin* sibling = 3714 const BrowserAccessibilityWin* sibling =
3719 InternalGetChild(i)->ToBrowserAccessibilityWin(); 3715 InternalGetChild(i)->ToBrowserAccessibilityWin();
3720 DCHECK(sibling); 3716 DCHECK(sibling);
3721 if (sibling->IsTextOnlyObject()) 3717 if (sibling->IsTextOnlyObject())
3722 hypertextOffset += sibling->hypertext().length(); 3718 hypertextOffset += sibling->GetText().size();
3723 else 3719 else
3724 ++hypertextOffset; 3720 ++hypertextOffset;
3725 } 3721 }
3726 return hypertextOffset; 3722 return hypertextOffset;
3727 } 3723 }
3728 3724
3729 int32_t hyperlink_index = GetHyperlinkIndexFromChild(child); 3725 int32_t hyperlink_index = GetHyperlinkIndexFromChild(child);
3730 if (hyperlink_index < 0) 3726 if (hyperlink_index < 0)
3731 return -1; 3727 return -1;
3732 3728
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
3805 if (endpoint_object.IsDescendantOf(child)) { 3801 if (endpoint_object.IsDescendantOf(child)) {
3806 endpoint_index_in_common_parent = child->GetIndexInParent(); 3802 endpoint_index_in_common_parent = child->GetIndexInParent();
3807 break; 3803 break;
3808 } 3804 }
3809 } 3805 }
3810 DCHECK_GE(endpoint_index_in_common_parent, 0); 3806 DCHECK_GE(endpoint_index_in_common_parent, 0);
3811 3807
3812 if (endpoint_index_in_common_parent < index_in_common_parent) 3808 if (endpoint_index_in_common_parent < index_in_common_parent)
3813 return 0; 3809 return 0;
3814 if (endpoint_index_in_common_parent > index_in_common_parent) 3810 if (endpoint_index_in_common_parent > index_in_common_parent)
3815 return hypertext().length(); 3811 return GetText().size();
3816 3812
3817 NOTREACHED(); 3813 NOTREACHED();
3818 return -1; 3814 return -1;
3819 } 3815 }
3820 3816
3821 int BrowserAccessibilityWin::GetSelectionAnchor() const { 3817 int BrowserAccessibilityWin::GetSelectionAnchor() const {
3822 int32_t anchor_id = manager()->GetTreeData().sel_anchor_object_id; 3818 int32_t anchor_id = manager()->GetTreeData().sel_anchor_object_id;
3823 const auto anchor_object = 3819 const auto anchor_object =
3824 manager()->GetFromID(anchor_id)->ToBrowserAccessibilityWin(); 3820 manager()->GetFromID(anchor_id)->ToBrowserAccessibilityWin();
3825 if (!anchor_object) 3821 if (!anchor_object)
(...skipping 11 matching lines...) Expand all
3837 return -1; 3833 return -1;
3838 3834
3839 int focus_offset = manager()->GetTreeData().sel_focus_offset; 3835 int focus_offset = manager()->GetTreeData().sel_focus_offset;
3840 return GetHypertextOffsetFromEndpoint(*focus_object, focus_offset); 3836 return GetHypertextOffsetFromEndpoint(*focus_object, focus_offset);
3841 } 3837 }
3842 3838
3843 void BrowserAccessibilityWin::GetSelectionOffsets( 3839 void BrowserAccessibilityWin::GetSelectionOffsets(
3844 int* selection_start, int* selection_end) const { 3840 int* selection_start, int* selection_end) const {
3845 DCHECK(selection_start && selection_end); 3841 DCHECK(selection_start && selection_end);
3846 3842
3847 if (IsEditableText() && !HasState(ui::AX_STATE_RICHLY_EDITABLE) && 3843 if (HasState(ui::AX_STATE_EDITABLE) &&
3844 !HasState(ui::AX_STATE_RICHLY_EDITABLE) &&
3848 GetIntAttribute(ui::AX_ATTR_TEXT_SEL_START, selection_start) && 3845 GetIntAttribute(ui::AX_ATTR_TEXT_SEL_START, selection_start) &&
3849 GetIntAttribute(ui::AX_ATTR_TEXT_SEL_END, selection_end)) { 3846 GetIntAttribute(ui::AX_ATTR_TEXT_SEL_END, selection_end)) {
3850 return; 3847 return;
3851 } 3848 }
3852 3849
3853 *selection_start = GetSelectionAnchor(); 3850 *selection_start = GetSelectionAnchor();
3854 *selection_end = GetSelectionFocus(); 3851 *selection_end = GetSelectionFocus();
3855 if (*selection_start < 0 || *selection_end < 0) 3852 if (*selection_start < 0 || *selection_end < 0)
3856 return; 3853 return;
3857 3854
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
3952 3949
3953 void BrowserAccessibilityWin::ComputeHypertextRemovedAndInserted( 3950 void BrowserAccessibilityWin::ComputeHypertextRemovedAndInserted(
3954 int* start, int* old_len, int* new_len) { 3951 int* start, int* old_len, int* new_len) {
3955 CHECK(old_win_attributes_); 3952 CHECK(old_win_attributes_);
3956 3953
3957 *start = 0; 3954 *start = 0;
3958 *old_len = 0; 3955 *old_len = 0;
3959 *new_len = 0; 3956 *new_len = 0;
3960 3957
3961 const base::string16& old_text = old_win_attributes_->hypertext; 3958 const base::string16& old_text = old_win_attributes_->hypertext;
3962 const base::string16& new_text = hypertext(); 3959 const base::string16& new_text = GetText();
3963 3960
3964 size_t common_prefix = 0; 3961 size_t common_prefix = 0;
3965 while (common_prefix < old_text.size() && 3962 while (common_prefix < old_text.size() &&
3966 common_prefix < new_text.size() && 3963 common_prefix < new_text.size() &&
3967 IsSameHypertextCharacter(common_prefix, common_prefix)) { 3964 IsSameHypertextCharacter(common_prefix, common_prefix)) {
3968 ++common_prefix; 3965 ++common_prefix;
3969 } 3966 }
3970 3967
3971 size_t common_suffix = 0; 3968 size_t common_suffix = 0;
3972 while (common_prefix + common_suffix < old_text.size() && 3969 while (common_prefix + common_suffix < old_text.size() &&
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
4011 } 4008 }
4012 return ui::CHAR_BOUNDARY; 4009 return ui::CHAR_BOUNDARY;
4013 } 4010 }
4014 4011
4015 LONG BrowserAccessibilityWin::FindBoundary( 4012 LONG BrowserAccessibilityWin::FindBoundary(
4016 const base::string16& text, 4013 const base::string16& text,
4017 IA2TextBoundaryType ia2_boundary, 4014 IA2TextBoundaryType ia2_boundary,
4018 LONG start_offset, 4015 LONG start_offset,
4019 ui::TextBoundaryDirection direction) { 4016 ui::TextBoundaryDirection direction) {
4020 HandleSpecialTextOffset(text, &start_offset); 4017 HandleSpecialTextOffset(text, &start_offset);
4021 if (ia2_boundary == IA2_TEXT_BOUNDARY_WORD && IsSimpleTextControl()) 4018 if (ia2_boundary == IA2_TEXT_BOUNDARY_WORD)
4022 return GetWordStartBoundary(static_cast<int>(start_offset), direction); 4019 return GetWordStartBoundary(static_cast<int>(start_offset), direction);
4023 4020
4024 ui::TextBoundaryType boundary = IA2TextBoundaryToTextBoundary(ia2_boundary); 4021 ui::TextBoundaryType boundary = IA2TextBoundaryToTextBoundary(ia2_boundary);
4025 const std::vector<int32_t>& line_breaks = 4022 const std::vector<int32_t>& line_breaks =
4026 GetIntListAttribute(ui::AX_ATTR_LINE_BREAKS); 4023 GetIntListAttribute(ui::AX_ATTR_LINE_BREAKS);
4027 return ui::FindAccessibleTextBoundary( 4024 return ui::FindAccessibleTextBoundary(
4028 text, line_breaks, boundary, start_offset, direction); 4025 text, line_breaks, boundary, start_offset, direction);
4029 } 4026 }
4030 4027
4031 BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromID(int32_t id) { 4028 BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromID(int32_t id) {
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
4191 // Expose whether or not the mouse is over an element, but suppress 4188 // Expose whether or not the mouse is over an element, but suppress
4192 // this for tests because it can make the test results flaky depending 4189 // this for tests because it can make the test results flaky depending
4193 // on the position of the mouse. 4190 // on the position of the mouse.
4194 BrowserAccessibilityStateImpl* accessibility_state = 4191 BrowserAccessibilityStateImpl* accessibility_state =
4195 BrowserAccessibilityStateImpl::GetInstance(); 4192 BrowserAccessibilityStateImpl::GetInstance();
4196 if (!accessibility_state->disable_hot_tracking_for_testing()) { 4193 if (!accessibility_state->disable_hot_tracking_for_testing()) {
4197 if (HasState(ui::AX_STATE_HOVERED)) 4194 if (HasState(ui::AX_STATE_HOVERED))
4198 ia_state |= STATE_SYSTEM_HOTTRACKED; 4195 ia_state |= STATE_SYSTEM_HOTTRACKED;
4199 } 4196 }
4200 4197
4201 if (IsEditableText()) 4198 if (HasState(ui::AX_STATE_EDITABLE))
4202 ia2_state |= IA2_STATE_EDITABLE; 4199 ia2_state |= IA2_STATE_EDITABLE;
4203 4200
4204 if (GetBoolAttribute(ui::AX_ATTR_STATE_MIXED)) 4201 if (GetBoolAttribute(ui::AX_ATTR_STATE_MIXED))
4205 ia_state |= STATE_SYSTEM_MIXED; 4202 ia_state |= STATE_SYSTEM_MIXED;
4206 4203
4207 if (GetBoolAttribute(ui::AX_ATTR_CAN_SET_VALUE)) 4204 if (GetBoolAttribute(ui::AX_ATTR_CAN_SET_VALUE))
4208 ia2_state |= IA2_STATE_EDITABLE; 4205 ia2_state |= IA2_STATE_EDITABLE;
4209 4206
4210 if (!GetStringAttribute(ui::AX_ATTR_AUTO_COMPLETE).empty()) 4207 if (!GetStringAttribute(ui::AX_ATTR_AUTO_COMPLETE).empty())
4211 ia2_state |= IA2_STATE_SUPPORTS_AUTOCOMPLETION; 4208 ia2_state |= IA2_STATE_SUPPORTS_AUTOCOMPLETION;
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after
4681 ia2_role = ia_role; 4678 ia2_role = ia_role;
4682 4679
4683 win_attributes_->ia_role = ia_role; 4680 win_attributes_->ia_role = ia_role;
4684 win_attributes_->ia_state = ia_state; 4681 win_attributes_->ia_state = ia_state;
4685 win_attributes_->role_name = role_name; 4682 win_attributes_->role_name = role_name;
4686 win_attributes_->ia2_role = ia2_role; 4683 win_attributes_->ia2_role = ia2_role;
4687 win_attributes_->ia2_state = ia2_state; 4684 win_attributes_->ia2_state = ia2_state;
4688 } 4685 }
4689 4686
4690 } // namespace content 4687 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698