Changeset 263378 in webkit


Ignore:
Timestamp:
Jun 22, 2020 4:54:58 PM (4 years ago)
Author:
Andres Gonzalez
Message:

AXIsolatedTree::generateSubtree should properly assign the generated subtree to its parent node.
https://bugs.webkit.org/show_bug.cgi?id=213435

Reviewed by Darin Adler.

AXIsolatedTree::generateSubtree now properly updates the children IDs
of the parent node of the subtree being generated.

  • accessibility/AXObjectCache.cpp:

(WebCore::AXObjectCache::generateIsolatedTree):

  • accessibility/isolatedtree/AXIsolatedTree.cpp:

(WebCore::AXIsolatedTree::updateChildrenIDs):
(WebCore::AXIsolatedTree::generateSubtree): Takes the parent object
instead of the parent ID. This allows to retrieve the children IDs of
the parent object.
(WebCore::AXIsolatedTree::createSubtree):
(WebCore::AXIsolatedTree::updateSubtree):
(WebCore::AXIsolatedTree::updateChildren):
(WebCore::AXIsolatedTree::setRootNode):
(WebCore::AXIsolatedTree::removeSubtree):
(WebCore::AXIsolatedTree::appendNodeChanges): R-value parameter instead
of by reference.

  • accessibility/isolatedtree/AXIsolatedTree.h:
Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r263364 r263378  
     12020-06-22  Andres Gonzalez  <andresg_22@apple.com>
     2
     3        AXIsolatedTree::generateSubtree should properly assign the generated subtree to its parent node.
     4        https://bugs.webkit.org/show_bug.cgi?id=213435
     5
     6        Reviewed by Darin Adler.
     7
     8        AXIsolatedTree::generateSubtree now properly updates the children IDs
     9        of the parent node of the subtree being generated.
     10
     11        * accessibility/AXObjectCache.cpp:
     12        (WebCore::AXObjectCache::generateIsolatedTree):
     13        * accessibility/isolatedtree/AXIsolatedTree.cpp:
     14        (WebCore::AXIsolatedTree::updateChildrenIDs):
     15        (WebCore::AXIsolatedTree::generateSubtree): Takes the parent object
     16        instead of the parent ID. This allows to retrieve the children IDs of
     17        the parent object.
     18        (WebCore::AXIsolatedTree::createSubtree):
     19        (WebCore::AXIsolatedTree::updateSubtree):
     20        (WebCore::AXIsolatedTree::updateChildren):
     21        (WebCore::AXIsolatedTree::setRootNode):
     22        (WebCore::AXIsolatedTree::removeSubtree):
     23        (WebCore::AXIsolatedTree::appendNodeChanges): R-value parameter instead
     24        of by reference.
     25        * accessibility/isolatedtree/AXIsolatedTree.h:
     26
    1272020-06-22  Tim Horton  <timothy_horton@apple.com>
    228
  • trunk/Source/WebCore/accessibility/AXObjectCache.cpp

    r263285 r263378  
    31283128    auto* axRoot = axObjectCache->getOrCreate(document.view());
    31293129    if (axRoot)
    3130         tree->generateSubtree(*axRoot, InvalidAXID, true);
     3130        tree->generateSubtree(*axRoot, nullptr, true);
    31313131
    31323132    auto* axFocus = axObjectCache->focusedObject(document);
  • trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp

    r262966 r263378  
    162162}
    163163
    164 void AXIsolatedTree::generateSubtree(AXCoreObject& axObject, AXID parentID, bool attachWrapper)
     164void AXIsolatedTree::updateChildrenIDs(AXID axID, Vector<AXID>&& childrenIDs)
     165{
     166    ASSERT(isMainThread());
     167    ASSERT(m_changeLogLock.isLocked());
     168
     169    m_nodeMap.set(axID, childrenIDs);
     170    m_pendingChildrenUpdates.append(std::make_pair(axID, WTFMove(childrenIDs)));
     171}
     172
     173void AXIsolatedTree::generateSubtree(AXCoreObject& axObject, AXCoreObject* axParent, bool attachWrapper)
    165174{
    166175    AXTRACE("AXIsolatedTree::generateSubtree");
    167176    ASSERT(isMainThread());
     177
    168178    Vector<NodeChange> nodeChanges;
    169     auto object = createSubtree(axObject, parentID, attachWrapper, nodeChanges);
    170     LockHolder locker { m_changeLogLock };
    171     appendNodeChanges(nodeChanges);
    172 
    173     if (parentID == InvalidAXID)
     179    auto object = createSubtree(axObject, axParent ? axParent->objectID() : InvalidAXID, attachWrapper, nodeChanges);
     180    LockHolder locker { m_changeLogLock };
     181    appendNodeChanges(WTFMove(nodeChanges));
     182
     183    if (!axParent)
    174184        setRootNode(object.ptr());
    175     // FIXME: else attach the newly created subtree to its parent.
     185    else
     186        updateChildrenIDs(axParent->objectID(), axParent->childrenIDs());
    176187}
    177188
     
    203214        childrenIDs.append(child->objectID());
    204215    }
    205     m_nodeMap.set(object->objectID(), childrenIDs);
     216
    206217    {
    207218        LockHolder locker { m_changeLogLock };
    208         m_pendingChildrenUpdates.append(std::make_pair(object->objectID(), childrenIDs));
     219        updateChildrenIDs(object->objectID(), WTFMove(childrenIDs));
    209220    }
    210221
     
    238249    AXLOG(&axObject);
    239250    ASSERT(isMainThread());
     251
    240252    removeSubtree(axObject.objectID());
    241     auto* axParent = axObject.parentObject();
    242     AXID parentID = axParent ? axParent->objectID() : InvalidAXID;
    243     generateSubtree(axObject, parentID, false);
     253    generateSubtree(axObject, axObject.parentObject(), false);
    244254}
    245255
     
    287297            AXLOG("Adding a new child for:");
    288298            AXLOG(axChildren[i]);
    289             generateSubtree(*axChildren[i], axAncestor->objectID(), true);
     299            generateSubtree(*axChildren[i], axAncestor, true);
    290300        }
    291301    }
     
    297307
    298308    // Lastly, make the children IDs of the isolated object to be the same as the AXObject's.
    299     m_nodeMap.set(axAncestor->objectID(), axChildrenIDs);
    300     {
    301         LockHolder locker { m_changeLogLock };
    302         m_pendingChildrenUpdates.append(std::make_pair(axAncestor->objectID(), axChildrenIDs));
    303     }
     309    LockHolder locker { m_changeLogLock };
     310    updateChildrenIDs(axAncestor->objectID(), WTFMove(axChildrenIDs));
    304311}
    305312
     
    328335    ASSERT(isMainThread());
    329336    ASSERT(m_changeLogLock.isLocked());
     337    ASSERT(!m_rootNode);
    330338    ASSERT(root);
    331339
     
    371379}
    372380
    373 void AXIsolatedTree::appendNodeChanges(const Vector<NodeChange>& changes)
     381void AXIsolatedTree::appendNodeChanges(Vector<NodeChange>&& changes)
    374382{
    375383    AXTRACE("AXIsolatedTree::appendNodeChanges");
    376384    ASSERT(isMainThread());
    377     m_pendingAppends.appendVector(changes);
     385    ASSERT(m_changeLogLock.isLocked());
     386
     387    m_pendingAppends.appendVector(WTFMove(changes));
    378388}
    379389
  • trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h

    r262626 r263378  
    7373    };
    7474
    75     void generateSubtree(AXCoreObject&, AXID parentID, bool attachWrapper);
     75    void generateSubtree(AXCoreObject&, AXCoreObject*, bool attachWrapper);
    7676    void updateNode(AXCoreObject&);
    7777    void updateSubtree(AXCoreObject&);
     
    9999    void clear();
    100100
     101    AXIsolatedTreeID m_treeID;
    101102    static HashMap<AXIsolatedTreeID, Ref<AXIsolatedTree>>& treeIDCache();
    102103    static HashMap<PageIdentifier, Ref<AXIsolatedTree>>& treePageCache();
     
    105106    Ref<AXIsolatedObject> createSubtree(AXCoreObject&, AXID parentID, bool attachWrapper, Vector<NodeChange>&);
    106107    // Queues all pending additions to the tree as the result of a subtree generation.
    107     void appendNodeChanges(const Vector<NodeChange>&);
     108    void appendNodeChanges(Vector<NodeChange>&&);
    108109
    109110    AXObjectCache* m_axObjectCache { nullptr };
     
    121122    Vector<std::pair<AXID, Vector<AXID>>> m_pendingChildrenUpdates;
    122123    AXID m_pendingFocusedNodeID { InvalidAXID };
     124    AXID m_focusedNodeID { InvalidAXID };
    123125    Lock m_changeLogLock;
    124126
    125     AXIsolatedTreeID m_treeID;
    126     AXID m_focusedNodeID { InvalidAXID };
     127    // Called on main thread to updates both m_nodeMap and m_pendingChildrenUpdates.
     128    void updateChildrenIDs(AXID axID, Vector<AXID>&& childrenIDs);
    127129};
    128130
Note: See TracChangeset for help on using the changeset viewer.