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

Changeset 286059 in webkit


Ignore:
Timestamp:
Nov 19, 2021, 6:51:09 AM (5 years ago)
Author:
Carlos Garcia Campos
Message:

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

Reviewed by Adrian Perez de Castro.

Source/WebCore:

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

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

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

(WebCore::AccessibilityObjectAtspi::documentAttribute const):
(WebCore::AccessibilityObjectAtspi::documentAttributes const):
(WebCore::AccessibilityObjectAtspi::documentLocale const):

Tools:

Add unit test for the document interface and WTR implementation.

  • TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp:

(testDocumentBasic):
(beforeAll):

  • WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp:

(WTR::AccessibilityUIElement::language):
(WTR::AccessibilityUIElement::documentEncoding):
(WTR::AccessibilityUIElement::documentURI):

Location:
trunk
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r286058 r286059  
     12021-11-19  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK][a11y] Add implementation of document interface when building with ATSPI
     4        https://bugs.webkit.org/show_bug.cgi?id=232755
     5
     6        Reviewed by Adrian Perez de Castro.
     7
     8        * SourcesGTK.txt:
     9        * accessibility/atspi/AccessibilityObjectAtspi.cpp:
     10        (WebCore::AccessibilityObjectAtspi::interfacesForObject):
     11        (WebCore::AccessibilityObjectAtspi::path):
     12        (WebCore::AccessibilityObjectAtspi::locale const):
     13        (WebCore::AccessibilityObjectAtspi::buildInterfaces const):
     14        * accessibility/atspi/AccessibilityObjectAtspi.h:
     15        * accessibility/atspi/AccessibilityObjectDocumentAtspi.cpp: Added.
     16        (WebCore::AccessibilityObjectAtspi::documentAttribute const):
     17        (WebCore::AccessibilityObjectAtspi::documentAttributes const):
     18        (WebCore::AccessibilityObjectAtspi::documentLocale const):
     19
    1202021-11-19  Antti Koivisto  <antti@apple.com>
    221
  • trunk/Source/WebCore/SourcesGTK.txt

    r286056 r286059  
    4444accessibility/atspi/AccessibilityObjectActionAtspi.cpp
    4545accessibility/atspi/AccessibilityObjectComponentAtspi.cpp
     46accessibility/atspi/AccessibilityObjectDocumentAtspi.cpp
    4647accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp
    4748accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp

    r286056 r286059  
    9191    if (coreObject.isLink() || (isRendererReplacedElement(renderer)))
    9292        interfaces.add(Interface::Hyperlink);
     93
     94    if (coreObject.roleValue() == AccessibilityRole::WebArea)
     95        interfaces.add(Interface::Document);
    9396
    9497    return interfaces;
     
    446449            return g_variant_new_string(atspiObject->description().data());
    447450        if (!g_strcmp0(propertyName, "Locale"))
    448             return g_variant_new_string(setlocale(LC_MESSAGES, nullptr));
     451            return g_variant_new_string(atspiObject->locale().utf8().data());
    449452        if (!g_strcmp0(propertyName, "AccessibleId"))
    450453            return g_variant_new_string(atspiObject->m_axObject ? String::number(atspiObject->m_axObject->objectID().toUInt64()).utf8().data() : "");
     
    486489        if (m_interfaces.contains(Interface::Action))
    487490            interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_action_interface), &s_actionFunctions });
     491        if (m_interfaces.contains(Interface::Document))
     492            interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_document_interface), &s_documentFunctions });
    488493        m_path = atspiRoot->atspi().registerObject(*this, WTFMove(interfaces));
    489494    }
     
    694699
    695700    return "";
     701}
     702
     703String AccessibilityObjectAtspi::locale() const
     704{
     705    auto* axObject = isMainThread() ? m_coreObject : m_axObject;
     706    return axObject ? axObject->language() : String();
    696707}
    697708
     
    11201131    if (m_interfaces.contains(Interface::Action))
    11211132        g_variant_builder_add(builder, "s", webkit_action_interface.name);
     1133    if (m_interfaces.contains(Interface::Document))
     1134        g_variant_builder_add(builder, "s", webkit_document_interface.name);
    11221135}
    11231136
  • trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h

    r286056 r286059  
    5050        Hyperlink = 1 << 4,
    5151        Hypertext = 1 << 5,
    52         Action = 1 << 6
     52        Action = 1 << 6,
     53        Document = 1 << 7
    5354    };
    5455    const OptionSet<Interface>& interfaces() const { return m_interfaces; }
     
    7576    WEBCORE_EXPORT CString name() const;
    7677    WEBCORE_EXPORT CString description() const;
     78    WEBCORE_EXPORT String locale() const;
    7779    WEBCORE_EXPORT unsigned role() const;
    7880    WEBCORE_EXPORT unsigned childCount() const;
     
    127129    WEBCORE_EXPORT bool doAction() const;
    128130
     131    WEBCORE_EXPORT String documentAttribute(const String&) const;
     132
    129133private:
    130134    explicit AccessibilityObjectAtspi(AXCoreObject*);
     
    169173    String actionKeyBinding() const;
    170174
     175    HashMap<String, String> documentAttributes() const;
     176    String documentLocale() const;
     177
    171178    static OptionSet<Interface> interfacesForObject(AXCoreObject&);
    172179
     
    178185    static GDBusInterfaceVTable s_hypertextFunctions;
    179186    static GDBusInterfaceVTable s_actionFunctions;
     187    static GDBusInterfaceVTable s_documentFunctions;
    180188
    181189    AXCoreObject* m_axObject { nullptr };
  • trunk/Tools/ChangeLog

    r286056 r286059  
     12021-11-19  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK][a11y] Add implementation of document interface when building with ATSPI
     4        https://bugs.webkit.org/show_bug.cgi?id=232755
     5
     6        Reviewed by Adrian Perez de Castro.
     7
     8        Add unit test for the document interface and WTR implementation.
     9
     10        * TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp:
     11        (testDocumentBasic):
     12        (beforeAll):
     13        * WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp:
     14        (WTR::AccessibilityUIElement::language):
     15        (WTR::AccessibilityUIElement::documentEncoding):
     16        (WTR::AccessibilityUIElement::documentURI):
     17
    1182021-11-19  Carlos Garcia Campos  <cgarcia@igalia.com>
    219
  • trunk/Tools/TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp

    r286056 r286059  
    19401940}
    19411941
     1942static void testDocumentBasic(AccessibilityTest* test, gconstpointer)
     1943{
     1944    test->showInWindow(800, 600);
     1945    test->loadHtml(
     1946        "<!doctype html>"
     1947        "<html>"
     1948        "  <head>"
     1949        "    <meta http-equiv='content-language' content='en-us'/>"
     1950        "    <meta http-equiv='content-type' content='text/html; charset=UTF-8'/>"
     1951        "    <title>Document attributes</title>"
     1952        "  </head>"
     1953        "  <body>"
     1954        "    <p>This is a paragraph</p>"
     1955        "    <p lang='es'>Spanish</p>"
     1956        "  </body>"
     1957        "</html>",
     1958        "http://example.org");
     1959    test->waitUntilLoadFinished();
     1960
     1961    auto testApp = test->findTestApplication();
     1962    g_assert_true(ATSPI_IS_ACCESSIBLE(testApp.get()));
     1963
     1964    auto documentWeb = test->findDocumentWeb(testApp.get());
     1965    g_assert_true(ATSPI_IS_DOCUMENT(documentWeb.get()));
     1966    g_assert_cmpint(atspi_accessible_get_child_count(documentWeb.get(), nullptr), ==, 2);
     1967
     1968    GUniquePtr<char> language(atspi_document_get_locale(ATSPI_DOCUMENT(documentWeb.get()), nullptr));
     1969    g_assert_cmpstr(language.get(), ==, "en-us");
     1970    // Elements with no language attribute inhewir the document one.
     1971    auto p1 = adoptGRef(atspi_accessible_get_child_at_index(documentWeb.get(), 0, nullptr));
     1972    g_assert_true(ATSPI_IS_ACCESSIBLE(p1.get()));
     1973    g_assert_cmpstr(atspi_accessible_get_object_locale(p1.get(), nullptr), ==, "en-us");
     1974    auto p2 = adoptGRef(atspi_accessible_get_child_at_index(documentWeb.get(), 1, nullptr));
     1975    g_assert_true(ATSPI_IS_ACCESSIBLE(p2.get()));
     1976    g_assert_cmpstr(atspi_accessible_get_object_locale(p2.get(), nullptr), ==, "es");
     1977
     1978    GRefPtr<GHashTable> attributes = adoptGRef(atspi_document_get_attributes(ATSPI_DOCUMENT(documentWeb.get()), nullptr));
     1979    g_assert_nonnull(attributes.get());
     1980#if USE(ATSPI)
     1981    g_assert_cmpuint(g_hash_table_size(attributes.get()), ==, 5);
     1982#else
     1983    g_assert_cmpuint(g_hash_table_size(attributes.get()), ==, 3);
     1984#endif
     1985    g_assert_cmpstr(static_cast<const char*>(g_hash_table_lookup(attributes.get(), "DocType")), ==, "html");
     1986    GUniquePtr<char> value(atspi_document_get_document_attribute_value(ATSPI_DOCUMENT(documentWeb.get()), const_cast<char*>("DocType"), nullptr));
     1987    g_assert_cmpstr(value.get(), ==, "html");
     1988    g_assert_cmpstr(static_cast<const char*>(g_hash_table_lookup(attributes.get(), "Encoding")), ==, "UTF-8");
     1989    value.reset(atspi_document_get_document_attribute_value(ATSPI_DOCUMENT(documentWeb.get()), const_cast<char*>("Encoding"), nullptr));
     1990    g_assert_cmpstr(value.get(), ==, "UTF-8");
     1991    g_assert_cmpstr(static_cast<const char*>(g_hash_table_lookup(attributes.get(), "URI")), ==, "http://example.org/");
     1992    value.reset(atspi_document_get_document_attribute_value(ATSPI_DOCUMENT(documentWeb.get()), const_cast<char*>("URI"), nullptr));
     1993    g_assert_cmpstr(value.get(), ==, "http://example.org/");
     1994#if USE(ATSPI)
     1995    g_assert_cmpstr(static_cast<const char*>(g_hash_table_lookup(attributes.get(), "MimeType")), ==, "text/html");
     1996    value.reset(atspi_document_get_document_attribute_value(ATSPI_DOCUMENT(documentWeb.get()), const_cast<char*>("MimeType"), nullptr));
     1997    g_assert_cmpstr(value.get(), ==, "text/html");
     1998    g_assert_cmpstr(static_cast<const char*>(g_hash_table_lookup(attributes.get(), "Title")), ==, "Document attributes");
     1999    value.reset(atspi_document_get_document_attribute_value(ATSPI_DOCUMENT(documentWeb.get()), const_cast<char*>("Title"), nullptr));
     2000    g_assert_cmpstr(value.get(), ==, "Document attributes");
     2001#endif
     2002}
     2003
    19422004void beforeAll()
    19432005{
     
    19642026    AccessibilityTest::add("WebKitAccessibility", "hypertext/basic", testHypertextBasic);
    19652027    AccessibilityTest::add("WebKitAccessibility", "action/basic", testActionBasic);
     2028    AccessibilityTest::add("WebKitAccessibility", "document/basic", testDocumentBasic);
    19662029}
    19672030
  • trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp

    r286056 r286059  
    685685JSRetainPtr<JSStringRef> AccessibilityUIElement::language()
    686686{
    687     return JSStringCreateWithCharacters(0, 0);
     687    m_element->updateBackingStore();
     688    auto locale = m_element->locale();
     689    if (locale.isEmpty())
     690        return JSStringCreateWithCharacters(0, 0);
     691
     692    return OpaqueJSString::tryCreate(makeString("AXLanguage: ", locale)).leakRef();
    688693}
    689694
     
    11231128JSRetainPtr<JSStringRef> AccessibilityUIElement::documentEncoding()
    11241129{
    1125     return JSStringCreateWithCharacters(0, 0);
     1130    if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Document))
     1131        return JSStringCreateWithCharacters(0, 0);
     1132
     1133    return OpaqueJSString::tryCreate(m_element->documentAttribute("Encoding")).leakRef();
    11261134}
    11271135
    11281136JSRetainPtr<JSStringRef> AccessibilityUIElement::documentURI()
    11291137{
    1130     return JSStringCreateWithCharacters(0, 0);
     1138    if (!m_element->interfaces().contains(WebCore::AccessibilityObjectAtspi::Interface::Document))
     1139        return JSStringCreateWithCharacters(0, 0);
     1140
     1141    return OpaqueJSString::tryCreate(m_element->documentAttribute("URI")).leakRef();
    11311142}
    11321143
Note: See TracChangeset for help on using the changeset viewer.