| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright (C) 2008, 2009, 2011 Apple Inc. All rights reserved. | 2  * Copyright (C) 2008, 2009, 2011 Apple Inc. All rights reserved. | 
| 3  * | 3  * | 
| 4  * Redistribution and use in source and binary forms, with or without | 4  * Redistribution and use in source and binary forms, with or without | 
| 5  * modification, are permitted provided that the following conditions | 5  * modification, are permitted provided that the following conditions | 
| 6  * are met: | 6  * are met: | 
| 7  * | 7  * | 
| 8  * 1.  Redistributions of source code must retain the above copyright | 8  * 1.  Redistributions of source code must retain the above copyright | 
| 9  *     notice, this list of conditions and the following disclaimer. | 9  *     notice, this list of conditions and the following disclaimer. | 
| 10  * 2.  Redistributions in binary form must reproduce the above copyright | 10  * 2.  Redistributions in binary form must reproduce the above copyright | 
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 378 | 378 | 
| 379   ax_object_cache_ = nullptr; | 379   ax_object_cache_ = nullptr; | 
| 380 } | 380 } | 
| 381 | 381 | 
| 382 bool AXObject::IsDetached() const { | 382 bool AXObject::IsDetached() const { | 
| 383   return !ax_object_cache_; | 383   return !ax_object_cache_; | 
| 384 } | 384 } | 
| 385 | 385 | 
| 386 const AtomicString& AXObject::GetAOMPropertyOrARIAAttribute( | 386 const AtomicString& AXObject::GetAOMPropertyOrARIAAttribute( | 
| 387     AOMStringProperty property) const { | 387     AOMStringProperty property) const { | 
| 388   Node* node = this->GetNode(); | 388   if (Element* element = this->GetElement()) | 
| 389   if (!node || !node->IsElementNode()) | 389     return AccessibleNode::GetProperty(element, property); | 
| 390     return g_null_atom; | 390   return g_null_atom; | 
|  | 391 } | 
| 391 | 392 | 
| 392   return AccessibleNode::GetProperty(ToElement(node), property); | 393 bool AXObject::HasAOMPropertyOrARIAAttribute(AOMBooleanProperty property, | 
|  | 394                                              bool& result) const { | 
|  | 395   Element* element = this->GetElement(); | 
|  | 396   if (!element) | 
|  | 397     return false; | 
|  | 398 | 
|  | 399   bool is_null = true; | 
|  | 400   result = AccessibleNode::GetProperty(element, property, is_null); | 
|  | 401   return !is_null; | 
|  | 402 } | 
|  | 403 | 
|  | 404 bool AXObject::AOMPropertyOrARIAAttributeIsTrue( | 
|  | 405     AOMBooleanProperty property) const { | 
|  | 406   bool result; | 
|  | 407   if (HasAOMPropertyOrARIAAttribute(property, result)) | 
|  | 408     return result; | 
|  | 409   return false; | 
|  | 410 } | 
|  | 411 | 
|  | 412 bool AXObject::AOMPropertyOrARIAAttributeIsFalse( | 
|  | 413     AOMBooleanProperty property) const { | 
|  | 414   bool result; | 
|  | 415   if (HasAOMPropertyOrARIAAttribute(property, result)) | 
|  | 416     return !result; | 
|  | 417   return false; | 
| 393 } | 418 } | 
| 394 | 419 | 
| 395 bool AXObject::IsARIATextControl() const { | 420 bool AXObject::IsARIATextControl() const { | 
| 396   return AriaRoleAttribute() == kTextFieldRole || | 421   return AriaRoleAttribute() == kTextFieldRole || | 
| 397          AriaRoleAttribute() == kSearchBoxRole || | 422          AriaRoleAttribute() == kSearchBoxRole || | 
| 398          AriaRoleAttribute() == kComboBoxRole; | 423          AriaRoleAttribute() == kComboBoxRole; | 
| 399 } | 424 } | 
| 400 | 425 | 
| 401 bool AXObject::IsButton() const { | 426 bool AXObject::IsButton() const { | 
| 402   AccessibilityRole role = RoleValue(); | 427   AccessibilityRole role = RoleValue(); | 
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 560   cached_live_region_root_ = | 585   cached_live_region_root_ = | 
| 561       IsLiveRegion() | 586       IsLiveRegion() | 
| 562           ? const_cast<AXObject*>(this) | 587           ? const_cast<AXObject*>(this) | 
| 563           : (ParentObjectIfExists() ? ParentObjectIfExists()->LiveRegionRoot() | 588           : (ParentObjectIfExists() ? ParentObjectIfExists()->LiveRegionRoot() | 
| 564                                     : 0); | 589                                     : 0); | 
| 565   cached_ancestor_exposes_active_descendant_ = | 590   cached_ancestor_exposes_active_descendant_ = | 
| 566       ComputeAncestorExposesActiveDescendant(); | 591       ComputeAncestorExposesActiveDescendant(); | 
| 567 } | 592 } | 
| 568 | 593 | 
| 569 bool AXObject::AccessibilityIsIgnoredByDefault( | 594 bool AXObject::AccessibilityIsIgnoredByDefault( | 
| 570     IgnoredReasons* ignored_reasons) const { | 595     IgnoredReasons* ignoredReasons) const { | 
| 571   return DefaultObjectInclusion(ignored_reasons) == kIgnoreObject; | 596   return DefaultObjectInclusion(ignoredReasons) == kIgnoreObject; | 
| 572 } | 597 } | 
| 573 | 598 | 
| 574 AXObjectInclusion AXObject::AccessibilityPlatformIncludesObject() const { | 599 AXObjectInclusion AXObject::AccessibilityPlatformIncludesObject() const { | 
| 575   if (IsMenuListPopup() || IsMenuListOption()) | 600   if (IsMenuListPopup() || IsMenuListOption()) | 
| 576     return kIncludeObject; | 601     return kIncludeObject; | 
| 577 | 602 | 
| 578   return kDefaultBehavior; | 603   return kDefaultBehavior; | 
| 579 } | 604 } | 
| 580 | 605 | 
| 581 AXObjectInclusion AXObject::DefaultObjectInclusion( | 606 AXObjectInclusion AXObject::DefaultObjectInclusion( | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 597 | 622 | 
| 598   return AccessibilityPlatformIncludesObject(); | 623   return AccessibilityPlatformIncludesObject(); | 
| 599 } | 624 } | 
| 600 | 625 | 
| 601 bool AXObject::IsInertOrAriaHidden() const { | 626 bool AXObject::IsInertOrAriaHidden() const { | 
| 602   UpdateCachedAttributeValuesIfNeeded(); | 627   UpdateCachedAttributeValuesIfNeeded(); | 
| 603   return cached_is_inert_or_aria_hidden_; | 628   return cached_is_inert_or_aria_hidden_; | 
| 604 } | 629 } | 
| 605 | 630 | 
| 606 bool AXObject::ComputeIsInertOrAriaHidden( | 631 bool AXObject::ComputeIsInertOrAriaHidden( | 
| 607     IgnoredReasons* ignored_reasons) const { | 632     IgnoredReasons* ignoredReasons) const { | 
| 608   if (GetNode()) { | 633   if (GetNode()) { | 
| 609     if (GetNode()->IsInert()) { | 634     if (GetNode()->IsInert()) { | 
| 610       if (ignored_reasons) { | 635       if (ignoredReasons) { | 
| 611         HTMLDialogElement* dialog = GetActiveDialogElement(GetNode()); | 636         HTMLDialogElement* dialog = GetActiveDialogElement(GetNode()); | 
| 612         if (dialog) { | 637         if (dialog) { | 
| 613           AXObject* dialog_object = AxObjectCache().GetOrCreate(dialog); | 638           AXObject* dialog_object = AxObjectCache().GetOrCreate(dialog); | 
| 614           if (dialog_object) | 639           if (dialog_object) | 
| 615             ignored_reasons->push_back( | 640             ignoredReasons->push_back( | 
| 616                 IgnoredReason(kAXActiveModalDialog, dialog_object)); | 641                 IgnoredReason(kAXActiveModalDialog, dialog_object)); | 
| 617           else | 642           else | 
| 618             ignored_reasons->push_back(IgnoredReason(kAXInert)); | 643             ignoredReasons->push_back(IgnoredReason(kAXInert)); | 
| 619         } else { | 644         } else { | 
| 620           // TODO(aboxhall): handle inert attribute if it eventuates | 645           // TODO(aboxhall): handle inert attribute if it eventuates | 
| 621           ignored_reasons->push_back(IgnoredReason(kAXInert)); | 646           ignoredReasons->push_back(IgnoredReason(kAXInert)); | 
| 622         } | 647         } | 
| 623       } | 648       } | 
| 624       return true; | 649       return true; | 
| 625     } | 650     } | 
| 626   } else { | 651   } else { | 
| 627     AXObject* parent = ParentObject(); | 652     AXObject* parent = ParentObject(); | 
| 628     if (parent && parent->IsInertOrAriaHidden()) { | 653     if (parent && parent->IsInertOrAriaHidden()) { | 
| 629       if (ignored_reasons) | 654       if (ignoredReasons) | 
| 630         parent->ComputeIsInertOrAriaHidden(ignored_reasons); | 655         parent->ComputeIsInertOrAriaHidden(ignoredReasons); | 
| 631       return true; | 656       return true; | 
| 632     } | 657     } | 
| 633   } | 658   } | 
| 634 | 659 | 
| 635   const AXObject* hidden_root = AriaHiddenRoot(); | 660   const AXObject* hidden_root = AriaHiddenRoot(); | 
| 636   if (hidden_root) { | 661   if (hidden_root) { | 
| 637     if (ignored_reasons) { | 662     if (ignoredReasons) { | 
| 638       if (hidden_root == this) | 663       if (hidden_root == this) | 
| 639         ignored_reasons->push_back(IgnoredReason(kAXAriaHidden)); | 664         ignoredReasons->push_back(IgnoredReason(kAXAriaHidden)); | 
| 640       else | 665       else | 
| 641         ignored_reasons->push_back( | 666         ignoredReasons->push_back( | 
| 642             IgnoredReason(kAXAriaHiddenRoot, hidden_root)); | 667             IgnoredReason(kAXAriaHiddenRoot, hidden_root)); | 
| 643     } | 668     } | 
| 644     return true; | 669     return true; | 
| 645   } | 670   } | 
| 646 | 671 | 
| 647   return false; | 672   return false; | 
| 648 } | 673 } | 
| 649 | 674 | 
| 650 bool AXObject::IsDescendantOfLeafNode() const { | 675 bool AXObject::IsDescendantOfLeafNode() const { | 
| 651   UpdateCachedAttributeValuesIfNeeded(); | 676   UpdateCachedAttributeValuesIfNeeded(); | 
| 652   return cached_is_descendant_of_leaf_node_; | 677   return cached_is_descendant_of_leaf_node_; | 
| 653 } | 678 } | 
| 654 | 679 | 
| 655 AXObject* AXObject::LeafNodeAncestor() const { | 680 AXObject* AXObject::LeafNodeAncestor() const { | 
| 656   if (AXObject* parent = ParentObject()) { | 681   if (AXObject* parent = ParentObject()) { | 
| 657     if (!parent->CanHaveChildren()) | 682     if (!parent->CanHaveChildren()) | 
| 658       return parent; | 683       return parent; | 
| 659 | 684 | 
| 660     return parent->LeafNodeAncestor(); | 685     return parent->LeafNodeAncestor(); | 
| 661   } | 686   } | 
| 662 | 687 | 
| 663   return 0; | 688   return 0; | 
| 664 } | 689 } | 
| 665 | 690 | 
| 666 const AXObject* AXObject::AriaHiddenRoot() const { | 691 const AXObject* AXObject::AriaHiddenRoot() const { | 
| 667   for (const AXObject* object = this; object; object = object->ParentObject()) { | 692   for (const AXObject* object = this; object; object = object->ParentObject()) { | 
| 668     if (EqualIgnoringASCIICase(object->GetAttribute(aria_hiddenAttr), "true")) | 693     if (object->AOMPropertyOrARIAAttributeIsTrue(AOMBooleanProperty::kHidden)) | 
| 669       return object; | 694       return object; | 
| 670   } | 695   } | 
| 671 | 696 | 
| 672   return 0; | 697   return 0; | 
| 673 } | 698 } | 
| 674 | 699 | 
| 675 bool AXObject::IsDescendantOfDisabledNode() const { | 700 bool AXObject::IsDescendantOfDisabledNode() const { | 
| 676   UpdateCachedAttributeValuesIfNeeded(); | 701   UpdateCachedAttributeValuesIfNeeded(); | 
| 677   return cached_is_descendant_of_disabled_node_; | 702   return cached_is_descendant_of_disabled_node_; | 
| 678 } | 703 } | 
| 679 | 704 | 
| 680 const AXObject* AXObject::DisabledAncestor() const { | 705 const AXObject* AXObject::DisabledAncestor() const { | 
| 681   const AtomicString& disabled = GetAttribute(aria_disabledAttr); | 706   bool disabled = false; | 
| 682   if (EqualIgnoringASCIICase(disabled, "true")) | 707   if (HasAOMPropertyOrARIAAttribute(AOMBooleanProperty::kDisabled, disabled)) { | 
| 683     return this; | 708     if (disabled) | 
| 684   if (EqualIgnoringASCIICase(disabled, "false")) | 709       return this; | 
| 685     return 0; | 710     return nullptr; | 
|  | 711   } | 
| 686 | 712 | 
| 687   if (AXObject* parent = ParentObject()) | 713   if (AXObject* parent = ParentObject()) | 
| 688     return parent->DisabledAncestor(); | 714     return parent->DisabledAncestor(); | 
| 689 | 715 | 
| 690   return 0; | 716   return nullptr; | 
| 691 } | 717 } | 
| 692 | 718 | 
| 693 bool AXObject::LastKnownIsIgnoredValue() { | 719 bool AXObject::LastKnownIsIgnoredValue() { | 
| 694   if (last_known_is_ignored_value_ == kDefaultBehavior) | 720   if (last_known_is_ignored_value_ == kDefaultBehavior) | 
| 695     last_known_is_ignored_value_ = | 721     last_known_is_ignored_value_ = | 
| 696         AccessibilityIsIgnored() ? kIgnoreObject : kIncludeObject; | 722         AccessibilityIsIgnored() ? kIgnoreObject : kIncludeObject; | 
| 697 | 723 | 
| 698   return last_known_is_ignored_value_ == kIgnoreObject; | 724   return last_known_is_ignored_value_ == kIgnoreObject; | 
| 699 } | 725 } | 
| 700 | 726 | 
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 785                                           AXObjectSet& visited) { | 811                                           AXObjectSet& visited) { | 
| 786   if (visited.Contains(&ax_obj) && !in_aria_labelled_by_traversal) | 812   if (visited.Contains(&ax_obj) && !in_aria_labelled_by_traversal) | 
| 787     return String(); | 813     return String(); | 
| 788 | 814 | 
| 789   AXNameFrom tmp_name_from; | 815   AXNameFrom tmp_name_from; | 
| 790   return ax_obj.TextAlternative(true, in_aria_labelled_by_traversal, visited, | 816   return ax_obj.TextAlternative(true, in_aria_labelled_by_traversal, visited, | 
| 791                                 tmp_name_from, nullptr, nullptr); | 817                                 tmp_name_from, nullptr, nullptr); | 
| 792 } | 818 } | 
| 793 | 819 | 
| 794 bool AXObject::IsHiddenForTextAlternativeCalculation() const { | 820 bool AXObject::IsHiddenForTextAlternativeCalculation() const { | 
| 795   if (EqualIgnoringASCIICase(GetAttribute(aria_hiddenAttr), "false")) | 821   if (AOMPropertyOrARIAAttributeIsFalse(AOMBooleanProperty::kHidden)) | 
| 796     return false; | 822     return false; | 
| 797 | 823 | 
| 798   if (GetLayoutObject()) | 824   if (GetLayoutObject()) | 
| 799     return GetLayoutObject()->Style()->Visibility() != EVisibility::kVisible; | 825     return GetLayoutObject()->Style()->Visibility() != EVisibility::kVisible; | 
| 800 | 826 | 
| 801   // This is an obscure corner case: if a node has no LayoutObject, that means | 827   // This is an obscure corner case: if a node has no LayoutObject, that means | 
| 802   // it's not rendered, but we still may be exploring it as part of a text | 828   // it's not rendered, but we still may be exploring it as part of a text | 
| 803   // alternative calculation, for example if it was explicitly referenced by | 829   // alternative calculation, for example if it was explicitly referenced by | 
| 804   // aria-labelledby. So we need to explicitly call the style resolver to check | 830   // aria-labelledby. So we need to explicitly call the style resolver to check | 
| 805   // whether it's invisible or display:none, rather than relying on the style | 831   // whether it's invisible or display:none, rather than relying on the style | 
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 931   } | 957   } | 
| 932   if (!found_valid_element) | 958   if (!found_valid_element) | 
| 933     return String(); | 959     return String(); | 
| 934   if (related_objects) | 960   if (related_objects) | 
| 935     *related_objects = local_related_objects; | 961     *related_objects = local_related_objects; | 
| 936   return accumulated_text.ToString(); | 962   return accumulated_text.ToString(); | 
| 937 } | 963 } | 
| 938 | 964 | 
| 939 void AXObject::TokenVectorFromAttribute(Vector<String>& tokens, | 965 void AXObject::TokenVectorFromAttribute(Vector<String>& tokens, | 
| 940                                         const QualifiedName& attribute) const { | 966                                         const QualifiedName& attribute) const { | 
| 941   Node* node = this->GetNode(); |  | 
| 942   if (!node || !node->IsElementNode()) |  | 
| 943     return; |  | 
| 944 |  | 
| 945   String attribute_value = GetAttribute(attribute).GetString(); | 967   String attribute_value = GetAttribute(attribute).GetString(); | 
| 946   if (attribute_value.IsEmpty()) | 968   if (attribute_value.IsEmpty()) | 
| 947     return; | 969     return; | 
| 948 | 970 | 
| 949   attribute_value.SimplifyWhiteSpace(); | 971   attribute_value.SimplifyWhiteSpace(); | 
| 950   attribute_value.Split(' ', tokens); | 972   attribute_value.Split(' ', tokens); | 
| 951 } | 973 } | 
| 952 | 974 | 
| 953 void AXObject::ElementsFromAttribute(HeapVector<Member<Element>>& elements, | 975 void AXObject::ElementsFromAttribute(HeapVector<Member<Element>>& elements, | 
| 954                                      const QualifiedName& attribute) const { | 976                                      const QualifiedName& attribute) const { | 
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1031 | 1053 | 
| 1032   if (isHTMLTextAreaElement(*node)) | 1054   if (isHTMLTextAreaElement(*node)) | 
| 1033     return true; | 1055     return true; | 
| 1034 | 1056 | 
| 1035   if (HasEditableStyle(*node)) | 1057   if (HasEditableStyle(*node)) | 
| 1036     return true; | 1058     return true; | 
| 1037 | 1059 | 
| 1038   if (!IsNativeTextControl() && !IsNonNativeTextControl()) | 1060   if (!IsNativeTextControl() && !IsNonNativeTextControl()) | 
| 1039     return false; | 1061     return false; | 
| 1040 | 1062 | 
| 1041   return EqualIgnoringASCIICase(GetAttribute(aria_multilineAttr), "true"); | 1063   return AOMPropertyOrARIAAttributeIsTrue(AOMBooleanProperty::kMultiline); | 
| 1042 } | 1064 } | 
| 1043 | 1065 | 
| 1044 bool AXObject::AriaPressedIsPresent() const { | 1066 bool AXObject::AriaPressedIsPresent() const { | 
| 1045   return !GetAttribute(aria_pressedAttr).IsEmpty(); | 1067   return !GetAttribute(aria_pressedAttr).IsEmpty(); | 
| 1046 } | 1068 } | 
| 1047 | 1069 | 
| 1048 bool AXObject::SupportsActiveDescendant() const { | 1070 bool AXObject::SupportsActiveDescendant() const { | 
| 1049   // According to the ARIA Spec, all ARIA composite widgets, ARIA text boxes | 1071   // According to the ARIA Spec, all ARIA composite widgets, ARIA text boxes | 
| 1050   // and ARIA groups should be able to expose an active descendant. | 1072   // and ARIA groups should be able to expose an active descendant. | 
| 1051   // Implicitly, <input> and <textarea> elements should also have this ability. | 1073   // Implicitly, <input> and <textarea> elements should also have this ability. | 
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1208 | 1230 | 
| 1209 void AXObject::ClearChildren() { | 1231 void AXObject::ClearChildren() { | 
| 1210   // Detach all weak pointers from objects to their parents. | 1232   // Detach all weak pointers from objects to their parents. | 
| 1211   for (const auto& child : children_) | 1233   for (const auto& child : children_) | 
| 1212     child->DetachFromParent(); | 1234     child->DetachFromParent(); | 
| 1213 | 1235 | 
| 1214   children_.clear(); | 1236   children_.clear(); | 
| 1215   have_children_ = false; | 1237   have_children_ = false; | 
| 1216 } | 1238 } | 
| 1217 | 1239 | 
|  | 1240 Element* AXObject::GetElement() const { | 
|  | 1241   Node* node = GetNode(); | 
|  | 1242   return node && node->IsElementNode() ? ToElement(node) : nullptr; | 
|  | 1243 } | 
|  | 1244 | 
| 1218 Document* AXObject::GetDocument() const { | 1245 Document* AXObject::GetDocument() const { | 
| 1219   FrameView* frame_view = DocumentFrameView(); | 1246   FrameView* frame_view = DocumentFrameView(); | 
| 1220   if (!frame_view) | 1247   if (!frame_view) | 
| 1221     return 0; | 1248     return 0; | 
| 1222 | 1249 | 
| 1223   return frame_view->GetFrame().GetDocument(); | 1250   return frame_view->GetFrame().GetDocument(); | 
| 1224 } | 1251 } | 
| 1225 | 1252 | 
| 1226 FrameView* AXObject::DocumentFrameView() const { | 1253 FrameView* AXObject::DocumentFrameView() const { | 
| 1227   const AXObject* object = this; | 1254   const AXObject* object = this; | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 1247     Document* doc = GetDocument(); | 1274     Document* doc = GetDocument(); | 
| 1248     if (doc) | 1275     if (doc) | 
| 1249       return doc->ContentLanguage(); | 1276       return doc->ContentLanguage(); | 
| 1250     return g_null_atom; | 1277     return g_null_atom; | 
| 1251   } | 1278   } | 
| 1252 | 1279 | 
| 1253   return parent->Language(); | 1280   return parent->Language(); | 
| 1254 } | 1281 } | 
| 1255 | 1282 | 
| 1256 bool AXObject::HasAttribute(const QualifiedName& attribute) const { | 1283 bool AXObject::HasAttribute(const QualifiedName& attribute) const { | 
| 1257   Node* element_node = GetNode(); | 1284   if (Element* element = GetElement()) | 
| 1258   if (!element_node) | 1285     return element->FastHasAttribute(attribute); | 
| 1259     return false; | 1286   return false; | 
| 1260 |  | 
| 1261   if (!element_node->IsElementNode()) |  | 
| 1262     return false; |  | 
| 1263 |  | 
| 1264   Element* element = ToElement(element_node); |  | 
| 1265   return element->FastHasAttribute(attribute); |  | 
| 1266 } | 1287 } | 
| 1267 | 1288 | 
| 1268 const AtomicString& AXObject::GetAttribute( | 1289 const AtomicString& AXObject::GetAttribute( | 
| 1269     const QualifiedName& attribute) const { | 1290     const QualifiedName& attribute) const { | 
| 1270   Node* element_node = GetNode(); | 1291   if (Element* element = GetElement()) | 
| 1271   if (!element_node) | 1292     return element->FastGetAttribute(attribute); | 
| 1272     return g_null_atom; | 1293   return g_null_atom; | 
| 1273 |  | 
| 1274   if (!element_node->IsElementNode()) |  | 
| 1275     return g_null_atom; |  | 
| 1276 |  | 
| 1277   Element* element = ToElement(element_node); |  | 
| 1278   return element->FastGetAttribute(attribute); |  | 
| 1279 } | 1294 } | 
| 1280 | 1295 | 
| 1281 // | 1296 // | 
| 1282 // Scrollable containers. | 1297 // Scrollable containers. | 
| 1283 // | 1298 // | 
| 1284 | 1299 | 
| 1285 bool AXObject::IsScrollableContainer() const { | 1300 bool AXObject::IsScrollableContainer() const { | 
| 1286   return !!GetScrollableAreaIfScrollable(); | 1301   return !!GetScrollableAreaIfScrollable(); | 
| 1287 } | 1302 } | 
| 1288 | 1303 | 
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1713     previous_position = current_position; | 1728     previous_position = current_position; | 
| 1714     current_position = PreviousLinePosition(current_position, LayoutUnit(), | 1729     current_position = PreviousLinePosition(current_position, LayoutUnit(), | 
| 1715                                             kHasEditableAXRole); | 1730                                             kHasEditableAXRole); | 
| 1716     ++line_count; | 1731     ++line_count; | 
| 1717   } while (current_position.IsNotNull() && | 1732   } while (current_position.IsNotNull() && | 
| 1718            !InSameLine(current_position, previous_position)); | 1733            !InSameLine(current_position, previous_position)); | 
| 1719 | 1734 | 
| 1720   return line_count; | 1735   return line_count; | 
| 1721 } | 1736 } | 
| 1722 | 1737 | 
| 1723 bool AXObject::IsARIAControl(AccessibilityRole aria_role) { | 1738 bool AXObject::IsARIAControl(AccessibilityRole ariaRole) { | 
| 1724   return IsARIAInput(aria_role) || aria_role == kButtonRole || | 1739   return IsARIAInput(ariaRole) || ariaRole == kButtonRole || | 
| 1725          aria_role == kComboBoxRole || aria_role == kSliderRole; | 1740          ariaRole == kComboBoxRole || ariaRole == kSliderRole; | 
| 1726 } | 1741 } | 
| 1727 | 1742 | 
| 1728 bool AXObject::IsARIAInput(AccessibilityRole aria_role) { | 1743 bool AXObject::IsARIAInput(AccessibilityRole ariaRole) { | 
| 1729   return aria_role == kRadioButtonRole || aria_role == kCheckBoxRole || | 1744   return ariaRole == kRadioButtonRole || ariaRole == kCheckBoxRole || | 
| 1730          aria_role == kTextFieldRole || aria_role == kSwitchRole || | 1745          ariaRole == kTextFieldRole || ariaRole == kSwitchRole || | 
| 1731          aria_role == kSearchBoxRole; | 1746          ariaRole == kSearchBoxRole; | 
| 1732 } | 1747 } | 
| 1733 | 1748 | 
| 1734 AccessibilityRole AXObject::AriaRoleToWebCoreRole(const String& value) { | 1749 AccessibilityRole AXObject::AriaRoleToWebCoreRole(const String& value) { | 
| 1735   DCHECK(!value.IsEmpty()); | 1750   DCHECK(!value.IsEmpty()); | 
| 1736 | 1751 | 
| 1737   static const ARIARoleMap* role_map = CreateARIARoleMap(); | 1752   static const ARIARoleMap* role_map = CreateARIARoleMap(); | 
| 1738 | 1753 | 
| 1739   Vector<String> role_vector; | 1754   Vector<String> role_vector; | 
| 1740   value.Split(' ', role_vector); | 1755   value.Split(' ', role_vector); | 
| 1741   AccessibilityRole role = kUnknownRole; | 1756   AccessibilityRole role = kUnknownRole; | 
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1820     case kTreeItemRole: | 1835     case kTreeItemRole: | 
| 1821     case kUserInterfaceTooltipRole: | 1836     case kUserInterfaceTooltipRole: | 
| 1822       return true; | 1837       return true; | 
| 1823     case kRowRole: { | 1838     case kRowRole: { | 
| 1824       // Spec says we should always expose the name on rows, | 1839       // Spec says we should always expose the name on rows, | 
| 1825       // but for performance reasons we only do it | 1840       // but for performance reasons we only do it | 
| 1826       // if the row might receive focus | 1841       // if the row might receive focus | 
| 1827       if (AncestorExposesActiveDescendant()) { | 1842       if (AncestorExposesActiveDescendant()) { | 
| 1828         return true; | 1843         return true; | 
| 1829       } | 1844       } | 
| 1830       const Node* node = this->GetNode(); | 1845       const Element* element = this->GetElement(); | 
| 1831       return node && node->IsElementNode() && ToElement(node)->IsFocusable(); | 1846       return element && element->IsFocusable(); | 
| 1832     } | 1847     } | 
| 1833     default: | 1848     default: | 
| 1834       return false; | 1849       return false; | 
| 1835   } | 1850   } | 
| 1836 } | 1851 } | 
| 1837 | 1852 | 
| 1838 AccessibilityRole AXObject::ButtonRoleType() const { | 1853 AccessibilityRole AXObject::ButtonRoleType() const { | 
| 1839   // If aria-pressed is present, then it should be exposed as a toggle button. | 1854   // If aria-pressed is present, then it should be exposed as a toggle button. | 
| 1840   // http://www.w3.org/TR/wai-aria/states_and_properties#aria-pressed | 1855   // http://www.w3.org/TR/wai-aria/states_and_properties#aria-pressed | 
| 1841   if (AriaPressedIsPresent()) | 1856   if (AriaPressedIsPresent()) | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
| 1862 } | 1877 } | 
| 1863 | 1878 | 
| 1864 DEFINE_TRACE(AXObject) { | 1879 DEFINE_TRACE(AXObject) { | 
| 1865   visitor->Trace(children_); | 1880   visitor->Trace(children_); | 
| 1866   visitor->Trace(parent_); | 1881   visitor->Trace(parent_); | 
| 1867   visitor->Trace(cached_live_region_root_); | 1882   visitor->Trace(cached_live_region_root_); | 
| 1868   visitor->Trace(ax_object_cache_); | 1883   visitor->Trace(ax_object_cache_); | 
| 1869 } | 1884 } | 
| 1870 | 1885 | 
| 1871 }  // namespace blink | 1886 }  // namespace blink | 
| OLD | NEW | 
|---|