Index: Source/modules/accessibility/AXObjectCacheImpl.cpp |
diff --git a/Source/modules/accessibility/AXObjectCacheImpl.cpp b/Source/modules/accessibility/AXObjectCacheImpl.cpp |
index 47e682327e3cefda1c7c49d26d45ac68e9ec2e56..f5d5952bd8b057b1a634ec5820be6b986ba7ed59 100644 |
--- a/Source/modules/accessibility/AXObjectCacheImpl.cpp |
+++ b/Source/modules/accessibility/AXObjectCacheImpl.cpp |
@@ -39,6 +39,8 @@ |
#include "core/html/HTMLImageElement.h" |
#include "core/html/HTMLInputElement.h" |
#include "core/html/HTMLLabelElement.h" |
+#include "core/html/HTMLOptionElement.h" |
+#include "core/html/HTMLSelectElement.h" |
#include "core/layout/LayoutListBox.h" |
#include "core/layout/LayoutMenuList.h" |
#include "core/layout/LayoutProgress.h" |
@@ -778,18 +780,23 @@ void AXObjectCacheImpl::checkedStateChanged(Node* node) |
postNotification(node, AXObjectCacheImpl::AXCheckedStateChanged, true); |
} |
-void AXObjectCacheImpl::selectedChildrenChanged(Node* node) |
+void AXObjectCacheImpl::listboxOptionStateChanged(HTMLOptionElement* option) |
{ |
- // postToElement is false so that you can pass in any child of an element and it will go up the parent tree |
- // to find the container which should send out the notification. |
- postNotification(node, AXSelectedChildrenChanged, false); |
+ postNotification(option, AXCheckedStateChanged); |
} |
-void AXObjectCacheImpl::selectedChildrenChanged(LayoutObject* layoutObject) |
+void AXObjectCacheImpl::listboxSelectedChildrenChanged(HTMLSelectElement* select) |
{ |
- // postToElement is false so that you can pass in any child of an element and it will go up the parent tree |
- // to find the container which should send out the notification. |
- postNotification(layoutObject, AXSelectedChildrenChanged, false); |
+ postNotification(select, AXSelectedChildrenChanged); |
+} |
+ |
+void AXObjectCacheImpl::listboxActiveIndexChanged(HTMLSelectElement* select) |
+{ |
+ AXObject* obj = get(select); |
+ if (!obj || !obj->isAXListBox()) |
+ return; |
+ |
+ static_cast<AXListBox*>(obj)->activeIndexChanged(); |
} |
void AXObjectCacheImpl::handleScrollbarUpdate(FrameView* view) |
@@ -824,6 +831,19 @@ void AXObjectCacheImpl::handleAriaExpandedChange(Node* node) |
obj->handleAriaExpandedChanged(); |
} |
+void AXObjectCacheImpl::handleAriaSelectedChanged(Node* node) |
+{ |
+ AXObject* obj = get(node); |
+ if (!obj) |
+ return; |
+ |
+ postNotification(obj, AXCheckedStateChanged); |
+ |
+ AXObject* listbox = obj->parentObjectUnignored(); |
+ if (listbox->roleValue() == ListBoxRole) |
+ postNotification(listbox, AXSelectedChildrenChanged); |
+} |
+ |
void AXObjectCacheImpl::handleActiveDescendantChanged(Node* node) |
{ |
if (AXObject* obj = getOrCreate(node)) |
@@ -860,7 +880,7 @@ void AXObjectCacheImpl::handleAttributeChanged(const QualifiedName& attrName, El |
else if (attrName == aria_checkedAttr) |
checkedStateChanged(element); |
else if (attrName == aria_selectedAttr) |
- selectedChildrenChanged(element); |
+ handleAriaSelectedChanged(element); |
else if (attrName == aria_expandedAttr) |
handleAriaExpandedChange(element); |
else if (attrName == aria_hiddenAttr) |