Chromium Code Reviews| OLD | NEW |
|---|---|
| 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.h" | 5 #include "content/browser/accessibility/browser_accessibility.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
| 9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 182 gfx::Rect BrowserAccessibility::GetGlobalBoundsRect() const { | 182 gfx::Rect BrowserAccessibility::GetGlobalBoundsRect() const { |
| 183 gfx::Rect bounds = GetLocalBoundsRect(); | 183 gfx::Rect bounds = GetLocalBoundsRect(); |
| 184 | 184 |
| 185 // Adjust the bounds by the top left corner of the containing view's bounds | 185 // Adjust the bounds by the top left corner of the containing view's bounds |
| 186 // in screen coordinates. | 186 // in screen coordinates. |
| 187 bounds.Offset(manager_->GetViewBounds().OffsetFromOrigin()); | 187 bounds.Offset(manager_->GetViewBounds().OffsetFromOrigin()); |
| 188 | 188 |
| 189 return bounds; | 189 return bounds; |
| 190 } | 190 } |
| 191 | 191 |
| 192 gfx::Rect BrowserAccessibility::GetLocalBoundsForRange(int start, int len) | |
| 193 const { | |
| 194 DCHECK_EQ(role_, WebKit::WebAXRoleStaticText); | |
| 195 int end = start + len; | |
| 196 int child_start = 0; | |
| 197 int child_end = 0; | |
| 198 | |
| 199 gfx::Rect bounds; | |
| 200 for (size_t i = 0; i < children_.size(); i++) { | |
|
David Tseng
2013/10/17 21:32:02
You only need to iterate up to text length "end",
dmazzoni
2013/10/21 17:25:38
Good point. I added a condition to the for loop so
David Tseng
2013/10/23 17:00:50
nit: ++i
dmazzoni
2013/11/01 18:39:37
Done.
| |
| 201 BrowserAccessibility* child = children_[i]; | |
| 202 DCHECK_EQ(child->role(), WebKit::WebAXRoleInlineTextBox); | |
| 203 std::string child_text; | |
| 204 child->GetStringAttribute(AccessibilityNodeData::ATTR_VALUE, &child_text); | |
| 205 int child_len = static_cast<int>(child_text.size()); | |
| 206 child_start = child_end; | |
| 207 child_end += child_len; | |
| 208 | |
| 209 int overlap_start = std::max(start, child_start); | |
|
aboxhall
2013/10/04 18:53:07
Could we just do
if (start > child_end || end < ch
dmazzoni
2013/10/21 17:25:38
Done.
| |
| 210 int overlap_end = std::min(end, child_end); | |
| 211 | |
| 212 if (overlap_end <= overlap_start) | |
| 213 continue; | |
| 214 | |
| 215 int local_start = overlap_start - child_start; | |
| 216 int local_end = overlap_end - child_start; | |
| 217 | |
| 218 gfx::Rect child_rect = child->location(); | |
| 219 int text_direction = child->GetIntAttribute( | |
| 220 AccessibilityNodeData::ATTR_TEXT_DIRECTION); | |
| 221 const std::vector<int32>& character_offsets = child->GetIntListAttribute( | |
| 222 AccessibilityNodeData::ATTR_CHARACTER_OFFSETS); | |
| 223 int start_pixel_offset = | |
| 224 local_start > 0 ? character_offsets[local_start - 1] : 0; | |
| 225 int end_pixel_offset = | |
| 226 local_end > 0 ? character_offsets[local_end - 1] : 0; | |
| 227 | |
| 228 gfx::Rect child_overlap_rect; | |
| 229 switch (text_direction) { | |
| 230 default: | |
|
David Tseng
2013/10/23 17:00:50
Do you expect to get anything other than the four
dmazzoni
2013/11/01 18:39:37
No. Changed to NOTREACHED.
| |
| 231 case WebKit::WebAXTextDirectionLR: { | |
| 232 int left = child_rect.x() + start_pixel_offset; | |
| 233 int right = child_rect.x() + end_pixel_offset; | |
| 234 child_overlap_rect = gfx::Rect(left, child_rect.y(), | |
| 235 right - left, child_rect.height()); | |
| 236 break; | |
| 237 } | |
| 238 case WebKit::WebAXTextDirectionRL: { | |
| 239 int right = child_rect.right() - start_pixel_offset; | |
| 240 int left = child_rect.right() - end_pixel_offset; | |
| 241 child_overlap_rect = gfx::Rect(left, child_rect.y(), | |
| 242 right - left, child_rect.height()); | |
| 243 break; | |
| 244 } | |
| 245 case WebKit::WebAXTextDirectionTB: { | |
| 246 int top = child_rect.y() + start_pixel_offset; | |
| 247 int bottom = child_rect.y() + end_pixel_offset; | |
| 248 child_overlap_rect = gfx::Rect(child_rect.x(), top, | |
| 249 child_rect.width(), bottom - top); | |
| 250 break; | |
| 251 } | |
| 252 case WebKit::WebAXTextDirectionBT: { | |
| 253 int bottom = child_rect.bottom() - start_pixel_offset; | |
| 254 int top = child_rect.bottom() - end_pixel_offset; | |
| 255 child_overlap_rect = gfx::Rect(child_rect.x(), top, | |
| 256 child_rect.width(), bottom - top); | |
| 257 break; | |
| 258 } | |
| 259 } | |
| 260 | |
| 261 if (bounds.width() == 0 && bounds.height() == 0) | |
|
aboxhall
2013/10/04 18:53:07
Would IsEmpty() do here? Or is it conceivable that
dmazzoni
2013/10/21 17:25:38
It will happen - a common example is a space chara
| |
| 262 bounds = child_overlap_rect; | |
| 263 else | |
| 264 bounds.Union(child_overlap_rect); | |
| 265 } | |
| 266 | |
| 267 return bounds; | |
| 268 } | |
| 269 | |
| 270 gfx::Rect BrowserAccessibility::GetGlobalBoundsForRange(int start, int len) | |
| 271 const { | |
| 272 gfx::Rect bounds = GetLocalBoundsForRange(start, len); | |
| 273 | |
| 274 // Adjust the bounds by the top left corner of the containing view's bounds | |
| 275 // in screen coordinates. | |
| 276 bounds.Offset(manager_->GetViewBounds().OffsetFromOrigin()); | |
| 277 | |
| 278 return bounds; | |
| 279 } | |
| 280 | |
| 192 BrowserAccessibility* BrowserAccessibility::BrowserAccessibilityForPoint( | 281 BrowserAccessibility* BrowserAccessibility::BrowserAccessibilityForPoint( |
| 193 const gfx::Point& point) { | 282 const gfx::Point& point) { |
| 194 // Walk the children recursively looking for the BrowserAccessibility that | 283 // Walk the children recursively looking for the BrowserAccessibility that |
| 195 // most tightly encloses the specified point. | 284 // most tightly encloses the specified point. |
| 196 for (int i = children_.size() - 1; i >= 0; --i) { | 285 for (int i = children_.size() - 1; i >= 0; --i) { |
| 197 BrowserAccessibility* child = children_[i]; | 286 BrowserAccessibility* child = children_[i]; |
| 198 if (child->GetGlobalBoundsRect().Contains(point)) | 287 if (child->GetGlobalBoundsRect().Contains(point)) |
| 199 return child->BrowserAccessibilityForPoint(point); | 288 return child->BrowserAccessibilityForPoint(point); |
| 200 } | 289 } |
| 201 return this; | 290 return this; |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 485 return name_; | 574 return name_; |
| 486 } | 575 } |
| 487 | 576 |
| 488 std::string result; | 577 std::string result; |
| 489 for (size_t i = 0; i < children_.size(); ++i) | 578 for (size_t i = 0; i < children_.size(); ++i) |
| 490 result += children_[i]->GetTextRecursive(); | 579 result += children_[i]->GetTextRecursive(); |
| 491 return result; | 580 return result; |
| 492 } | 581 } |
| 493 | 582 |
| 494 } // namespace content | 583 } // namespace content |
| OLD | NEW |