Changeset 254566 in webkit
- Timestamp:
- Jan 15, 2020 6:42:44 AM (4 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r254565 r254566 1 2020-01-15 Andres Gonzalez <andresg_22@apple.com> 2 3 Implementation of AXIsolatedObject::press(). 4 https://bugs.webkit.org/show_bug.cgi?id=206177 5 6 Reviewed by Chris Fleizach. 7 8 - Implemented AXIsolatedObject::press(). 9 - For link objects, press causes the destruction and re-creation of the 10 isolated tree. Thus also added AXIsolatedTree:removeTreeForPageID. 11 - AXIsolatedTree::applyPendingChanges now also properly detaches isolated 12 objects that have been removed. 13 - Moved set and get wrapper to AXCoreObject so that it can be used for 14 both isolated and live objects. 15 16 * accessibility/AXObjectCache.cpp: 17 (WebCore::AXObjectCache::~AXObjectCache): 18 (WebCore::AXObjectCache::remove): 19 (WebCore::AXObjectCache::createIsolatedTreeHierarchy): 20 * accessibility/AXObjectCache.h: 21 (WebCore::AXObjectCache::detachWrapper): 22 * accessibility/AccessibilityObject.h: 23 * accessibility/AccessibilityObjectInterface.h: 24 (WebCore::AXCoreObject::wrapper const): 25 (WebCore::AXCoreObject::setWrapper): 26 * accessibility/atk/AXObjectCacheAtk.cpp: 27 (WebCore::AXObjectCache::detachWrapper): 28 * accessibility/ios/AXObjectCacheIOS.mm: 29 (WebCore::AXObjectCache::detachWrapper): 30 * accessibility/isolatedtree/AXIsolatedTree.cpp: 31 (WebCore::AXIsolatedTree::removeTreeForPageID): 32 (WebCore::AXIsolatedTree::applyPendingChanges): 33 * accessibility/isolatedtree/AXIsolatedTree.h: 34 * accessibility/isolatedtree/AXIsolatedTreeNode.cpp: 35 (WebCore::AXIsolatedObject::detach): 36 (WebCore::AXIsolatedObject::detachFromParent): 37 (WebCore::AXIsolatedObject::children): 38 (WebCore::AXIsolatedObject::isDetachedFromParent): 39 (WebCore::AXIsolatedObject::performFunctionOnMainThread): 40 (WebCore::AXIsolatedObject::findTextRanges const): 41 (WebCore::AXIsolatedObject::performTextOperation): 42 (WebCore::AXIsolatedObject::press): 43 (WebCore::AXIsolatedObject::widget const): 44 (WebCore::AXIsolatedObject::page const): 45 (WebCore::AXIsolatedObject::document const): 46 (WebCore::AXIsolatedObject::documentFrameView const): 47 * accessibility/isolatedtree/AXIsolatedTreeNode.h: 48 * accessibility/mac/AXObjectCacheMac.mm: 49 (WebCore::AXObjectCache::detachWrapper): 50 * accessibility/win/AXObjectCacheWin.cpp: 51 (WebCore::AXObjectCache::detachWrapper): 52 1 53 2020-01-15 Thibault Saunier <tsaunier@igalia.com> 2 54 -
trunk/Source/WebCore/accessibility/AXObjectCache.cpp
r254557 r254566 234 234 m_performCacheUpdateTimer.stop(); 235 235 236 #if ENABLE(ACCESSIBILITY_ISOLATED_TREE) 237 // Destroy the IsolatedTree before destroying the live tree. 238 if (m_pageID) 239 AXIsolatedTree::removeTreeForPageID(*m_pageID); 240 #endif 241 236 242 for (const auto& object : m_objects.values()) { 237 243 detachWrapper(object.get(), AccessibilityDetachmentType::CacheDestroyed); … … 744 750 745 751 auto tree = AXIsolatedTree::treeForPageID(*m_pageID); 746 if (!tree && isMainThread()) { 747 tree = generateIsolatedTree(*m_pageID, m_document); 752 if (!tree) { 753 tree = Accessibility::retrieveValueFromMainThread<RefPtr<AXIsolatedTree>>([this] () -> RefPtr<AXIsolatedTree> { 754 return generateIsolatedTree(*m_pageID, m_document); 755 }); 756 748 757 // Now that we have created our tree, initialize the secondary thread, 749 758 // so future requests come in on the other thread. … … 838 847 return; 839 848 840 auto object = m_objects.take(axID);841 if (!object)842 return;843 844 detachWrapper(object.get(), AccessibilityDetachmentType::ElementDestroyed);845 object->detach(AccessibilityDetachmentType::ElementDestroyed, this);846 object->setObjectID(0);847 848 m_idsInUse.remove(axID);849 849 #if ENABLE(ACCESSIBILITY_ISOLATED_TREE) 850 850 if (m_pageID) { … … 854 854 #endif 855 855 856 auto object = m_objects.take(axID); 857 if (!object) 858 return; 859 860 detachWrapper(object.get(), AccessibilityDetachmentType::ElementDestroyed); 861 object->detach(AccessibilityDetachmentType::ElementDestroyed, this); 862 object->setObjectID(0); 863 864 m_idsInUse.remove(axID); 856 865 ASSERT(m_objects.size() >= m_idsInUse.size()); 857 866 } … … 3072 3081 isolatedTreeNode->setTreeIdentifier(tree.treeIdentifier()); 3073 3082 isolatedTreeNode->setParent(parentID); 3083 axObjectCache->detachWrapper(&object, AccessibilityDetachmentType::ElementChange); 3074 3084 axObjectCache->attachWrapper(&isolatedTreeNode.get()); 3075 3085 … … 3086 3096 RELEASE_ASSERT(isMainThread()); 3087 3097 3088 auto tree = AXIsolatedTree::treeForPageID(pageID); 3089 if (!tree) 3090 tree = AXIsolatedTree::createTreeForPageID(pageID); 3098 RefPtr<AXIsolatedTree> tree(AXIsolatedTree::createTreeForPageID(pageID)); 3091 3099 3092 3100 // Set the root and focused objects in the isolated tree. For that, we need -
trunk/Source/WebCore/accessibility/AXObjectCache.h
r253835 r254566 172 172 void remove(AXID); 173 173 174 void detachWrapper(A ccessibilityObject*, AccessibilityDetachmentType);174 void detachWrapper(AXCoreObject*, AccessibilityDetachmentType); 175 175 void attachWrapper(AXCoreObject*); 176 176 void childrenChanged(Node*, Node* newChild = nullptr); … … 548 548 inline void AXObjectCache::deferSelectedChildrenChangedIfNeeded(Element&) { } 549 549 inline void AXObjectCache::deferTextReplacementNotificationForTextControl(HTMLTextFormControlElement&, const String&) { } 550 inline void AXObjectCache::detachWrapper(A ccessibilityObject*, AccessibilityDetachmentType) { }550 inline void AXObjectCache::detachWrapper(AXCoreObject*, AccessibilityDetachmentType) { } 551 551 inline void AXObjectCache::focusModalNodeTimerFired() { } 552 552 inline void AXObjectCache::performCacheUpdateTimerFired() { } -
trunk/Source/WebCore/accessibility/AccessibilityObject.h
r254158 r254566 682 682 bool isHidden() const override { return isAXHidden() || isDOMHidden(); } 683 683 684 #if ENABLE(ACCESSIBILITY)685 AccessibilityObjectWrapper* wrapper() const override { return m_wrapper.get(); }686 void setWrapper(AccessibilityObjectWrapper* wrapper) override { m_wrapper = wrapper; }687 #else688 AccessibilityObjectWrapper* wrapper() const override { return nullptr; }689 void setWrapper(AccessibilityObjectWrapper*) override { }690 #endif691 692 684 #if PLATFORM(COCOA) 693 685 void overrideAttachmentParent(AXCoreObject* parent) override; … … 786 778 unsigned getLengthForTextRange() const { return text().length(); } 787 779 #endif 788 789 #if PLATFORM(COCOA)790 RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;791 #elif PLATFORM(WIN)792 COMPtr<AccessibilityObjectWrapper> m_wrapper;793 #elif USE(ATK)794 GRefPtr<WebKitAccessible> m_wrapper;795 #endif796 780 }; 797 781 -
trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h
r254158 r254566 1076 1076 virtual bool isHidden() const = 0; 1077 1077 1078 virtual AccessibilityObjectWrapper* wrapper() const = 0; 1079 virtual void setWrapper(AccessibilityObjectWrapper*) = 0; 1078 #if ENABLE(ACCESSIBILITY) 1079 AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); } 1080 void setWrapper(AccessibilityObjectWrapper* wrapper) { m_wrapper = wrapper; } 1081 #else 1082 AccessibilityObjectWrapper* wrapper() const override { return nullptr; } 1083 void setWrapper(AccessibilityObjectWrapper*) override { } 1084 #endif 1080 1085 1081 1086 virtual void overrideAttachmentParent(AXCoreObject* parent) = 0; … … 1125 1130 virtual String documentURI() const = 0; 1126 1131 virtual String documentEncoding() const = 0; 1132 protected: 1133 #if PLATFORM(COCOA) 1134 RetainPtr<WebAccessibilityObjectWrapper> m_wrapper; 1135 #elif PLATFORM(WIN) 1136 COMPtr<AccessibilityObjectWrapper> m_wrapper; 1137 #elif USE(ATK) 1138 GRefPtr<WebKitAccessible> m_wrapper; 1139 #endif 1127 1140 }; 1128 1141 -
trunk/Source/WebCore/accessibility/atk/AXObjectCacheAtk.cpp
r251974 r254566 49 49 } 50 50 51 void AXObjectCache::detachWrapper(A ccessibilityObject* obj, AccessibilityDetachmentType detachmentType)51 void AXObjectCache::detachWrapper(AXCoreObject* obj, AccessibilityDetachmentType detachmentType) 52 52 { 53 53 auto* wrapper = obj->wrapper(); -
trunk/Source/WebCore/accessibility/ios/AXObjectCacheIOS.mm
r251974 r254566 37 37 namespace WebCore { 38 38 39 void AXObjectCache::detachWrapper(A ccessibilityObject* obj, AccessibilityDetachmentType)39 void AXObjectCache::detachWrapper(AXCoreObject* obj, AccessibilityDetachmentType) 40 40 { 41 41 [obj->wrapper() detach]; -
trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
r253261 r254566 81 81 { 82 82 LockHolder locker(s_cacheLock); 83 ASSERT(!treePageCache().contains(pageID)); 83 84 84 85 auto newTree = AXIsolatedTree::create(); … … 86 87 treeIDCache().set(newTree->treeIdentifier(), newTree.copyRef()); 87 88 return newTree; 89 } 90 91 void AXIsolatedTree::removeTreeForPageID(PageIdentifier pageID) 92 { 93 LockHolder locker(s_cacheLock); 94 95 if (auto optionalTree = treePageCache().take(pageID)) { 96 auto& tree { *optionalTree }; 97 LockHolder treeLocker { tree->m_changeLogLock }; 98 for (const auto& axID : tree->m_readerThreadNodeMap.keys()) { 99 if (auto object = tree->nodeForID(axID)) 100 object->disconnect(); 101 } 102 tree->m_readerThreadNodeMap.clear(); 103 treeLocker.unlockEarly(); 104 105 treeIDCache().remove(tree->treeIdentifier()); 106 } 88 107 } 89 108 … … 158 177 m_readerThreadNodeMap.add(item->objectID(), WTFMove(item)); 159 178 160 for (auto item : removeCopy) 179 for (auto item : removeCopy) { 180 if (auto object = nodeForID(item)) 181 object->disconnect(); 161 182 m_readerThreadNodeMap.remove(item); 183 } 162 184 } 163 185 -
trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h
r253565 r254566 45 45 virtual ~AXIsolatedTree(); 46 46 47 WEBCORE_EXPORT static Ref<AXIsolatedTree> createTreeForPageID(PageIdentifier); 47 static Ref<AXIsolatedTree> createTreeForPageID(PageIdentifier); 48 static void removeTreeForPageID(PageIdentifier); 49 48 50 WEBCORE_EXPORT static RefPtr<AXIsolatedTree> treeForPageID(PageIdentifier); 49 51 WEBCORE_EXPORT static RefPtr<AXIsolatedTree> treeForID(AXIsolatedTreeID); -
trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.cpp
r254158 r254566 405 405 } 406 406 407 void AXIsolatedObject::detach(AccessibilityDetachmentType, AXObjectCache*) 408 { 409 ASSERT(isMainThread()); 410 for (const auto& childID : m_childrenIDs) 411 tree()->nodeForID(childID)->detachFromParent(); 412 413 m_childrenIDs.clear(); 414 } 415 407 416 bool AXIsolatedObject::isDetached() const 408 417 { 409 418 ASSERT_NOT_REACHED(); 410 419 return false; 420 } 421 422 void AXIsolatedObject::detachFromParent() 423 { 424 m_parent = InvalidAXID; 425 } 426 427 void AXIsolatedObject::disconnect() 428 { 429 ASSERT(isMainThread()); 430 tree()->axObjectCache()->detachWrapper(this, AccessibilityDetachmentType::ElementDestroyed); 431 detach(AccessibilityDetachmentType::ElementDestroyed); 432 setObjectID(InvalidAXID); 411 433 } 412 434 … … 420 442 const AXCoreObject::AccessibilityChildrenVector& AXIsolatedObject::children(bool) 421 443 { 422 ASSERT(!isMainThread());423 444 if (!isMainThread()) { 424 445 m_children.clear(); … … 433 454 bool AXIsolatedObject::isDetachedFromParent() 434 455 { 435 return parent() == InvalidAXID && tree()->rootNode()->objectID() != m_id; 456 if (parent() != InvalidAXID) 457 return false; 458 459 // Check whether this is the root node, in which case we should return false. 460 if (auto root = tree()->rootNode()) 461 return root->objectID() != m_id; 462 return false; 436 463 } 437 464 … … 528 555 { 529 556 Accessibility::performFunctionOnMainThread([&lambda, this] () { 530 if (auto object = associatedAXObject())557 if (auto* object = associatedAXObject()) 531 558 lambda(object); 532 559 }); … … 791 818 { 792 819 return Accessibility::retrieveValueFromMainThread<Vector<RefPtr<Range>>>([&criteria, this] () -> Vector<RefPtr<Range>> { 793 if (auto object = associatedAXObject())820 if (auto* object = associatedAXObject()) 794 821 return object->findTextRanges(criteria); 795 822 return Vector<RefPtr<Range>>(); … … 800 827 { 801 828 return Accessibility::retrieveValueFromMainThread<Vector<String>>([&textOperation, this] () -> Vector<String> { 802 if (auto object = associatedAXObject())829 if (auto* object = associatedAXObject()) 803 830 return object->performTextOperation(textOperation); 804 831 return Vector<String>(); … … 830 857 bool AXIsolatedObject::press() 831 858 { 832 ASSERT_NOT_REACHED(); 859 if (auto* object = associatedAXObject()) 860 return object->press(); 833 861 return false; 834 862 } … … 1468 1496 Widget* AXIsolatedObject::widget() const 1469 1497 { 1470 if (auto object = associatedAXObject())1498 if (auto* object = associatedAXObject()) 1471 1499 return object->widget(); 1472 1500 return nullptr; … … 1481 1509 Page* AXIsolatedObject::page() const 1482 1510 { 1511 if (auto* object = associatedAXObject()) 1512 return object->page(); 1483 1513 ASSERT_NOT_REACHED(); 1484 1514 return nullptr; … … 1487 1517 Document* AXIsolatedObject::document() const 1488 1518 { 1489 if (auto object = associatedAXObject())1519 if (auto* object = associatedAXObject()) 1490 1520 return object->document(); 1521 ASSERT_NOT_REACHED(); 1491 1522 return nullptr; 1492 1523 } … … 1494 1525 FrameView* AXIsolatedObject::documentFrameView() const 1495 1526 { 1496 if (auto object = associatedAXObject())1527 if (auto* object = associatedAXObject()) 1497 1528 return object->documentFrameView(); 1498 1529 return nullptr; … … 1592 1623 } 1593 1624 1594 void AXIsolatedObject::detachFromParent()1595 {1596 ASSERT_NOT_REACHED();1597 }1598 1599 1625 bool AXIsolatedObject::shouldFocusActiveDescendant() const 1600 1626 { -
trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.h
r254158 r254566 55 55 void init() override { } 56 56 57 AccessibilityObjectWrapper* wrapper() const override { return m_wrapper.get(); } 58 void detach(AccessibilityDetachmentType, AXObjectCache* = nullptr) override { } 57 void detach(AccessibilityDetachmentType, AXObjectCache* = nullptr) override; 59 58 bool isDetached() const override; 59 void disconnect(); 60 60 61 61 void setTreeIdentifier(AXIsolatedTreeID); … … 73 73 AXIsolatedObject(AXCoreObject&, bool isRoot); 74 74 void initializeAttributeData(AXCoreObject&, bool isRoot); 75 AXCoreObject* associatedAXObject() const { return axObjectCache()->objectFromAXID(objectID()); } 75 AXCoreObject* associatedAXObject() const 76 { 77 ASSERT(isMainThread()); 78 return axObjectCache()->objectFromAXID(objectID()); 79 } 76 80 77 81 enum class AXPropertyName : uint8_t { … … 817 821 818 822 void updateBackingStore() override; 819 void setWrapper(AccessibilityObjectWrapper* wrapper) override { m_wrapper = wrapper; } 820 823 821 824 AXID m_parent { InvalidAXID }; 822 825 AXID m_id { InvalidAXID }; … … 827 830 Vector<RefPtr<AXCoreObject>> m_children; 828 831 829 #if PLATFORM(COCOA)830 RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;831 #endif832 833 832 HashMap<AXPropertyName, AttributeValueVariant, WTF::IntHash<AXPropertyName>, WTF::StrongEnumHashTraits<AXPropertyName>> m_attributeMap; 833 Lock m_attributeMapLock; 834 834 }; 835 835 -
trunk/Source/WebCore/accessibility/mac/AXObjectCacheMac.mm
r252175 r254566 233 233 namespace WebCore { 234 234 235 void AXObjectCache::detachWrapper(A ccessibilityObject* obj, AccessibilityDetachmentType)235 void AXObjectCache::detachWrapper(AXCoreObject* obj, AccessibilityDetachmentType) 236 236 { 237 237 [obj->wrapper() detach]; -
trunk/Source/WebCore/accessibility/win/AXObjectCacheWin.cpp
r251974 r254566 42 42 namespace WebCore { 43 43 44 void AXObjectCache::detachWrapper(A ccessibilityObject* obj, AccessibilityDetachmentType)44 void AXObjectCache::detachWrapper(AXCoreObject* obj, AccessibilityDetachmentType) 45 45 { 46 46 // On Windows, AccessibilityObjects are created when get_accChildCount is
Note: See TracChangeset
for help on using the changeset viewer.