Changeset 105727 in webkit


Ignore:
Timestamp:
Jan 24, 2012 4:25:13 AM (12 years ago)
Author:
mario@webkit.org
Message:

[GTK] Refactor GTK's accessibilitity code to be more modular
https://bugs.webkit.org/show_bug.cgi?id=76783

Reviewed by Martin Robinson.

New files for the implementation of the AtkSelection interface,
containing the related code from WebKitAccessibleWrapperAtk.cpp.

  • accessibility/gtk/WebKitAccessibleInterfaceSelection.cpp: Added.

(core):
(listObjectForSelection):
(optionFromList):
(optionFromSelection):
(webkitAccessibleSelectionInterfaceInit):
(webkitAccessibleSelectionAddSelection):
(webkitAccessibleSelectionClearSelection):
(webkitAccessibleSelectionRefSelection):
(webkitAccessibleSelectionGetSelectionCount):
(webkitAccessibleSelectionIsChildSelected):
(webkitAccessibleSelectionRemoveSelection):
(webkitAccessibleSelectionSelectAllSelection):

  • accessibility/gtk/WebKitAccessibleInterfaceSelection.h: Added.
  • accessibility/gtk/WebKitAccessibleWrapperAtk.cpp: Remove code

related to the implementation of the AtkSelection interface.

Add new files to build files.

  • GNUmakefile.list.am: Add WebKitAccessibleInterfaceSelection.[h|cpp].
  • WebCore.gypi: Ditto.
Location:
trunk/Source/WebCore
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r105726 r105727  
     12012-01-24  Mario Sanchez Prada  <msanchez@igalia.com>
     2
     3        [GTK] Refactor GTK's accessibilitity code to be more modular
     4        https://bugs.webkit.org/show_bug.cgi?id=76783
     5
     6        Reviewed by Martin Robinson.
     7
     8        New files for the implementation of the AtkSelection interface,
     9        containing the related code from WebKitAccessibleWrapperAtk.cpp.
     10
     11        * accessibility/gtk/WebKitAccessibleInterfaceSelection.cpp: Added.
     12        (core):
     13        (listObjectForSelection):
     14        (optionFromList):
     15        (optionFromSelection):
     16        (webkitAccessibleSelectionInterfaceInit):
     17        (webkitAccessibleSelectionAddSelection):
     18        (webkitAccessibleSelectionClearSelection):
     19        (webkitAccessibleSelectionRefSelection):
     20        (webkitAccessibleSelectionGetSelectionCount):
     21        (webkitAccessibleSelectionIsChildSelected):
     22        (webkitAccessibleSelectionRemoveSelection):
     23        (webkitAccessibleSelectionSelectAllSelection):
     24        * accessibility/gtk/WebKitAccessibleInterfaceSelection.h: Added.
     25        * accessibility/gtk/WebKitAccessibleWrapperAtk.cpp: Remove code
     26        related to the implementation of the AtkSelection interface.
     27
     28        Add new files to build files.
     29
     30        * GNUmakefile.list.am: Add WebKitAccessibleInterfaceSelection.[h|cpp].
     31        * WebCore.gypi: Ditto.
     32
    1332012-01-24  Mario Sanchez Prada  <msanchez@igalia.com>
    234
  • trunk/Source/WebCore/GNUmakefile.list.am

    r105726 r105727  
    44364436        Source/WebCore/accessibility/gtk/WebKitAccessibleInterfaceImage.cpp \
    44374437        Source/WebCore/accessibility/gtk/WebKitAccessibleInterfaceImage.h \
     4438        Source/WebCore/accessibility/gtk/WebKitAccessibleInterfaceSelection.cpp \
     4439        Source/WebCore/accessibility/gtk/WebKitAccessibleInterfaceSelection.h \
    44384440        Source/WebCore/accessibility/gtk/WebKitAccessibleUtil.cpp \
    44394441        Source/WebCore/accessibility/gtk/WebKitAccessibleUtil.h \
  • trunk/Source/WebCore/WebCore.gypi

    r105726 r105727  
    13601360            'accessibility/gtk/WebKitAccessibleInterfaceImage.cpp',
    13611361            'accessibility/gtk/WebKitAccessibleInterfaceImage.h',
     1362            'accessibility/gtk/WebKitAccessibleInterfaceSelection.cpp',
     1363            'accessibility/gtk/WebKitAccessibleInterfaceSelection.h',
    13621364            'accessibility/gtk/WebKitAccessibleUtil.cpp',
    13631365            'accessibility/gtk/WebKitAccessibleUtil.h',
  • trunk/Source/WebCore/accessibility/gtk/WebKitAccessibleWrapperAtk.cpp

    r105726 r105727  
    7171#include "WebKitAccessibleInterfaceHypertext.h"
    7272#include "WebKitAccessibleInterfaceImage.h"
     73#include "WebKitAccessibleInterfaceSelection.h"
    7374#include "WebKitAccessibleUtil.h"
    7475#include "htmlediting.h"
     
    113114
    114115    return core(WEBKIT_ACCESSIBLE(object));
    115 }
    116 
    117 static AccessibilityObject* core(AtkSelection* selection)
    118 {
    119     return core(ATK_OBJECT(selection));
    120116}
    121117
     
    832828}
    833829
    834 // Selection (for controls)
    835 
    836 static AccessibilityObject* listObjectForSelection(AtkSelection* selection)
    837 {
    838     AccessibilityObject* coreSelection = core(selection);
    839 
    840     // Only list boxes and menu lists supported so far.
    841     if (!coreSelection->isListBox() && !coreSelection->isMenuList())
    842         return 0;
    843 
    844     // For list boxes the list object is just itself.
    845     if (coreSelection->isListBox())
    846         return coreSelection;
    847 
    848     // For menu lists we need to return the first accessible child,
    849     // with role MenuListPopupRole, since that's the one holding the list
    850     // of items with role MenuListOptionRole.
    851     AccessibilityObject::AccessibilityChildrenVector children = coreSelection->children();
    852     if (!children.size())
    853         return 0;
    854 
    855     AccessibilityObject* listObject = children.at(0).get();
    856     if (!listObject->isMenuListPopup())
    857         return 0;
    858 
    859     return listObject;
    860 }
    861 
    862 static AccessibilityObject* optionFromList(AtkSelection* selection, gint i)
    863 {
    864     AccessibilityObject* coreSelection = core(selection);
    865     if (!coreSelection || i < 0)
    866         return 0;
    867 
    868     // Need to select the proper list object depending on the type.
    869     AccessibilityObject* listObject = listObjectForSelection(selection);
    870     if (!listObject)
    871         return 0;
    872 
    873     AccessibilityObject::AccessibilityChildrenVector options = listObject->children();
    874     if (i < static_cast<gint>(options.size()))
    875         return options.at(i).get();
    876 
    877     return 0;
    878 }
    879 
    880 static AccessibilityObject* optionFromSelection(AtkSelection* selection, gint i)
    881 {
    882     // i is the ith selection as opposed to the ith child.
    883 
    884     AccessibilityObject* coreSelection = core(selection);
    885     if (!coreSelection || !coreSelection->isAccessibilityRenderObject() || i < 0)
    886         return 0;
    887 
    888     AccessibilityObject::AccessibilityChildrenVector selectedItems;
    889     if (coreSelection->isListBox())
    890         coreSelection->selectedChildren(selectedItems);
    891     else if (coreSelection->isMenuList()) {
    892         RenderObject* renderer = coreSelection->renderer();
    893         if (!renderer)
    894             return 0;
    895 
    896         HTMLSelectElement* selectNode = toHTMLSelectElement(renderer->node());
    897         int selectedIndex = selectNode->selectedIndex();
    898         const Vector<HTMLElement*> listItems = selectNode->listItems();
    899 
    900         if (selectedIndex < 0 || selectedIndex >= static_cast<int>(listItems.size()))
    901             return 0;
    902 
    903         return optionFromList(selection, selectedIndex);
    904     }
    905 
    906     if (i < static_cast<gint>(selectedItems.size()))
    907         return selectedItems.at(i).get();
    908 
    909     return 0;
    910 }
    911 
    912 static gboolean webkit_accessible_selection_add_selection(AtkSelection* selection, gint i)
    913 {
    914     AccessibilityObject* coreSelection = core(selection);
    915     if (!coreSelection)
    916         return false;
    917 
    918     AccessibilityObject* option = optionFromList(selection, i);
    919     if (option && (coreSelection->isListBox() || coreSelection->isMenuList())) {
    920         option->setSelected(true);
    921         return option->isSelected();
    922     }
    923 
    924     return false;
    925 }
    926 
    927 static gboolean webkit_accessible_selection_clear_selection(AtkSelection* selection)
    928 {
    929     AccessibilityObject* coreSelection = core(selection);
    930     if (!coreSelection)
    931         return false;
    932 
    933     AccessibilityObject::AccessibilityChildrenVector selectedItems;
    934     if (coreSelection->isListBox() || coreSelection->isMenuList()) {
    935         // Set the list of selected items to an empty list; then verify that it worked.
    936         AccessibilityListBox* listBox = static_cast<AccessibilityListBox*>(coreSelection);
    937         listBox->setSelectedChildren(selectedItems);
    938         listBox->selectedChildren(selectedItems);
    939         return !selectedItems.size();
    940     }
    941     return false;
    942 }
    943 
    944 static AtkObject* webkit_accessible_selection_ref_selection(AtkSelection* selection, gint i)
    945 {
    946     AccessibilityObject* option = optionFromSelection(selection, i);
    947     if (option) {
    948         AtkObject* child = option->wrapper();
    949         g_object_ref(child);
    950         return child;
    951     }
    952 
    953     return 0;
    954 }
    955 
    956 static gint webkit_accessible_selection_get_selection_count(AtkSelection* selection)
    957 {
    958     AccessibilityObject* coreSelection = core(selection);
    959     if (!coreSelection || !coreSelection->isAccessibilityRenderObject())
    960         return 0;
    961 
    962     if (coreSelection->isListBox()) {
    963         AccessibilityObject::AccessibilityChildrenVector selectedItems;
    964         coreSelection->selectedChildren(selectedItems);
    965         return static_cast<gint>(selectedItems.size());
    966     }
    967 
    968     if (coreSelection->isMenuList()) {
    969         RenderObject* renderer = coreSelection->renderer();
    970         if (!renderer)
    971             return 0;
    972 
    973         int selectedIndex = toHTMLSelectElement(renderer->node())->selectedIndex();
    974         return selectedIndex >= 0 && selectedIndex < static_cast<int>(toHTMLSelectElement(renderer->node())->listItems().size());
    975     }
    976 
    977     return 0;
    978 }
    979 
    980 static gboolean webkit_accessible_selection_is_child_selected(AtkSelection* selection, gint i)
    981 {
    982     AccessibilityObject* coreSelection = core(selection);
    983     if (!coreSelection)
    984         return 0;
    985 
    986     AccessibilityObject* option = optionFromList(selection, i);
    987     if (option && (coreSelection->isListBox() || coreSelection->isMenuList()))
    988         return option->isSelected();
    989 
    990     return false;
    991 }
    992 
    993 static gboolean webkit_accessible_selection_remove_selection(AtkSelection* selection, gint i)
    994 {
    995     AccessibilityObject* coreSelection = core(selection);
    996     if (!coreSelection)
    997         return 0;
    998 
    999     // TODO: This is only getting called if i == 0. What is preventing the rest?
    1000     AccessibilityObject* option = optionFromSelection(selection, i);
    1001     if (option && (coreSelection->isListBox() || coreSelection->isMenuList())) {
    1002         option->setSelected(false);
    1003         return !option->isSelected();
    1004     }
    1005 
    1006     return false;
    1007 }
    1008 
    1009 static gboolean webkit_accessible_selection_select_all_selection(AtkSelection* selection)
    1010 {
    1011     AccessibilityObject* coreSelection = core(selection);
    1012     if (!coreSelection || !coreSelection->isMultiSelectable())
    1013         return false;
    1014 
    1015     AccessibilityObject::AccessibilityChildrenVector children = coreSelection->children();
    1016     if (coreSelection->isListBox()) {
    1017         AccessibilityListBox* listBox = static_cast<AccessibilityListBox*>(coreSelection);
    1018         listBox->setSelectedChildren(children);
    1019         AccessibilityObject::AccessibilityChildrenVector selectedItems;
    1020         listBox->selectedChildren(selectedItems);
    1021         return selectedItems.size() == children.size();
    1022     }
    1023 
    1024     return false;
    1025 }
    1026 
    1027 static void atk_selection_interface_init(AtkSelectionIface* iface)
    1028 {
    1029     iface->add_selection = webkit_accessible_selection_add_selection;
    1030     iface->clear_selection = webkit_accessible_selection_clear_selection;
    1031     iface->ref_selection = webkit_accessible_selection_ref_selection;
    1032     iface->get_selection_count = webkit_accessible_selection_get_selection_count;
    1033     iface->is_child_selected = webkit_accessible_selection_is_child_selected;
    1034     iface->remove_selection = webkit_accessible_selection_remove_selection;
    1035     iface->select_all_selection = webkit_accessible_selection_select_all_selection;
    1036 }
    1037 
    1038830// Text
    1039831
     
    20871879static const GInterfaceInfo AtkInterfacesInitFunctions[] = {
    20881880    {reinterpret_cast<GInterfaceInitFunc>(webkitAccessibleActionInterfaceInit), 0, 0},
    2089     {(GInterfaceInitFunc)atk_selection_interface_init,
    2090      (GInterfaceFinalizeFunc) 0, 0},
     1881    {reinterpret_cast<GInterfaceInitFunc>(webkitAccessibleSelectionInterfaceInit), 0, 0},
    20911882    {reinterpret_cast<GInterfaceInitFunc>(webkitAccessibleEditableTextInterfaceInit), 0, 0},
    20921883    {(GInterfaceInitFunc)atk_text_interface_init,
Note: See TracChangeset for help on using the changeset viewer.