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

Side by Side Diff: third_party/WebKit/Source/modules/accessibility/AXObject.cpp

Issue 2805493002: Boolean properties for Accessibility Object Model Phase 1 (Closed)
Patch Set: Address feedback Created 3 years, 8 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 /* 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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698