2010-11-09 Mario Sanchez Prada <msanchez@igalia.com>

        Reviewed by Chris Fleizach.

        [GTK] Improve accessibility of focusable lists
        https://bugs.webkit.org/show_bug.cgi?id=25679

        Emit the 'selected' and 'focused' events as needed.

        This is the last bit of a series of patches to fix bug 25679,
        which just ensures that the right signals are emmited whenever a
        selection inside a listbox object changes, that is, the signals
        'state-changed::selected', 'state-changed::focused' and
        'focus-event', along with the right detail for each of them to
        report if the focus/selection has been activated or not.

        * accessibility/gtk/AXObjectCacheAtk.cpp:
        (WebCore::notifyChildrenSelectionChange): New, takes care of
        emitting all the needed signals when children selection has
        changed, both from the point of view of the container and the
        selected/unselected items inside of it. It currently supports
        listboxes (html 'select' controls) only.
        (WebCore::AXObjectCache::postPlatformNotification): Replaced some
        old code with a simple call to notifyChildrenSelectionChange().

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@71710 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent 5d95052e
2010-11-09 Mario Sanchez Prada <msanchez@igalia.com>
Reviewed by Chris Fleizach.
[GTK] Improve accessibility of focusable lists
https://bugs.webkit.org/show_bug.cgi?id=25679
Emit the 'selected' and 'focused' events as needed.
This is the last bit of a series of patches to fix bug 25679,
which just ensures that the right signals are emmited whenever a
selection inside a listbox object changes, that is, the signals
'state-changed::selected', 'state-changed::focused' and
'focus-event', along with the right detail for each of them to
report if the focus/selection has been activated or not.
* accessibility/gtk/AXObjectCacheAtk.cpp:
(WebCore::notifyChildrenSelectionChange): New, takes care of
emitting all the needed signals when children selection has
changed, both from the point of view of the container and the
selected/unselected items inside of it. It currently supports
listboxes (html 'select' controls) only.
(WebCore::AXObjectCache::postPlatformNotification): Replaced some
old code with a simple call to notifyChildrenSelectionChange().
2010-11-09 David Hyatt <hyatt@apple.com>
Reviewed by Dan Bernstein.
......@@ -25,6 +25,7 @@
#include "AccessibilityRenderObject.h"
#include "GOwnPtr.h"
#include "Range.h"
#include "SelectElement.h"
#include "TextIterator.h"
namespace WebCore {
......@@ -41,17 +42,65 @@ void AXObjectCache::attachWrapper(AccessibilityObject* obj)
g_object_unref(atkObj);
}
static void notifyChildrenSelectionChange(AccessibilityObject* object)
{
// This static variable is needed to keep track of the old focused
// object as per previous calls to this function, in order to
// properly decide whether to emit some signals or not.
static RefPtr<AccessibilityObject> oldFocusedObject = 0;
// Only list boxes supported so far.
if (!object || !object->isListBox())
return;
// Emit signal from the listbox's point of view first.
g_signal_emit_by_name(object->wrapper(), "selection-changed");
// Find the item where the selection change was triggered from.
AccessibilityObject::AccessibilityChildrenVector items = object->children();
SelectElement* select = toSelectElement(static_cast<Element*>(object->node()));
if (!select)
return;
int changedItemIndex = select->activeSelectionStartListIndex();
if (changedItemIndex < 0 || changedItemIndex >= static_cast<int>(items.size()))
return;
AccessibilityObject* item = items.at(changedItemIndex).get();
// Ensure the oldFocusedObject belongs to the same document that
// the current item so further comparisons make sense. Otherwise,
// just reset oldFocusedObject so it won't be taken into account.
if (item && oldFocusedObject && item->document() != oldFocusedObject->document())
oldFocusedObject = 0;
AtkObject* axItem = item ? item->wrapper() : 0;
AtkObject* axOldFocusedObject = oldFocusedObject ? oldFocusedObject->wrapper() : 0;
// Old focused object just lost focus, so emit the events.
if (axOldFocusedObject && axItem != axOldFocusedObject) {
g_signal_emit_by_name(axOldFocusedObject, "focus-event", false);
g_signal_emit_by_name(axOldFocusedObject, "state-change", "focused", false);
}
// Emit needed events for the currently (un)selected item.
if (axItem) {
bool isSelected = item->isSelected();
g_signal_emit_by_name(axItem, "state-change", "selected", isSelected);
g_signal_emit_by_name(axItem, "focus-event", isSelected);
g_signal_emit_by_name(axItem, "state-change", "focused", isSelected);
}
// Update pointer to the previously focused object.
oldFocusedObject = item;
}
void AXObjectCache::postPlatformNotification(AccessibilityObject* coreObject, AXNotification notification)
{
if (notification == AXCheckedStateChanged) {
if (!coreObject->isCheckboxOrRadio())
return;
g_signal_emit_by_name(coreObject->wrapper(), "state-change", "checked", coreObject->isChecked());
} else if (notification == AXSelectedChildrenChanged) {
if (!coreObject->isListBox())
return;
g_signal_emit_by_name(coreObject->wrapper(), "selection-changed");
}
} else if (notification == AXSelectedChildrenChanged)
notifyChildrenSelectionChange(coreObject);
}
static void emitTextChanged(AccessibilityRenderObject* object, AXObjectCache::AXTextChange textChange, unsigned offset, unsigned count)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment