WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
wcore-atspi-image.diff (text/plain), 13.03 KB, created by
Carlos Garcia Campos
on 2021-11-19 05:49:19 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Carlos Garcia Campos
Created:
2021-11-19 05:49:19 PST
Size:
13.03 KB
patch
obsolete
>diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 4048e3ea90fe..c7bd5611ba46 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,19 @@ >+2021-11-06 Carlos Garcia Campos <cgarcia@igalia.com> >+ >+ [GTK][a11y] Add implementation of image interface when building with ATSPI >+ https://bugs.webkit.org/show_bug.cgi?id=232782 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * SourcesGTK.txt: >+ * accessibility/atspi/AccessibilityObjectAtspi.cpp: >+ (WebCore::AccessibilityObjectAtspi::interfacesForObject): >+ (WebCore::AccessibilityObjectAtspi::path): >+ (WebCore::AccessibilityObjectAtspi::buildInterfaces const): >+ * accessibility/atspi/AccessibilityObjectAtspi.h: >+ * accessibility/atspi/AccessibilityObjectImageAtspi.cpp: Added. >+ (WebCore::AccessibilityObjectAtspi::imageDescription const): >+ > 2021-11-05 Carlos Garcia Campos <cgarcia@igalia.com> > > [GTK][a11y] Add implementation of document interface when building with ATSPI >diff --git a/Source/WebCore/SourcesGTK.txt b/Source/WebCore/SourcesGTK.txt >index 0b49088378a2..77a71256512d 100644 >--- a/Source/WebCore/SourcesGTK.txt >+++ b/Source/WebCore/SourcesGTK.txt >@@ -46,6 +46,7 @@ accessibility/atspi/AccessibilityObjectComponentAtspi.cpp > accessibility/atspi/AccessibilityObjectDocumentAtspi.cpp > accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp > accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp >+accessibility/atspi/AccessibilityObjectImageAtspi.cpp > accessibility/atspi/AccessibilityObjectTextAtspi.cpp > accessibility/atspi/AccessibilityObjectValueAtspi.cpp > accessibility/atspi/AccessibilityRootAtspi.cpp >diff --git a/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp b/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp >index 8986a592c5f6..b3de7a8a3336 100644 >--- a/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp >+++ b/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp >@@ -94,6 +94,9 @@ OptionSet<AccessibilityObjectAtspi::Interface> AccessibilityObjectAtspi::interfa > if (coreObject.roleValue() == AccessibilityRole::WebArea) > interfaces.add(Interface::Document); > >+ if (coreObject.isImage()) >+ interfaces.add(Interface::Image); >+ > return interfaces; > } > >@@ -490,6 +493,8 @@ const String& AccessibilityObjectAtspi::path() > interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_action_interface), &s_actionFunctions }); > if (m_interfaces.contains(Interface::Document)) > interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_document_interface), &s_documentFunctions }); >+ if (m_interfaces.contains(Interface::Image)) >+ interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_image_interface), &s_imageFunctions }); > m_path = atspiRoot->atspi().registerObject(*this, WTFMove(interfaces)); > } > >@@ -1132,6 +1137,8 @@ void AccessibilityObjectAtspi::buildInterfaces(GVariantBuilder* builder) const > g_variant_builder_add(builder, "s", webkit_action_interface.name); > if (m_interfaces.contains(Interface::Document)) > g_variant_builder_add(builder, "s", webkit_document_interface.name); >+ if (m_interfaces.contains(Interface::Image)) >+ g_variant_builder_add(builder, "s", webkit_image_interface.name); > } > > void AccessibilityObjectAtspi::serialize(GVariantBuilder* builder) const >diff --git a/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h b/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h >index 48d7401ba025..776503633288 100644 >--- a/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h >+++ b/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h >@@ -42,7 +42,7 @@ public: > static Ref<AccessibilityObjectAtspi> create(AXCoreObject*); > ~AccessibilityObjectAtspi() = default; > >- enum class Interface : uint8_t { >+ enum class Interface : uint16_t { > Accessible = 1 << 0, > Component = 1 << 1, > Text = 1 << 2, >@@ -50,7 +50,8 @@ public: > Hyperlink = 1 << 4, > Hypertext = 1 << 5, > Action = 1 << 6, >- Document = 1 << 7 >+ Document = 1 << 7, >+ Image = 1 << 8 > }; > const OptionSet<Interface>& interfaces() const { return m_interfaces; } > >@@ -175,6 +176,8 @@ private: > HashMap<String, String> documentAttributes() const; > String documentLocale() const; > >+ String imageDescription() const; >+ > static OptionSet<Interface> interfacesForObject(AXCoreObject&); > > static GDBusInterfaceVTable s_accessibleFunctions; >@@ -185,6 +188,7 @@ private: > static GDBusInterfaceVTable s_hypertextFunctions; > static GDBusInterfaceVTable s_actionFunctions; > static GDBusInterfaceVTable s_documentFunctions; >+ static GDBusInterfaceVTable s_imageFunctions; > > AXCoreObject* m_axObject { nullptr }; > AXCoreObject* m_coreObject { nullptr }; >diff --git a/Source/WebCore/accessibility/atspi/AccessibilityObjectImageAtspi.cpp b/Source/WebCore/accessibility/atspi/AccessibilityObjectImageAtspi.cpp >new file mode 100644 >index 000000000000..e73a80c986eb >--- /dev/null >+++ b/Source/WebCore/accessibility/atspi/AccessibilityObjectImageAtspi.cpp >@@ -0,0 +1,105 @@ >+/* >+ * Copyright (C) 2021 Igalia S.L. >+ * >+ * This library is free software; you can redistribute it and/or >+ * modify it under the terms of the GNU Library General Public >+ * License as published by the Free Software Foundation; either >+ * version 2 of the License, or (at your option) any later version. >+ * >+ * This library is distributed in the hope that it will be useful, >+ * but WITHOUT ANY WARRANTY; without even the implied warranty of >+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >+ * Library General Public License for more details. >+ * >+ * You should have received a copy of the GNU Library General Public License >+ * along with this library; see the file COPYING.LIB. If not, write to >+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, >+ * Boston, MA 02110-1301, USA. >+ */ >+ >+#include "config.h" >+#include "AccessibilityObjectAtspi.h" >+ >+#if ENABLE(ACCESSIBILITY) && USE(ATSPI) >+ >+#include "AccessibilityAtspiEnums.h" >+#include "AccessibilityObject.h" >+#include <gio/gio.h> >+ >+namespace WebCore { >+ >+GDBusInterfaceVTable AccessibilityObjectAtspi::s_imageFunctions = { >+ // method_call >+ [](GDBusConnection*, const gchar*, const gchar*, const gchar*, const gchar* methodName, GVariant* parameters, GDBusMethodInvocation* invocation, gpointer userData) { >+ RELEASE_ASSERT(!isMainThread()); >+ auto atspiObject = Ref { *static_cast<AccessibilityObjectAtspi*>(userData) }; >+ atspiObject->updateBackingStore(); >+ >+ if (!g_strcmp0(methodName, "GetImageExtents")) { >+ uint32_t coordinateType; >+ g_variant_get(parameters, "(u)", &coordinateType); >+ auto rect = atspiObject->elementRect(coordinateType); >+ g_dbus_method_invocation_return_value(invocation, g_variant_new("((iiii))", rect.x(), rect.y(), rect.width(), rect.height())); >+ } else if (!g_strcmp0(methodName, "GetImagePosition")) { >+ uint32_t coordinateType; >+ g_variant_get(parameters, "(u)", &coordinateType); >+ auto rect = atspiObject->elementRect(coordinateType); >+ g_dbus_method_invocation_return_value(invocation, g_variant_new("(ii)", rect.x(), rect.y())); >+ } else if (!g_strcmp0(methodName, "GetImageSize")) { >+ auto rect = atspiObject->elementRect(Atspi::CoordinateType::ParentCoordinates); >+ g_dbus_method_invocation_return_value(invocation, g_variant_new("(ii)", rect.width(), rect.height())); >+ } >+ }, >+ // get_property >+ [](GDBusConnection*, const gchar*, const gchar*, const gchar*, const gchar* propertyName, GError** error, gpointer userData) -> GVariant* { >+ RELEASE_ASSERT(!isMainThread()); >+ auto atspiObject = Ref { *static_cast<AccessibilityObjectAtspi*>(userData) }; >+ atspiObject->updateBackingStore(); >+ >+ if (!g_strcmp0(propertyName, "ImageDescription")) >+ return g_variant_new_string(atspiObject->imageDescription().utf8().data()); >+ if (!g_strcmp0(propertyName, "ImageLocale")) >+ return g_variant_new_string(atspiObject->locale().utf8().data()); >+ >+ g_set_error(error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "Unknown property '%s'", propertyName); >+ return nullptr; >+ }, >+ // set_property, >+ nullptr, >+ // padding >+ nullptr >+}; >+ >+String AccessibilityObjectAtspi::imageDescription() const >+{ >+ RELEASE_ASSERT(!isMainThread()); >+ if (!m_axObject) >+ return { }; >+ >+ Vector<AccessibilityText> textOrder; >+ m_axObject->accessibilityText(textOrder); >+ >+ bool visibleTextAvailable = false; >+ for (const AccessibilityText& text : textOrder) { >+ if (text.textSource == AccessibilityTextSource::Alternative) >+ return text.text; >+ >+ switch (text.textSource) { >+ case AccessibilityTextSource::Visible: >+ case AccessibilityTextSource::Children: >+ case AccessibilityTextSource::LabelByElement: >+ visibleTextAvailable = true; >+ default: >+ break; >+ } >+ >+ if (text.textSource == AccessibilityTextSource::TitleTag && !visibleTextAvailable) >+ return text.text; >+ } >+ >+ return { }; >+} >+ >+} // namespace WebCore >+ >+#endif // ENABLE(ACCESSIBILITY) && USE(ATSPI) >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index ad7c86f9680b..861edafab4a2 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,16 @@ >+2021-11-06 Carlos Garcia Campos <cgarcia@igalia.com> >+ >+ [GTK][a11y] Add implementation of image interface when building with ATSPI >+ https://bugs.webkit.org/show_bug.cgi?id=232782 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add unit tests for the image interface. >+ >+ * TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp: >+ (testImageBasic): >+ (beforeAll): >+ > 2021-11-05 Carlos Garcia Campos <cgarcia@igalia.com> > > [GTK][a11y] Add implementation of document interface when building with ATSPI >diff --git a/Tools/TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp b/Tools/TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp >index 88edbfcae276..f2506f0bc648 100644 >--- a/Tools/TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp >+++ b/Tools/TestWebKitAPI/Tests/WebKitGtk/TestWebKitAccessibility.cpp >@@ -1997,6 +1997,51 @@ static void testDocumentBasic(AccessibilityTest* test, gconstpointer) > #endif > } > >+static void testImageBasic(AccessibilityTest* test, gconstpointer) >+{ >+ test->showInWindow(800, 600); >+ GUniquePtr<char> baseDir(g_strdup_printf("file://%s/", Test::getResourcesDir().data())); >+ test->loadHtml( >+ "<html>" >+ " <body>" >+ " <img style='position:absolute; left:1; top:1' src='blank.ico' width=5 height=5 alt='This is a blank icon' lang='en'></img>" >+ " </body>" >+ "</html>", >+ baseDir.get()); >+ test->waitUntilLoadFinished(); >+ >+ auto testApp = test->findTestApplication(); >+ g_assert_true(ATSPI_IS_ACCESSIBLE(testApp.get())); >+ >+ auto documentWeb = test->findDocumentWeb(testApp.get()); >+ g_assert_true(ATSPI_IS_ACCESSIBLE(documentWeb.get())); >+ g_assert_cmpint(atspi_accessible_get_child_count(documentWeb.get(), nullptr), ==, 1); >+ >+ auto img = adoptGRef(atspi_accessible_get_child_at_index(documentWeb.get(), 0, nullptr)); >+ g_assert_true(ATSPI_IS_IMAGE(img.get())); >+ GUniquePtr<AtspiRect> rect(atspi_image_get_image_extents(ATSPI_IMAGE(img.get()), ATSPI_COORD_TYPE_WINDOW, nullptr)); >+ g_assert_nonnull(rect.get()); >+ g_assert_cmpuint(rect->x, ==, 1); >+ g_assert_cmpuint(rect->y, ==, 1); >+ g_assert_cmpuint(rect->width, ==, 5); >+ g_assert_cmpuint(rect->height, ==, 5); >+ GUniquePtr<AtspiPoint> point(atspi_image_get_image_position(ATSPI_IMAGE(img.get()), ATSPI_COORD_TYPE_WINDOW, nullptr)); >+ g_assert_nonnull(point.get()); >+ g_assert_cmpuint(rect->x, ==, point->x); >+ g_assert_cmpuint(rect->y, ==, point->y); >+ GUniquePtr<AtspiPoint> size(atspi_image_get_image_size(ATSPI_IMAGE(img.get()), nullptr)); >+ g_assert_nonnull(size.get()); >+ g_assert_cmpuint(size->x, ==, rect->width); >+ g_assert_cmpuint(size->y, ==, rect->height); >+ >+ GUniquePtr<char> description(atspi_image_get_image_description(ATSPI_IMAGE(img.get()), nullptr)); >+ g_assert_cmpstr(description.get(), ==, "This is a blank icon"); >+#if USE(ATSPI) >+ GUniquePtr<char> locale(atspi_image_get_image_locale(ATSPI_IMAGE(img.get()), nullptr)); >+ g_assert_cmpstr(locale.get(), ==, "en"); >+#endif >+} >+ > void beforeAll() > { > AccessibilityTest::add("WebKitAccessibility", "accessible/basic-hierarchy", testAccessibleBasicHierarchy); >@@ -2022,6 +2067,7 @@ void beforeAll() > AccessibilityTest::add("WebKitAccessibility", "hypertext/basic", testHypertextBasic); > AccessibilityTest::add("WebKitAccessibility", "action/basic", testActionBasic); > AccessibilityTest::add("WebKitAccessibility", "document/basic", testDocumentBasic); >+ AccessibilityTest::add("WebKitAccessibility", "image/basic", testImageBasic); > } > > void afterAll()
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 232782
:
443479
|
444810
|
444815