Changeset 285997 in webkit
- Timestamp:
- Nov 18, 2021, 4:34:31 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 11 edited
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/SourcesGTK.txt (modified) (1 diff)
-
Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp (modified) (1 diff)
-
Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp (modified) (1 diff)
-
Source/WebCore/accessibility/atspi/AccessibilityAtspi.h (modified) (1 diff)
-
Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp (modified) (3 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h (modified) (3 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityObjectValueAtspi.cpp (added)
-
Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp (modified) (2 diffs)
-
Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r285996 r285997 1 2021-10-26 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK][a11y] Add implementation of value interface when building with ATSPI 4 https://bugs.webkit.org/show_bug.cgi?id=232300 5 6 Reviewed by Adrian Perez de Castro. 7 8 * SourcesGTK.txt: 9 * accessibility/atspi/AXObjectCacheAtspi.cpp: 10 (WebCore::AXObjectCache::postPlatformNotification): 11 * accessibility/atspi/AccessibilityAtspi.cpp: 12 (WebCore::AccessibilityAtspi::valueChanged): 13 * accessibility/atspi/AccessibilityAtspi.h: 14 * accessibility/atspi/AccessibilityObjectAtspi.cpp: 15 (WebCore::AccessibilityObjectAtspi::interfacesForObject): 16 (WebCore::AccessibilityObjectAtspi::path): 17 (WebCore::AccessibilityObjectAtspi::buildInterfaces const): 18 * accessibility/atspi/AccessibilityObjectAtspi.h: 19 * accessibility/atspi/AccessibilityObjectValueAtspi.cpp: Added. 20 (WebCore::AccessibilityObjectAtspi::currentValue const): 21 (WebCore::AccessibilityObjectAtspi::setCurrentValue): 22 (WebCore::AccessibilityObjectAtspi::minimumValue const): 23 (WebCore::AccessibilityObjectAtspi::maximumValue const): 24 (WebCore::AccessibilityObjectAtspi::minimumIncrement const): 25 (WebCore::AccessibilityObjectAtspi::valueChanged): 26 * accessibility/atspi/AccessibilityRootAtspi.cpp: 27 1 28 2021-10-25 Carlos Garcia Campos <cgarcia@igalia.com> 2 29 -
trunk/Source/WebCore/SourcesGTK.txt
r284920 r285997 44 44 accessibility/atspi/AccessibilityObjectComponentAtspi.cpp 45 45 accessibility/atspi/AccessibilityObjectTextAtspi.cpp 46 accessibility/atspi/AccessibilityObjectValueAtspi.cpp 46 47 accessibility/atspi/AccessibilityRootAtspi.cpp 47 48 accessibility/atspi/AXObjectCacheAtspi.cpp -
trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp
r284675 r285997 87 87 break; 88 88 case AXValueChanged: 89 if (wrapper->interfaces().contains(AccessibilityObjectAtspi::Interface::Value)) 90 wrapper->valueChanged(coreObject->valueForRange()); 89 91 break; 90 92 case AXInvalidStatusChanged: -
trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp
r285996 r285997 218 218 g_dbus_connection_emit_signal(m_connection.get(), nullptr, atspiObject->path().utf8().data(), "org.a11y.atspi.Event.Object", "TextSelectionChanged", 219 219 g_variant_new("(siiva{sv})", "", 0, 0, g_variant_new_string(""), nullptr), nullptr); 220 }); 221 } 222 223 void AccessibilityAtspi::valueChanged(AccessibilityObjectAtspi& atspiObject, double value) 224 { 225 RELEASE_ASSERT(isMainThread()); 226 m_queue->dispatch([this, atspiObject = Ref { atspiObject }, value] { 227 if (!m_connection) 228 return; 229 230 g_dbus_connection_emit_signal(m_connection.get(), nullptr, atspiObject->path().utf8().data(), "org.a11y.atspi.Event.Object", "PropertyChange", 231 g_variant_new("(siiva{sv})", "accessible-value", 0, 0, g_variant_new_double(value), nullptr), nullptr); 220 232 }); 221 233 } -
trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.h
r285996 r285997 64 64 void textSelectionChanged(AccessibilityObjectAtspi&); 65 65 66 void valueChanged(AccessibilityObjectAtspi&, double); 67 66 68 static const char* localizedRoleName(AccessibilityRole); 67 69 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp
r285991 r285997 83 83 } 84 84 } 85 86 if (coreObject.supportsRangeValue()) 87 interfaces.add(Interface::Value); 85 88 86 89 return interfaces; … … 470 473 if (m_interfaces.contains(Interface::Text)) 471 474 interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_text_interface), &s_textFunctions }); 475 if (m_interfaces.contains(Interface::Value)) 476 interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_value_interface), &s_valueFunctions }); 472 477 m_path = atspiRoot->atspi().registerObject(*this, WTFMove(interfaces)); 473 478 } … … 1085 1090 if (m_interfaces.contains(Interface::Text)) 1086 1091 g_variant_builder_add(builder, "s", webkit_text_interface.name); 1092 if (m_interfaces.contains(Interface::Value)) 1093 g_variant_builder_add(builder, "s", webkit_value_interface.name); 1087 1094 } 1088 1095 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h
r285996 r285997 46 46 Accessible = 1 << 0, 47 47 Component = 1 << 1, 48 Text = 1 << 2 48 Text = 1 << 2, 49 Value = 1 << 3 49 50 }; 50 51 const OptionSet<Interface>& interfaces() const { return m_interfaces; } … … 110 111 void selectionChanged(const VisibleSelection&); 111 112 113 WEBCORE_EXPORT double currentValue() const; 114 WEBCORE_EXPORT bool setCurrentValue(double); 115 WEBCORE_EXPORT double minimumValue() const; 116 WEBCORE_EXPORT double maximumValue() const; 117 WEBCORE_EXPORT double minimumIncrement() const; 118 void valueChanged(double); 119 112 120 private: 113 121 explicit AccessibilityObjectAtspi(AXCoreObject*); … … 146 154 static GDBusInterfaceVTable s_componentFunctions; 147 155 static GDBusInterfaceVTable s_textFunctions; 156 static GDBusInterfaceVTable s_valueFunctions; 148 157 149 158 AXCoreObject* m_axObject { nullptr }; -
trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp
r285996 r285997 28 28 #include "FocusController.h" 29 29 #include "Frame.h" 30 #include "FrameView.h" 30 31 #include "Page.h" 31 32 #include <glib/gi18n-lib.h> -
trunk/Tools/ChangeLog
r285996 r285997 1 2021-10-26 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK][a11y] Add implementation of value interface when building with ATSPI 4 https://bugs.webkit.org/show_bug.cgi?id=232300 5 6 Reviewed by Adrian Perez de Castro. 7 8 Add new unit test for the value interface and implement WTR value support. 9 10 * TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp: 11 (testValueBasic): 12 (beforeAll): 13 * WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp: 14 (WTR::AccessibilityUIElement::isAttributeSettable): 15 (WTR::AccessibilityUIElement::intValue const): 16 (WTR::AccessibilityUIElement::minValue): 17 (WTR::AccessibilityUIElement::maxValue): 18 (WTR::AccessibilityUIElement::valueDescription): 19 (WTR::AccessibilityUIElement::increment): 20 (WTR::AccessibilityUIElement::decrement): 21 1 22 2021-10-25 Carlos Garcia Campos <cgarcia@igalia.com> 2 23 -
trunk/Tools/TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp
r285339 r285997 1615 1615 } 1616 1616 1617 static void testValueBasic(AccessibilityTest* test, gconstpointer) 1618 { 1619 test->showInWindow(800, 600); 1620 test->loadHtml( 1621 "<html>" 1622 " <body>" 1623 " <input type='range' min='0' max='100' value='50' step='25'/>" 1624 " </body>" 1625 "</html>", 1626 nullptr); 1627 test->waitUntilLoadFinished(); 1628 1629 auto testApp = test->findTestApplication(); 1630 g_assert_true(ATSPI_IS_ACCESSIBLE(testApp.get())); 1631 1632 auto documentWeb = test->findDocumentWeb(testApp.get()); 1633 g_assert_true(ATSPI_IS_ACCESSIBLE(documentWeb.get())); 1634 g_assert_cmpint(atspi_accessible_get_child_count(documentWeb.get(), nullptr), ==, 1); 1635 1636 auto panel = adoptGRef(atspi_accessible_get_child_at_index(documentWeb.get(), 0, nullptr)); 1637 g_assert_true(ATSPI_IS_ACCESSIBLE(panel.get())); 1638 g_assert_cmpint(atspi_accessible_get_role(panel.get(), nullptr), ==, ATSPI_ROLE_PANEL); 1639 1640 auto slider = adoptGRef(atspi_accessible_get_child_at_index(panel.get(), 0, nullptr)); 1641 g_assert_true(ATSPI_IS_VALUE(slider.get())); 1642 g_assert_cmpfloat(atspi_value_get_current_value(ATSPI_VALUE(slider.get()), nullptr), ==, 50); 1643 g_assert_cmpfloat(atspi_value_get_minimum_value(ATSPI_VALUE(slider.get()), nullptr), ==, 0); 1644 g_assert_cmpfloat(atspi_value_get_maximum_value(ATSPI_VALUE(slider.get()), nullptr), ==, 100); 1645 g_assert_cmpfloat(atspi_value_get_minimum_increment(ATSPI_VALUE(slider.get()), nullptr), ==, 25); 1646 1647 test->startEventMonitor(slider.get(), { "object:property-change:accessible-value" }); 1648 g_assert_true(atspi_value_set_current_value(ATSPI_VALUE(slider.get()), 75, nullptr)); 1649 auto events = test->stopEventMonitor(1); 1650 g_assert_cmpuint(events.size(), ==, 1); 1651 g_assert_cmpstr(events[0]->type, ==, "object:property-change:accessible-value"); 1652 g_assert_cmpfloat(atspi_value_get_current_value(ATSPI_VALUE(slider.get()), nullptr), ==, 75); 1653 1654 test->startEventMonitor(slider.get(), { "object:property-change:accessible-value" }); 1655 g_assert_true(atspi_value_set_current_value(ATSPI_VALUE(slider.get()), 125, nullptr)); 1656 events = test->stopEventMonitor(1); 1657 g_assert_cmpuint(events.size(), ==, 1); 1658 g_assert_cmpstr(events[0]->type, ==, "object:property-change:accessible-value"); 1659 g_assert_cmpfloat(atspi_value_get_current_value(ATSPI_VALUE(slider.get()), nullptr), ==, 100); 1660 test->startEventMonitor(slider.get(), { "object:property-change:accessible-value" }); 1661 g_assert_true(atspi_value_set_current_value(ATSPI_VALUE(slider.get()), -25, nullptr)); 1662 events = test->stopEventMonitor(1); 1663 g_assert_cmpuint(events.size(), ==, 1); 1664 g_assert_cmpstr(events[0]->type, ==, "object:property-change:accessible-value"); 1665 g_assert_cmpfloat(atspi_value_get_current_value(ATSPI_VALUE(slider.get()), nullptr), ==, 0); 1666 } 1667 1617 1668 void beforeAll() 1618 1669 { … … 1635 1686 AccessibilityTest::add("WebKitAccessibility", "text/state-changed", testTextStateChanged); 1636 1687 AccessibilityTest::add("WebKitAccessibility", "text/replaced-objects", testTextReplacedObjects); 1688 AccessibilityTest::add("WebKitAccessibility", "value/basic", testValueBasic); 1637 1689 } 1638 1690 -
trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp
r285996 r285997 384 384 bool AccessibilityUIElement::isAttributeSettable(JSStringRef attribute) 385 385 { 386 String attributeName = toWTFString(attribute); 387 if (attributeName != "AXValue") 388 return false; 389 390 if (checkElementState(m_element.get(), WebCore::Atspi::State::ReadOnly)) 391 return false; 392 393 if (checkElementState(m_element.get(), WebCore::Atspi::State::Editable)) 394 return true; 395 396 if (checkElementState(m_element.get(), WebCore::Atspi::State::Checkable)) 397 return true; 398 399 if (m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Value) 400 && checkElementState(m_element.get(), WebCore::Atspi::State::Focusable)) { 401 double minimumValue, maximumValue; 402 s_controller->executeOnAXThreadAndWait([this, &minimumValue, &maximumValue] { 403 m_element->updateBackingStore(); 404 minimumValue = m_element->minimumValue(); 405 maximumValue = m_element->maximumValue(); 406 }); 407 if (minimumValue != maximumValue) 408 return true; 409 } 410 386 411 return false; 387 412 } … … 718 743 double AccessibilityUIElement::intValue() const 719 744 { 720 return 0; 745 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Value)) 746 return 0; 747 748 double currentValue; 749 s_controller->executeOnAXThreadAndWait([this, ¤tValue] { 750 m_element->updateBackingStore(); 751 currentValue = m_element->currentValue(); 752 }); 753 return currentValue; 721 754 } 722 755 723 756 double AccessibilityUIElement::minValue() 724 757 { 725 return 0; 758 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Value)) 759 return 0; 760 761 double minimumValue; 762 s_controller->executeOnAXThreadAndWait([this, &minimumValue] { 763 m_element->updateBackingStore(); 764 minimumValue = m_element->minimumValue(); 765 }); 766 return minimumValue; 726 767 } 727 768 728 769 double AccessibilityUIElement::maxValue() 729 770 { 730 return 0; 771 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Value)) 772 return 0; 773 774 double maximumValue; 775 s_controller->executeOnAXThreadAndWait([this, &maximumValue] { 776 m_element->updateBackingStore(); 777 maximumValue = m_element->maximumValue(); 778 }); 779 return maximumValue; 731 780 } 732 781 733 782 JSRetainPtr<JSStringRef> AccessibilityUIElement::valueDescription() 734 783 { 735 return JSStringCreateWithCharacters(0, 0); 784 auto attributes = m_element->attributes(); 785 auto value = makeString("AXValueDescription: ", attributes.get("valuetext")); 786 return OpaqueJSString::tryCreate(value).leakRef(); 736 787 } 737 788 … … 1023 1074 void AccessibilityUIElement::increment() 1024 1075 { 1076 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Value)) 1077 return; 1078 1079 m_element->setCurrentValue(intValue() + m_element->minimumIncrement()); 1025 1080 } 1026 1081 1027 1082 void AccessibilityUIElement::decrement() 1028 1083 { 1084 if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Value)) 1085 return; 1086 1087 m_element->setCurrentValue(intValue() - m_element->minimumIncrement()); 1029 1088 } 1030 1089
Note:
See TracChangeset
for help on using the changeset viewer.