OLD | NEW |
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 Loading... |
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, obj->document(), AXObjectCacheImpl::AXTextChanged, tru
e); | 650 postNotification(obj, AXObjectCacheImpl::AXTextChanged, true); |
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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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, bool postToElement) |
717 { | 717 { |
718 if (!layoutObject) | 718 if (!layoutObject) |
719 return; | 719 return; |
720 | 720 |
721 m_modificationCount++; | 721 m_modificationCount++; |
722 | 722 postNotification(get(layoutObject), notification, postToElement); |
723 // Get an accessibility object that already exists. One should not be create
d here | |
724 // because a layout update may be in progress and creating an AX object can
re-trigger a layout | |
725 RefPtr<AXObject> object = get(layoutObject); | |
726 while (!object && layoutObject) { | |
727 layoutObject = layoutObject->parent(); | |
728 object = get(layoutObject); | |
729 } | |
730 | |
731 if (!layoutObject) | |
732 return; | |
733 | |
734 postNotification(object.get(), &layoutObject->document(), notification, post
ToElement); | |
735 } | 723 } |
736 | 724 |
737 void AXObjectCacheImpl::postNotification(Node* node, AXNotification notification
, bool postToElement) | 725 void AXObjectCacheImpl::postNotification(Node* node, AXNotification notification
, bool postToElement) |
738 { | 726 { |
739 if (!node) | 727 if (!node) |
740 return; | 728 return; |
741 | 729 |
742 m_modificationCount++; | 730 m_modificationCount++; |
743 | 731 postNotification(get(node), notification, postToElement); |
744 // Get an accessibility object that already exists. One should not be create
d here | |
745 // because a layout update may be in progress and creating an AX object can
re-trigger a layout | |
746 RefPtr<AXObject> object = get(node); | |
747 while (!object && node) { | |
748 node = node->parentNode(); | |
749 object = get(node); | |
750 } | |
751 | |
752 if (!node) | |
753 return; | |
754 | |
755 postNotification(object.get(), &node->document(), notification, postToElemen
t); | |
756 } | 732 } |
757 | 733 |
758 void AXObjectCacheImpl::postNotification(AXObject* object, Document* document, A
XNotification notification, bool postToElement) | 734 void AXObjectCacheImpl::postNotification(AXObject* object, AXNotification notifi
cation, bool postToElement) |
759 { | 735 { |
760 m_modificationCount++; | 736 m_modificationCount++; |
761 | 737 |
762 if (object && !postToElement) | 738 if (object && !postToElement) |
763 object = object->observableObject(); | 739 object = object->observableObject(); |
764 | 740 |
765 if (!object && document) | |
766 object = get(document->layoutView()); | |
767 | |
768 if (!object) | 741 if (!object) |
769 return; | 742 return; |
770 | 743 |
771 m_notificationsToPost.append(std::make_pair(object, notification)); | 744 m_notificationsToPost.append(std::make_pair(object, notification)); |
772 if (!m_notificationPostTimer.isActive()) | 745 if (!m_notificationPostTimer.isActive()) |
773 m_notificationPostTimer.startOneShot(0, FROM_HERE); | 746 m_notificationPostTimer.startOneShot(0, FROM_HERE); |
774 } | 747 } |
775 | 748 |
776 void AXObjectCacheImpl::checkedStateChanged(Node* node) | 749 void AXObjectCacheImpl::checkedStateChanged(Node* node) |
777 { | 750 { |
(...skipping 30 matching lines...) Expand all Loading... |
808 { | 781 { |
809 if (!layoutObject) | 782 if (!layoutObject) |
810 return; | 783 return; |
811 | 784 |
812 m_modificationCount++; | 785 m_modificationCount++; |
813 | 786 |
814 // Create the AXObject if it didn't yet exist - that's always safe at the en
d of a layout, and it | 787 // Create the AXObject if it didn't yet exist - that's always safe at the en
d of a layout, and it |
815 // allows an AX notification to be sent when a page has its first layout, ra
ther than when the | 788 // allows an AX notification to be sent when a page has its first layout, ra
ther than when the |
816 // document first loads. | 789 // document first loads. |
817 if (AXObject* obj = getOrCreate(layoutObject)) | 790 if (AXObject* obj = getOrCreate(layoutObject)) |
818 postNotification(obj, obj->document(), AXLayoutComplete, true); | 791 postNotification(obj, AXLayoutComplete, true); |
819 } | 792 } |
820 | 793 |
821 void AXObjectCacheImpl::handleAriaExpandedChange(Node* node) | 794 void AXObjectCacheImpl::handleAriaExpandedChange(Node* node) |
822 { | 795 { |
823 if (AXObject* obj = getOrCreate(node)) | 796 if (AXObject* obj = getOrCreate(node)) |
824 obj->handleAriaExpandedChanged(); | 797 obj->handleAriaExpandedChanged(); |
825 } | 798 } |
826 | 799 |
827 void AXObjectCacheImpl::handleActiveDescendantChanged(Node* node) | 800 void AXObjectCacheImpl::handleActiveDescendantChanged(Node* node) |
828 { | 801 { |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1038 } | 1011 } |
1039 | 1012 |
1040 void AXObjectCacheImpl::handleUpdateActiveMenuOption(LayoutMenuList* menuList, i
nt optionIndex) | 1013 void AXObjectCacheImpl::handleUpdateActiveMenuOption(LayoutMenuList* menuList, i
nt optionIndex) |
1041 { | 1014 { |
1042 if (AXMenuList* axMenuList = static_cast<AXMenuList*>(get(menuList))) | 1015 if (AXMenuList* axMenuList = static_cast<AXMenuList*>(get(menuList))) |
1043 axMenuList->didUpdateActiveOption(optionIndex); | 1016 axMenuList->didUpdateActiveOption(optionIndex); |
1044 } | 1017 } |
1045 | 1018 |
1046 void AXObjectCacheImpl::handleLoadComplete(Document* document) | 1019 void AXObjectCacheImpl::handleLoadComplete(Document* document) |
1047 { | 1020 { |
1048 postNotification(getOrCreate(document), document, AXObjectCache::AXLoadCompl
ete, true); | 1021 postNotification(getOrCreate(document), AXObjectCache::AXLoadComplete, true)
; |
1049 } | 1022 } |
1050 | 1023 |
1051 void AXObjectCacheImpl::handleLayoutComplete(Document* document) | 1024 void AXObjectCacheImpl::handleLayoutComplete(Document* document) |
1052 { | 1025 { |
1053 postNotification(getOrCreate(document), document, AXObjectCache::AXLayoutCom
plete, true); | 1026 postNotification(getOrCreate(document), AXObjectCache::AXLayoutComplete, tru
e); |
1054 } | 1027 } |
1055 | 1028 |
1056 void AXObjectCacheImpl::handleScrolledToAnchor(const Node* anchorNode) | 1029 void AXObjectCacheImpl::handleScrolledToAnchor(const Node* anchorNode) |
1057 { | 1030 { |
1058 // The anchor node may not be accessible. Post the notification for the | 1031 // The anchor node may not be accessible. Post the notification for the |
1059 // first accessible object. | 1032 // first accessible object. |
1060 postPlatformNotification(firstAccessibleObjectFromNode(anchorNode), AXScroll
edToAnchor); | 1033 postPlatformNotification(firstAccessibleObjectFromNode(anchorNode), AXScroll
edToAnchor); |
1061 } | 1034 } |
1062 | 1035 |
1063 void AXObjectCacheImpl::handleScrollPositionChanged(FrameView* frameView) | 1036 void AXObjectCacheImpl::handleScrollPositionChanged(FrameView* frameView) |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1121 void AXObjectCacheImpl::setCanvasObjectBounds(Element* element, const LayoutRect
& rect) | 1094 void AXObjectCacheImpl::setCanvasObjectBounds(Element* element, const LayoutRect
& rect) |
1122 { | 1095 { |
1123 AXObject* obj = getOrCreate(element); | 1096 AXObject* obj = getOrCreate(element); |
1124 if (!obj) | 1097 if (!obj) |
1125 return; | 1098 return; |
1126 | 1099 |
1127 obj->setElementRect(rect); | 1100 obj->setElementRect(rect); |
1128 } | 1101 } |
1129 | 1102 |
1130 } // namespace blink | 1103 } // namespace blink |
OLD | NEW |