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.
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);
}
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())
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:
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());
}