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

Side by Side Diff: Source/modules/accessibility/AXObjectCacheImpl.cpp

Issue 1014573010: Get rid of postToElement argument for accessibility notifications. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@postnotification_1
Patch Set: Rebaseline test Created 5 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) 2014, Google Inc. All rights reserved. 2 * Copyright (C) 2014, Google 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 629 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 textChanged(getOrCreate(layoutObject)); 640 textChanged(getOrCreate(layoutObject));
641 } 641 }
642 642
643 void AXObjectCacheImpl::textChanged(AXObject* obj) 643 void AXObjectCacheImpl::textChanged(AXObject* obj)
644 { 644 {
645 if (!obj) 645 if (!obj)
646 return; 646 return;
647 647
648 bool parentAlreadyExists = obj->parentObjectIfExists(); 648 bool parentAlreadyExists = obj->parentObjectIfExists();
649 obj->textChanged(); 649 obj->textChanged();
650 postNotification(obj, AXObjectCacheImpl::AXTextChanged, true); 650 postNotification(obj, AXObjectCacheImpl::AXTextChanged);
651 if (parentAlreadyExists) 651 if (parentAlreadyExists)
652 obj->notifyIfIgnoredValueChanged(); 652 obj->notifyIfIgnoredValueChanged();
653 } 653 }
654 654
655 void AXObjectCacheImpl::updateCacheAfterNodeIsAttached(Node* node) 655 void AXObjectCacheImpl::updateCacheAfterNodeIsAttached(Node* node)
656 { 656 {
657 // Calling get() will update the AX object if we had an AXNodeObject but now we need 657 // Calling get() will update the AX object if we had an AXNodeObject but now we need
658 // an AXLayoutObject, because it was reparented to a location outside of a c anvas. 658 // an AXLayoutObject, because it was reparented to a location outside of a c anvas.
659 get(node); 659 get(node);
660 } 660 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 AXNotification notification = m_notificationsToPost[i].second; 706 AXNotification notification = m_notificationsToPost[i].second;
707 postPlatformNotification(obj, notification); 707 postPlatformNotification(obj, notification);
708 708
709 if (notification == AXChildrenChanged && obj->parentObjectIfExists() && obj->lastKnownIsIgnoredValue() != obj->accessibilityIsIgnored()) 709 if (notification == AXChildrenChanged && obj->parentObjectIfExists() && obj->lastKnownIsIgnoredValue() != obj->accessibilityIsIgnored())
710 childrenChanged(obj->parentObject()); 710 childrenChanged(obj->parentObject());
711 } 711 }
712 712
713 m_notificationsToPost.clear(); 713 m_notificationsToPost.clear();
714 } 714 }
715 715
716 void AXObjectCacheImpl::postNotification(LayoutObject* layoutObject, AXNotificat ion notification, bool postToElement) 716 void AXObjectCacheImpl::postNotification(LayoutObject* layoutObject, AXNotificat ion notification)
717 { 717 {
718 if (!layoutObject) 718 if (!layoutObject)
719 return; 719 return;
720 720
721 m_modificationCount++; 721 m_modificationCount++;
722 postNotification(get(layoutObject), notification, postToElement); 722 postNotification(get(layoutObject), notification);
723 } 723 }
724 724
725 void AXObjectCacheImpl::postNotification(Node* node, AXNotification notification , bool postToElement) 725 void AXObjectCacheImpl::postNotification(Node* node, AXNotification notification )
726 { 726 {
727 if (!node) 727 if (!node)
728 return; 728 return;
729 729
730 m_modificationCount++; 730 m_modificationCount++;
731 postNotification(get(node), notification, postToElement); 731 postNotification(get(node), notification);
732 } 732 }
733 733
734 void AXObjectCacheImpl::postNotification(AXObject* object, AXNotification notifi cation, bool postToElement) 734 void AXObjectCacheImpl::postNotification(AXObject* object, AXNotification notifi cation)
735 { 735 {
736 m_modificationCount++; 736 m_modificationCount++;
737
738 if (object && !postToElement)
739 object = object->observableObject();
740
741 if (!object) 737 if (!object)
742 return; 738 return;
743 739
744 m_notificationsToPost.append(std::make_pair(object, notification)); 740 m_notificationsToPost.append(std::make_pair(object, notification));
745 if (!m_notificationPostTimer.isActive()) 741 if (!m_notificationPostTimer.isActive())
746 m_notificationPostTimer.startOneShot(0, FROM_HERE); 742 m_notificationPostTimer.startOneShot(0, FROM_HERE);
747 } 743 }
748 744
749 void AXObjectCacheImpl::checkedStateChanged(Node* node) 745 void AXObjectCacheImpl::checkedStateChanged(Node* node)
750 { 746 {
751 postNotification(node, AXObjectCacheImpl::AXCheckedStateChanged, true); 747 postNotification(node, AXObjectCacheImpl::AXCheckedStateChanged);
752 } 748 }
753 749
754 void AXObjectCacheImpl::selectedChildrenChanged(Node* node) 750 void AXObjectCacheImpl::selectedChildrenChanged(Node* node)
755 { 751 {
756 // postToElement is false so that you can pass in any child of an element an d it will go up the parent tree 752 selectedChildrenChanged(get(node));
757 // to find the container which should send out the notification.
758 postNotification(node, AXSelectedChildrenChanged, false);
759 } 753 }
760 754
761 void AXObjectCacheImpl::selectedChildrenChanged(LayoutObject* layoutObject) 755 void AXObjectCacheImpl::selectedChildrenChanged(LayoutObject* layoutObject)
762 { 756 {
763 // postToElement is false so that you can pass in any child of an element an d it will go up the parent tree 757 selectedChildrenChanged(get(layoutObject));
764 // to find the container which should send out the notification. 758 }
765 postNotification(layoutObject, AXSelectedChildrenChanged, false); 759
760 void AXObjectCacheImpl::selectedChildrenChanged(AXObject* obj)
761 {
762 while (obj && obj->roleValue() != ListBoxRole)
763 obj = obj->parentObject();
764 postNotification(obj, AXSelectedChildrenChanged);
766 } 765 }
767 766
768 void AXObjectCacheImpl::handleScrollbarUpdate(FrameView* view) 767 void AXObjectCacheImpl::handleScrollbarUpdate(FrameView* view)
769 { 768 {
770 if (!view) 769 if (!view)
771 return; 770 return;
772 771
773 // We don't want to create a scroll view from this method, only update an ex isting one. 772 // We don't want to create a scroll view from this method, only update an ex isting one.
774 if (AXObject* scrollViewObject = get(view)) { 773 if (AXObject* scrollViewObject = get(view)) {
775 m_modificationCount++; 774 m_modificationCount++;
776 scrollViewObject->updateChildrenIfNecessary(); 775 scrollViewObject->updateChildrenIfNecessary();
777 } 776 }
778 } 777 }
779 778
780 void AXObjectCacheImpl::handleLayoutComplete(LayoutObject* layoutObject) 779 void AXObjectCacheImpl::handleLayoutComplete(LayoutObject* layoutObject)
781 { 780 {
782 if (!layoutObject) 781 if (!layoutObject)
783 return; 782 return;
784 783
785 m_modificationCount++; 784 m_modificationCount++;
786 785
787 // Create the AXObject if it didn't yet exist - that's always safe at the en d of a layout, and it 786 // Create the AXObject if it didn't yet exist - that's always safe at the en d of a layout, and it
788 // allows an AX notification to be sent when a page has its first layout, ra ther than when the 787 // allows an AX notification to be sent when a page has its first layout, ra ther than when the
789 // document first loads. 788 // document first loads.
790 if (AXObject* obj = getOrCreate(layoutObject)) 789 if (AXObject* obj = getOrCreate(layoutObject))
791 postNotification(obj, AXLayoutComplete, true); 790 postNotification(obj, AXLayoutComplete);
792 } 791 }
793 792
794 void AXObjectCacheImpl::handleAriaExpandedChange(Node* node) 793 void AXObjectCacheImpl::handleAriaExpandedChange(Node* node)
795 { 794 {
796 if (AXObject* obj = getOrCreate(node)) 795 if (AXObject* obj = getOrCreate(node))
797 obj->handleAriaExpandedChanged(); 796 obj->handleAriaExpandedChanged();
798 } 797 }
799 798
800 void AXObjectCacheImpl::handleActiveDescendantChanged(Node* node) 799 void AXObjectCacheImpl::handleActiveDescendantChanged(Node* node)
801 { 800 {
(...skipping 18 matching lines...) Expand all
820 textChanged(element); 819 textChanged(element);
821 else if (attrName == forAttr && isHTMLLabelElement(*element)) 820 else if (attrName == forAttr && isHTMLLabelElement(*element))
822 labelChanged(element); 821 labelChanged(element);
823 822
824 if (!attrName.localName().startsWith("aria-")) 823 if (!attrName.localName().startsWith("aria-"))
825 return; 824 return;
826 825
827 if (attrName == aria_activedescendantAttr) 826 if (attrName == aria_activedescendantAttr)
828 handleActiveDescendantChanged(element); 827 handleActiveDescendantChanged(element);
829 else if (attrName == aria_valuenowAttr || attrName == aria_valuetextAttr) 828 else if (attrName == aria_valuenowAttr || attrName == aria_valuetextAttr)
830 postNotification(element, AXObjectCacheImpl::AXValueChanged, true); 829 postNotification(element, AXObjectCacheImpl::AXValueChanged);
831 else if (attrName == aria_labelAttr || attrName == aria_labeledbyAttr || att rName == aria_labelledbyAttr) 830 else if (attrName == aria_labelAttr || attrName == aria_labeledbyAttr || att rName == aria_labelledbyAttr)
832 textChanged(element); 831 textChanged(element);
833 else if (attrName == aria_checkedAttr) 832 else if (attrName == aria_checkedAttr)
834 checkedStateChanged(element); 833 checkedStateChanged(element);
835 else if (attrName == aria_selectedAttr) 834 else if (attrName == aria_selectedAttr)
836 selectedChildrenChanged(element); 835 selectedChildrenChanged(element);
837 else if (attrName == aria_expandedAttr) 836 else if (attrName == aria_expandedAttr)
838 handleAriaExpandedChange(element); 837 handleAriaExpandedChange(element);
839 else if (attrName == aria_hiddenAttr) 838 else if (attrName == aria_hiddenAttr)
840 childrenChanged(element->parentNode()); 839 childrenChanged(element->parentNode());
841 else if (attrName == aria_invalidAttr) 840 else if (attrName == aria_invalidAttr)
842 postNotification(element, AXObjectCacheImpl::AXInvalidStatusChanged, tru e); 841 postNotification(element, AXObjectCacheImpl::AXInvalidStatusChanged);
843 else 842 else
844 postNotification(element, AXObjectCacheImpl::AXAriaAttributeChanged, tru e); 843 postNotification(element, AXObjectCacheImpl::AXAriaAttributeChanged);
845 } 844 }
846 845
847 void AXObjectCacheImpl::labelChanged(Element* element) 846 void AXObjectCacheImpl::labelChanged(Element* element)
848 { 847 {
849 textChanged(toHTMLLabelElement(element)->control()); 848 textChanged(toHTMLLabelElement(element)->control());
850 } 849 }
851 850
852 void AXObjectCacheImpl::recomputeIsIgnored(LayoutObject* layoutObject) 851 void AXObjectCacheImpl::recomputeIsIgnored(LayoutObject* layoutObject)
853 { 852 {
854 if (AXObject* obj = get(layoutObject)) 853 if (AXObject* obj = get(layoutObject))
855 obj->notifyIfIgnoredValueChanged(); 854 obj->notifyIfIgnoredValueChanged();
856 } 855 }
857 856
858 void AXObjectCacheImpl::inlineTextBoxesUpdated(LayoutObject* layoutObject) 857 void AXObjectCacheImpl::inlineTextBoxesUpdated(LayoutObject* layoutObject)
859 { 858 {
860 if (!inlineTextBoxAccessibilityEnabled()) 859 if (!inlineTextBoxAccessibilityEnabled())
861 return; 860 return;
862 861
863 // Only update if the accessibility object already exists and it's 862 // Only update if the accessibility object already exists and it's
864 // not already marked as dirty. 863 // not already marked as dirty.
865 if (AXObject* obj = get(layoutObject)) { 864 if (AXObject* obj = get(layoutObject)) {
866 if (!obj->needsToUpdateChildren()) { 865 if (!obj->needsToUpdateChildren()) {
867 obj->setNeedsToUpdateChildren(); 866 obj->setNeedsToUpdateChildren();
868 postNotification(layoutObject, AXChildrenChanged, true); 867 postNotification(layoutObject, AXChildrenChanged);
869 } 868 }
870 } 869 }
871 } 870 }
872 871
873 Settings* AXObjectCacheImpl::settings() 872 Settings* AXObjectCacheImpl::settings()
874 { 873 {
875 return m_document.settings(); 874 return m_document.settings();
876 } 875 }
877 876
878 bool AXObjectCacheImpl::accessibilityEnabled() 877 bool AXObjectCacheImpl::accessibilityEnabled()
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 984
986 AXObject* focusedObject = focusedUIElementForPage(page); 985 AXObject* focusedObject = focusedUIElementForPage(page);
987 if (!focusedObject) 986 if (!focusedObject)
988 return; 987 return;
989 988
990 postPlatformNotification(focusedObject, AXFocusedUIElementChanged); 989 postPlatformNotification(focusedObject, AXFocusedUIElementChanged);
991 } 990 }
992 991
993 void AXObjectCacheImpl::handleInitialFocus() 992 void AXObjectCacheImpl::handleInitialFocus()
994 { 993 {
995 postNotification(&m_document, AXObjectCache::AXFocusedUIElementChanged, true ); 994 postNotification(&m_document, AXObjectCache::AXFocusedUIElementChanged);
996 } 995 }
997 996
998 void AXObjectCacheImpl::handleEditableTextContentChanged(Node* node) 997 void AXObjectCacheImpl::handleEditableTextContentChanged(Node* node)
999 { 998 {
1000 postNotification(node, AXObjectCache::AXValueChanged, false); 999 AXObject* obj = get(node);
1000 while (obj && !obj->isNativeTextControl() && !obj->isNonNativeTextControl())
1001 obj = obj->parentObject();
1002 postNotification(obj, AXObjectCache::AXValueChanged);
1001 } 1003 }
1002 1004
1003 void AXObjectCacheImpl::handleTextFormControlChanged(Node* node) 1005 void AXObjectCacheImpl::handleTextFormControlChanged(Node* node)
1004 { 1006 {
1005 postNotification(node, AXObjectCache::AXValueChanged, false); 1007 handleEditableTextContentChanged(node);
1006 } 1008 }
1007 1009
1008 void AXObjectCacheImpl::handleValueChanged(Node* node) 1010 void AXObjectCacheImpl::handleValueChanged(Node* node)
1009 { 1011 {
1010 postNotification(node, AXObjectCache::AXValueChanged, true); 1012 postNotification(node, AXObjectCache::AXValueChanged);
1011 } 1013 }
1012 1014
1013 void AXObjectCacheImpl::handleUpdateActiveMenuOption(LayoutMenuList* menuList, i nt optionIndex) 1015 void AXObjectCacheImpl::handleUpdateActiveMenuOption(LayoutMenuList* menuList, i nt optionIndex)
1014 { 1016 {
1015 if (AXMenuList* axMenuList = static_cast<AXMenuList*>(get(menuList))) 1017 if (AXMenuList* axMenuList = static_cast<AXMenuList*>(get(menuList)))
1016 axMenuList->didUpdateActiveOption(optionIndex); 1018 axMenuList->didUpdateActiveOption(optionIndex);
1017 } 1019 }
1018 1020
1019 void AXObjectCacheImpl::handleLoadComplete(Document* document) 1021 void AXObjectCacheImpl::handleLoadComplete(Document* document)
1020 { 1022 {
1021 postNotification(getOrCreate(document), AXObjectCache::AXLoadComplete, true) ; 1023 postNotification(getOrCreate(document), AXObjectCache::AXLoadComplete);
1022 } 1024 }
1023 1025
1024 void AXObjectCacheImpl::handleLayoutComplete(Document* document) 1026 void AXObjectCacheImpl::handleLayoutComplete(Document* document)
1025 { 1027 {
1026 postNotification(getOrCreate(document), AXObjectCache::AXLayoutComplete, tru e); 1028 postNotification(getOrCreate(document), AXObjectCache::AXLayoutComplete);
1027 } 1029 }
1028 1030
1029 void AXObjectCacheImpl::handleScrolledToAnchor(const Node* anchorNode) 1031 void AXObjectCacheImpl::handleScrolledToAnchor(const Node* anchorNode)
1030 { 1032 {
1031 // The anchor node may not be accessible. Post the notification for the 1033 // The anchor node may not be accessible. Post the notification for the
1032 // first accessible object. 1034 // first accessible object.
1033 postPlatformNotification(firstAccessibleObjectFromNode(anchorNode), AXScroll edToAnchor); 1035 postPlatformNotification(firstAccessibleObjectFromNode(anchorNode), AXScroll edToAnchor);
1034 } 1036 }
1035 1037
1036 void AXObjectCacheImpl::handleScrollPositionChanged(FrameView* frameView) 1038 void AXObjectCacheImpl::handleScrollPositionChanged(FrameView* frameView)
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1094 void AXObjectCacheImpl::setCanvasObjectBounds(Element* element, const LayoutRect & rect) 1096 void AXObjectCacheImpl::setCanvasObjectBounds(Element* element, const LayoutRect & rect)
1095 { 1097 {
1096 AXObject* obj = getOrCreate(element); 1098 AXObject* obj = getOrCreate(element);
1097 if (!obj) 1099 if (!obj)
1098 return; 1100 return;
1099 1101
1100 obj->setElementRect(rect); 1102 obj->setElementRect(rect);
1101 } 1103 }
1102 1104
1103 } // namespace blink 1105 } // namespace blink
OLDNEW
« no previous file with comments | « Source/modules/accessibility/AXObjectCacheImpl.h ('k') | Source/modules/accessibility/AXTableRow.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698