Changeset 50282 in webkit
- Timestamp:
- Oct 29, 2009 10:34:39 AM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r50279 r50282 1 2009-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 1 26 2009-10-29 Jian Li <jianli@chromium.org> 2 27 -
trunk/WebCore/accessibility/gtk/AXObjectCacheAtk.cpp
r48367 r50282 44 44 return; 45 45 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"); 46 50 } 47 51 } -
trunk/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp
r50250 r50282 36 36 #include "AXObjectCache.h" 37 37 #include "AccessibilityListBox.h" 38 #include "AccessibilityListBoxOption.h" 38 39 #include "AccessibilityRenderObject.h" 39 40 #include "AccessibilityTable.h" … … 105 106 { 106 107 return core(ATK_OBJECT(action)); 108 } 109 110 static AccessibilityObject* core(AtkSelection* selection) 111 { 112 return core(ATK_OBJECT(selection)); 107 113 } 108 114 … … 610 616 } 611 617 618 // Selection (for controls) 619 620 static 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 633 static 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 653 static 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 665 static 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 682 static 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 694 static 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 706 static 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 715 static 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 728 static 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 746 static 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 612 757 // Text 613 758 … … 1178 1323 {(GInterfaceInitFunc)atk_action_interface_init, 1179 1324 (GInterfaceFinalizeFunc) NULL, NULL}, 1325 {(GInterfaceInitFunc)atk_selection_interface_init, 1326 (GInterfaceFinalizeFunc) NULL, NULL}, 1180 1327 {(GInterfaceInitFunc)atk_editable_text_interface_init, 1181 1328 (GInterfaceFinalizeFunc) NULL, NULL}, … … 1192 1339 enum WAIType { 1193 1340 WAI_ACTION, 1341 WAI_SELECTION, 1194 1342 WAI_EDITABLE_TEXT, 1195 1343 WAI_TEXT, … … 1204 1352 case WAI_ACTION: 1205 1353 return ATK_TYPE_ACTION; 1354 case WAI_SELECTION: 1355 return ATK_TYPE_SELECTION; 1206 1356 case WAI_EDITABLE_TEXT: 1207 1357 return ATK_TYPE_EDITABLE_TEXT; … … 1229 1379 if (!coreObject->actionVerb().isEmpty()) 1230 1380 interfaceMask |= 1 << WAI_ACTION; 1381 1382 // Selection 1383 if (coreObject->isListBox()) 1384 interfaceMask |= 1 << WAI_SELECTION; 1231 1385 1232 1386 // Text & Editable Text
Note: See TracChangeset
for help on using the changeset viewer.