Changeset 287876 in webkit
- Timestamp:
- Jan 11, 2022, 6:07:38 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 24 edited
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/accessibility/AccessibilityRenderObject.cpp (modified) (2 diffs)
-
Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp (modified) (1 diff)
-
Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp (modified) (6 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityAtspi.h (modified) (3 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp (modified) (16 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h (modified) (5 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp (modified) (2 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp (modified) (2 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp (modified) (2 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp (modified) (3 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityObjectTableAtspi.cpp (modified) (4 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp (modified) (3 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp (modified) (5 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityObjectValueAtspi.cpp (modified) (2 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp (modified) (9 diffs)
-
Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h (modified) (6 diffs)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/WebProcess/WebPage/gtk/WebPageGtk.cpp (modified) (1 diff)
-
Source/WebKit/WebProcess/WebProcess.h (modified) (3 diffs)
-
Source/WebKit/WebProcess/glib/WebProcessGLib.cpp (modified) (2 diffs)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp (modified) (1 diff)
-
Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityNotificationHandler.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r287875 r287876 1 2022-01-11 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK][a11y] Web process crashes in some sites having SVG images 4 https://bugs.webkit.org/show_bug.cgi?id=234737 5 6 Reviewed by Adrian Perez de Castro. 7 8 Unfortunately the changes in r287388 are not enough, it can still happen that root hasn't been set to the 9 SVGImage page when the wrappers are created. So, we can't actually create the wrappers with a reference to the 10 root object as we did in r286767. In most of the cases wrappers use the root just to get AccessibilityAtspi, 11 which is not a singleton, but it's created and owned by the web process singleton at startup, so it can be 12 accessed globaly. This patch makes AccessibilityAtspi a singleton to get the global instance without having to 13 keep a reference in the root object. 14 15 * accessibility/AccessibilityRenderObject.cpp: 16 (WebCore::AccessibilityRenderObject::remoteSVGRootElement const): Move the code to set the root in SVGImage page 17 before the remote svg wrapper is created. 18 * accessibility/atspi/AXObjectCacheAtspi.cpp: 19 (WebCore::AXObjectCache::attachWrapper): Just pass the page root object to the wrapper constructor, that now 20 receives a pointer that might be nullptr. 21 * accessibility/atspi/AccessibilityAtspi.cpp: 22 (WebCore::AccessibilityAtspi::AccessibilityAtspi): Just create the WorkQueue. 23 (WebCore::AccessibilityAtspi::singleton): Return a reference to the global instance. 24 (WebCore::AccessibilityAtspi::connect): Connect to the given dbus address. 25 (WebCore::AccessibilityAtspi::applicationReference const): This allows wrappers to get the application reference 26 without having to check if m_root is nullptr or not. 27 (WebCore::AccessibilityAtspi::parentChanged): Use AccessibilityObjectAtspi::isTreeRegistered() 28 (WebCore::AccessibilityAtspi::childrenChanged): Ditto. 29 * accessibility/atspi/AccessibilityAtspi.h: 30 * accessibility/atspi/AccessibilityObjectAtspi.cpp: 31 (WebCore::AccessibilityObjectAtspi::create): Receive a AccessibilityRootAtspi pointer instead of reference. 32 (WebCore::AccessibilityObjectAtspi::AccessibilityObjectAtspi): Ditto. 33 (WebCore::AccessibilityObjectAtspi::cacheDestroyed): Only call AccessibilityRootAtspi::childRemoved if parent is 34 the root object. 35 (WebCore::AccessibilityObjectAtspi::elementDestroyed): Null check m_root and use AccessibilityAtspi::singleton(). 36 (WebCore::AccessibilityObjectAtspi::root): Get the root if already set or try to get it from the page. 37 (WebCore::AccessibilityObjectAtspi::isTreeRegistered const): Return try if root has been set and its tree has 38 been registered. 39 (WebCore::AccessibilityObjectAtspi::registerObject): Use AccessibilityObjectAtspi::root(). 40 (WebCore::AccessibilityObjectAtspi::reference): Use AccessibilityAtspi::singleton(). 41 (WebCore::AccessibilityObjectAtspi::hyperlinkReference): Ditto. 42 (WebCore::AccessibilityObjectAtspi::setParent): Return early also if root hasn't been set yet. 43 (WebCore::AccessibilityObjectAtspi::parentReference const): Use AccessibilityAtspi::singleton(). 44 (WebCore::AccessibilityObjectAtspi::serialize const): Ditto. 45 (WebCore::AccessibilityObjectAtspi::childAdded): Ditto. 46 (WebCore::AccessibilityObjectAtspi::childRemoved): Ditto. 47 (WebCore::AccessibilityObjectAtspi::stateChanged): Ditto. 48 (WebCore::AccessibilityObjectAtspi::loadEvent): Ditto. 49 * accessibility/atspi/AccessibilityObjectAtspi.h: 50 * accessibility/atspi/AccessibilityObjectComponentAtspi.cpp: 51 * accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp: 52 * accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp: 53 * accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp: 54 (WebCore::AccessibilityObjectAtspi::selectionChanged): Ditto. 55 * accessibility/atspi/AccessibilityObjectTableAtspi.cpp: 56 * accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp: 57 * accessibility/atspi/AccessibilityObjectTextAtspi.cpp: 58 (WebCore::AccessibilityObjectAtspi::textInserted): Ditto. 59 (WebCore::AccessibilityObjectAtspi::textDeleted): Ditto. 60 (WebCore::AccessibilityObjectAtspi::selectionChanged): Ditto. 61 (WebCore::AccessibilityObjectAtspi::textAttributesChanged): Ditto. 62 * accessibility/atspi/AccessibilityObjectValueAtspi.cpp: 63 (WebCore::AccessibilityObjectAtspi::valueChanged): Ditto. 64 * accessibility/atspi/AccessibilityRootAtspi.cpp: 65 (WebCore::AccessibilityRootAtspi::create): Remove AccessibilityAtspi parameter. 66 (WebCore::AccessibilityRootAtspi::AccessibilityRootAtspi): Ditto. 67 (WebCore::AccessibilityRootAtspi::registerObject): Use AccessibilityAtspi::singleton(). 68 (WebCore::AccessibilityRootAtspi::unregisterObject): Ditto 69 (WebCore::AccessibilityRootAtspi::embedded): Ditto. 70 (WebCore::AccessibilityRootAtspi::applicationReference const): Ditto. 71 (WebCore::AccessibilityRootAtspi::reference const): Ditto. 72 (WebCore::AccessibilityRootAtspi::childAdded): Ditto. 73 (WebCore::AccessibilityRootAtspi::childRemoved): Ditto. 74 (WebCore::AccessibilityRootAtspi::serialize const): Ditto. 75 * accessibility/atspi/AccessibilityRootAtspi.h: 76 1 77 2022-01-11 Martin Robinson <mrobinson@webkit.org> 2 78 -
trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp
r287832 r287876 3403 3403 if (!cache) 3404 3404 return nullptr; 3405 AccessibilityObject* rootSVGObject = createIfNecessary == Create ? cache->getOrCreate(rendererRoot) : cache->get(rendererRoot);3406 3407 ASSERT(!createIfNecessary || rootSVGObject);3408 if (!is<AccessibilitySVGRoot>(rootSVGObject))3409 return nullptr;3410 3405 3411 3406 #if USE(ATSPI) … … 3413 3408 page->setAccessibilityRootObject(createIfNecessary == Create ? axObjectCache()->document().page()->accessibilityRootObject() : nullptr); 3414 3409 #endif 3410 3411 AccessibilityObject* rootSVGObject = createIfNecessary == Create ? cache->getOrCreate(rendererRoot) : cache->get(rendererRoot); 3412 3413 ASSERT(!createIfNecessary || rootSVGObject); 3414 if (!is<AccessibilitySVGRoot>(rootSVGObject)) 3415 return nullptr; 3415 3416 3416 3417 return downcast<AccessibilitySVGRoot>(rootSVGObject); -
trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp
r287871 r287876 36 36 void AXObjectCache::attachWrapper(AXCoreObject* axObject) 37 37 { 38 auto* rootWrapper = document().page()->accessibilityRootObject(); 39 if (!rootWrapper) 40 return; 41 42 auto wrapper = AccessibilityObjectAtspi::create(axObject, *rootWrapper); 38 auto wrapper = AccessibilityObjectAtspi::create(axObject, document().page()->accessibilityRootObject()); 43 39 axObject->setWrapper(wrapper.ptr()); 44 40 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp
r287456 r287876 27 27 #include <glib/gi18n-lib.h> 28 28 #include <wtf/MainThread.h> 29 #include <wtf/NeverDestroyed.h> 29 30 #include <wtf/SetForScope.h> 30 31 #include <wtf/SortedArrayMap.h> … … 33 34 namespace WebCore { 34 35 35 AccessibilityAtspi::AccessibilityAtspi(const String& busAddress) 36 AccessibilityAtspi& AccessibilityAtspi::singleton() 37 { 38 static NeverDestroyed<AccessibilityAtspi> atspi; 39 return atspi; 40 } 41 42 AccessibilityAtspi::AccessibilityAtspi() 36 43 : m_queue(WorkQueue::create("org.webkit.a11y")) 37 44 { 38 45 RELEASE_ASSERT(isMainThread()); 46 } 47 48 void AccessibilityAtspi::connect(const String& busAddress) 49 { 50 RELEASE_ASSERT(isMainThread()); 39 51 if (busAddress.isEmpty()) 40 52 return; 53 41 54 m_queue->dispatch([this, busAddress = busAddress.isolatedCopy()] { 42 55 GUniqueOutPtr<GError> error; … … 50 63 g_warning("Can't connect to a11y bus: %s", error->message); 51 64 }); 52 }53 54 AccessibilityAtspi::~AccessibilityAtspi()55 {56 if (m_registry)57 g_signal_handlers_disconnect_by_data(m_registry.get(), this);58 65 } 59 66 … … 217 224 RELEASE_ASSERT(!isMainThread()); 218 225 return g_variant_new("(so)", uniqueName(), "/org/a11y/atspi/null"); 226 } 227 228 GVariant* AccessibilityAtspi::applicationReference() const 229 { 230 RELEASE_ASSERT(!isMainThread()); 231 232 // The application is the same for all root objects, so just use the first root object that is already embedded. 233 for (auto* rootObject : m_rootObjects.keys()) { 234 if (!rootObject->path().isNull()) 235 return rootObject->applicationReference(); 236 } 237 238 return nullReference(); 219 239 } 220 240 … … 330 350 331 351 // Always emit parentChanged when the tree is registered because the atspi cache always consumes it. 332 if (!atspiObject-> root().isTreeRegistered())352 if (!atspiObject->isTreeRegistered()) 333 353 return; 334 354 … … 366 386 367 387 // Always emit ChildrenChanged when the tree is registered because the atspi cache always consumes it. 368 if (!atspiObject-> root().isTreeRegistered())388 if (!atspiObject->isTreeRegistered()) 369 389 return; 370 390 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityAtspi.h
r287456 r287876 41 41 42 42 class AccessibilityAtspi { 43 WTF_MAKE_FAST_ALLOCATED; 43 WTF_MAKE_NONCOPYABLE(AccessibilityAtspi); WTF_MAKE_FAST_ALLOCATED; 44 friend NeverDestroyed<AccessibilityAtspi>; 44 45 public: 45 AccessibilityAtspi(const String&); 46 ~AccessibilityAtspi(); 46 WEBCORE_EXPORT static AccessibilityAtspi& singleton(); 47 48 void connect(const String&); 47 49 48 50 WEBCORE_EXPORT RunLoop& runLoop() const; … … 50 52 const char* uniqueName() const; 51 53 GVariant* nullReference() const; 54 GVariant* applicationReference() const; 52 55 bool hasEventListeners() const { return !m_eventListeners.isEmpty(); } 53 56 … … 89 92 90 93 private: 94 AccessibilityAtspi(); 95 91 96 void registerTrees() const; 92 97 void initializeRegistry(); -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.cpp
r287871 r287876 38 38 namespace WebCore { 39 39 40 Ref<AccessibilityObjectAtspi> AccessibilityObjectAtspi::create(AXCoreObject* coreObject, AccessibilityRootAtspi &root)40 Ref<AccessibilityObjectAtspi> AccessibilityObjectAtspi::create(AXCoreObject* coreObject, AccessibilityRootAtspi* root) 41 41 { 42 42 return adoptRef(*new AccessibilityObjectAtspi(coreObject, root)); … … 111 111 } 112 112 113 AccessibilityObjectAtspi::AccessibilityObjectAtspi(AXCoreObject* coreObject, AccessibilityRootAtspi &root)113 AccessibilityObjectAtspi::AccessibilityObjectAtspi(AXCoreObject* coreObject, AccessibilityRootAtspi* root) 114 114 : m_coreObject(coreObject) 115 115 , m_interfaces(interfacesForObject(*m_coreObject)) … … 137 137 return; 138 138 139 m_root.childRemoved(*this); 140 m_root.atspi().unregisterObject(*this); 139 if (m_parent && !*m_parent && m_root) 140 m_root->childRemoved(*this); 141 142 AccessibilityAtspi::singleton().unregisterObject(*this); 141 143 } 142 144 … … 151 153 if (*m_parent) 152 154 m_parent.value()->childRemoved(*this); 153 else 154 m_root .childRemoved(*this);155 } 156 157 m_root.atspi().unregisterObject(*this);155 else if (m_root) 156 m_root->childRemoved(*this); 157 } 158 159 AccessibilityAtspi::singleton().unregisterObject(*this); 158 160 } 159 161 … … 433 435 g_dbus_method_invocation_return_value(invocation, g_variant_builder_end(&builder)); 434 436 } else if (!g_strcmp0(methodName, "GetApplication")) 435 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", atspiObject->m_root.applicationReference()));437 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", AccessibilityAtspi::singleton().applicationReference())); 436 438 else if (!g_strcmp0(methodName, "GetChildAtIndex")) { 437 439 int index; 438 440 g_variant_get(parameters, "(i)", &index); 439 441 auto* wrapper = index >= 0 ? atspiObject->childAt(index) : nullptr; 440 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->reference() : atspiObject->m_root.atspi().nullReference()));442 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->reference() : AccessibilityAtspi::singleton().nullReference())); 441 443 } else if (!g_strcmp0(methodName, "GetChildren")) { 442 444 GVariantBuilder builder = G_VARIANT_BUILDER_INIT(G_VARIANT_TYPE("a(so)")); … … 483 485 nullptr 484 486 }; 487 488 AccessibilityRootAtspi* AccessibilityObjectAtspi::root() 489 { 490 RELEASE_ASSERT(isMainThread()); 491 RELEASE_ASSERT(m_coreObject); 492 493 if (!m_root) { 494 if (auto* document = m_coreObject->document()) 495 m_root = document->page()->accessibilityRootObject(); 496 } 497 return m_root; 498 } 499 500 bool AccessibilityObjectAtspi::isTreeRegistered() const 501 { 502 return m_root ? m_root->isTreeRegistered() : false; 503 } 485 504 486 505 bool AccessibilityObjectAtspi::registerObject() … … 520 539 // to create it before registering the object. 521 540 Accessibility::performFunctionOnMainThread([this] { 522 m_root.child(); 541 if (!m_coreObject) 542 return; 543 544 if (auto* atspiRoot = root()) 545 atspiRoot->child(); 523 546 }); 524 547 } 525 m_path = m_root.atspi().registerObject(*this, WTFMove(interfaces)); 526 m_root.atspi().addAccessible(*this); 548 549 m_path = AccessibilityAtspi::singleton().registerObject(*this, WTFMove(interfaces)); 550 AccessibilityAtspi::singleton().addAccessible(*this); 527 551 528 552 return true; … … 539 563 { 540 564 RELEASE_ASSERT(!isMainThread()); 541 return g_variant_new("(so)", m_root.atspi().uniqueName(), path().utf8().data());565 return g_variant_new("(so)", AccessibilityAtspi::singleton().uniqueName(), path().utf8().data()); 542 566 } 543 567 … … 547 571 if (m_hyperlinkPath.isNull()) { 548 572 registerObject(); 549 m_hyperlinkPath = m_root.atspi().registerHyperlink(*this, { { const_cast<GDBusInterfaceInfo*>(&webkit_hyperlink_interface), &s_hyperlinkFunctions } });550 } 551 552 return g_variant_new("(so)", m_root.atspi().uniqueName(), m_hyperlinkPath.utf8().data());573 m_hyperlinkPath = AccessibilityAtspi::singleton().registerHyperlink(*this, { { const_cast<GDBusInterfaceInfo*>(&webkit_hyperlink_interface), &s_hyperlinkFunctions } }); 574 } 575 576 return g_variant_new("(so)", AccessibilityAtspi::singleton().uniqueName(), m_hyperlinkPath.utf8().data()); 553 577 } 554 578 … … 560 584 561 585 m_parent = atspiParent; 562 if (!m_coreObject || m_coreObject->accessibilityIsIgnored() )586 if (!m_coreObject || m_coreObject->accessibilityIsIgnored() || !root()) 563 587 return; 564 588 565 m_root.atspi().parentChanged(*this);589 AccessibilityAtspi::singleton().parentChanged(*this); 566 590 if (m_parent) { 567 591 if (*m_parent) 568 592 m_parent.value()->childAdded(*this); 569 else 570 m_root .childAdded(*this);593 else if (m_root) 594 m_root->childAdded(*this); 571 595 } 572 596 } … … 590 614 GVariant* AccessibilityObjectAtspi::parentReference() const 591 615 { 592 if (!m_parent) 593 return m_root.atspi().nullReference(); 594 595 if (!m_parent.value()) 596 return m_root.reference(); 597 598 return m_parent.value()->reference(); 616 if (m_parent) { 617 if (*m_parent) 618 return m_parent.value()->reference(); 619 620 if (m_root) 621 return m_root->reference(); 622 } 623 624 return AccessibilityAtspi::singleton().nullReference(); 599 625 } 600 626 … … 1223 1249 { 1224 1250 RELEASE_ASSERT(!isMainThread()); 1225 g_variant_builder_add(builder, "(so)", m_root.atspi().uniqueName(), m_path.utf8().data());1226 g_variant_builder_add(builder, "@(so)", m_root.applicationReference());1251 g_variant_builder_add(builder, "(so)", AccessibilityAtspi::singleton().uniqueName(), m_path.utf8().data()); 1252 g_variant_builder_add(builder, "@(so)", AccessibilityAtspi::singleton().applicationReference()); 1227 1253 g_variant_builder_add(builder, "@(so)", parentReference()); 1228 1254 … … 1256 1282 return; 1257 1283 1258 m_root.atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added);1284 AccessibilityAtspi::singleton().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added); 1259 1285 } 1260 1286 … … 1268 1294 return; 1269 1295 1270 m_root.atspi().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Removed);1296 AccessibilityAtspi::singleton().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Removed); 1271 1297 } 1272 1298 … … 1274 1300 { 1275 1301 RELEASE_ASSERT(isMainThread()); 1276 m_root.atspi().stateChanged(*this, name, value);1302 AccessibilityAtspi::singleton().stateChanged(*this, name, value); 1277 1303 } 1278 1304 … … 1280 1306 { 1281 1307 RELEASE_ASSERT(isMainThread()); 1282 m_root.atspi().loadEvent(*this, event);1308 AccessibilityAtspi::singleton().loadEvent(*this, event); 1283 1309 } 1284 1310 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectAtspi.h
r287565 r287876 39 39 class AccessibilityObjectAtspi final : public ThreadSafeRefCounted<AccessibilityObjectAtspi, WTF::DestructionThread::Main> { 40 40 public: 41 static Ref<AccessibilityObjectAtspi> create(AXCoreObject*, AccessibilityRootAtspi &);41 static Ref<AccessibilityObjectAtspi> create(AXCoreObject*, AccessibilityRootAtspi*); 42 42 ~AccessibilityObjectAtspi() = default; 43 43 44 44 bool registerObject(); 45 bool isTreeRegistered() const; 45 46 46 47 enum class Interface : uint16_t { … … 60 61 const OptionSet<Interface>& interfaces() const { return m_interfaces; } 61 62 62 const AccessibilityRootAtspi& root() const { return m_root; }63 63 void setParent(std::optional<AccessibilityObjectAtspi*>); 64 64 WEBCORE_EXPORT std::optional<AccessibilityObjectAtspi*> parent() const; … … 159 159 160 160 private: 161 explicit AccessibilityObjectAtspi(AXCoreObject*, AccessibilityRootAtspi&); 161 AccessibilityObjectAtspi(AXCoreObject*, AccessibilityRootAtspi*); 162 163 AccessibilityRootAtspi* root(); 162 164 163 165 Vector<RefPtr<AccessibilityObjectAtspi>> wrapperVector(const Vector<RefPtr<AXCoreObject>>&) const; … … 242 244 AXCoreObject* m_coreObject { nullptr }; 243 245 OptionSet<Interface> m_interfaces; 244 AccessibilityRootAtspi & m_root;246 AccessibilityRootAtspi* m_root { nullptr }; 245 247 std::optional<AccessibilityObjectAtspi*> m_parent; 246 248 Atomic<bool> m_isRegistered { false }; … … 250 252 mutable std::atomic<bool> m_hasListMarkerAtStart; 251 253 mutable int m_indexInParent { -1 }; 252 mutable Lock m_rootLock;253 254 }; 254 255 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp
r286767 r287876 23 23 #if ENABLE(ACCESSIBILITY) && USE(ATSPI) 24 24 #include "AXIsolatedObject.h" 25 #include "AccessibilityAtspi.h" 25 26 #include "AccessibilityAtspiEnums.h" 26 27 #include "AccessibilityObjectInterface.h" … … 48 49 g_variant_get(parameters, "(iiu)", &x, &y, &coordinateType); 49 50 auto* wrapper = atspiObject->hitTest({ x, y }, coordinateType); 50 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->reference() : atspiObject->m_root.atspi().nullReference()));51 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->reference() : AccessibilityAtspi::singleton().nullReference())); 51 52 } else if (!g_strcmp0(methodName, "GetExtents")) { 52 53 uint32_t coordinateType; -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHyperlinkAtspi.cpp
r286767 r287876 23 23 #if ENABLE(ACCESSIBILITY) && USE(ATSPI) 24 24 25 #include "Accessibility RootAtspi.h"25 #include "AccessibilityAtspi.h" 26 26 #include <gio/gio.h> 27 27 #include <wtf/URL.h> … … 40 40 int index; 41 41 g_variant_get(parameters, "(i)", &index); 42 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", !index ? atspiObject->reference() : atspiObject->m_root.atspi().nullReference()));42 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", !index ? atspiObject->reference() : AccessibilityAtspi::singleton().nullReference())); 43 43 } else if (!g_strcmp0(methodName, "GetURI")) { 44 44 int index; -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectHypertextAtspi.cpp
r286767 r287876 23 23 #if ENABLE(ACCESSIBILITY) && USE(ATSPI) 24 24 25 #include "Accessibility RootAtspi.h"25 #include "AccessibilityAtspi.h" 26 26 #include <gio/gio.h> 27 27 #include <wtf/unicode/CharacterNames.h> … … 42 42 g_variant_get(parameters, "(i)", &index); 43 43 auto* wrapper = index >= 0 ? atspiObject->hyperlink(index) : nullptr; 44 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->hyperlinkReference() : atspiObject->m_root.atspi().nullReference()));44 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", wrapper ? wrapper->hyperlinkReference() : AccessibilityAtspi::singleton().nullReference())); 45 45 } else if (!g_strcmp0(methodName, "GetLinkIndex")) { 46 46 int offset; -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectSelectionAtspi.cpp
r287455 r287876 23 23 #if ENABLE(ACCESSIBILITY) && USE(ATSPI) 24 24 25 #include "Accessibility RootAtspi.h"25 #include "AccessibilityAtspi.h" 26 26 27 27 namespace WebCore { … … 38 38 g_variant_get(parameters, "(i)", &index); 39 39 auto* child = index >= 0 ? atspiObject->selectedChild(index) : nullptr; 40 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", child ? child->reference() : atspiObject->m_root.atspi().nullReference()));40 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", child ? child->reference() : AccessibilityAtspi::singleton().nullReference())); 41 41 } else if (!g_strcmp0(methodName, "SelectChild")) { 42 42 int index; … … 234 234 235 235 m_lastSelectionChangedTime = sourceTime; 236 m_root.atspi().selectionChanged(*this);236 AccessibilityAtspi::singleton().selectionChanged(*this); 237 237 } 238 238 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableAtspi.cpp
r286767 r287876 23 23 #if ENABLE(ACCESSIBILITY) && USE(ATSPI) 24 24 25 #include "Accessibility RootAtspi.h"25 #include "AccessibilityAtspi.h" 26 26 #include "HTMLTableCaptionElement.h" 27 27 #include "HTMLTableElement.h" … … 43 43 g_variant_get(parameters, "(ii)", &row, &column); 44 44 auto* cell = row >= 0 && column >= 0 ? atspiObject->cell(row, column) : nullptr; 45 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", cell ? cell->reference() : atspiObject->m_root.atspi().nullReference()));45 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", cell ? cell->reference() : AccessibilityAtspi::singleton().nullReference())); 46 46 } else if (!g_strcmp0(methodName, "GetIndexAt")) { 47 47 int row, column; … … 76 76 g_variant_get(parameters, "(i)", &row); 77 77 auto* header = row >= 0 ? atspiObject->rowHeader(row) : nullptr; 78 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", header ? header->reference() : atspiObject->m_root.atspi().nullReference()));78 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", header ? header->reference() : AccessibilityAtspi::singleton().nullReference())); 79 79 } else if (!g_strcmp0(methodName, "GetColumnHeader")) { 80 80 int column; 81 81 g_variant_get(parameters, "(i)", &column); 82 82 auto* header = column >= 0 ? atspiObject->columnHeader(column) : nullptr; 83 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", header ? header->reference() : atspiObject->m_root.atspi().nullReference()));83 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", header ? header->reference() : AccessibilityAtspi::singleton().nullReference())); 84 84 } else if (!g_strcmp0(methodName, "GetRowColumnExtentsAtIndex")) { 85 85 int index; … … 119 119 if (!g_strcmp0(propertyName, "Caption")) { 120 120 auto* caption = atspiObject->tableCaption(); 121 return caption ? caption->reference() : atspiObject->m_root.atspi().nullReference();121 return caption ? caption->reference() : AccessibilityAtspi::singleton().nullReference(); 122 122 } 123 123 if (!g_strcmp0(propertyName, "Summary")) 124 return atspiObject->m_root.atspi().nullReference();124 return AccessibilityAtspi::singleton().nullReference(); 125 125 if (!g_strcmp0(propertyName, "NSelectedRows")) 126 126 return g_variant_new_int32(0); -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp
r286767 r287876 23 23 #if ENABLE(ACCESSIBILITY) && USE(ATSPI) 24 24 25 #include "AccessibilityAtspi.h" 25 26 #include "AccessibilityAtspiEnums.h" 26 #include "AccessibilityRootAtspi.h"27 27 #include <gio/gio.h> 28 28 … … 68 68 auto* axObject = atspiObject->m_axObject; 69 69 if (!axObject || !axObject->isTableCell()) 70 return atspiObject->m_root.atspi().nullReference();70 return AccessibilityAtspi::singleton().nullReference(); 71 71 72 72 AccessibilityObjectAtspi* wrapper = atspiObject.ptr(); … … 81 81 break; 82 82 } 83 return wrapper ? wrapper->reference() : atspiObject->m_root.atspi().nullReference();83 return wrapper ? wrapper->reference() : AccessibilityAtspi::singleton().nullReference(); 84 84 } 85 85 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp
r287552 r287876 23 23 #if ENABLE(ACCESSIBILITY) && USE(ATSPI) 24 24 #include "AXObjectCache.h" 25 #include "AccessibilityAtspi.h" 25 26 #include "AccessibilityAtspiEnums.h" 26 27 #include "AccessibilityObject.h" 27 28 #include "AccessibilityObjectInterface.h" 28 #include "AccessibilityRootAtspi.h"29 29 #include "Editing.h" 30 30 #include "PlatformScreen.h" … … 382 382 auto utf8InsertedText = insertedText.utf8(); 383 383 auto insertedTextLength = g_utf8_strlen(utf8InsertedText.data(), -1); 384 m_root.atspi().textChanged(*this, "insert", WTFMove(utf8InsertedText), offset - insertedTextLength, insertedTextLength);384 AccessibilityAtspi::singleton().textChanged(*this, "insert", WTFMove(utf8InsertedText), offset - insertedTextLength, insertedTextLength); 385 385 } 386 386 … … 398 398 auto utf8DeletedText = deletedText.utf8(); 399 399 auto deletedTextLength = g_utf8_strlen(utf8DeletedText.data(), -1); 400 m_root.atspi().textChanged(*this, "delete", WTFMove(utf8DeletedText), offset, deletedTextLength);400 AccessibilityAtspi::singleton().textChanged(*this, "delete", WTFMove(utf8DeletedText), offset, deletedTextLength); 401 401 } 402 402 … … 799 799 auto caretOffset = UTF16OffsetToUTF8(mapping, bounds.y()); 800 800 if (caretOffset <= length) 801 m_root.atspi().textCaretMoved(*this, caretOffset);801 AccessibilityAtspi::singleton().textCaretMoved(*this, caretOffset); 802 802 803 803 if (selection.isRange()) 804 m_root.atspi().textSelectionChanged(*this);804 AccessibilityAtspi::singleton().textSelectionChanged(*this); 805 805 } 806 806 … … 991 991 return; 992 992 993 m_root.atspi().textAttributesChanged(*this);993 AccessibilityAtspi::singleton().textAttributesChanged(*this); 994 994 } 995 995 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityObjectValueAtspi.cpp
r287070 r287876 23 23 #if ENABLE(ACCESSIBILITY) && USE(ATSPI) 24 24 25 #include "AccessibilityAtspi.h" 25 26 #include "AccessibilityObject.h" 26 #include "AccessibilityRootAtspi.h"27 27 #include <gio/gio.h> 28 28 … … 135 135 { 136 136 RELEASE_ASSERT(isMainThread()); 137 m_root.atspi().valueChanged(*this, value);137 AccessibilityAtspi::singleton().valueChanged(*this, value); 138 138 } 139 139 -
trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.cpp
r287456 r287876 35 35 namespace WebCore { 36 36 37 Ref<AccessibilityRootAtspi> AccessibilityRootAtspi::create(Page& page, AccessibilityAtspi& atspi) 38 { 39 return adoptRef(*new AccessibilityRootAtspi(page, atspi)); 40 } 41 42 AccessibilityRootAtspi::AccessibilityRootAtspi(Page& page, AccessibilityAtspi& atspi) 43 : m_atspi(atspi) 44 , m_page(page) 37 Ref<AccessibilityRootAtspi> AccessibilityRootAtspi::create(Page& page) 38 { 39 return adoptRef(*new AccessibilityRootAtspi(page)); 40 } 41 42 AccessibilityRootAtspi::AccessibilityRootAtspi(Page& page) 43 : m_page(page) 45 44 { 46 45 RELEASE_ASSERT(isMainThread()); … … 93 92 } 94 93 } 95 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", rootObject.atspi().nullReference()));94 g_dbus_method_invocation_return_value(invocation, g_variant_new("(@(so))", AccessibilityAtspi::singleton().nullReference())); 96 95 } else if (!g_strcmp0(methodName, "GetChildren")) { 97 96 GVariantBuilder builder = G_VARIANT_BUILDER_INIT(G_VARIANT_TYPE("a(so)")); … … 175 174 interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_socket_interface), &s_socketFunctions }); 176 175 interfaces.append({ const_cast<GDBusInterfaceInfo*>(&webkit_component_interface), &s_componentFunctions }); 177 m_atspi.registerRoot(*this, WTFMove(interfaces), WTFMove(completionHandler));176 AccessibilityAtspi::singleton().registerRoot(*this, WTFMove(interfaces), WTFMove(completionHandler)); 178 177 } 179 178 … … 181 180 { 182 181 RELEASE_ASSERT(isMainThread()); 183 m_atspi.unregisterRoot(*this);182 AccessibilityAtspi::singleton().unregisterRoot(*this); 184 183 185 184 if (m_page) … … 223 222 m_parentUniqueName = parentUniqueName; 224 223 m_parentPath = parentPath; 225 m_atspi.parentChanged(*this);226 if (!m_isTreeRegistered.load() && m_atspi.hasEventListeners())224 AccessibilityAtspi::singleton().parentChanged(*this); 225 if (!m_isTreeRegistered.load() && AccessibilityAtspi::singleton().hasEventListeners()) 227 226 registerTree(); 228 227 } … … 232 231 RELEASE_ASSERT(!isMainThread()); 233 232 if (m_parentUniqueName.isNull()) 234 return m_atspi.nullReference();233 return AccessibilityAtspi::singleton().nullReference(); 235 234 return g_variant_new("(so)", m_parentUniqueName.utf8().data(), "/org/a11y/atspi/accessible/root"); 236 235 } … … 239 238 { 240 239 RELEASE_ASSERT(!isMainThread()); 241 return g_variant_new("(so)", m_atspi.uniqueName(), m_path.utf8().data());240 return g_variant_new("(so)", AccessibilityAtspi::singleton().uniqueName(), m_path.utf8().data()); 242 241 } 243 242 … … 269 268 void AccessibilityRootAtspi::childAdded(AccessibilityObjectAtspi& child) 270 269 { 271 m_atspi.childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added);270 AccessibilityAtspi::singleton().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Added); 272 271 } 273 272 274 273 void AccessibilityRootAtspi::childRemoved(AccessibilityObjectAtspi& child) 275 274 { 276 m_atspi.childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Removed);275 AccessibilityAtspi::singleton().childrenChanged(*this, child, AccessibilityAtspi::ChildrenChanged::Removed); 277 276 } 278 277 … … 280 279 { 281 280 RELEASE_ASSERT(!isMainThread()); 282 g_variant_builder_add(builder, "(so)", m_atspi.uniqueName(), m_path.utf8().data());281 g_variant_builder_add(builder, "(so)", AccessibilityAtspi::singleton().uniqueName(), m_path.utf8().data()); 283 282 g_variant_builder_add(builder, "@(so)", applicationReference()); 284 283 g_variant_builder_add(builder, "@(so)", parentReference()); -
trunk/Source/WebCore/accessibility/atspi/AccessibilityRootAtspi.h
r287565 r287876 21 21 22 22 #if ENABLE(ACCESSIBILITY) && USE(ATSPI) 23 #include "AccessibilityAtspi.h"24 23 #include "IntRect.h" 25 24 #include <wtf/Atomics.h> … … 28 27 #include <wtf/WeakPtr.h> 29 28 29 typedef struct _GDBusInterfaceVTable GDBusInterfaceVTable; 30 30 typedef struct _GVariant GVariant; 31 31 … … 37 37 WTF_MAKE_FAST_ALLOCATED; 38 38 public: 39 static Ref<AccessibilityRootAtspi> create(Page& , AccessibilityAtspi&);39 static Ref<AccessibilityRootAtspi> create(Page&); 40 40 ~AccessibilityRootAtspi() = default; 41 41 … … 50 50 GVariant* parentReference() const; 51 51 GVariant* applicationReference() const; 52 AccessibilityAtspi& atspi() const { return m_atspi; }53 52 AccessibilityObjectAtspi* child() const; 54 53 void childAdded(AccessibilityObjectAtspi&); … … 58 57 59 58 private: 60 AccessibilityRootAtspi(Page&, AccessibilityAtspi&);59 explicit AccessibilityRootAtspi(Page&); 61 60 62 61 void embedded(const char* parentUniqueName, const char* parentPath); … … 67 66 static GDBusInterfaceVTable s_componentFunctions; 68 67 69 AccessibilityAtspi& m_atspi;70 68 WeakPtr<Page> m_page; 71 69 String m_path; -
trunk/Source/WebKit/ChangeLog
r287866 r287876 1 2022-01-11 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK][a11y] Web process crashes in some sites having SVG images 4 https://bugs.webkit.org/show_bug.cgi?id=234737 5 6 Reviewed by Adrian Perez de Castro. 7 8 Use AccessibilityAtspi::singleton(). 9 10 * WebProcess/WebPage/gtk/WebPageGtk.cpp: 11 (WebKit::WebPage::platformInitialize): 12 * WebProcess/WebProcess.h: 13 (WebKit::WebProcess::accessibilityAtspi const): Deleted. 14 * WebProcess/glib/WebProcessGLib.cpp: 15 (WebKit::WebProcess::platformInitializeWebProcess): 16 1 17 2022-01-10 Wenson Hsieh <wenson_hsieh@apple.com> 2 18 -
trunk/Source/WebKit/WebProcess/WebPage/gtk/WebPageGtk.cpp
r287014 r287876 71 71 #else 72 72 if (auto* page = corePage()) { 73 m_accessibilityRootObject = AccessibilityRootAtspi::create(*page , WebProcess::singleton().accessibilityAtspi());73 m_accessibilityRootObject = AccessibilityRootAtspi::create(*page); 74 74 m_accessibilityRootObject->registerObject([&](const String& plugID) { 75 75 send(Messages::WebPageProxy::BindAccessibilityTree(plugID)); -
trunk/Source/WebKit/WebProcess/WebProcess.h
r287808 r287876 74 74 #if HAVE(MEDIA_ACCESSIBILITY_FRAMEWORK) 75 75 #include <WebCore/CaptionUserPreferences.h> 76 #endif77 78 #if USE(ATSPI)79 #include <WebCore/AccessibilityAtspi.h>80 76 #endif 81 77 … … 400 396 #endif 401 397 402 #if USE(ATSPI)403 WebCore::AccessibilityAtspi& accessibilityAtspi() const { return *m_accessibility; }404 #endif405 406 398 bool isCaptivePortalModeEnabled() const { return m_isCaptivePortalModeEnabled; } 407 399 … … 779 771 std::unique_ptr<SpeechRecognitionRealtimeMediaSourceManager> m_speechRecognitionRealtimeMediaSourceManager; 780 772 #endif 781 782 #if USE(ATSPI)783 std::unique_ptr<WebCore::AccessibilityAtspi> m_accessibility;784 #endif785 773 }; 786 774 -
trunk/Source/WebKit/WebProcess/glib/WebProcessGLib.cpp
r284525 r287876 58 58 #if OS(LINUX) 59 59 #include <wtf/linux/RealTimeThreads.h> 60 #endif 61 62 #if USE(ATSPI) 63 #include <WebCore/AccessibilityAtspi.h> 60 64 #endif 61 65 … … 130 134 131 135 #if USE(ATSPI) 132 m_accessibility = makeUnique<AccessibilityAtspi>(parameters.accessibilityBusAddress);136 AccessibilityAtspi::singleton().connect(parameters.accessibilityBusAddress); 133 137 #endif 134 138 } -
trunk/Tools/ChangeLog
r287872 r287876 1 2022-01-11 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK][a11y] Web process crashes in some sites having SVG images 4 https://bugs.webkit.org/show_bug.cgi?id=234737 5 6 Reviewed by Adrian Perez de Castro. 7 8 Use AccessibilityAtspi::singleton(). 9 10 * WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp: 11 (WTR::AccessibilityController::axRunLoop): 12 * WebKitTestRunner/InjectedBundle/atspi/AccessibilityNotificationHandler.cpp: 13 (WTR::AccessibilityNotificationHandler::AccessibilityNotificationHandler): 14 (WTR::AccessibilityNotificationHandler::~AccessibilityNotificationHandler): 15 1 16 2022-01-11 Carlos Garcia Campos <cgarcia@igalia.com> 2 17 -
trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityControllerAtspi.cpp
r287872 r287876 139 139 auto* element = static_cast<WebCore::AccessibilityObjectAtspi*>(WKAccessibilityRootObject(page)); 140 140 RELEASE_ASSERT(element); 141 m_axRunLoop = & element->root().atspi().runLoop();141 m_axRunLoop = &WebCore::AccessibilityAtspi::singleton().runLoop(); 142 142 } 143 143 -
trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityNotificationHandler.cpp
r287387 r287876 34 34 #include <JavaScriptCore/OpaqueJSString.h> 35 35 #include <WebCore/AccessibilityObjectAtspi.h> 36 #include <WebCore/AccessibilityRootAtspi.h>37 36 #include <WebKit/WKBundleFrame.h> 38 37 #include <WebKit/WKBundlePage.h> … … 45 44 , m_element(element) 46 45 { 47 WKBundlePageRef page = InjectedBundle::singleton().page()->page(); 48 WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(page); 46 WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::singleton().page()->page()); 49 47 JSContextRef jsContext = WKBundleFrameGetJavaScriptContext(mainFrame); 50 48 JSValueProtect(jsContext, m_callback); 51 49 52 auto& atspi = m_element ? m_element->root().atspi() : static_cast<WebCore::AccessibilityObjectAtspi*>(WKAccessibilityRootObject(page))->root().atspi(); 53 atspi.addNotificationObserver(this, [this](WebCore::AccessibilityObjectAtspi& element, const char* notificationName, WebCore::AccessibilityAtspi::NotificationObserverParameter parameter) { 50 WebCore::AccessibilityAtspi::singleton().addNotificationObserver(this, [this](WebCore::AccessibilityObjectAtspi& element, const char* notificationName, WebCore::AccessibilityAtspi::NotificationObserverParameter parameter) { 54 51 if (m_element && m_element.get() != &element) 55 52 return; … … 96 93 AccessibilityNotificationHandler::~AccessibilityNotificationHandler() 97 94 { 98 WKBundlePageRef page = InjectedBundle::singleton().page()->page(); 99 auto& atspi = m_element ? m_element->root().atspi() : static_cast<WebCore::AccessibilityObjectAtspi*>(WKAccessibilityRootObject(page))->root().atspi(); 100 atspi.removeNotificationObserver(this); 95 WebCore::AccessibilityAtspi::singleton().removeNotificationObserver(this); 101 96 102 WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame( page);97 WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(InjectedBundle::singleton().page()->page()); 103 98 JSContextRef jsContext = WKBundleFrameGetJavaScriptContext(mainFrame); 104 99 JSValueUnprotect(jsContext, m_callback);
Note:
See TracChangeset
for help on using the changeset viewer.