AX: Do less work under m_changeLogLock in AXIsolatedTree::clear and AXIsolatedTree::setFocusedNodeID
https://bugs.webkit.org/show_bug.cgi?id=235624

Reviewed by Chris Fleizach.

AXIsolatedTree::clear and AXIsolatedTree::setFocusedNodeID
do work while holding m_changeLogLock that does not require this lock. This
patch moves this work before the lock acquisition so we hold the lock for as short
a time as possible.

* accessibility/isolatedtree/AXIsolatedTree.cpp:
(WebCore::AXIsolatedTree::clear):
(WebCore::AXIsolatedTree::setFocusedNodeID):
Move work that doesn't require m_changeLogLock before we acquire the lock.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@288619 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index eea6aed..0b90311 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,20 @@
+2022-01-26  Tyler Wilcock  <tyler_w@apple.com>
+
+        AX: Do less work under m_changeLogLock in AXIsolatedTree::clear and AXIsolatedTree::setFocusedNodeID
+        https://bugs.webkit.org/show_bug.cgi?id=235624
+
+        Reviewed by Chris Fleizach.
+
+        AXIsolatedTree::clear and AXIsolatedTree::setFocusedNodeID
+        do work while holding m_changeLogLock that does not require this lock. This
+        patch moves this work before the lock acquisition so we hold the lock for as short
+        a time as possible.
+
+        * accessibility/isolatedtree/AXIsolatedTree.cpp:
+        (WebCore::AXIsolatedTree::clear):
+        (WebCore::AXIsolatedTree::setFocusedNodeID):
+        Move work that doesn't require m_changeLogLock before we acquire the lock.
+
 2022-01-26  Antti Koivisto  <antti@apple.com>
 
         ASSERTION FAILED: !hasPendingSheets() under WebCore::Style::Scope::~Scope()
diff --git a/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp b/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
index 6549dbb..03ad3df 100644
--- a/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
+++ b/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
@@ -76,11 +76,11 @@
     AXTRACE("AXIsolatedTree::clear");
     ASSERT(isMainThread());
     m_axObjectCache = nullptr;
+    m_nodeMap.clear();
 
     Locker locker { m_changeLogLock };
     m_pendingSubtreeRemovals.append(m_rootNode->objectID());
     m_rootNode = nullptr;
-    m_nodeMap.clear();
 }
 
 RefPtr<AXIsolatedTree> AXIsolatedTree::treeForID(AXIsolatedTreeID treeID)
@@ -431,11 +431,11 @@
     AXLOG(makeString("axID ", axID.loggingString()));
     ASSERT(isMainThread());
 
-    Locker locker { m_changeLogLock };
-    m_pendingFocusedNodeID = axID;
-
     AXPropertyMap propertyMap;
     propertyMap.set(AXPropertyName::IsFocused, true);
+
+    Locker locker { m_changeLogLock };
+    m_pendingFocusedNodeID = axID;
     m_pendingPropertyChanges.append({ axID, propertyMap });
 }