From: Joanmarie Diggs Date: Fri, 6 Mar 2015 07:33:11 +0000 (+0000) Subject: Fix accessible focus events in non-focused combo boxes X-Git-Tag: archive/raspbian/2.14.3-1+rpi1~1^2^2^2~15 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=94b1b409475e55e6c989f0c0fc266e9ebe5e2874;p=webkit2gtk.git Fix accessible focus events in non-focused combo boxes =================================================================== Gbp-Pq: Name ax-focus-events.patch --- diff --git a/Source/WebCore/accessibility/atk/AXObjectCacheAtk.cpp b/Source/WebCore/accessibility/atk/AXObjectCacheAtk.cpp index 930ef3b7bc..ac49be41c9 100644 --- a/Source/WebCore/accessibility/atk/AXObjectCacheAtk.cpp +++ b/Source/WebCore/accessibility/atk/AXObjectCacheAtk.cpp @@ -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); } diff --git a/Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp b/Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp index ee1c38fe9e..2aef74ce88 100644 --- a/Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp +++ b/Source/WebCore/accessibility/atk/WebKitAccessibleWrapperAtk.cpp @@ -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()) diff --git a/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp b/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp index 8610a9fd91..4dc07067bf 100644 --- a/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp +++ b/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp @@ -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 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 roleStringWithPrefix(g_strdup_printf("AXRole: %s", roleToString(ATK_OBJECT(m_element.get())))); return JSStringCreateWithUTF8CString(roleStringWithPrefix.get()); }