Changeset 295139 in webkit
- Timestamp:
- Jun 2, 2022, 12:46:46 PM (4 years ago)
- Location:
- trunk/Source/WebCore/accessibility
- Files:
-
- 9 edited
-
AXObjectCache.cpp (modified) (2 diffs)
-
AXObjectCache.h (modified) (3 diffs)
-
AccessibilityObject.cpp (modified) (2 diffs)
-
AccessibilityObject.h (modified) (2 diffs)
-
AccessibilityObjectInterface.h (modified) (2 diffs)
-
isolatedtree/AXIsolatedObject.cpp (modified) (3 diffs)
-
isolatedtree/AXIsolatedObject.h (modified) (1 diff)
-
isolatedtree/AXIsolatedTree.cpp (modified) (1 diff)
-
isolatedtree/AXIsolatedTree.h (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/accessibility/AXObjectCache.cpp
r295024 r295139 3772 3772 if (relationsIterator == m_relations.end()) { 3773 3773 // No relations for this object, add the first one. 3774 m_relations.add(origin->objectID(), Relations { { static_cast<uint8_t>(relationType), { target->objectID() } } });3774 m_relations.add(origin->objectID(), AXRelations { { static_cast<uint8_t>(relationType), { target->objectID() } } }); 3775 3775 } else if (auto targetsIterator = relationsIterator->value.find(static_cast<uint8_t>(relationType)); targetsIterator == relationsIterator->value.end()) { 3776 3776 // No relation of this type for this object, add the first one. … … 3843 3843 } 3844 3844 3845 std::optional<Vector<AXID>> AXObjectCache::relatedObjectsFor(const AXCoreObject& object, AXRelationType relationType) 3845 void AXObjectCache::relationsNeedUpdate(bool needUpdate) 3846 { 3847 m_relationsNeedUpdate = needUpdate; 3848 3849 #if ENABLE(ACCESSIBILITY_ISOLATED_TREE) 3850 if (m_relationsNeedUpdate && m_pageID) { 3851 if (auto tree = AXIsolatedTree::treeForPageID(*m_pageID)) 3852 tree->relationsNeedUpdate(true); 3853 } 3854 #endif 3855 } 3856 3857 HashMap<AXID, AXRelations> AXObjectCache::relations() 3858 { 3859 updateRelationsIfNeeded(); 3860 return m_relations; 3861 } 3862 3863 std::optional<Vector<AXID>> AXObjectCache::relatedObjectIDsFor(const AXCoreObject& object, AXRelationType relationType) 3846 3864 { 3847 3865 updateRelationsIfNeeded(); -
trunk/Source/WebCore/accessibility/AXObjectCache.h
r294938 r295139 381 381 382 382 // Returns the IDs of the objects that relate to the given object with the specified relationship. 383 std::optional<Vector<AXID>> relatedObject sFor(const AXCoreObject&, AXRelationType);383 std::optional<Vector<AXID>> relatedObjectIDsFor(const AXCoreObject&, AXRelationType); 384 384 385 385 #if ENABLE(ACCESSIBILITY_ISOLATED_TREE) … … 501 501 void addRelation(AccessibilityObject*, AccessibilityObject*, AXRelationType, AddingSymmetricRelation = AddingSymmetricRelation::No); 502 502 void updateRelationsIfNeeded(); 503 void relationsNeedUpdate(bool needUpdate) { m_relationsNeedUpdate = needUpdate; } 503 void relationsNeedUpdate(bool); 504 HashMap<AXID, AXRelations> relations(); 504 505 505 506 Document& m_document; … … 559 560 560 561 // Relationships between objects. 561 using Relations = HashMap<AXRelationType, Vector<AXID>, DefaultHash<uint8_t>, WTF::UnsignedWithZeroKeyHashTraits<uint8_t>>; 562 HashMap<AXID, Relations> m_relations; 562 HashMap<AXID, AXRelations> m_relations; 563 563 bool m_relationsNeedUpdate { true }; 564 564 -
trunk/Source/WebCore/accessibility/AccessibilityObject.cpp
r295090 r295139 3937 3937 return { }; 3938 3938 3939 auto relatedObjectIDs = cache->relatedObject sFor(*this, relationType);3939 auto relatedObjectIDs = cache->relatedObjectIDsFor(*this, relationType); 3940 3940 if (!relatedObjectIDs) 3941 3941 return { }; … … 3952 3952 3953 3953 return false; 3954 }3955 3956 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::activeDescendantOfObjects() const3957 {3958 return relatedObjects(AXRelationType::ActiveDescendantOf);3959 }3960 3961 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::controlledObjects() const3962 {3963 return relatedObjects(AXRelationType::ControllerFor);3964 }3965 3966 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::controllers() const3967 {3968 return relatedObjects(AXRelationType::ControlledBy);3969 }3970 3971 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::describedByObjects() const3972 {3973 return relatedObjects(AXRelationType::DescribedBy);3974 }3975 3976 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::descriptionForObjects() const3977 {3978 return relatedObjects(AXRelationType::DescriptionFor);3979 }3980 3981 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::detailedByObjects() const3982 {3983 return relatedObjects(AXRelationType::Details);3984 }3985 3986 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::detailsForObjects() const3987 {3988 return relatedObjects(AXRelationType::DetailsFor);3989 }3990 3991 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::errorMessageObjects() const3992 {3993 return relatedObjects(AXRelationType::ErrorMessage);3994 }3995 3996 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::errorMessageForObjects() const3997 {3998 return relatedObjects(AXRelationType::ErrorMessageFor);3999 }4000 4001 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::flowToObjects() const4002 {4003 return relatedObjects(AXRelationType::FlowsTo);4004 }4005 4006 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::flowFromObjects() const4007 {4008 return relatedObjects(AXRelationType::FlowsFrom);4009 }4010 4011 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::labelledByObjects() const4012 {4013 return relatedObjects(AXRelationType::LabelledBy);4014 }4015 4016 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::labelForObjects() const4017 {4018 return relatedObjects(AXRelationType::LabelFor);4019 }4020 4021 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::ownedObjects() const4022 {4023 return relatedObjects(AXRelationType::OwnerFor);4024 }4025 4026 AXCoreObject::AccessibilityChildrenVector AccessibilityObject::owners() const4027 {4028 return relatedObjects(AXRelationType::OwnedBy);4029 3954 } 4030 3955 -
trunk/Source/WebCore/accessibility/AccessibilityObject.h
r295090 r295139 305 305 bool isActiveDescendantOfFocusedContainer() const override; 306 306 307 AccessibilityChildrenVector activeDescendantOfObjects() const override;308 AccessibilityChildrenVector controlledObjects() const override;309 AccessibilityChildrenVector controllers() const override;310 AccessibilityChildrenVector describedByObjects() const override;311 AccessibilityChildrenVector descriptionForObjects() const override;312 AccessibilityChildrenVector detailedByObjects() const override;313 AccessibilityChildrenVector detailsForObjects() const override;314 AccessibilityChildrenVector errorMessageObjects() const override;315 AccessibilityChildrenVector errorMessageForObjects() const override;316 AccessibilityChildrenVector flowToObjects() const override;317 AccessibilityChildrenVector flowFromObjects() const override;318 AccessibilityChildrenVector labelledByObjects() const override;319 AccessibilityChildrenVector labelForObjects() const override;320 AccessibilityChildrenVector ownedObjects() const override;321 AccessibilityChildrenVector owners() const override;322 323 307 bool hasPopup() const override { return false; } 324 308 String popupValue() const override; … … 788 772 AccessibilityChildrenVector documentLinks() override { return AccessibilityChildrenVector(); } 789 773 790 AccessibilityChildrenVector relatedObjects(AXRelationType) const ;774 AccessibilityChildrenVector relatedObjects(AXRelationType) const override; 791 775 protected: 792 776 AccessibilityObject() = default; -
trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h
r294878 r295139 799 799 OwnerFor, 800 800 }; 801 using AXRelations = HashMap<AXRelationType, Vector<AXID>, DefaultHash<uint8_t>, WTF::UnsignedWithZeroKeyHashTraits<uint8_t>>; 801 802 802 803 // Use this struct to store the isIgnored data that depends on the parents, so that in addChildren() … … 1074 1075 1075 1076 // Retrieval of related objects. 1076 virtual AccessibilityChildrenVector activeDescendantOfObjects() const = 0; 1077 virtual AccessibilityChildrenVector controlledObjects() const = 0; 1078 virtual AccessibilityChildrenVector controllers() const = 0; 1079 virtual AccessibilityChildrenVector describedByObjects() const = 0; 1080 virtual AccessibilityChildrenVector descriptionForObjects() const = 0; 1081 virtual AccessibilityChildrenVector detailedByObjects() const = 0; 1082 virtual AccessibilityChildrenVector detailsForObjects() const = 0; 1083 virtual AccessibilityChildrenVector errorMessageObjects() const = 0; 1084 virtual AccessibilityChildrenVector errorMessageForObjects() const = 0; 1085 virtual AccessibilityChildrenVector flowToObjects() const = 0; 1086 virtual AccessibilityChildrenVector flowFromObjects() const = 0; 1087 virtual AccessibilityChildrenVector labelledByObjects() const = 0; 1088 virtual AccessibilityChildrenVector labelForObjects() const = 0; 1089 virtual AccessibilityChildrenVector ownedObjects() const = 0; 1090 virtual AccessibilityChildrenVector owners() const = 0; 1077 AccessibilityChildrenVector activeDescendantOfObjects() const { return relatedObjects(AXRelationType::ActiveDescendantOf); } 1078 AccessibilityChildrenVector controlledObjects() const { return relatedObjects(AXRelationType::ControllerFor); } 1079 AccessibilityChildrenVector controllers() const { return relatedObjects(AXRelationType::ControlledBy); } 1080 AccessibilityChildrenVector describedByObjects() const { return relatedObjects(AXRelationType::DescribedBy); } 1081 AccessibilityChildrenVector descriptionForObjects() const { return relatedObjects(AXRelationType::DescriptionFor); } 1082 AccessibilityChildrenVector detailedByObjects() const { return relatedObjects(AXRelationType::Details); } 1083 AccessibilityChildrenVector detailsForObjects() const { return relatedObjects(AXRelationType::DetailsFor); } 1084 AccessibilityChildrenVector errorMessageObjects() const { return relatedObjects(AXRelationType::ErrorMessage); } 1085 AccessibilityChildrenVector errorMessageForObjects() const { return relatedObjects(AXRelationType::ErrorMessageFor); } 1086 AccessibilityChildrenVector flowToObjects() const { return relatedObjects(AXRelationType::FlowsTo); } 1087 AccessibilityChildrenVector flowFromObjects() const { return relatedObjects(AXRelationType::FlowsFrom); } 1088 AccessibilityChildrenVector labelledByObjects() const { return relatedObjects(AXRelationType::LabelledBy); } 1089 AccessibilityChildrenVector labelForObjects() const { return relatedObjects(AXRelationType::LabelFor); } 1090 AccessibilityChildrenVector ownedObjects() const { return relatedObjects(AXRelationType::OwnerFor); } 1091 AccessibilityChildrenVector owners() const { return relatedObjects(AXRelationType::OwnedBy); } 1092 virtual AccessibilityChildrenVector relatedObjects(AXRelationType) const = 0; 1091 1093 1092 1094 virtual bool hasPopup() const = 0; -
trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp
r294328 r295139 329 329 setObjectVectorProperty(AXPropertyName::LinkedObjects, object.linkedObjects()); 330 330 331 // Relations.332 setObjectVectorProperty(AXPropertyName::ControlledObjects, object.controlledObjects());333 setObjectVectorProperty(AXPropertyName::DetailedByObjects, object.detailedByObjects());334 setObjectVectorProperty(AXPropertyName::ErrorMessageObjects, object.errorMessageObjects());335 setObjectVectorProperty(AXPropertyName::FlowToObjects, object.flowToObjects());336 setObjectVectorProperty(AXPropertyName::OwnedObjects, object.ownedObjects());337 338 331 // Spin button support. 339 332 setObjectProperty(AXPropertyName::DecrementButton, object.decrementButton()); … … 1866 1859 } 1867 1860 1868 AXCoreObject::AccessibilityChildrenVector AXIsolatedObject::activeDescendantOfObjects() const1869 {1870 ASSERT_NOT_REACHED();1871 return { };1872 }1873 1874 AXCoreObject::AccessibilityChildrenVector AXIsolatedObject::controllers() const1875 {1876 ASSERT_NOT_REACHED();1877 return { };1878 }1879 1880 AXCoreObject::AccessibilityChildrenVector AXIsolatedObject::describedByObjects() const1881 {1882 ASSERT_NOT_REACHED();1883 return { };1884 }1885 1886 AXCoreObject::AccessibilityChildrenVector AXIsolatedObject::descriptionForObjects() const1887 {1888 ASSERT_NOT_REACHED();1889 return { };1890 }1891 1892 AXCoreObject::AccessibilityChildrenVector AXIsolatedObject::detailsForObjects() const1893 {1894 ASSERT_NOT_REACHED();1895 return { };1896 }1897 1898 AXCoreObject::AccessibilityChildrenVector AXIsolatedObject::errorMessageForObjects() const1899 {1900 ASSERT_NOT_REACHED();1901 return { };1902 }1903 1904 AXCoreObject::AccessibilityChildrenVector AXIsolatedObject::flowFromObjects() const1905 {1906 ASSERT_NOT_REACHED();1907 return { };1908 }1909 1910 AXCoreObject::AccessibilityChildrenVector AXIsolatedObject::labelledByObjects() const1911 {1912 ASSERT_NOT_REACHED();1913 return { };1914 }1915 1916 AXCoreObject::AccessibilityChildrenVector AXIsolatedObject::labelForObjects() const1917 {1918 ASSERT_NOT_REACHED();1919 return { };1920 }1921 1922 AXCoreObject::AccessibilityChildrenVector AXIsolatedObject::owners() const1923 {1924 ASSERT_NOT_REACHED();1925 return { };1926 }1927 1928 1861 bool AXIsolatedObject::hasDatalist() const 1929 1862 { … … 2184 2117 } 2185 2118 2119 AXCoreObject::AccessibilityChildrenVector AXIsolatedObject::relatedObjects(AXRelationType relationType) const 2120 { 2121 if (auto relatedObjectIDs = tree()->relatedObjectIDsFor(*this, relationType)) 2122 return tree()->objectsForIDs(*relatedObjectIDs); 2123 return { }; 2124 } 2125 2186 2126 AXCoreObject* AXIsolatedObject::activeDescendant() const 2187 2127 { -
trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h
r294328 r295139 542 542 AXCoreObject* selectedListItem() override; 543 543 544 AccessibilityChildrenVector activeDescendantOfObjects() const override; 545 AccessibilityChildrenVector controlledObjects() const override { return tree()->objectsForIDs(vectorAttributeValue<AXID>(AXPropertyName::ControlledObjects)); } 546 AccessibilityChildrenVector controllers() const override; 547 AccessibilityChildrenVector describedByObjects() const override; 548 AccessibilityChildrenVector descriptionForObjects() const override; 549 AccessibilityChildrenVector detailedByObjects() const override { return tree()->objectsForIDs(vectorAttributeValue<AXID>(AXPropertyName::DetailedByObjects)); } 550 AccessibilityChildrenVector detailsForObjects() const override; 551 AccessibilityChildrenVector errorMessageObjects() const override { return tree()->objectsForIDs(vectorAttributeValue<AXID>(AXPropertyName::ErrorMessageObjects)); } 552 AccessibilityChildrenVector errorMessageForObjects() const override; 553 AccessibilityChildrenVector flowToObjects() const override { return tree()->objectsForIDs(vectorAttributeValue<AXID>(AXPropertyName::FlowToObjects)); } 554 AccessibilityChildrenVector flowFromObjects() const override; 555 AccessibilityChildrenVector labelledByObjects() const override; 556 AccessibilityChildrenVector labelForObjects() const override; 557 AccessibilityChildrenVector ownedObjects() const override { return tree()->objectsForIDs(vectorAttributeValue<AXID>(AXPropertyName::OwnedObjects)); } 558 AccessibilityChildrenVector owners() const override; 544 AccessibilityChildrenVector relatedObjects(AXRelationType) const override; 559 545 560 546 bool hasDatalist() const override; -
trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
r294894 r295139 618 618 } 619 619 620 std::optional<Vector<AXID>> AXIsolatedTree::relatedObjectIDsFor(const AXCoreObject& object, AXRelationType relationType) 621 { 622 ASSERT(!isMainThread()); 623 624 if (m_relationsNeedUpdate) { 625 m_relations = Accessibility::retrieveValueFromMainThread<HashMap<AXID, AXRelations>>([this] () -> HashMap<AXID, AXRelations> { 626 if (auto* cache = axObjectCache()) 627 return cache->relations(); 628 return { }; 629 }); 630 m_relationsNeedUpdate = false; 631 } 632 633 auto relationsIterator = m_relations.find(object.objectID()); 634 if (relationsIterator == m_relations.end()) 635 return std::nullopt; 636 637 auto targetsIterator = relationsIterator->value.find(static_cast<uint8_t>(relationType)); 638 if (targetsIterator == relationsIterator->value.end()) 639 return std::nullopt; 640 return targetsIterator->value; 641 } 642 620 643 void AXIsolatedTree::applyPendingChanges() 621 644 { -
trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h
r294894 r295139 93 93 ComputedRoleString, 94 94 Contents, 95 ControlledObjects,96 95 CurrentState, 97 96 CurrentValue, … … 99 98 DecrementButton, 100 99 Description, 101 DetailedByObjects,102 100 DisclosedByRow, 103 101 DisclosedRows, … … 108 106 EditableAncestor, 109 107 EmbeddedImageDescription, 110 ErrorMessageObjects,111 108 ExpandedTextValue, 112 109 FileUploadButtonReturnsValueInTitle, 113 FlowToObjects,114 110 FocusableAncestor, 115 111 HasARIAValueNow, … … 251 247 MinValueForRange, 252 248 NameAttribute, 253 OwnedObjects,254 249 Orientation, 255 250 OuterHTML, … … 372 367 void setFocusedNodeID(AXID); 373 368 369 // Relationships between objects. 370 std::optional<Vector<AXID>> relatedObjectIDsFor(const AXCoreObject&, AXRelationType); 371 void relationsNeedUpdate(bool needUpdate) { m_relationsNeedUpdate = needUpdate; } 372 374 373 // Called on AX thread from WebAccessibilityObjectWrapper methods. 375 374 // During layout tests, it is called on the main thread. … … 428 427 AXID m_focusedNodeID; 429 428 std::atomic<double> m_loadingProgress { 0 }; 429 430 // Relationships between objects. 431 // Accessed only on the AX thread. 432 HashMap<AXID, AXRelations> m_relations; 433 // Set to true by the AXObjectCache on the main thread. 434 // Set to false on the AX thread by relatedObjectIDsFor. 435 std::atomic<bool> m_relationsNeedUpdate { true }; 436 430 437 Lock m_changeLogLock; 431 438 };
Note:
See TracChangeset
for help on using the changeset viewer.