Fix accessible focus events in non-focused combo boxes
authorJoanmarie Diggs <jdiggs@igalia.com>
Fri, 6 Mar 2015 07:33:11 +0000 (07:33 +0000)
committerAlberto Garcia <berto@igalia.com>
Fri, 6 Mar 2015 07:33:11 +0000 (07:33 +0000)
===================================================================

Gbp-Pq: Name ax-focus-events.patch

Source/WebCore/accessibility/atk/AXObjectCacheAtk.cpp
Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp
Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp

index 930ef3b7bcfdfdcc47d9bf9f549e614de0a42697..ac49be41c9164f2026866ee55798a7acb735d3d8 100644 (file)
@@ -175,8 +175,12 @@ static void notifyChildrenSelectionChange(AccessibilityObject* object)
     if (axItem) {
         bool isSelected = item->isSelected();
         atk_object_notify_state_change(axItem, ATK_STATE_SELECTED, isSelected);
-        g_signal_emit_by_name(axItem, "focus-event", isSelected);
-        atk_object_notify_state_change(axItem, ATK_STATE_FOCUSED, isSelected);
+        // When the selection changes in a collapsed widget such as a combo box
+        // whose child menu is not showing, that collapsed widget retains focus.
+        if (!object->isCollapsed()) {
+            g_signal_emit_by_name(axItem, "focus-event", isSelected);
+            atk_object_notify_state_change(axItem, ATK_STATE_FOCUSED, isSelected);
+        }
     }
 
     // Update pointers to the previously involved objects.
@@ -199,7 +203,8 @@ void AXObjectCache::postPlatformNotification(AccessibilityObject* coreObject, AX
 
     case AXSelectedChildrenChanged:
     case AXMenuListValueChanged:
-        if (notification == AXMenuListValueChanged && coreObject->isMenuList()) {
+        // Accessible focus claims should not be made if the associated widget is not focused.
+        if (notification == AXMenuListValueChanged && coreObject->isMenuList() && coreObject->isFocused()) {
             g_signal_emit_by_name(axObject, "focus-event", true);
             atk_object_notify_state_change(axObject, ATK_STATE_FOCUSED, true);
         }
index ee1c38fe9e1a263055a4e1c1e04160785cca1bfa..2aef74ce88decfb9a733f6fe52ff66ca6df45dc6 100644 (file)
@@ -748,13 +748,15 @@ static AtkRole atkRole(AccessibilityObject* coreObject)
 
 static AtkRole webkitAccessibleGetRole(AtkObject* object)
 {
-    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), ATK_ROLE_UNKNOWN);
-    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), ATK_ROLE_UNKNOWN);
+    // ATK_ROLE_UNKNOWN should only be applied in cases where there is a valid
+    // WebCore accessible object for which the platform role mapping is unknown.
+    g_return_val_if_fail(WEBKIT_IS_ACCESSIBLE(object), ATK_ROLE_INVALID);
+    returnValIfWebKitAccessibleIsInvalid(WEBKIT_ACCESSIBLE(object), ATK_ROLE_INVALID);
 
     AccessibilityObject* coreObject = core(object);
 
     if (!coreObject)
-        return ATK_ROLE_UNKNOWN;
+        return ATK_ROLE_INVALID;
 
     // Note: Why doesn't WebCore have a password field for this
     if (coreObject->isPasswordField())
index 8610a9fd912ea4ad096d643641e0a2ca920956d5..4dc07067bfa38fbc54444c205a8ff83d7284a0ba 100644 (file)
@@ -369,6 +369,8 @@ const gchar* roleToString(AtkObject* object)
         return "AXImage";
     case ATK_ROLE_IMAGE_MAP:
         return "AXImageMap";
+    case ATK_ROLE_INVALID:
+        return "AXInvalid";
     case ATK_ROLE_LABEL:
         return "AXLabel";
     case ATK_ROLE_LINK:
@@ -1013,9 +1015,6 @@ JSRetainPtr<JSStringRef> AccessibilityUIElement::role()
     if (!ATK_IS_OBJECT(m_element.get()))
         return JSStringCreateWithCharacters(0, 0);
 
-    if (!atk_object_get_role(ATK_OBJECT(m_element.get())))
-        return JSStringCreateWithCharacters(0, 0);
-
     GUniquePtr<char> roleStringWithPrefix(g_strdup_printf("AXRole: %s", roleToString(ATK_OBJECT(m_element.get()))));
     return JSStringCreateWithUTF8CString(roleStringWithPrefix.get());
 }