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

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

Issue 2088453002: Implement the inert attribute (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Revert histograms.xml Created 3 years, 7 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 580 matching lines...) Expand 10 before | Expand all | Expand 10 after
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() const { 601 bool AXObjectImpl::AccessibilityIsIgnored() {
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
602 UpdateCachedAttributeValuesIfNeeded(); 621 UpdateCachedAttributeValuesIfNeeded();
603 return cached_is_ignored_; 622 return cached_is_ignored_;
604 } 623 }
605 624
606 void AXObjectImpl::UpdateCachedAttributeValuesIfNeeded() const { 625 void AXObjectImpl::UpdateCachedAttributeValuesIfNeeded() const {
607 if (IsDetached()) 626 if (IsDetached())
608 return; 627 return;
609 628
610 AXObjectCacheImpl& cache = AxObjectCache(); 629 AXObjectCacheImpl& cache = AxObjectCache();
611 630
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
673 if (GetNode()) { 692 if (GetNode()) {
674 if (GetNode()->IsInert()) { 693 if (GetNode()->IsInert()) {
675 if (ignored_reasons) { 694 if (ignored_reasons) {
676 HTMLDialogElement* dialog = GetActiveDialogElement(GetNode()); 695 HTMLDialogElement* dialog = GetActiveDialogElement(GetNode());
677 if (dialog) { 696 if (dialog) {
678 AXObjectImpl* dialog_object = AxObjectCache().GetOrCreate(dialog); 697 AXObjectImpl* dialog_object = AxObjectCache().GetOrCreate(dialog);
679 if (dialog_object) { 698 if (dialog_object) {
680 ignored_reasons->push_back( 699 ignored_reasons->push_back(
681 IgnoredReason(kAXActiveModalDialog, dialog_object)); 700 IgnoredReason(kAXActiveModalDialog, dialog_object));
682 } else { 701 } else {
683 ignored_reasons->push_back(IgnoredReason(kAXInert)); 702 ignored_reasons->push_back(IgnoredReason(kAXInertElement));
684 } 703 }
685 } else { 704 } else {
686 // TODO(aboxhall): handle inert attribute if it eventuates 705 const AXObjectImpl* inert_root_el = InertRoot();
687 ignored_reasons->push_back(IgnoredReason(kAXInert)); 706 if (inert_root_el == this) {
707 ignored_reasons->push_back(IgnoredReason(kAXInertElement));
708 } else {
709 ignored_reasons->push_back(
710 IgnoredReason(kAXInertSubtree, inert_root_el));
711 }
688 } 712 }
689 } 713 }
690 return true; 714 return true;
691 } 715 }
692 } else { 716 } else {
693 AXObjectImpl* parent = ParentObject(); 717 AXObjectImpl* parent = ParentObject();
694 if (parent && parent->IsInertOrAriaHidden()) { 718 if (parent && parent->IsInertOrAriaHidden()) {
695 if (ignored_reasons) 719 if (ignored_reasons)
696 parent->ComputeIsInertOrAriaHidden(ignored_reasons); 720 parent->ComputeIsInertOrAriaHidden(ignored_reasons);
697 return true; 721 return true;
698 } 722 }
699 } 723 }
700 724
701 const AXObjectImpl* hidden_root = AriaHiddenRoot(); 725 const AXObjectImpl* hidden_root = AriaHiddenRoot();
702 if (hidden_root) { 726 if (hidden_root) {
703 if (ignored_reasons) { 727 if (ignored_reasons) {
704 if (hidden_root == this) { 728 if (hidden_root == this) {
705 ignored_reasons->push_back(IgnoredReason(kAXAriaHidden)); 729 ignored_reasons->push_back(IgnoredReason(kAXAriaHiddenElement));
706 } else { 730 } else {
707 ignored_reasons->push_back( 731 ignored_reasons->push_back(
708 IgnoredReason(kAXAriaHiddenRoot, hidden_root)); 732 IgnoredReason(kAXAriaHiddenSubtree, hidden_root));
709 } 733 }
710 } 734 }
711 return true; 735 return true;
712 } 736 }
713 737
714 return false; 738 return false;
715 } 739 }
716 740
717 bool AXObjectImpl::IsDescendantOfLeafNode() const { 741 bool AXObjectImpl::IsDescendantOfLeafNode() const {
718 UpdateCachedAttributeValuesIfNeeded(); 742 UpdateCachedAttributeValuesIfNeeded();
(...skipping 14 matching lines...) Expand all
733 const AXObjectImpl* AXObjectImpl::AriaHiddenRoot() const { 757 const AXObjectImpl* AXObjectImpl::AriaHiddenRoot() const {
734 for (const AXObjectImpl* object = this; object; 758 for (const AXObjectImpl* object = this; object;
735 object = object->ParentObject()) { 759 object = object->ParentObject()) {
736 if (object->AOMPropertyOrARIAAttributeIsTrue(AOMBooleanProperty::kHidden)) 760 if (object->AOMPropertyOrARIAAttributeIsTrue(AOMBooleanProperty::kHidden))
737 return object; 761 return object;
738 } 762 }
739 763
740 return 0; 764 return 0;
741 } 765 }
742 766
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
743 bool AXObjectImpl::IsDescendantOfDisabledNode() const { 787 bool AXObjectImpl::IsDescendantOfDisabledNode() const {
744 UpdateCachedAttributeValuesIfNeeded(); 788 UpdateCachedAttributeValuesIfNeeded();
745 return cached_is_descendant_of_disabled_node_; 789 return cached_is_descendant_of_disabled_node_;
746 } 790 }
747 791
748 const AXObjectImpl* AXObjectImpl::DisabledAncestor() const { 792 const AXObjectImpl* AXObjectImpl::DisabledAncestor() const {
749 bool disabled = false; 793 bool disabled = false;
750 if (HasAOMPropertyOrARIAAttribute(AOMBooleanProperty::kDisabled, disabled)) { 794 if (HasAOMPropertyOrARIAAttribute(AOMBooleanProperty::kDisabled, disabled)) {
751 if (disabled) 795 if (disabled)
752 return this; 796 return this;
(...skipping 1338 matching lines...) Expand 10 before | Expand all | Expand 10 after
2091 } 2135 }
2092 2136
2093 DEFINE_TRACE(AXObjectImpl) { 2137 DEFINE_TRACE(AXObjectImpl) {
2094 visitor->Trace(children_); 2138 visitor->Trace(children_);
2095 visitor->Trace(parent_); 2139 visitor->Trace(parent_);
2096 visitor->Trace(cached_live_region_root_); 2140 visitor->Trace(cached_live_region_root_);
2097 visitor->Trace(ax_object_cache_); 2141 visitor->Trace(ax_object_cache_);
2098 } 2142 }
2099 2143
2100 } // namespace blink 2144 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698