| 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 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 case kSpinButtonRole: | 591 case kSpinButtonRole: |
| 592 case kTabRole: | 592 case kTabRole: |
| 593 case kTextFieldRole: | 593 case kTextFieldRole: |
| 594 case kToggleButtonRole: | 594 case kToggleButtonRole: |
| 595 return true; | 595 return true; |
| 596 default: | 596 default: |
| 597 return false; | 597 return false; |
| 598 } | 598 } |
| 599 } | 599 } |
| 600 | 600 |
| 601 bool AXObjectImpl::AccessibilityIsIgnored() { | 601 bool AXObjectImpl::AccessibilityIsIgnored() const { |
| 602 Node* node = GetNode(); | |
| 603 if (!node) { | |
| 604 AXObjectImpl* parent = this->ParentObject(); | |
| 605 while (!node && parent) { | |
| 606 node = parent->GetNode(); | |
| 607 parent = parent->ParentObject(); | |
| 608 } | |
| 609 } | |
| 610 | |
| 611 if (node) | |
| 612 node->UpdateDistribution(); | |
| 613 | |
| 614 // TODO(aboxhall): Instead of this, propagate inert down through frames | |
| 615 Document* document = GetDocument(); | |
| 616 while (document && document->LocalOwner()) { | |
| 617 document->LocalOwner()->UpdateDistribution(); | |
| 618 document = document->LocalOwner()->ownerDocument(); | |
| 619 } | |
| 620 | |
| 621 UpdateCachedAttributeValuesIfNeeded(); | 602 UpdateCachedAttributeValuesIfNeeded(); |
| 622 return cached_is_ignored_; | 603 return cached_is_ignored_; |
| 623 } | 604 } |
| 624 | 605 |
| 625 void AXObjectImpl::UpdateCachedAttributeValuesIfNeeded() const { | 606 void AXObjectImpl::UpdateCachedAttributeValuesIfNeeded() const { |
| 626 if (IsDetached()) | 607 if (IsDetached()) |
| 627 return; | 608 return; |
| 628 | 609 |
| 629 AXObjectCacheImpl& cache = AxObjectCache(); | 610 AXObjectCacheImpl& cache = AxObjectCache(); |
| 630 | 611 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 692 if (GetNode()) { | 673 if (GetNode()) { |
| 693 if (GetNode()->IsInert()) { | 674 if (GetNode()->IsInert()) { |
| 694 if (ignored_reasons) { | 675 if (ignored_reasons) { |
| 695 HTMLDialogElement* dialog = GetActiveDialogElement(GetNode()); | 676 HTMLDialogElement* dialog = GetActiveDialogElement(GetNode()); |
| 696 if (dialog) { | 677 if (dialog) { |
| 697 AXObjectImpl* dialog_object = AxObjectCache().GetOrCreate(dialog); | 678 AXObjectImpl* dialog_object = AxObjectCache().GetOrCreate(dialog); |
| 698 if (dialog_object) { | 679 if (dialog_object) { |
| 699 ignored_reasons->push_back( | 680 ignored_reasons->push_back( |
| 700 IgnoredReason(kAXActiveModalDialog, dialog_object)); | 681 IgnoredReason(kAXActiveModalDialog, dialog_object)); |
| 701 } else { | 682 } else { |
| 702 ignored_reasons->push_back(IgnoredReason(kAXInertElement)); | 683 ignored_reasons->push_back(IgnoredReason(kAXInert)); |
| 703 } | 684 } |
| 704 } else { | 685 } else { |
| 705 const AXObjectImpl* inert_root_el = InertRoot(); | 686 // TODO(aboxhall): handle inert attribute if it eventuates |
| 706 if (inert_root_el == this) { | 687 ignored_reasons->push_back(IgnoredReason(kAXInert)); |
| 707 ignored_reasons->push_back(IgnoredReason(kAXInertElement)); | |
| 708 } else { | |
| 709 ignored_reasons->push_back( | |
| 710 IgnoredReason(kAXInertSubtree, inert_root_el)); | |
| 711 } | |
| 712 } | 688 } |
| 713 } | 689 } |
| 714 return true; | 690 return true; |
| 715 } | 691 } |
| 716 } else { | 692 } else { |
| 717 AXObjectImpl* parent = ParentObject(); | 693 AXObjectImpl* parent = ParentObject(); |
| 718 if (parent && parent->IsInertOrAriaHidden()) { | 694 if (parent && parent->IsInertOrAriaHidden()) { |
| 719 if (ignored_reasons) | 695 if (ignored_reasons) |
| 720 parent->ComputeIsInertOrAriaHidden(ignored_reasons); | 696 parent->ComputeIsInertOrAriaHidden(ignored_reasons); |
| 721 return true; | 697 return true; |
| 722 } | 698 } |
| 723 } | 699 } |
| 724 | 700 |
| 725 const AXObjectImpl* hidden_root = AriaHiddenRoot(); | 701 const AXObjectImpl* hidden_root = AriaHiddenRoot(); |
| 726 if (hidden_root) { | 702 if (hidden_root) { |
| 727 if (ignored_reasons) { | 703 if (ignored_reasons) { |
| 728 if (hidden_root == this) { | 704 if (hidden_root == this) { |
| 729 ignored_reasons->push_back(IgnoredReason(kAXAriaHiddenElement)); | 705 ignored_reasons->push_back(IgnoredReason(kAXAriaHidden)); |
| 730 } else { | 706 } else { |
| 731 ignored_reasons->push_back( | 707 ignored_reasons->push_back( |
| 732 IgnoredReason(kAXAriaHiddenSubtree, hidden_root)); | 708 IgnoredReason(kAXAriaHiddenRoot, hidden_root)); |
| 733 } | 709 } |
| 734 } | 710 } |
| 735 return true; | 711 return true; |
| 736 } | 712 } |
| 737 | 713 |
| 738 return false; | 714 return false; |
| 739 } | 715 } |
| 740 | 716 |
| 741 bool AXObjectImpl::IsDescendantOfLeafNode() const { | 717 bool AXObjectImpl::IsDescendantOfLeafNode() const { |
| 742 UpdateCachedAttributeValuesIfNeeded(); | 718 UpdateCachedAttributeValuesIfNeeded(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 757 const AXObjectImpl* AXObjectImpl::AriaHiddenRoot() const { | 733 const AXObjectImpl* AXObjectImpl::AriaHiddenRoot() const { |
| 758 for (const AXObjectImpl* object = this; object; | 734 for (const AXObjectImpl* object = this; object; |
| 759 object = object->ParentObject()) { | 735 object = object->ParentObject()) { |
| 760 if (object->AOMPropertyOrARIAAttributeIsTrue(AOMBooleanProperty::kHidden)) | 736 if (object->AOMPropertyOrARIAAttributeIsTrue(AOMBooleanProperty::kHidden)) |
| 761 return object; | 737 return object; |
| 762 } | 738 } |
| 763 | 739 |
| 764 return 0; | 740 return 0; |
| 765 } | 741 } |
| 766 | 742 |
| 767 const AXObjectImpl* AXObjectImpl::InertRoot() const { | |
| 768 const AXObjectImpl* object = this; | |
| 769 if (!RuntimeEnabledFeatures::inertAttributeEnabled()) | |
| 770 return 0; | |
| 771 | |
| 772 while (object && !object->IsAXNodeObject()) | |
| 773 object = object->ParentObject(); | |
| 774 Node* node = object->GetNode(); | |
| 775 Element* element = node->IsElementNode() | |
| 776 ? ToElement(node) | |
| 777 : FlatTreeTraversal::ParentElement(*node); | |
| 778 while (element) { | |
| 779 if (element->hasAttribute(inertAttr)) | |
| 780 return AxObjectCache().GetOrCreate(element); | |
| 781 element = FlatTreeTraversal::ParentElement(*element); | |
| 782 } | |
| 783 | |
| 784 return 0; | |
| 785 } | |
| 786 | |
| 787 bool AXObjectImpl::IsDescendantOfDisabledNode() const { | 743 bool AXObjectImpl::IsDescendantOfDisabledNode() const { |
| 788 UpdateCachedAttributeValuesIfNeeded(); | 744 UpdateCachedAttributeValuesIfNeeded(); |
| 789 return cached_is_descendant_of_disabled_node_; | 745 return cached_is_descendant_of_disabled_node_; |
| 790 } | 746 } |
| 791 | 747 |
| 792 const AXObjectImpl* AXObjectImpl::DisabledAncestor() const { | 748 const AXObjectImpl* AXObjectImpl::DisabledAncestor() const { |
| 793 bool disabled = false; | 749 bool disabled = false; |
| 794 if (HasAOMPropertyOrARIAAttribute(AOMBooleanProperty::kDisabled, disabled)) { | 750 if (HasAOMPropertyOrARIAAttribute(AOMBooleanProperty::kDisabled, disabled)) { |
| 795 if (disabled) | 751 if (disabled) |
| 796 return this; | 752 return this; |
| (...skipping 1305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2102 } | 2058 } |
| 2103 | 2059 |
| 2104 DEFINE_TRACE(AXObjectImpl) { | 2060 DEFINE_TRACE(AXObjectImpl) { |
| 2105 visitor->Trace(children_); | 2061 visitor->Trace(children_); |
| 2106 visitor->Trace(parent_); | 2062 visitor->Trace(parent_); |
| 2107 visitor->Trace(cached_live_region_root_); | 2063 visitor->Trace(cached_live_region_root_); |
| 2108 visitor->Trace(ax_object_cache_); | 2064 visitor->Trace(ax_object_cache_); |
| 2109 } | 2065 } |
| 2110 | 2066 |
| 2111 } // namespace blink | 2067 } // namespace blink |
| OLD | NEW |