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

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

Issue 1416873015: Text controls should expose their value instead of their name via IAccessibleText (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added browser tests. Created 5 years, 1 month 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 1984 matching lines...) Expand 10 before | Expand all | Expand 10 after
1995 // IAccessibleText methods. 1995 // IAccessibleText methods.
1996 // 1996 //
1997 1997
1998 STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) { 1998 STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) {
1999 if (!instance_active()) 1999 if (!instance_active())
2000 return E_FAIL; 2000 return E_FAIL;
2001 2001
2002 if (!n_characters) 2002 if (!n_characters)
2003 return E_INVALIDARG; 2003 return E_INVALIDARG;
2004 2004
2005 *n_characters = TextForIAccessibleText().length(); 2005 *n_characters = hypertext().length();
2006 return S_OK; 2006 return S_OK;
2007 } 2007 }
2008 2008
2009 STDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) { 2009 STDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) {
2010 if (!instance_active()) 2010 if (!instance_active())
2011 return E_FAIL; 2011 return E_FAIL;
2012 2012
2013 if (!offset) 2013 if (!offset)
2014 return E_INVALIDARG; 2014 return E_INVALIDARG;
2015 2015
(...skipping 16 matching lines...) Expand all
2032 LONG* out_x, 2032 LONG* out_x,
2033 LONG* out_y, 2033 LONG* out_y,
2034 LONG* out_width, 2034 LONG* out_width,
2035 LONG* out_height) { 2035 LONG* out_height) {
2036 if (!instance_active()) 2036 if (!instance_active())
2037 return E_FAIL; 2037 return E_FAIL;
2038 2038
2039 if (!out_x || !out_y || !out_width || !out_height) 2039 if (!out_x || !out_y || !out_width || !out_height)
2040 return E_INVALIDARG; 2040 return E_INVALIDARG;
2041 2041
2042 const base::string16& text_str = TextForIAccessibleText(); 2042 const base::string16& text_str = hypertext();
2043 HandleSpecialTextOffset(text_str, &offset); 2043 HandleSpecialTextOffset(text_str, &offset);
2044 2044
2045 if (offset < 0 || offset > static_cast<LONG>(text_str.size())) 2045 if (offset < 0 || offset > static_cast<LONG>(text_str.size()))
2046 return E_INVALIDARG; 2046 return E_INVALIDARG;
2047 2047
2048 gfx::Rect character_bounds; 2048 gfx::Rect character_bounds;
2049 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 2049 if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) {
2050 character_bounds = GetGlobalBoundsForRange(offset, 1); 2050 character_bounds = GetGlobalBoundsForRange(offset, 1);
2051 } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 2051 } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) {
2052 character_bounds = GetLocalBoundsForRange(offset, 1); 2052 character_bounds = GetLocalBoundsForRange(offset, 1);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
2115 2115
2116 STDMETHODIMP BrowserAccessibilityWin::get_text(LONG start_offset, 2116 STDMETHODIMP BrowserAccessibilityWin::get_text(LONG start_offset,
2117 LONG end_offset, 2117 LONG end_offset,
2118 BSTR* text) { 2118 BSTR* text) {
2119 if (!instance_active()) 2119 if (!instance_active())
2120 return E_FAIL; 2120 return E_FAIL;
2121 2121
2122 if (!text) 2122 if (!text)
2123 return E_INVALIDARG; 2123 return E_INVALIDARG;
2124 2124
2125 const base::string16& text_str = TextForIAccessibleText(); 2125 const base::string16& text_str = hypertext();
2126 2126
2127 // Handle special text offsets. 2127 // Handle special text offsets.
2128 HandleSpecialTextOffset(text_str, &start_offset); 2128 HandleSpecialTextOffset(text_str, &start_offset);
2129 HandleSpecialTextOffset(text_str, &end_offset); 2129 HandleSpecialTextOffset(text_str, &end_offset);
2130 2130
2131 // The spec allows the arguments to be reversed. 2131 // The spec allows the arguments to be reversed.
2132 if (start_offset > end_offset) { 2132 if (start_offset > end_offset) {
2133 LONG tmp = start_offset; 2133 LONG tmp = start_offset;
2134 start_offset = end_offset; 2134 start_offset = end_offset;
2135 end_offset = tmp; 2135 end_offset = tmp;
(...skipping 22 matching lines...) Expand all
2158 enum IA2TextBoundaryType boundary_type, 2158 enum IA2TextBoundaryType boundary_type,
2159 LONG* start_offset, 2159 LONG* start_offset,
2160 LONG* end_offset, 2160 LONG* end_offset,
2161 BSTR* text) { 2161 BSTR* text) {
2162 if (!instance_active()) 2162 if (!instance_active())
2163 return E_FAIL; 2163 return E_FAIL;
2164 2164
2165 if (!start_offset || !end_offset || !text) 2165 if (!start_offset || !end_offset || !text)
2166 return E_INVALIDARG; 2166 return E_INVALIDARG;
2167 2167
2168 const base::string16& text_str = TextForIAccessibleText(); 2168 const base::string16& text_str = hypertext();
2169 HandleSpecialTextOffset(text_str, &offset); 2169 HandleSpecialTextOffset(text_str, &offset);
2170 if (offset < 0) 2170 if (offset < 0)
2171 return E_INVALIDARG; 2171 return E_INVALIDARG;
2172 2172
2173 LONG text_len = text_str.length(); 2173 LONG text_len = text_str.length();
2174 if (offset > text_len) 2174 if (offset > text_len)
2175 return E_INVALIDARG; 2175 return E_INVALIDARG;
2176 2176
2177 // The IAccessible2 spec says we don't have to implement the "sentence" 2177 // The IAccessible2 spec says we don't have to implement the "sentence"
2178 // boundary type, we can just let the screenreader handle it. 2178 // boundary type, we can just let the screenreader handle it.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
2213 2213
2214 // The IAccessible2 spec says we don't have to implement the "sentence" 2214 // The IAccessible2 spec says we don't have to implement the "sentence"
2215 // boundary type, we can just let the screenreader handle it. 2215 // boundary type, we can just let the screenreader handle it.
2216 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 2216 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) {
2217 *start_offset = 0; 2217 *start_offset = 0;
2218 *end_offset = 0; 2218 *end_offset = 0;
2219 *text = NULL; 2219 *text = NULL;
2220 return S_FALSE; 2220 return S_FALSE;
2221 } 2221 }
2222 2222
2223 const base::string16& text_str = TextForIAccessibleText(); 2223 const base::string16& text_str = hypertext();
2224 2224
2225 *start_offset = FindBoundary( 2225 *start_offset = FindBoundary(
2226 text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); 2226 text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION);
2227 *end_offset = offset; 2227 *end_offset = offset;
2228 return get_text(*start_offset, *end_offset, text); 2228 return get_text(*start_offset, *end_offset, text);
2229 } 2229 }
2230 2230
2231 STDMETHODIMP BrowserAccessibilityWin::get_textAfterOffset( 2231 STDMETHODIMP BrowserAccessibilityWin::get_textAfterOffset(
2232 LONG offset, 2232 LONG offset,
2233 enum IA2TextBoundaryType boundary_type, 2233 enum IA2TextBoundaryType boundary_type,
2234 LONG* start_offset, 2234 LONG* start_offset,
2235 LONG* end_offset, 2235 LONG* end_offset,
2236 BSTR* text) { 2236 BSTR* text) {
2237 if (!instance_active()) 2237 if (!instance_active())
2238 return E_FAIL; 2238 return E_FAIL;
2239 2239
2240 if (!start_offset || !end_offset || !text) 2240 if (!start_offset || !end_offset || !text)
2241 return E_INVALIDARG; 2241 return E_INVALIDARG;
2242 2242
2243 // The IAccessible2 spec says we don't have to implement the "sentence" 2243 // The IAccessible2 spec says we don't have to implement the "sentence"
2244 // boundary type, we can just let the screenreader handle it. 2244 // boundary type, we can just let the screenreader handle it.
2245 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 2245 if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) {
2246 *start_offset = 0; 2246 *start_offset = 0;
2247 *end_offset = 0; 2247 *end_offset = 0;
2248 *text = NULL; 2248 *text = NULL;
2249 return S_FALSE; 2249 return S_FALSE;
2250 } 2250 }
2251 2251
2252 const base::string16& text_str = TextForIAccessibleText(); 2252 const base::string16& text_str = hypertext();
2253 2253
2254 *start_offset = offset; 2254 *start_offset = offset;
2255 *end_offset = FindBoundary( 2255 *end_offset = FindBoundary(
2256 text_str, boundary_type, offset, ui::FORWARDS_DIRECTION); 2256 text_str, boundary_type, offset, ui::FORWARDS_DIRECTION);
2257 return get_text(*start_offset, *end_offset, text); 2257 return get_text(*start_offset, *end_offset, text);
2258 } 2258 }
2259 2259
2260 STDMETHODIMP BrowserAccessibilityWin::get_newText(IA2TextSegment* new_text) { 2260 STDMETHODIMP BrowserAccessibilityWin::get_newText(IA2TextSegment* new_text) {
2261 if (!instance_active()) 2261 if (!instance_active())
2262 return E_FAIL; 2262 return E_FAIL;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
2335 LONG x, LONG y) { 2335 LONG x, LONG y) {
2336 // TODO(dmazzoni): adjust this for the start and end index, too. 2336 // TODO(dmazzoni): adjust this for the start and end index, too.
2337 return scrollToPoint(coordinate_type, x, y); 2337 return scrollToPoint(coordinate_type, x, y);
2338 } 2338 }
2339 2339
2340 STDMETHODIMP BrowserAccessibilityWin::addSelection(LONG start_offset, 2340 STDMETHODIMP BrowserAccessibilityWin::addSelection(LONG start_offset,
2341 LONG end_offset) { 2341 LONG end_offset) {
2342 if (!instance_active()) 2342 if (!instance_active())
2343 return E_FAIL; 2343 return E_FAIL;
2344 2344
2345 const base::string16& text_str = TextForIAccessibleText(); 2345 const base::string16& text_str = hypertext();
2346 HandleSpecialTextOffset(text_str, &start_offset); 2346 HandleSpecialTextOffset(text_str, &start_offset);
2347 HandleSpecialTextOffset(text_str, &end_offset); 2347 HandleSpecialTextOffset(text_str, &end_offset);
2348 2348
2349 manager()->SetTextSelection(*this, start_offset, end_offset); 2349 manager()->SetTextSelection(*this, start_offset, end_offset);
2350 return S_OK; 2350 return S_OK;
2351 } 2351 }
2352 2352
2353 STDMETHODIMP BrowserAccessibilityWin::removeSelection(LONG selection_index) { 2353 STDMETHODIMP BrowserAccessibilityWin::removeSelection(LONG selection_index) {
2354 if (!instance_active()) 2354 if (!instance_active())
2355 return E_FAIL; 2355 return E_FAIL;
2356 2356
2357 if (selection_index != 0) 2357 if (selection_index != 0)
2358 return E_INVALIDARG; 2358 return E_INVALIDARG;
2359 2359
2360 manager()->SetTextSelection(*this, 0, 0); 2360 manager()->SetTextSelection(*this, 0, 0);
2361 return S_OK; 2361 return S_OK;
2362 } 2362 }
2363 2363
2364 STDMETHODIMP BrowserAccessibilityWin::setCaretOffset(LONG offset) { 2364 STDMETHODIMP BrowserAccessibilityWin::setCaretOffset(LONG offset) {
2365 if (!instance_active()) 2365 if (!instance_active())
2366 return E_FAIL; 2366 return E_FAIL;
2367 2367
2368 const base::string16& text_str = TextForIAccessibleText(); 2368 const base::string16& text_str = hypertext();
2369 HandleSpecialTextOffset(text_str, &offset); 2369 HandleSpecialTextOffset(text_str, &offset);
2370 manager()->SetTextSelection(*this, offset, offset); 2370 manager()->SetTextSelection(*this, offset, offset);
2371 return S_OK; 2371 return S_OK;
2372 } 2372 }
2373 2373
2374 STDMETHODIMP BrowserAccessibilityWin::setSelection(LONG selection_index, 2374 STDMETHODIMP BrowserAccessibilityWin::setSelection(LONG selection_index,
2375 LONG start_offset, 2375 LONG start_offset,
2376 LONG end_offset) { 2376 LONG end_offset) {
2377 if (!instance_active()) 2377 if (!instance_active())
2378 return E_FAIL; 2378 return E_FAIL;
2379 2379
2380 if (selection_index != 0) 2380 if (selection_index != 0)
2381 return E_INVALIDARG; 2381 return E_INVALIDARG;
2382 2382
2383 const base::string16& text_str = TextForIAccessibleText(); 2383 const base::string16& text_str = hypertext();
2384 HandleSpecialTextOffset(text_str, &start_offset); 2384 HandleSpecialTextOffset(text_str, &start_offset);
2385 HandleSpecialTextOffset(text_str, &end_offset); 2385 HandleSpecialTextOffset(text_str, &end_offset);
2386 2386
2387 manager()->SetTextSelection(*this, start_offset, end_offset); 2387 manager()->SetTextSelection(*this, start_offset, end_offset);
2388 return S_OK; 2388 return S_OK;
2389 } 2389 }
2390 2390
2391 // 2391 //
2392 // IAccessibleText methods not implemented. 2392 // IAccessibleText methods not implemented.
2393 // 2393 //
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
2468 2468
2469 // Currently, only text links are supported. 2469 // Currently, only text links are supported.
2470 STDMETHODIMP BrowserAccessibilityWin::get_anchor(long index, VARIANT* anchor) { 2470 STDMETHODIMP BrowserAccessibilityWin::get_anchor(long index, VARIANT* anchor) {
2471 if (!instance_active() || !IsHyperlink()) 2471 if (!instance_active() || !IsHyperlink())
2472 return E_FAIL; 2472 return E_FAIL;
2473 2473
2474 // IA2 text links can have only one anchor, that is the text inside them. 2474 // IA2 text links can have only one anchor, that is the text inside them.
2475 if (index != 0 || !anchor) 2475 if (index != 0 || !anchor)
2476 return E_INVALIDARG; 2476 return E_INVALIDARG;
2477 2477
2478 BSTR hypertext = SysAllocString(TextForIAccessibleText().c_str()); 2478 BSTR ia2_hypertext = SysAllocString(hypertext().c_str());
2479 DCHECK(hypertext); 2479 DCHECK(ia2_hypertext);
2480 anchor->vt = VT_BSTR; 2480 anchor->vt = VT_BSTR;
2481 anchor->bstrVal = hypertext; 2481 anchor->bstrVal = ia2_hypertext;
2482 2482
2483 // Returning S_FALSE is not mentioned in the IA2 Spec, but it might have been 2483 // Returning S_FALSE is not mentioned in the IA2 Spec, but it might have been
2484 // an oversight. 2484 // an oversight.
2485 if (!SysStringLen(hypertext)) 2485 if (!SysStringLen(ia2_hypertext))
2486 return S_FALSE; 2486 return S_FALSE;
2487 2487
2488 return S_OK; 2488 return S_OK;
2489 } 2489 }
2490 2490
2491 // Currently, only text links are supported. 2491 // Currently, only text links are supported.
2492 STDMETHODIMP BrowserAccessibilityWin::get_anchorTarget(long index, 2492 STDMETHODIMP BrowserAccessibilityWin::get_anchorTarget(long index,
2493 VARIANT* anchor_target) { 2493 VARIANT* anchor_target) {
2494 if (!instance_active() || !IsHyperlink()) 2494 if (!instance_active() || !IsHyperlink())
2495 return E_FAIL; 2495 return E_FAIL;
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after
3050 int* out_x, 3050 int* out_x,
3051 int* out_y, 3051 int* out_y,
3052 int* out_width, 3052 int* out_width,
3053 int* out_height) { 3053 int* out_height) {
3054 if (!instance_active()) 3054 if (!instance_active())
3055 return E_FAIL; 3055 return E_FAIL;
3056 3056
3057 if (!out_x || !out_y || !out_width || !out_height) 3057 if (!out_x || !out_y || !out_width || !out_height)
3058 return E_INVALIDARG; 3058 return E_INVALIDARG;
3059 3059
3060 const base::string16& text_str = TextForIAccessibleText(); 3060 const base::string16& text_str = hypertext();
3061 if (start_index > text_str.size() || 3061 if (start_index > text_str.size() ||
3062 end_index > text_str.size() || 3062 end_index > text_str.size() ||
3063 start_index > end_index) { 3063 start_index > end_index) {
3064 return E_INVALIDARG; 3064 return E_INVALIDARG;
3065 } 3065 }
3066 3066
3067 gfx::Rect bounds = GetGlobalBoundsForRange( 3067 gfx::Rect bounds = GetGlobalBoundsForRange(
3068 start_index, end_index - start_index); 3068 start_index, end_index - start_index);
3069 *out_x = bounds.x(); 3069 *out_x = bounds.x();
3070 *out_y = bounds.y(); 3070 *out_y = bounds.y();
3071 *out_width = bounds.width(); 3071 *out_width = bounds.width();
3072 *out_height = bounds.height(); 3072 *out_height = bounds.height();
3073 return S_OK; 3073 return S_OK;
3074 } 3074 }
3075 3075
3076 STDMETHODIMP BrowserAccessibilityWin::scrollToSubstring( 3076 STDMETHODIMP BrowserAccessibilityWin::scrollToSubstring(
3077 unsigned int start_index, 3077 unsigned int start_index,
3078 unsigned int end_index) { 3078 unsigned int end_index) {
3079 if (!instance_active()) 3079 if (!instance_active())
3080 return E_FAIL; 3080 return E_FAIL;
3081 3081
3082 const base::string16& text_str = TextForIAccessibleText(); 3082 const base::string16& text_str = hypertext();
3083 if (start_index > text_str.size() || 3083 if (start_index > text_str.size() ||
3084 end_index > text_str.size() || 3084 end_index > text_str.size() ||
3085 start_index > end_index) { 3085 start_index > end_index) {
3086 return E_INVALIDARG; 3086 return E_INVALIDARG;
3087 } 3087 }
3088 3088
3089 manager()->ScrollToMakeVisible(*this, GetLocalBoundsForRange( 3089 manager()->ScrollToMakeVisible(*this, GetLocalBoundsForRange(
3090 start_index, end_index - start_index)); 3090 start_index, end_index - start_index));
3091 manager()->ToBrowserAccessibilityManagerWin()->TrackScrollingObject(this); 3091 manager()->ToBrowserAccessibilityManagerWin()->TrackScrollingObject(this);
3092 3092
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
3521 // something other than DOCUMENT so that the fact that it's a separate doc 3521 // something other than DOCUMENT so that the fact that it's a separate doc
3522 // is not exposed to AT. 3522 // is not exposed to AT.
3523 if (IsWebAreaForPresentationalIframe()) { 3523 if (IsWebAreaForPresentationalIframe()) {
3524 win_attributes_->ia_role = ROLE_SYSTEM_GROUPING; 3524 win_attributes_->ia_role = ROLE_SYSTEM_GROUPING;
3525 win_attributes_->ia2_role = ROLE_SYSTEM_GROUPING; 3525 win_attributes_->ia2_role = ROLE_SYSTEM_GROUPING;
3526 } 3526 }
3527 } 3527 }
3528 3528
3529 void BrowserAccessibilityWin::UpdateStep2ComputeHypertext() { 3529 void BrowserAccessibilityWin::UpdateStep2ComputeHypertext() {
3530 if (!PlatformChildCount()) { 3530 if (!PlatformChildCount()) {
3531 win_attributes_->hypertext += name(); 3531 if (IsControlWithValue())
dmazzoni 2015/10/29 20:15:29 I like the idea behind this change, but I don't th
3532 win_attributes_->hypertext += value();
3533 else
3534 win_attributes_->hypertext += name();
3535
3532 return; 3536 return;
3533 } 3537 }
3534 3538
3535 // Construct the hypertext for this node, which contains the concatenation 3539 // Construct the hypertext for this node, which contains the concatenation
3536 // of all of the static text and widespace of this node's children and an 3540 // of all of the static text and widespace of this node's children and an
3537 // embedded object character for all the other children. Build up a map from 3541 // embedded object character for all the other children. Build up a map from
3538 // the character index of each embedded object character to the id of the 3542 // the character index of each embedded object character to the id of the
3539 // child object it points to. 3543 // child object it points to.
3540 for (unsigned int i = 0; i < PlatformChildCount(); ++i) { 3544 for (unsigned int i = 0; i < PlatformChildCount(); ++i) {
3541 BrowserAccessibilityWin* child = 3545 BrowserAccessibilityWin* child =
3542 PlatformGetChild(i)->ToBrowserAccessibilityWin(); 3546 PlatformGetChild(i)->ToBrowserAccessibilityWin();
3543 DCHECK(child); 3547 DCHECK(child);
3548 // Similar to Firefox, we don't expose text-only objects in IA2 hypertext.
3544 if (child->IsTextOnlyObject()) { 3549 if (child->IsTextOnlyObject()) {
3545 win_attributes_->hypertext += child->name(); 3550 win_attributes_->hypertext += child->name();
3546 } else { 3551 } else {
3547 int32 char_offset = hypertext().size(); 3552 int32 char_offset = hypertext().size();
3548 int32 child_id = child->GetId(); 3553 int32 child_id = child->GetId();
3549 int32 index = hyperlinks().size(); 3554 int32 index = hyperlinks().size();
3550 win_attributes_->hyperlink_offset_to_index[char_offset] = index; 3555 win_attributes_->hyperlink_offset_to_index[char_offset] = index;
3551 win_attributes_->hyperlinks.push_back(child_id); 3556 win_attributes_->hyperlinks.push_back(child_id);
3552 win_attributes_->hypertext += kEmbeddedCharacter; 3557 win_attributes_->hypertext += kEmbeddedCharacter;
3553 } 3558 }
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
3808 if (child.IsTextOnlyObject()) { 3813 if (child.IsTextOnlyObject()) {
3809 int32 hypertextOffset = 0; 3814 int32 hypertextOffset = 0;
3810 int32 index_in_parent = child.GetIndexInParent(); 3815 int32 index_in_parent = child.GetIndexInParent();
3811 DCHECK_GE(index_in_parent, 0); 3816 DCHECK_GE(index_in_parent, 0);
3812 DCHECK_LT(index_in_parent, static_cast<int32>(PlatformChildCount())); 3817 DCHECK_LT(index_in_parent, static_cast<int32>(PlatformChildCount()));
3813 for (uint32 i = 0; i < static_cast<uint32>(index_in_parent); ++i) { 3818 for (uint32 i = 0; i < static_cast<uint32>(index_in_parent); ++i) {
3814 const BrowserAccessibilityWin* sibling = 3819 const BrowserAccessibilityWin* sibling =
3815 PlatformGetChild(i)->ToBrowserAccessibilityWin(); 3820 PlatformGetChild(i)->ToBrowserAccessibilityWin();
3816 DCHECK(sibling); 3821 DCHECK(sibling);
3817 if (sibling->IsTextOnlyObject()) 3822 if (sibling->IsTextOnlyObject())
3818 hypertextOffset += sibling->TextForIAccessibleText().length(); 3823 hypertextOffset += sibling->hypertext().length();
3819 else 3824 else
3820 ++hypertextOffset; 3825 ++hypertextOffset;
3821 } 3826 }
3822 return hypertextOffset; 3827 return hypertextOffset;
3823 } 3828 }
3824 3829
3825 int32 hyperlink_index = GetHyperlinkIndexFromChild(child); 3830 int32 hyperlink_index = GetHyperlinkIndexFromChild(child);
3826 if (hyperlink_index < 0) 3831 if (hyperlink_index < 0)
3827 return -1; 3832 return -1;
3828 3833
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
3900 if (endpoint_object.IsDescendantOf(child)) { 3905 if (endpoint_object.IsDescendantOf(child)) {
3901 endpoint_index_in_common_parent = child->GetIndexInParent(); 3906 endpoint_index_in_common_parent = child->GetIndexInParent();
3902 break; 3907 break;
3903 } 3908 }
3904 } 3909 }
3905 DCHECK_GE(endpoint_index_in_common_parent, 0); 3910 DCHECK_GE(endpoint_index_in_common_parent, 0);
3906 3911
3907 if (endpoint_index_in_common_parent < index_in_common_parent) 3912 if (endpoint_index_in_common_parent < index_in_common_parent)
3908 return 0; 3913 return 0;
3909 if (endpoint_index_in_common_parent > index_in_common_parent) 3914 if (endpoint_index_in_common_parent > index_in_common_parent)
3910 return TextForIAccessibleText().length(); 3915 return hypertext().length();
3911 3916
3912 NOTREACHED(); 3917 NOTREACHED();
3913 return -1; 3918 return -1;
3914 } 3919 }
3915 3920
3916 int BrowserAccessibilityWin::GetSelectionAnchor() const { 3921 int BrowserAccessibilityWin::GetSelectionAnchor() const {
3917 int32 anchor_id = manager()->GetTreeData().sel_anchor_object_id; 3922 int32 anchor_id = manager()->GetTreeData().sel_anchor_object_id;
3918 BrowserAccessibilityWin* anchor_object = manager()->GetFromID( 3923 BrowserAccessibilityWin* anchor_object = manager()->GetFromID(
3919 anchor_id)->ToBrowserAccessibilityWin(); 3924 anchor_id)->ToBrowserAccessibilityWin();
3920 if (!anchor_object) 3925 if (!anchor_object)
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
4014 float fval; 4019 float fval;
4015 base::string16 value = this->value(); 4020 base::string16 value = this->value();
4016 4021
4017 if (value.empty() && 4022 if (value.empty() &&
4018 GetFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE, &fval)) { 4023 GetFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE, &fval)) {
4019 value = base::UTF8ToUTF16(base::DoubleToString(fval)); 4024 value = base::UTF8ToUTF16(base::DoubleToString(fval));
4020 } 4025 }
4021 return value; 4026 return value;
4022 } 4027 }
4023 4028
4024 base::string16 BrowserAccessibilityWin::TextForIAccessibleText() const {
4025 switch (GetRole()) {
4026 case ui::AX_ROLE_TEXT_FIELD:
4027 case ui::AX_ROLE_MENU_LIST_OPTION:
4028 return value();
4029 default:
4030 return hypertext();
4031 }
4032 }
4033
4034 bool BrowserAccessibilityWin::IsSameHypertextCharacter(size_t old_char_index, 4029 bool BrowserAccessibilityWin::IsSameHypertextCharacter(size_t old_char_index,
4035 size_t new_char_index) { 4030 size_t new_char_index) {
4036 CHECK(old_win_attributes_); 4031 CHECK(old_win_attributes_);
4037 4032
4038 // For anything other than the "embedded character", we just compare the 4033 // For anything other than the "embedded character", we just compare the
4039 // characters directly. 4034 // characters directly.
4040 base::char16 old_ch = old_win_attributes_->hypertext[old_char_index]; 4035 base::char16 old_ch = old_win_attributes_->hypertext[old_char_index];
4041 base::char16 new_ch = win_attributes_->hypertext[new_char_index]; 4036 base::char16 new_ch = win_attributes_->hypertext[new_char_index];
4042 if (old_ch != new_ch) 4037 if (old_ch != new_ch)
4043 return false; 4038 return false;
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after
4784 ia2_role = ia_role; 4779 ia2_role = ia_role;
4785 4780
4786 win_attributes_->ia_role = ia_role; 4781 win_attributes_->ia_role = ia_role;
4787 win_attributes_->ia_state = ia_state; 4782 win_attributes_->ia_state = ia_state;
4788 win_attributes_->role_name = role_name; 4783 win_attributes_->role_name = role_name;
4789 win_attributes_->ia2_role = ia2_role; 4784 win_attributes_->ia2_role = ia2_role;
4790 win_attributes_->ia2_state = ia2_state; 4785 win_attributes_->ia2_state = ia2_state;
4791 } 4786 }
4792 4787
4793 } // namespace content 4788 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698