Changeset 50282 in webkit


Ignore:
Timestamp:
Oct 29, 2009 10:34:39 AM (14 years ago)
Author:
eric@webkit.org
Message:

2009-10-29 Joanmarie Diggs <joanmarie.diggs@gmail.com>

Reviewed by Xan Lopez.

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

Implements the AtkSelection interface and enables the corresponding
(and expected) object:selection-changed event.

  • accessibility/gtk/AccessibilityObjectWrapperAtk.cpp: (optionFromList): (optionFromSelection): (atk_selection_interface_init): (webkit_accessible_selection_add_selection): (webkit_accessible_selection_clear_selection): (webkit_accessible_selection_ref_selection): (webkit_accessible_selection_get_selection_count): (webkit_accessible_selection_is_child_selected): (webkit_accessible_selection_remove_selection): (webkit_accessible_selection_select_all_selection): (GetAtkInterfaceTypeFromWAIType):
  • accessibility/gtk/AXObjectCacheAtk.cpp: (AXObjectCache::postPlatformNotification):
Location:
trunk/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r50279 r50282  
     12009-10-29  Joanmarie Diggs  <joanmarie.diggs@gmail.com>
     2
     3        Reviewed by Xan Lopez.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=25679
     6        [Gtk] Improve accessibility of focusable lists
     7
     8        Implements the AtkSelection interface and enables the corresponding
     9        (and expected) object:selection-changed event.
     10
     11        * accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:
     12        (optionFromList):
     13        (optionFromSelection):
     14        (atk_selection_interface_init):
     15        (webkit_accessible_selection_add_selection):
     16        (webkit_accessible_selection_clear_selection):
     17        (webkit_accessible_selection_ref_selection):
     18        (webkit_accessible_selection_get_selection_count):
     19        (webkit_accessible_selection_is_child_selected):
     20        (webkit_accessible_selection_remove_selection):
     21        (webkit_accessible_selection_select_all_selection):
     22        (GetAtkInterfaceTypeFromWAIType):
     23        * accessibility/gtk/AXObjectCacheAtk.cpp:
     24        (AXObjectCache::postPlatformNotification):
     25
    1262009-10-29  Jian Li  <jianli@chromium.org>
    227
  • trunk/WebCore/accessibility/gtk/AXObjectCacheAtk.cpp

    r48367 r50282  
    4444            return;
    4545        g_signal_emit_by_name(coreObject->wrapper(), "state-change", "checked", coreObject->isChecked());
     46    } else if (notification == AXSelectedChildrenChanged) {
     47        if (!coreObject->isListBox())
     48            return;
     49        g_signal_emit_by_name(coreObject->wrapper(), "selection-changed");
    4650    }
    4751}
  • trunk/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp

    r50250 r50282  
    3636#include "AXObjectCache.h"
    3737#include "AccessibilityListBox.h"
     38#include "AccessibilityListBoxOption.h"
    3839#include "AccessibilityRenderObject.h"
    3940#include "AccessibilityTable.h"
     
    105106{
    106107    return core(ATK_OBJECT(action));
     108}
     109
     110static AccessibilityObject* core(AtkSelection* selection)
     111{
     112    return core(ATK_OBJECT(selection));
    107113}
    108114
     
    610616}
    611617
     618// Selection (for controls)
     619
     620static AccessibilityObject* optionFromList(AtkSelection* selection, gint i)
     621{
     622    AccessibilityObject* coreSelection = core(selection);
     623    if (!coreSelection || i < 0)
     624        return 0;
     625
     626    AccessibilityRenderObject::AccessibilityChildrenVector options = core(selection)->children();
     627    if (i < static_cast<gint>(options.size()))
     628        return options.at(i).get();
     629
     630    return 0;
     631}
     632
     633static AccessibilityObject* optionFromSelection(AtkSelection* selection, gint i)
     634{
     635    // i is the ith selection as opposed to the ith child.
     636
     637    AccessibilityObject* coreSelection = core(selection);
     638    if (!coreSelection || i < 0)
     639        return 0;
     640
     641    AccessibilityRenderObject::AccessibilityChildrenVector selectedItems;
     642    if (coreSelection->isListBox())
     643        static_cast<AccessibilityListBox*>(coreSelection)->selectedChildren(selectedItems);
     644
     645    // TODO: Combo boxes
     646
     647    if (i < static_cast<gint>(selectedItems.size()))
     648        return selectedItems.at(i).get();
     649
     650    return 0;
     651}
     652
     653static gboolean webkit_accessible_selection_add_selection(AtkSelection* selection, gint i)
     654{
     655    AccessibilityObject* option = optionFromList(selection, i);
     656    if (option && core(selection)->isListBox()) {
     657        AccessibilityListBoxOption* listBoxOption = static_cast<AccessibilityListBoxOption*>(option);
     658        listBoxOption->setSelected(true);
     659        return listBoxOption->isSelected();
     660    }
     661
     662    return false;
     663}
     664
     665static gboolean webkit_accessible_selection_clear_selection(AtkSelection* selection)
     666{
     667    AccessibilityObject* coreSelection = core(selection);
     668    if (!coreSelection)
     669        return false;
     670
     671    AccessibilityRenderObject::AccessibilityChildrenVector selectedItems;
     672    if (coreSelection->isListBox()) {
     673        // Set the list of selected items to an empty list; then verify that it worked.
     674        AccessibilityListBox* listBox = static_cast<AccessibilityListBox*>(coreSelection);
     675        listBox->setSelectedChildren(selectedItems);
     676        listBox->selectedChildren(selectedItems);
     677        return selectedItems.size() == 0;
     678    }
     679    return false;
     680}
     681
     682static AtkObject* webkit_accessible_selection_ref_selection(AtkSelection* selection, gint i)
     683{
     684    AccessibilityObject* option = optionFromSelection(selection, i);
     685    if (option) {
     686        AtkObject* child = option->wrapper();
     687        g_object_ref(child);
     688        return child;
     689    }
     690
     691    return 0;
     692}
     693
     694static gint webkit_accessible_selection_get_selection_count(AtkSelection* selection)
     695{
     696    AccessibilityObject* coreSelection = core(selection);
     697    if (coreSelection && coreSelection->isListBox()) {
     698        AccessibilityRenderObject::AccessibilityChildrenVector selectedItems;
     699        static_cast<AccessibilityListBox*>(coreSelection)->selectedChildren(selectedItems);
     700        return static_cast<gint>(selectedItems.size());
     701    }
     702
     703    return 0;
     704}
     705
     706static gboolean webkit_accessible_selection_is_child_selected(AtkSelection* selection, gint i)
     707{
     708    AccessibilityObject* option = optionFromList(selection, i);
     709    if (option && core(selection)->isListBox())
     710        return static_cast<AccessibilityListBoxOption*>(option)->isSelected();
     711
     712    return false;
     713}
     714
     715static gboolean webkit_accessible_selection_remove_selection(AtkSelection* selection, gint i)
     716{
     717    // TODO: This is only getting called if i == 0. What is preventing the rest?
     718    AccessibilityObject* option = optionFromSelection(selection, i);
     719    if (option && core(selection)->isListBox()) {
     720        AccessibilityListBoxOption* listBoxOption = static_cast<AccessibilityListBoxOption*>(option);
     721        listBoxOption->setSelected(false);
     722        return !listBoxOption->isSelected();
     723    }
     724
     725    return false;
     726}
     727
     728static gboolean webkit_accessible_selection_select_all_selection(AtkSelection* selection)
     729{
     730    AccessibilityObject* coreSelection = core(selection);
     731    if (!coreSelection || !coreSelection->isMultiSelect())
     732        return false;
     733
     734    AccessibilityRenderObject::AccessibilityChildrenVector children = coreSelection->children();
     735    if (coreSelection->isListBox()) {
     736        AccessibilityListBox* listBox = static_cast<AccessibilityListBox*>(coreSelection);
     737        listBox->setSelectedChildren(children);
     738        AccessibilityRenderObject::AccessibilityChildrenVector selectedItems;
     739        listBox->selectedChildren(selectedItems);
     740        return selectedItems.size() == children.size();
     741    }
     742
     743    return false;
     744}
     745
     746static void atk_selection_interface_init(AtkSelectionIface* iface)
     747{
     748    iface->add_selection = webkit_accessible_selection_add_selection;
     749    iface->clear_selection = webkit_accessible_selection_clear_selection;
     750    iface->ref_selection = webkit_accessible_selection_ref_selection;
     751    iface->get_selection_count = webkit_accessible_selection_get_selection_count;
     752    iface->is_child_selected = webkit_accessible_selection_is_child_selected;
     753    iface->remove_selection = webkit_accessible_selection_remove_selection;
     754    iface->select_all_selection = webkit_accessible_selection_select_all_selection;
     755}
     756
    612757// Text
    613758
     
    11781323    {(GInterfaceInitFunc)atk_action_interface_init,
    11791324     (GInterfaceFinalizeFunc) NULL, NULL},
     1325    {(GInterfaceInitFunc)atk_selection_interface_init,
     1326     (GInterfaceFinalizeFunc) NULL, NULL},
    11801327    {(GInterfaceInitFunc)atk_editable_text_interface_init,
    11811328     (GInterfaceFinalizeFunc) NULL, NULL},
     
    11921339enum WAIType {
    11931340    WAI_ACTION,
     1341    WAI_SELECTION,
    11941342    WAI_EDITABLE_TEXT,
    11951343    WAI_TEXT,
     
    12041352  case WAI_ACTION:
    12051353      return ATK_TYPE_ACTION;
     1354  case WAI_SELECTION:
     1355      return ATK_TYPE_SELECTION;
    12061356  case WAI_EDITABLE_TEXT:
    12071357      return ATK_TYPE_EDITABLE_TEXT;
     
    12291379    if (!coreObject->actionVerb().isEmpty())
    12301380        interfaceMask |= 1 << WAI_ACTION;
     1381
     1382    // Selection
     1383    if (coreObject->isListBox())
     1384        interfaceMask |= 1 << WAI_SELECTION;
    12311385
    12321386    // Text & Editable Text
Note: See TracChangeset for help on using the changeset viewer.