| 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 "content/browser/accessibility/browser_accessibility_manager.h" | 11 #include "content/browser/accessibility/browser_accessibility_manager.h" |
| 11 #include "content/common/accessibility_messages.h" | 12 #include "content/common/accessibility_messages.h" |
| 12 | 13 |
| 13 namespace content { | 14 namespace content { |
| 14 | 15 |
| 15 typedef AccessibilityNodeData::BoolAttribute BoolAttribute; | 16 typedef AccessibilityNodeData::BoolAttribute BoolAttribute; |
| 16 typedef AccessibilityNodeData::FloatAttribute FloatAttribute; | 17 typedef AccessibilityNodeData::FloatAttribute FloatAttribute; |
| 17 typedef AccessibilityNodeData::IntAttribute IntAttribute; | 18 typedef AccessibilityNodeData::IntAttribute IntAttribute; |
| 18 typedef AccessibilityNodeData::StringAttribute StringAttribute; | 19 typedef AccessibilityNodeData::StringAttribute StringAttribute; |
| 19 | 20 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 int32 renderer_id, | 58 int32 renderer_id, |
| 58 int32 index_in_parent) { | 59 int32 index_in_parent) { |
| 59 manager_ = manager; | 60 manager_ = manager; |
| 60 parent_ = parent; | 61 parent_ = parent; |
| 61 renderer_id_ = renderer_id; | 62 renderer_id_ = renderer_id; |
| 62 index_in_parent_ = index_in_parent; | 63 index_in_parent_ = index_in_parent; |
| 63 } | 64 } |
| 64 | 65 |
| 65 void BrowserAccessibility::InitializeData(const AccessibilityNodeData& src) { | 66 void BrowserAccessibility::InitializeData(const AccessibilityNodeData& src) { |
| 66 DCHECK_EQ(renderer_id_, src.id); | 67 DCHECK_EQ(renderer_id_, src.id); |
| 67 name_ = src.name; | |
| 68 value_ = src.value; | |
| 69 role_ = src.role; | 68 role_ = src.role; |
| 70 state_ = src.state; | 69 state_ = src.state; |
| 71 string_attributes_ = src.string_attributes; | 70 string_attributes_ = src.string_attributes; |
| 72 int_attributes_ = src.int_attributes; | 71 int_attributes_ = src.int_attributes; |
| 73 float_attributes_ = src.float_attributes; | 72 float_attributes_ = src.float_attributes; |
| 74 bool_attributes_ = src.bool_attributes; | 73 bool_attributes_ = src.bool_attributes; |
| 74 intlist_attributes_ = src.intlist_attributes; |
| 75 html_attributes_ = src.html_attributes; | 75 html_attributes_ = src.html_attributes; |
| 76 location_ = src.location; | 76 location_ = src.location; |
| 77 indirect_child_ids_ = src.indirect_child_ids; | |
| 78 line_breaks_ = src.line_breaks; | |
| 79 cell_ids_ = src.cell_ids; | |
| 80 unique_cell_ids_ = src.unique_cell_ids; | |
| 81 instance_active_ = true; | 77 instance_active_ = true; |
| 82 | 78 |
| 79 GetStringAttribute(AccessibilityNodeData::ATTR_NAME, &name_); |
| 80 GetStringAttribute(AccessibilityNodeData::ATTR_VALUE, &value_); |
| 81 |
| 83 PreInitialize(); | 82 PreInitialize(); |
| 84 } | 83 } |
| 85 | 84 |
| 86 bool BrowserAccessibility::IsNative() const { | 85 bool BrowserAccessibility::IsNative() const { |
| 87 return false; | 86 return false; |
| 88 } | 87 } |
| 89 | 88 |
| 90 void BrowserAccessibility::SwapChildren( | 89 void BrowserAccessibility::SwapChildren( |
| 91 std::vector<BrowserAccessibility*>& children) { | 90 std::vector<BrowserAccessibility*>& children) { |
| 92 children.swap(children_); | 91 children.swap(children_); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 | 215 |
| 217 instance_active_ = false; | 216 instance_active_ = false; |
| 218 manager_->RemoveNode(this); | 217 manager_->RemoveNode(this); |
| 219 NativeReleaseReference(); | 218 NativeReleaseReference(); |
| 220 } | 219 } |
| 221 | 220 |
| 222 void BrowserAccessibility::NativeReleaseReference() { | 221 void BrowserAccessibility::NativeReleaseReference() { |
| 223 delete this; | 222 delete this; |
| 224 } | 223 } |
| 225 | 224 |
| 226 bool BrowserAccessibility::GetBoolAttribute( | 225 bool BrowserAccessibility::HasBoolAttribute(BoolAttribute attribute) const { |
| 227 BoolAttribute attribute, bool* value) const { | 226 for (size_t i = 0; i < bool_attributes_.size(); ++i) { |
| 228 BoolAttrMap::const_iterator iter = bool_attributes_.find(attribute); | 227 if (bool_attributes_[i].first == attribute) |
| 229 if (iter != bool_attributes_.end()) { | 228 return true; |
| 230 *value = iter->second; | |
| 231 return true; | |
| 232 } | 229 } |
| 233 | 230 |
| 234 return false; | 231 return false; |
| 235 } | 232 } |
| 236 | 233 |
| 237 bool BrowserAccessibility::GetFloatAttribute( | 234 |
| 238 FloatAttribute attribute, float* value) const { | 235 bool BrowserAccessibility::GetBoolAttribute(BoolAttribute attribute) const { |
| 239 FloatAttrMap::const_iterator iter = float_attributes_.find(attribute); | 236 for (size_t i = 0; i < bool_attributes_.size(); ++i) { |
| 240 if (iter != float_attributes_.end()) { | 237 if (bool_attributes_[i].first == attribute) |
| 241 *value = iter->second; | 238 return bool_attributes_[i].second; |
| 242 return true; | |
| 243 } | 239 } |
| 244 | 240 |
| 245 return false; | 241 return false; |
| 246 } | 242 } |
| 247 | 243 |
| 248 bool BrowserAccessibility::GetIntAttribute( | 244 bool BrowserAccessibility::GetBoolAttribute( |
| 249 IntAttribute attribute, int* value) const { | 245 BoolAttribute attribute, bool* value) const { |
| 250 IntAttrMap::const_iterator iter = int_attributes_.find(attribute); | 246 for (size_t i = 0; i < bool_attributes_.size(); ++i) { |
| 251 if (iter != int_attributes_.end()) { | 247 if (bool_attributes_[i].first == attribute) { |
| 252 *value = iter->second; | 248 *value = bool_attributes_[i].second; |
| 253 return true; | 249 return true; |
| 250 } |
| 254 } | 251 } |
| 255 | 252 |
| 256 return false; | 253 return false; |
| 257 } | 254 } |
| 258 | 255 |
| 256 bool BrowserAccessibility::HasFloatAttribute(FloatAttribute attribute) const { |
| 257 for (size_t i = 0; i < float_attributes_.size(); ++i) { |
| 258 if (float_attributes_[i].first == attribute) |
| 259 return true; |
| 260 } |
| 261 |
| 262 return false; |
| 263 } |
| 264 |
| 265 float BrowserAccessibility::GetFloatAttribute(FloatAttribute attribute) const { |
| 266 for (size_t i = 0; i < float_attributes_.size(); ++i) { |
| 267 if (float_attributes_[i].first == attribute) |
| 268 return float_attributes_[i].second; |
| 269 } |
| 270 |
| 271 return 0.0; |
| 272 } |
| 273 |
| 274 bool BrowserAccessibility::GetFloatAttribute( |
| 275 FloatAttribute attribute, float* value) const { |
| 276 for (size_t i = 0; i < float_attributes_.size(); ++i) { |
| 277 if (float_attributes_[i].first == attribute) { |
| 278 *value = float_attributes_[i].second; |
| 279 return true; |
| 280 } |
| 281 } |
| 282 |
| 283 return false; |
| 284 } |
| 285 |
| 286 bool BrowserAccessibility::HasIntAttribute(IntAttribute attribute) const { |
| 287 for (size_t i = 0; i < int_attributes_.size(); ++i) { |
| 288 if (int_attributes_[i].first == attribute) |
| 289 return true; |
| 290 } |
| 291 |
| 292 return false; |
| 293 } |
| 294 |
| 295 int BrowserAccessibility::GetIntAttribute(IntAttribute attribute) const { |
| 296 for (size_t i = 0; i < int_attributes_.size(); ++i) { |
| 297 if (int_attributes_[i].first == attribute) |
| 298 return int_attributes_[i].second; |
| 299 } |
| 300 |
| 301 return 0; |
| 302 } |
| 303 |
| 304 bool BrowserAccessibility::GetIntAttribute( |
| 305 IntAttribute attribute, int* value) const { |
| 306 for (size_t i = 0; i < int_attributes_.size(); ++i) { |
| 307 if (int_attributes_[i].first == attribute) { |
| 308 *value = int_attributes_[i].second; |
| 309 return true; |
| 310 } |
| 311 } |
| 312 |
| 313 return false; |
| 314 } |
| 315 |
| 316 bool BrowserAccessibility::HasStringAttribute(StringAttribute attribute) const { |
| 317 for (size_t i = 0; i < string_attributes_.size(); ++i) { |
| 318 if (string_attributes_[i].first == attribute) |
| 319 return true; |
| 320 } |
| 321 |
| 322 return false; |
| 323 } |
| 324 |
| 325 const std::string& BrowserAccessibility::GetStringAttribute( |
| 326 StringAttribute attribute) const { |
| 327 CR_DEFINE_STATIC_LOCAL(std::string, empty_string, ()); |
| 328 for (size_t i = 0; i < string_attributes_.size(); ++i) { |
| 329 if (string_attributes_[i].first == attribute) |
| 330 return string_attributes_[i].second; |
| 331 } |
| 332 |
| 333 return empty_string; |
| 334 } |
| 335 |
| 259 bool BrowserAccessibility::GetStringAttribute( | 336 bool BrowserAccessibility::GetStringAttribute( |
| 337 StringAttribute attribute, std::string* value) const { |
| 338 for (size_t i = 0; i < string_attributes_.size(); ++i) { |
| 339 if (string_attributes_[i].first == attribute) { |
| 340 *value = string_attributes_[i].second; |
| 341 return true; |
| 342 } |
| 343 } |
| 344 |
| 345 return false; |
| 346 } |
| 347 |
| 348 string16 BrowserAccessibility::GetString16Attribute( |
| 349 StringAttribute attribute) const { |
| 350 std::string value_utf8; |
| 351 if (!GetStringAttribute(attribute, &value_utf8)) |
| 352 return string16(); |
| 353 return UTF8ToUTF16(value_utf8); |
| 354 } |
| 355 |
| 356 bool BrowserAccessibility::GetString16Attribute( |
| 260 StringAttribute attribute, | 357 StringAttribute attribute, |
| 261 string16* value) const { | 358 string16* value) const { |
| 262 StringAttrMap::const_iterator iter = string_attributes_.find(attribute); | 359 std::string value_utf8; |
| 263 if (iter != string_attributes_.end()) { | 360 if (!GetStringAttribute(attribute, &value_utf8)) |
| 264 *value = iter->second; | 361 return false; |
| 265 return true; | 362 *value = UTF8ToUTF16(value_utf8); |
| 363 return true; |
| 364 } |
| 365 |
| 366 void BrowserAccessibility::SetStringAttribute( |
| 367 StringAttribute attribute, const std::string& value) { |
| 368 for (size_t i = 0; i < string_attributes_.size(); ++i) { |
| 369 if (string_attributes_[i].first == attribute) { |
| 370 string_attributes_[i].second = value; |
| 371 return; |
| 372 } |
| 373 } |
| 374 if (!value.empty()) |
| 375 string_attributes_.push_back(std::make_pair(attribute, value)); |
| 376 } |
| 377 |
| 378 bool BrowserAccessibility::HasIntListAttribute( |
| 379 AccessibilityNodeData::IntListAttribute attribute) const { |
| 380 for (size_t i = 0; i < intlist_attributes_.size(); ++i) { |
| 381 if (intlist_attributes_[i].first == attribute) |
| 382 return true; |
| 383 } |
| 384 |
| 385 return false; |
| 386 } |
| 387 |
| 388 const std::vector<int32>& BrowserAccessibility::GetIntListAttribute( |
| 389 AccessibilityNodeData::IntListAttribute attribute) const { |
| 390 CR_DEFINE_STATIC_LOCAL(std::vector<int32>, empty_vector, ()); |
| 391 for (size_t i = 0; i < intlist_attributes_.size(); ++i) { |
| 392 if (intlist_attributes_[i].first == attribute) |
| 393 return intlist_attributes_[i].second; |
| 394 } |
| 395 |
| 396 return empty_vector; |
| 397 } |
| 398 |
| 399 bool BrowserAccessibility::GetIntListAttribute( |
| 400 AccessibilityNodeData::IntListAttribute attribute, |
| 401 std::vector<int32>* value) const { |
| 402 for (size_t i = 0; i < intlist_attributes_.size(); ++i) { |
| 403 if (intlist_attributes_[i].first == attribute) { |
| 404 *value = intlist_attributes_[i].second; |
| 405 return true; |
| 406 } |
| 266 } | 407 } |
| 267 | 408 |
| 268 return false; | 409 return false; |
| 269 } | 410 } |
| 270 | 411 |
| 271 bool BrowserAccessibility::GetHtmlAttribute( | 412 bool BrowserAccessibility::GetHtmlAttribute( |
| 272 const char* html_attr, string16* value) const { | 413 const char* html_attr, std::string* value) const { |
| 273 for (size_t i = 0; i < html_attributes_.size(); i++) { | 414 for (size_t i = 0; i < html_attributes_.size(); i++) { |
| 274 const string16& attr = html_attributes_[i].first; | 415 const std::string& attr = html_attributes_[i].first; |
| 275 if (LowerCaseEqualsASCII(attr, html_attr)) { | 416 if (LowerCaseEqualsASCII(attr, html_attr)) { |
| 276 *value = html_attributes_[i].second; | 417 *value = html_attributes_[i].second; |
| 277 return true; | 418 return true; |
| 278 } | 419 } |
| 279 } | 420 } |
| 280 | 421 |
| 281 return false; | 422 return false; |
| 282 } | 423 } |
| 283 | 424 |
| 425 bool BrowserAccessibility::GetHtmlAttribute( |
| 426 const char* html_attr, string16* value) const { |
| 427 std::string value_utf8; |
| 428 if (!GetHtmlAttribute(html_attr, &value_utf8)) |
| 429 return false; |
| 430 *value = UTF8ToUTF16(value_utf8); |
| 431 return true; |
| 432 } |
| 433 |
| 284 bool BrowserAccessibility::GetAriaTristate( | 434 bool BrowserAccessibility::GetAriaTristate( |
| 285 const char* html_attr, | 435 const char* html_attr, |
| 286 bool* is_defined, | 436 bool* is_defined, |
| 287 bool* is_mixed) const { | 437 bool* is_mixed) const { |
| 288 *is_defined = false; | 438 *is_defined = false; |
| 289 *is_mixed = false; | 439 *is_mixed = false; |
| 290 | 440 |
| 291 string16 value; | 441 string16 value; |
| 292 if (!GetHtmlAttribute(html_attr, &value) || | 442 if (!GetHtmlAttribute(html_attr, &value) || |
| 293 value.empty() || | 443 value.empty() || |
| (...skipping 26 matching lines...) Expand all Loading... |
| 320 } | 470 } |
| 321 | 471 |
| 322 // Note: STATE_READONLY being false means it's either a text control, | 472 // Note: STATE_READONLY being false means it's either a text control, |
| 323 // or contenteditable. We also check for editable text roles to cover | 473 // or contenteditable. We also check for editable text roles to cover |
| 324 // another element that has role=textbox set on it. | 474 // another element that has role=textbox set on it. |
| 325 return (!HasState(AccessibilityNodeData::STATE_READONLY) || | 475 return (!HasState(AccessibilityNodeData::STATE_READONLY) || |
| 326 role_ == AccessibilityNodeData::ROLE_TEXT_FIELD || | 476 role_ == AccessibilityNodeData::ROLE_TEXT_FIELD || |
| 327 role_ == AccessibilityNodeData::ROLE_TEXTAREA); | 477 role_ == AccessibilityNodeData::ROLE_TEXTAREA); |
| 328 } | 478 } |
| 329 | 479 |
| 330 string16 BrowserAccessibility::GetTextRecursive() const { | 480 std::string BrowserAccessibility::GetTextRecursive() const { |
| 331 if (!name_.empty()) { | 481 if (!name_.empty()) { |
| 332 return name_; | 482 return name_; |
| 333 } | 483 } |
| 334 | 484 |
| 335 string16 result; | 485 std::string result; |
| 336 for (size_t i = 0; i < children_.size(); ++i) | 486 for (size_t i = 0; i < children_.size(); ++i) |
| 337 result += children_[i]->GetTextRecursive(); | 487 result += children_[i]->GetTextRecursive(); |
| 338 return result; | 488 return result; |
| 339 } | 489 } |
| 340 | 490 |
| 341 } // namespace content | 491 } // namespace content |
| OLD | NEW |