⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 285997 in webkit


Ignore:
Timestamp:
Nov 18, 2021, 4:34:31 AM (5 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK][a11y] Add implementation of value interface when building with ATSPI
https://bugs.webkit.org/show_bug.cgi?id=232300

Reviewed by Adrian Perez de Castro.

Source/WebCore:

  • SourcesGTK.txt:
  • accessibility/atspi/AXObjectCacheAtspi.cpp:

(WebCore::AXObjectCache::postPlatformNotification):

  • accessibility/atspi/AccessibilityAtspi.cpp:

(WebCore::AccessibilityAtspi::valueChanged):

  • accessibility/atspi/AccessibilityAtspi.h:
  • accessibility/atspi/AccessibilityObjectAtspi.cpp:

(WebCore::AccessibilityObjectAtspi::interfacesForObject):
(WebCore::AccessibilityObjectAtspi::path):
(WebCore::AccessibilityObjectAtspi::buildInterfaces const):

  • accessibility/atspi/AccessibilityObjectAtspi.h:
  • accessibility/atspi/AccessibilityObjectValueAtspi.cpp: Added.

(WebCore::AccessibilityObjectAtspi::currentValue const):
(WebCore::AccessibilityObjectAtspi::setCurrentValue):
(WebCore::AccessibilityObjectAtspi::minimumValue const):
(WebCore::AccessibilityObjectAtspi::maximumValue const):
(WebCore::AccessibilityObjectAtspi::minimumIncrement const):
(WebCore::AccessibilityObjectAtspi::valueChanged):

  • accessibility/atspi/AccessibilityRootAtspi.cpp:

Tools:

Add new unit test for the value interface and implement WTR value support.

  • TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp:

(testValueBasic):
(beforeAll):

  • WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp:

(WTR::AccessibilityUIElement::isAttributeSettable):
(WTR::AccessibilityUIElement::intValue const):
(WTR::AccessibilityUIElement::minValue):
(WTR::AccessibilityUIElement::maxValue):
(WTR::AccessibilityUIElement::valueDescription):
(WTR::AccessibilityUIElement::increment):
(WTR::AccessibilityUIElement::decrement):

Location:
trunk
Files:
1 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r285996 r285997  
     12021-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
    1282021-10-25  Carlos Garcia Campos  <cgarcia@igalia.com>
    229
  • trunk/Source/WebCore/SourcesGTK.txt

    r284920 r285997  
    4444accessibility/atspi/AccessibilityObjectComponentAtspi.cpp
    4545accessibility/atspi/AccessibilityObjectTextAtspi.cpp
     46accessibility/atspi/AccessibilityObjectValueAtspi.cpp
    4647accessibility/atspi/AccessibilityRootAtspi.cpp
    4748accessibility/atspi/AXObjectCacheAtspi.cpp
  • trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp

    r284675 r285997  
    8787        break;
    8888    case AXValueChanged:
     89        if (wrapper->interfaces().contains(AccessibilityObjectAtspi::Interface::Value))
     90            wrapper->valueChanged(coreObject->valueForRange());
    8991        break;
    9092    case AXInvalidStatusChanged:
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp

    r285996 r285997  
    218218        g_dbus_connection_emit_signal(m_connection.get(), nullptr, atspiObject->path().utf8().data(), "org.a11y.atspi.Event.Object", "TextSelectionChanged",
    219219            g_variant_new("(siiva{sv})", "", 0, 0, g_variant_new_string(""), nullptr), nullptr);
     220    });
     221}
     222
     223void 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);
    220232    });
    221233}
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.h

    r285996 r285997  
    6464    void textSelectionChanged(AccessibilityObjectAtspi&);
    6565
     66    void valueChanged(AccessibilityObjectAtspi&, double);
     67
    6668    static const char* localizedRoleName(AccessibilityRole);
    6769
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp

    r285991 r285997  
    8383        }
    8484    }
     85
     86    if (coreObject.supportsRangeValue())
     87        interfaces.add(Interface::Value);
    8588
    8689    return interfaces;
     
    470473        if (m_interfaces.contains(Interface::Text))
    471474            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 });
    472477        m_path = atspiRoot->atspi().registerObject(*this, WTFMove(interfaces));
    473478    }
     
    10851090    if (m_interfaces.contains(Interface::Text))
    10861091        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);
    10871094}
    10881095
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h

    r285996 r285997  
    4646        Accessible = 1 << 0,
    4747        Component = 1 << 1,
    48         Text = 1 << 2
     48        Text = 1 << 2,
     49        Value = 1 << 3
    4950    };
    5051    const OptionSet<Interface>& interfaces() const { return m_interfaces; }
     
    110111    void selectionChanged(const VisibleSelection&);
    111112
     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
    112120private:
    113121    explicit AccessibilityObjectAtspi(AXCoreObject*);
     
    146154    static GDBusInterfaceVTable s_componentFunctions;
    147155    static GDBusInterfaceVTable s_textFunctions;
     156    static GDBusInterfaceVTable s_valueFunctions;
    148157
    149158    AXCoreObject* m_axObject { nullptr };
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp

    r285996 r285997  
    2828#include "FocusController.h"
    2929#include "Frame.h"
     30#include "FrameView.h"
    3031#include "Page.h"
    3132#include <glib/gi18n-lib.h>
  • trunk/Tools/ChangeLog

    r285996 r285997  
     12021-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
    1222021-10-25  Carlos Garcia Campos  <cgarcia@igalia.com>
    223
  • trunk/Tools/TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp

    r285339 r285997  
    16151615}
    16161616
     1617static 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
    16171668void beforeAll()
    16181669{
     
    16351686    AccessibilityTest::add("WebKitAccessibility", "text/state-changed", testTextStateChanged);
    16361687    AccessibilityTest::add("WebKitAccessibility", "text/replaced-objects", testTextReplacedObjects);
     1688    AccessibilityTest::add("WebKitAccessibility", "value/basic", testValueBasic);
    16371689}
    16381690
  • trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp

    r285996 r285997  
    384384bool AccessibilityUIElement::isAttributeSettable(JSStringRef attribute)
    385385{
     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
    386411    return false;
    387412}
     
    718743double AccessibilityUIElement::intValue() const
    719744{
    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, &currentValue] {
     750        m_element->updateBackingStore();
     751        currentValue = m_element->currentValue();
     752    });
     753    return currentValue;
    721754}
    722755
    723756double AccessibilityUIElement::minValue()
    724757{
    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;
    726767}
    727768
    728769double AccessibilityUIElement::maxValue()
    729770{
    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;
    731780}
    732781
    733782JSRetainPtr<JSStringRef> AccessibilityUIElement::valueDescription()
    734783{
    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();
    736787}
    737788
     
    10231074void AccessibilityUIElement::increment()
    10241075{
     1076    if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Value))
     1077        return;
     1078
     1079    m_element->setCurrentValue(intValue() + m_element->minimumIncrement());
    10251080}
    10261081
    10271082void AccessibilityUIElement::decrement()
    10281083{
     1084    if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Value))
     1085        return;
     1086
     1087    m_element->setCurrentValue(intValue() - m_element->minimumIncrement());
    10291088}
    10301089
Note: See TracChangeset for help on using the changeset viewer.