Diff
Modified: trunk/Source/WebCore/ChangeLog (254565 => 254566)
--- trunk/Source/WebCore/ChangeLog 2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/ChangeLog 2020-01-15 14:42:44 UTC (rev 254566)
@@ -1,3 +1,55 @@
+2020-01-15 Andres Gonzalez <andresg...@apple.com>
+
+ Implementation of AXIsolatedObject::press().
+ https://bugs.webkit.org/show_bug.cgi?id=206177
+
+ Reviewed by Chris Fleizach.
+
+ - Implemented AXIsolatedObject::press().
+ - For link objects, press causes the destruction and re-creation of the
+ isolated tree. Thus also added AXIsolatedTree:removeTreeForPageID.
+ - AXIsolatedTree::applyPendingChanges now also properly detaches isolated
+ objects that have been removed.
+ - Moved set and get wrapper to AXCoreObject so that it can be used for
+ both isolated and live objects.
+
+ * accessibility/AXObjectCache.cpp:
+ (WebCore::AXObjectCache::~AXObjectCache):
+ (WebCore::AXObjectCache::remove):
+ (WebCore::AXObjectCache::createIsolatedTreeHierarchy):
+ * accessibility/AXObjectCache.h:
+ (WebCore::AXObjectCache::detachWrapper):
+ * accessibility/AccessibilityObject.h:
+ * accessibility/AccessibilityObjectInterface.h:
+ (WebCore::AXCoreObject::wrapper const):
+ (WebCore::AXCoreObject::setWrapper):
+ * accessibility/atk/AXObjectCacheAtk.cpp:
+ (WebCore::AXObjectCache::detachWrapper):
+ * accessibility/ios/AXObjectCacheIOS.mm:
+ (WebCore::AXObjectCache::detachWrapper):
+ * accessibility/isolatedtree/AXIsolatedTree.cpp:
+ (WebCore::AXIsolatedTree::removeTreeForPageID):
+ (WebCore::AXIsolatedTree::applyPendingChanges):
+ * accessibility/isolatedtree/AXIsolatedTree.h:
+ * accessibility/isolatedtree/AXIsolatedTreeNode.cpp:
+ (WebCore::AXIsolatedObject::detach):
+ (WebCore::AXIsolatedObject::detachFromParent):
+ (WebCore::AXIsolatedObject::children):
+ (WebCore::AXIsolatedObject::isDetachedFromParent):
+ (WebCore::AXIsolatedObject::performFunctionOnMainThread):
+ (WebCore::AXIsolatedObject::findTextRanges const):
+ (WebCore::AXIsolatedObject::performTextOperation):
+ (WebCore::AXIsolatedObject::press):
+ (WebCore::AXIsolatedObject::widget const):
+ (WebCore::AXIsolatedObject::page const):
+ (WebCore::AXIsolatedObject::document const):
+ (WebCore::AXIsolatedObject::documentFrameView const):
+ * accessibility/isolatedtree/AXIsolatedTreeNode.h:
+ * accessibility/mac/AXObjectCacheMac.mm:
+ (WebCore::AXObjectCache::detachWrapper):
+ * accessibility/win/AXObjectCacheWin.cpp:
+ (WebCore::AXObjectCache::detachWrapper):
+
2020-01-15 Thibault Saunier <tsaun...@igalia.com>
[GStreamer] Several buffering fixes
Modified: trunk/Source/WebCore/accessibility/AXObjectCache.cpp (254565 => 254566)
--- trunk/Source/WebCore/accessibility/AXObjectCache.cpp 2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.cpp 2020-01-15 14:42:44 UTC (rev 254566)
@@ -233,6 +233,12 @@
m_focusModalNodeTimer.stop();
m_performCacheUpdateTimer.stop();
+#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
+ // Destroy the IsolatedTree before destroying the live tree.
+ if (m_pageID)
+ AXIsolatedTree::removeTreeForPageID(*m_pageID);
+#endif
+
for (const auto& object : m_objects.values()) {
detachWrapper(object.get(), AccessibilityDetachmentType::CacheDestroyed);
object->detach(AccessibilityDetachmentType::CacheDestroyed);
@@ -743,8 +749,11 @@
return nullptr;
auto tree = AXIsolatedTree::treeForPageID(*m_pageID);
- if (!tree && isMainThread()) {
- tree = generateIsolatedTree(*m_pageID, m_document);
+ if (!tree) {
+ tree = Accessibility::retrieveValueFromMainThread<RefPtr<AXIsolatedTree>>([this] () -> RefPtr<AXIsolatedTree> {
+ return generateIsolatedTree(*m_pageID, m_document);
+ });
+
// Now that we have created our tree, initialize the secondary thread,
// so future requests come in on the other thread.
_AXUIElementUseSecondaryAXThread(true);
@@ -837,6 +846,13 @@
if (!axID)
return;
+#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
+ if (m_pageID) {
+ if (auto tree = AXIsolatedTree::treeForPageID(*m_pageID))
+ tree->removeNode(axID);
+ }
+#endif
+
auto object = m_objects.take(axID);
if (!object)
return;
@@ -846,13 +862,6 @@
object->setObjectID(0);
m_idsInUse.remove(axID);
-#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
- if (m_pageID) {
- if (auto tree = AXIsolatedTree::treeForPageID(*m_pageID))
- tree->removeNode(axID);
- }
-#endif
-
ASSERT(m_objects.size() >= m_idsInUse.size());
}
@@ -3071,6 +3080,7 @@
isolatedTreeNode->setTreeIdentifier(tree.treeIdentifier());
isolatedTreeNode->setParent(parentID);
+ axObjectCache->detachWrapper(&object, AccessibilityDetachmentType::ElementChange);
axObjectCache->attachWrapper(&isolatedTreeNode.get());
for (const auto& child : object.children()) {
@@ -3085,9 +3095,7 @@
{
RELEASE_ASSERT(isMainThread());
- auto tree = AXIsolatedTree::treeForPageID(pageID);
- if (!tree)
- tree = AXIsolatedTree::createTreeForPageID(pageID);
+ RefPtr<AXIsolatedTree> tree(AXIsolatedTree::createTreeForPageID(pageID));
// Set the root and focused objects in the isolated tree. For that, we need
// the root and the focused object in the AXObject tree.
Modified: trunk/Source/WebCore/accessibility/AXObjectCache.h (254565 => 254566)
--- trunk/Source/WebCore/accessibility/AXObjectCache.h 2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.h 2020-01-15 14:42:44 UTC (rev 254566)
@@ -171,7 +171,7 @@
void remove(Widget*);
void remove(AXID);
- void detachWrapper(AccessibilityObject*, AccessibilityDetachmentType);
+ void detachWrapper(AXCoreObject*, AccessibilityDetachmentType);
void attachWrapper(AXCoreObject*);
void childrenChanged(Node*, Node* newChild = nullptr);
void childrenChanged(RenderObject*, RenderObject* newChild = nullptr);
@@ -547,7 +547,7 @@
inline void AXObjectCache::deferTextChangedIfNeeded(Node*) { }
inline void AXObjectCache::deferSelectedChildrenChangedIfNeeded(Element&) { }
inline void AXObjectCache::deferTextReplacementNotificationForTextControl(HTMLTextFormControlElement&, const String&) { }
-inline void AXObjectCache::detachWrapper(AccessibilityObject*, AccessibilityDetachmentType) { }
+inline void AXObjectCache::detachWrapper(AXCoreObject*, AccessibilityDetachmentType) { }
inline void AXObjectCache::focusModalNodeTimerFired() { }
inline void AXObjectCache::performCacheUpdateTimerFired() { }
inline void AXObjectCache::frameLoadingEventNotification(Frame*, AXLoadingEvent) { }
Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.h (254565 => 254566)
--- trunk/Source/WebCore/accessibility/AccessibilityObject.h 2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.h 2020-01-15 14:42:44 UTC (rev 254566)
@@ -681,14 +681,6 @@
bool isDOMHidden() const override;
bool isHidden() const override { return isAXHidden() || isDOMHidden(); }
-#if ENABLE(ACCESSIBILITY)
- AccessibilityObjectWrapper* wrapper() const override { return m_wrapper.get(); }
- void setWrapper(AccessibilityObjectWrapper* wrapper) override { m_wrapper = wrapper; }
-#else
- AccessibilityObjectWrapper* wrapper() const override { return nullptr; }
- void setWrapper(AccessibilityObjectWrapper*) override { }
-#endif
-
#if PLATFORM(COCOA)
void overrideAttachmentParent(AXCoreObject* parent) override;
#else
@@ -785,14 +777,6 @@
bool allowsTextRanges() const { return isTextControl(); }
unsigned getLengthForTextRange() const { return text().length(); }
#endif
-
-#if PLATFORM(COCOA)
- RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
-#elif PLATFORM(WIN)
- COMPtr<AccessibilityObjectWrapper> m_wrapper;
-#elif USE(ATK)
- GRefPtr<WebKitAccessible> m_wrapper;
-#endif
};
#if !ENABLE(ACCESSIBILITY)
Modified: trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h (254565 => 254566)
--- trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h 2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h 2020-01-15 14:42:44 UTC (rev 254566)
@@ -1075,8 +1075,13 @@
virtual bool isDOMHidden() const = 0;
virtual bool isHidden() const = 0;
- virtual AccessibilityObjectWrapper* wrapper() const = 0;
- virtual void setWrapper(AccessibilityObjectWrapper*) = 0;
+#if ENABLE(ACCESSIBILITY)
+ AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
+ void setWrapper(AccessibilityObjectWrapper* wrapper) { m_wrapper = wrapper; }
+#else
+ AccessibilityObjectWrapper* wrapper() const override { return nullptr; }
+ void setWrapper(AccessibilityObjectWrapper*) override { }
+#endif
virtual void overrideAttachmentParent(AXCoreObject* parent) = 0;
@@ -1124,6 +1129,14 @@
virtual uint64_t sessionID() const = 0;
virtual String documentURI() const = 0;
virtual String documentEncoding() const = 0;
+protected:
+#if PLATFORM(COCOA)
+ RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
+#elif PLATFORM(WIN)
+ COMPtr<AccessibilityObjectWrapper> m_wrapper;
+#elif USE(ATK)
+ GRefPtr<WebKitAccessible> m_wrapper;
+#endif
};
namespace Accessibility {
Modified: trunk/Source/WebCore/accessibility/atk/AXObjectCacheAtk.cpp (254565 => 254566)
--- trunk/Source/WebCore/accessibility/atk/AXObjectCacheAtk.cpp 2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/atk/AXObjectCacheAtk.cpp 2020-01-15 14:42:44 UTC (rev 254566)
@@ -48,7 +48,7 @@
return WEBKIT_IS_ACCESSIBLE(atkParent) ? atkParent : nullptr;
}
-void AXObjectCache::detachWrapper(AccessibilityObject* obj, AccessibilityDetachmentType detachmentType)
+void AXObjectCache::detachWrapper(AXCoreObject* obj, AccessibilityDetachmentType detachmentType)
{
auto* wrapper = obj->wrapper();
ASSERT(wrapper);
Modified: trunk/Source/WebCore/accessibility/ios/AXObjectCacheIOS.mm (254565 => 254566)
--- trunk/Source/WebCore/accessibility/ios/AXObjectCacheIOS.mm 2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/ios/AXObjectCacheIOS.mm 2020-01-15 14:42:44 UTC (rev 254566)
@@ -36,7 +36,7 @@
namespace WebCore {
-void AXObjectCache::detachWrapper(AccessibilityObject* obj, AccessibilityDetachmentType)
+void AXObjectCache::detachWrapper(AXCoreObject* obj, AccessibilityDetachmentType)
{
[obj->wrapper() detach];
obj->setWrapper(nullptr);
Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp (254565 => 254566)
--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp 2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp 2020-01-15 14:42:44 UTC (rev 254566)
@@ -80,6 +80,7 @@
Ref<AXIsolatedTree> AXIsolatedTree::createTreeForPageID(PageIdentifier pageID)
{
LockHolder locker(s_cacheLock);
+ ASSERT(!treePageCache().contains(pageID));
auto newTree = AXIsolatedTree::create();
treePageCache().set(pageID, newTree.copyRef());
@@ -87,6 +88,24 @@
return newTree;
}
+void AXIsolatedTree::removeTreeForPageID(PageIdentifier pageID)
+{
+ LockHolder locker(s_cacheLock);
+
+ if (auto optionalTree = treePageCache().take(pageID)) {
+ auto& tree { *optionalTree };
+ LockHolder treeLocker { tree->m_changeLogLock };
+ for (const auto& axID : tree->m_readerThreadNodeMap.keys()) {
+ if (auto object = tree->nodeForID(axID))
+ object->disconnect();
+ }
+ tree->m_readerThreadNodeMap.clear();
+ treeLocker.unlockEarly();
+
+ treeIDCache().remove(tree->treeIdentifier());
+ }
+}
+
RefPtr<AXIsolatedTree> AXIsolatedTree::treeForPageID(PageIdentifier pageID)
{
LockHolder locker(s_cacheLock);
@@ -157,8 +176,11 @@
for (auto& item : appendCopy)
m_readerThreadNodeMap.add(item->objectID(), WTFMove(item));
- for (auto item : removeCopy)
+ for (auto item : removeCopy) {
+ if (auto object = nodeForID(item))
+ object->disconnect();
m_readerThreadNodeMap.remove(item);
+ }
}
} // namespace WebCore
Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h (254565 => 254566)
--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h 2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h 2020-01-15 14:42:44 UTC (rev 254566)
@@ -44,7 +44,9 @@
static Ref<AXIsolatedTree> create();
virtual ~AXIsolatedTree();
- WEBCORE_EXPORT static Ref<AXIsolatedTree> createTreeForPageID(PageIdentifier);
+ static Ref<AXIsolatedTree> createTreeForPageID(PageIdentifier);
+ static void removeTreeForPageID(PageIdentifier);
+
WEBCORE_EXPORT static RefPtr<AXIsolatedTree> treeForPageID(PageIdentifier);
WEBCORE_EXPORT static RefPtr<AXIsolatedTree> treeForID(AXIsolatedTreeID);
AXObjectCache* axObjectCache() const { return m_axObjectCache; }
Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.cpp (254565 => 254566)
--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.cpp 2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.cpp 2020-01-15 14:42:44 UTC (rev 254566)
@@ -404,6 +404,15 @@
m_parent = parent;
}
+void AXIsolatedObject::detach(AccessibilityDetachmentType, AXObjectCache*)
+{
+ ASSERT(isMainThread());
+ for (const auto& childID : m_childrenIDs)
+ tree()->nodeForID(childID)->detachFromParent();
+
+ m_childrenIDs.clear();
+}
+
bool AXIsolatedObject::isDetached() const
{
ASSERT_NOT_REACHED();
@@ -410,6 +419,19 @@
return false;
}
+void AXIsolatedObject::detachFromParent()
+{
+ m_parent = InvalidAXID;
+}
+
+void AXIsolatedObject::disconnect()
+{
+ ASSERT(isMainThread());
+ tree()->axObjectCache()->detachWrapper(this, AccessibilityDetachmentType::ElementDestroyed);
+ detach(AccessibilityDetachmentType::ElementDestroyed);
+ setObjectID(InvalidAXID);
+}
+
void AXIsolatedObject::setTreeIdentifier(AXIsolatedTreeID treeIdentifier)
{
m_treeIdentifier = treeIdentifier;
@@ -419,7 +441,6 @@
const AXCoreObject::AccessibilityChildrenVector& AXIsolatedObject::children(bool)
{
- ASSERT(!isMainThread());
if (!isMainThread()) {
m_children.clear();
m_children.reserveInitialCapacity(m_childrenIDs.size());
@@ -432,7 +453,13 @@
bool AXIsolatedObject::isDetachedFromParent()
{
- return parent() == InvalidAXID && tree()->rootNode()->objectID() != m_id;
+ if (parent() != InvalidAXID)
+ return false;
+
+ // Check whether this is the root node, in which case we should return false.
+ if (auto root = tree()->rootNode())
+ return root->objectID() != m_id;
+ return false;
}
void AXIsolatedObject::accessibilityText(Vector<AccessibilityText>& texts) const
@@ -527,7 +554,7 @@
void AXIsolatedObject::performFunctionOnMainThread(U&& lambda)
{
Accessibility::performFunctionOnMainThread([&lambda, this] () {
- if (auto object = associatedAXObject())
+ if (auto* object = associatedAXObject())
lambda(object);
});
}
@@ -790,7 +817,7 @@
Vector<RefPtr<Range>> AXIsolatedObject::findTextRanges(AccessibilitySearchTextCriteria const& criteria) const
{
return Accessibility::retrieveValueFromMainThread<Vector<RefPtr<Range>>>([&criteria, this] () -> Vector<RefPtr<Range>> {
- if (auto object = associatedAXObject())
+ if (auto* object = associatedAXObject())
return object->findTextRanges(criteria);
return Vector<RefPtr<Range>>();
});
@@ -799,7 +826,7 @@
Vector<String> AXIsolatedObject::performTextOperation(AccessibilityTextOperation const& textOperation)
{
return Accessibility::retrieveValueFromMainThread<Vector<String>>([&textOperation, this] () -> Vector<String> {
- if (auto object = associatedAXObject())
+ if (auto* object = associatedAXObject())
return object->performTextOperation(textOperation);
return Vector<String>();
});
@@ -829,7 +856,8 @@
bool AXIsolatedObject::press()
{
- ASSERT_NOT_REACHED();
+ if (auto* object = associatedAXObject())
+ return object->press();
return false;
}
@@ -1467,7 +1495,7 @@
Widget* AXIsolatedObject::widget() const
{
- if (auto object = associatedAXObject())
+ if (auto* object = associatedAXObject())
return object->widget();
return nullptr;
}
@@ -1480,6 +1508,8 @@
Page* AXIsolatedObject::page() const
{
+ if (auto* object = associatedAXObject())
+ return object->page();
ASSERT_NOT_REACHED();
return nullptr;
}
@@ -1486,14 +1516,15 @@
Document* AXIsolatedObject::document() const
{
- if (auto object = associatedAXObject())
+ if (auto* object = associatedAXObject())
return object->document();
+ ASSERT_NOT_REACHED();
return nullptr;
}
FrameView* AXIsolatedObject::documentFrameView() const
{
- if (auto object = associatedAXObject())
+ if (auto* object = associatedAXObject())
return object->documentFrameView();
return nullptr;
}
@@ -1591,11 +1622,6 @@
return false;
}
-void AXIsolatedObject::detachFromParent()
-{
- ASSERT_NOT_REACHED();
-}
-
bool AXIsolatedObject::shouldFocusActiveDescendant() const
{
ASSERT_NOT_REACHED();
Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.h (254565 => 254566)
--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.h 2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.h 2020-01-15 14:42:44 UTC (rev 254566)
@@ -54,9 +54,9 @@
AXID objectID() const override { return m_id; }
void init() override { }
- AccessibilityObjectWrapper* wrapper() const override { return m_wrapper.get(); }
- void detach(AccessibilityDetachmentType, AXObjectCache* = nullptr) override { }
+ void detach(AccessibilityDetachmentType, AXObjectCache* = nullptr) override;
bool isDetached() const override;
+ void disconnect();
void setTreeIdentifier(AXIsolatedTreeID);
void setParent(AXID);
@@ -72,7 +72,11 @@
AXIsolatedObject() = default;
AXIsolatedObject(AXCoreObject&, bool isRoot);
void initializeAttributeData(AXCoreObject&, bool isRoot);
- AXCoreObject* associatedAXObject() const { return axObjectCache()->objectFromAXID(objectID()); }
+ AXCoreObject* associatedAXObject() const
+ {
+ ASSERT(isMainThread());
+ return axObjectCache()->objectFromAXID(objectID());
+ }
enum class AXPropertyName : uint8_t {
None = 0,
@@ -816,8 +820,7 @@
void setIsIgnoredFromParentDataForChild(AXCoreObject*) override;
void updateBackingStore() override;
- void setWrapper(AccessibilityObjectWrapper* wrapper) override { m_wrapper = wrapper; }
-
+
AXID m_parent { InvalidAXID };
AXID m_id { InvalidAXID };
bool m_initialized { false };
@@ -826,11 +829,8 @@
Vector<AXID> m_childrenIDs;
Vector<RefPtr<AXCoreObject>> m_children;
-#if PLATFORM(COCOA)
- RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
-#endif
-
HashMap<AXPropertyName, AttributeValueVariant, WTF::IntHash<AXPropertyName>, WTF::StrongEnumHashTraits<AXPropertyName>> m_attributeMap;
+ Lock m_attributeMapLock;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/accessibility/mac/AXObjectCacheMac.mm (254565 => 254566)
--- trunk/Source/WebCore/accessibility/mac/AXObjectCacheMac.mm 2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/mac/AXObjectCacheMac.mm 2020-01-15 14:42:44 UTC (rev 254566)
@@ -232,7 +232,7 @@
namespace WebCore {
-void AXObjectCache::detachWrapper(AccessibilityObject* obj, AccessibilityDetachmentType)
+void AXObjectCache::detachWrapper(AXCoreObject* obj, AccessibilityDetachmentType)
{
[obj->wrapper() detach];
obj->setWrapper(nullptr);
Modified: trunk/Source/WebCore/accessibility/win/AXObjectCacheWin.cpp (254565 => 254566)
--- trunk/Source/WebCore/accessibility/win/AXObjectCacheWin.cpp 2020-01-15 14:40:01 UTC (rev 254565)
+++ trunk/Source/WebCore/accessibility/win/AXObjectCacheWin.cpp 2020-01-15 14:42:44 UTC (rev 254566)
@@ -41,7 +41,7 @@
namespace WebCore {
-void AXObjectCache::detachWrapper(AccessibilityObject* obj, AccessibilityDetachmentType)
+void AXObjectCache::detachWrapper(AXCoreObject* obj, AccessibilityDetachmentType)
{
// On Windows, AccessibilityObjects are created when get_accChildCount is
// called, but they are not wrapped until get_accChild is called, so this