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 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 case kSpinButtonRole: | 555 case kSpinButtonRole: |
556 case kTabRole: | 556 case kTabRole: |
557 case kTextFieldRole: | 557 case kTextFieldRole: |
558 case kToggleButtonRole: | 558 case kToggleButtonRole: |
559 return true; | 559 return true; |
560 default: | 560 default: |
561 return false; | 561 return false; |
562 } | 562 } |
563 } | 563 } |
564 | 564 |
565 bool AXObjectImpl::AccessibilityIsIgnored() const { | 565 bool AXObjectImpl::AccessibilityIsIgnored() { |
| 566 Node* node = GetNode(); |
| 567 if (!node) { |
| 568 AXObjectImpl* parent = this->ParentObject(); |
| 569 while (!node && parent) { |
| 570 node = parent->GetNode(); |
| 571 parent = parent->ParentObject(); |
| 572 } |
| 573 } |
| 574 |
| 575 if (node) |
| 576 node->UpdateDistribution(); |
| 577 |
| 578 // TODO(aboxhall): Instead of this, propagate inert down through frames |
| 579 Document* document = GetDocument(); |
| 580 while (document && document->LocalOwner()) { |
| 581 document->LocalOwner()->UpdateDistribution(); |
| 582 document = document->LocalOwner()->ownerDocument(); |
| 583 } |
| 584 |
566 UpdateCachedAttributeValuesIfNeeded(); | 585 UpdateCachedAttributeValuesIfNeeded(); |
567 return cached_is_ignored_; | 586 return cached_is_ignored_; |
568 } | 587 } |
569 | 588 |
570 void AXObjectImpl::UpdateCachedAttributeValuesIfNeeded() const { | 589 void AXObjectImpl::UpdateCachedAttributeValuesIfNeeded() const { |
571 if (IsDetached()) | 590 if (IsDetached()) |
572 return; | 591 return; |
573 | 592 |
574 AXObjectCacheImpl& cache = AxObjectCache(); | 593 AXObjectCacheImpl& cache = AxObjectCache(); |
575 | 594 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 if (GetNode()) { | 656 if (GetNode()) { |
638 if (GetNode()->IsInert()) { | 657 if (GetNode()->IsInert()) { |
639 if (ignored_reasons) { | 658 if (ignored_reasons) { |
640 HTMLDialogElement* dialog = GetActiveDialogElement(GetNode()); | 659 HTMLDialogElement* dialog = GetActiveDialogElement(GetNode()); |
641 if (dialog) { | 660 if (dialog) { |
642 AXObjectImpl* dialog_object = AxObjectCache().GetOrCreate(dialog); | 661 AXObjectImpl* dialog_object = AxObjectCache().GetOrCreate(dialog); |
643 if (dialog_object) { | 662 if (dialog_object) { |
644 ignored_reasons->push_back( | 663 ignored_reasons->push_back( |
645 IgnoredReason(kAXActiveModalDialog, dialog_object)); | 664 IgnoredReason(kAXActiveModalDialog, dialog_object)); |
646 } else { | 665 } else { |
647 ignored_reasons->push_back(IgnoredReason(kAXInert)); | 666 ignored_reasons->push_back(IgnoredReason(kAXInertElement)); |
648 } | 667 } |
649 } else { | 668 } else { |
650 // TODO(aboxhall): handle inert attribute if it eventuates | 669 const AXObjectImpl* inert_root_el = InertRoot(); |
651 ignored_reasons->push_back(IgnoredReason(kAXInert)); | 670 if (inert_root_el == this) { |
| 671 ignored_reasons->push_back(IgnoredReason(kAXInertElement)); |
| 672 } else { |
| 673 ignored_reasons->push_back( |
| 674 IgnoredReason(kAXInertSubtree, inert_root_el)); |
| 675 } |
652 } | 676 } |
653 } | 677 } |
654 return true; | 678 return true; |
655 } | 679 } |
656 } else { | 680 } else { |
657 AXObjectImpl* parent = ParentObject(); | 681 AXObjectImpl* parent = ParentObject(); |
658 if (parent && parent->IsInertOrAriaHidden()) { | 682 if (parent && parent->IsInertOrAriaHidden()) { |
659 if (ignored_reasons) | 683 if (ignored_reasons) |
660 parent->ComputeIsInertOrAriaHidden(ignored_reasons); | 684 parent->ComputeIsInertOrAriaHidden(ignored_reasons); |
661 return true; | 685 return true; |
662 } | 686 } |
663 } | 687 } |
664 | 688 |
665 const AXObjectImpl* hidden_root = AriaHiddenRoot(); | 689 const AXObjectImpl* hidden_root = AriaHiddenRoot(); |
666 if (hidden_root) { | 690 if (hidden_root) { |
667 if (ignored_reasons) { | 691 if (ignored_reasons) { |
668 if (hidden_root == this) { | 692 if (hidden_root == this) { |
669 ignored_reasons->push_back(IgnoredReason(kAXAriaHidden)); | 693 ignored_reasons->push_back(IgnoredReason(kAXAriaHiddenElement)); |
670 } else { | 694 } else { |
671 ignored_reasons->push_back( | 695 ignored_reasons->push_back( |
672 IgnoredReason(kAXAriaHiddenRoot, hidden_root)); | 696 IgnoredReason(kAXAriaHiddenSubtree, hidden_root)); |
673 } | 697 } |
674 } | 698 } |
675 return true; | 699 return true; |
676 } | 700 } |
677 | 701 |
678 return false; | 702 return false; |
679 } | 703 } |
680 | 704 |
681 bool AXObjectImpl::IsDescendantOfLeafNode() const { | 705 bool AXObjectImpl::IsDescendantOfLeafNode() const { |
682 UpdateCachedAttributeValuesIfNeeded(); | 706 UpdateCachedAttributeValuesIfNeeded(); |
(...skipping 14 matching lines...) Expand all Loading... |
697 const AXObjectImpl* AXObjectImpl::AriaHiddenRoot() const { | 721 const AXObjectImpl* AXObjectImpl::AriaHiddenRoot() const { |
698 for (const AXObjectImpl* object = this; object; | 722 for (const AXObjectImpl* object = this; object; |
699 object = object->ParentObject()) { | 723 object = object->ParentObject()) { |
700 if (object->AOMPropertyOrARIAAttributeIsTrue(AOMBooleanProperty::kHidden)) | 724 if (object->AOMPropertyOrARIAAttributeIsTrue(AOMBooleanProperty::kHidden)) |
701 return object; | 725 return object; |
702 } | 726 } |
703 | 727 |
704 return 0; | 728 return 0; |
705 } | 729 } |
706 | 730 |
| 731 const AXObjectImpl* AXObjectImpl::InertRoot() const { |
| 732 const AXObjectImpl* object = this; |
| 733 if (!RuntimeEnabledFeatures::inertAttributeEnabled()) |
| 734 return 0; |
| 735 |
| 736 while (object && !object->IsAXNodeObject()) |
| 737 object = object->ParentObject(); |
| 738 Node* node = object->GetNode(); |
| 739 Element* element = node->IsElementNode() |
| 740 ? ToElement(node) |
| 741 : FlatTreeTraversal::ParentElement(*node); |
| 742 while (element) { |
| 743 if (element->hasAttribute(inertAttr)) |
| 744 return AxObjectCache().GetOrCreate(element); |
| 745 element = FlatTreeTraversal::ParentElement(*element); |
| 746 } |
| 747 |
| 748 return 0; |
| 749 } |
| 750 |
707 bool AXObjectImpl::IsDescendantOfDisabledNode() const { | 751 bool AXObjectImpl::IsDescendantOfDisabledNode() const { |
708 UpdateCachedAttributeValuesIfNeeded(); | 752 UpdateCachedAttributeValuesIfNeeded(); |
709 return cached_is_descendant_of_disabled_node_; | 753 return cached_is_descendant_of_disabled_node_; |
710 } | 754 } |
711 | 755 |
712 const AXObjectImpl* AXObjectImpl::DisabledAncestor() const { | 756 const AXObjectImpl* AXObjectImpl::DisabledAncestor() const { |
713 bool disabled = false; | 757 bool disabled = false; |
714 if (HasAOMPropertyOrARIAAttribute(AOMBooleanProperty::kDisabled, disabled)) { | 758 if (HasAOMPropertyOrARIAAttribute(AOMBooleanProperty::kDisabled, disabled)) { |
715 if (disabled) | 759 if (disabled) |
716 return this; | 760 return this; |
(...skipping 1305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2022 } | 2066 } |
2023 | 2067 |
2024 DEFINE_TRACE(AXObjectImpl) { | 2068 DEFINE_TRACE(AXObjectImpl) { |
2025 visitor->Trace(children_); | 2069 visitor->Trace(children_); |
2026 visitor->Trace(parent_); | 2070 visitor->Trace(parent_); |
2027 visitor->Trace(cached_live_region_root_); | 2071 visitor->Trace(cached_live_region_root_); |
2028 visitor->Trace(ax_object_cache_); | 2072 visitor->Trace(ax_object_cache_); |
2029 } | 2073 } |
2030 | 2074 |
2031 } // namespace blink | 2075 } // namespace blink |
OLD | NEW |