Title: [270154] trunk/Source/WebCore
Revision
270154
Author
[email protected]
Date
2020-11-21 15:03:28 -0800 (Sat, 21 Nov 2020)

Log Message

AccessibilityObject::FocusedUIElement should not call AXObjectCache::focusedUIElementForPage that can return an isolated object.
https://bugs.webkit.org/show_bug.cgi?id=219238

Reviewed by Chris Fleizach.

Since AXObjectCache::focusedUIElementForPage can return an isolated
object, AccessibilityObject::focusedUIElement should not use it to
determine the focused object. This causes that isolated objects may be
accessed on the main thread when they shouldn't, and even infinite
recursion if this happens when the isolated tree is being built.
This patch changes AccessibilityObject::focusedUIElement to call
AXObjectCache::focusedObjectForPage that always returns another AccessibilityObject.

* accessibility/AXObjectCache.cpp:
(WebCore::AXObjectCache::focusedObjectForPage):
(WebCore::AXObjectCache::focusedUIElementForPage):
(WebCore::AXObjectCache::generateIsolatedTree):
(WebCore::AXObjectCache::focusedObject): Deleted.
* accessibility/AXObjectCache.h:
* accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::focusedUIElement const):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (270153 => 270154)


--- trunk/Source/WebCore/ChangeLog	2020-11-21 20:46:25 UTC (rev 270153)
+++ trunk/Source/WebCore/ChangeLog	2020-11-21 23:03:28 UTC (rev 270154)
@@ -1,3 +1,27 @@
+2020-11-21  Andres Gonzalez  <[email protected]>
+
+        AccessibilityObject::FocusedUIElement should not call AXObjectCache::focusedUIElementForPage that can return an isolated object.
+        https://bugs.webkit.org/show_bug.cgi?id=219238
+
+        Reviewed by Chris Fleizach.
+
+        Since AXObjectCache::focusedUIElementForPage can return an isolated
+        object, AccessibilityObject::focusedUIElement should not use it to
+        determine the focused object. This causes that isolated objects may be
+        accessed on the main thread when they shouldn't, and even infinite
+        recursion if this happens when the isolated tree is being built.
+        This patch changes AccessibilityObject::focusedUIElement to call
+        AXObjectCache::focusedObjectForPage that always returns another AccessibilityObject.
+
+        * accessibility/AXObjectCache.cpp:
+        (WebCore::AXObjectCache::focusedObjectForPage):
+        (WebCore::AXObjectCache::focusedUIElementForPage):
+        (WebCore::AXObjectCache::generateIsolatedTree):
+        (WebCore::AXObjectCache::focusedObject): Deleted.
+        * accessibility/AXObjectCache.h:
+        * accessibility/AccessibilityObject.cpp:
+        (WebCore::AccessibilityObject::focusedUIElement const):
+
 2020-11-21  Zalan Bujtas  <[email protected]>
 
         [LFC][IFC] Move current logicalLeft from ContinuousContent to LineStatus

Modified: trunk/Source/WebCore/accessibility/AXObjectCache.cpp (270153 => 270154)


--- trunk/Source/WebCore/accessibility/AXObjectCache.cpp	2020-11-21 20:46:25 UTC (rev 270153)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.cpp	2020-11-21 23:03:28 UTC (rev 270154)
@@ -369,17 +369,29 @@
     return nullptr;
 }
 
-AXCoreObject* AXObjectCache::focusedObject(Document& document)
+AXCoreObject* AXObjectCache::focusedObjectForPage(const Page* page)
 {
-    Element* focusedElement = document.focusedElement();
+    ASSERT(isMainThread());
+
+    if (!gAccessibilityEnabled)
+        return nullptr;
+
+    // get the focused node in the page
+    Document* document = page->focusController().focusedOrMainFrame().document();
+    if (!document)
+        return nullptr;
+
+    document->updateStyleIfNeeded();
+
+    Element* focusedElement = document->focusedElement();
     if (is<HTMLAreaElement>(focusedElement))
         return focusedImageMapUIElement(downcast<HTMLAreaElement>(focusedElement));
 
-    auto* axObjectCache = document.axObjectCache();
+    auto* axObjectCache = document->axObjectCache();
     if (!axObjectCache)
         return nullptr;
 
-    AXCoreObject* focus = axObjectCache->getOrCreate(focusedElement ? focusedElement : static_cast<Node*>(&document));
+    AXCoreObject* focus = axObjectCache->getOrCreate(focusedElement ? focusedElement : static_cast<Node*>(document));
     if (!focus)
         return nullptr;
 
@@ -421,24 +433,12 @@
 
 AXCoreObject* AXObjectCache::focusedUIElementForPage(const Page* page)
 {
-    ASSERT(isMainThread());
-    if (!gAccessibilityEnabled)
-        return nullptr;
-
-    // get the focused node in the page
-    Document* focusedDocument = page->focusController().focusedOrMainFrame().document();
-    if (!focusedDocument)
-        return nullptr;
-
-    // Call this before isolated or non-isolated cases so the document is up to do.
-    focusedDocument->updateStyleIfNeeded();
-    
 #if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
     if (isIsolatedTreeEnabled())
         return isolatedTreeFocusedObject();
 #endif
 
-    return focusedObject(*focusedDocument);
+    return focusedObjectForPage(page);
 }
 
 AccessibilityObject* AXObjectCache::get(Widget* widget)
@@ -3179,7 +3179,7 @@
     if (axRoot)
         tree->generateSubtree(*axRoot, nullptr, true);
 
-    auto* axFocus = axObjectCache->focusedObject(document);
+    auto* axFocus = axObjectCache->focusedObjectForPage(document.page());
     if (axFocus)
         tree->setFocusedNodeID(axFocus->objectID());
 

Modified: trunk/Source/WebCore/accessibility/AXObjectCache.h (270153 => 270154)


--- trunk/Source/WebCore/accessibility/AXObjectCache.h	2020-11-21 20:46:25 UTC (rev 270153)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.h	2020-11-21 23:03:28 UTC (rev 270154)
@@ -145,6 +145,7 @@
     ~AXObjectCache();
 
     WEBCORE_EXPORT AXCoreObject* focusedUIElementForPage(const Page*);
+    static AXCoreObject* focusedObjectForPage(const Page*);
 
     // Returns the root object for the entire document.
     WEBCORE_EXPORT AXCoreObject* rootObject();
@@ -431,7 +432,6 @@
     AccessibilityObject* rootWebArea();
 
     static AccessibilityObject* focusedImageMapUIElement(HTMLAreaElement*);
-    static AXCoreObject* focusedObject(Document&);
 
     AXID getAXID(AccessibilityObject*);
 

Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.cpp (270153 => 270154)


--- trunk/Source/WebCore/accessibility/AccessibilityObject.cpp	2020-11-21 20:46:25 UTC (rev 270153)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.cpp	2020-11-21 23:03:28 UTC (rev 270154)
@@ -2544,12 +2544,12 @@
     auto* document = this->document();
     return document ? document->axObjectCache() : nullptr;
 }
-    
+
 AXCoreObject* AccessibilityObject::focusedUIElement() const
 {
     auto* page = this->page();
     auto* axObjectCache = this->axObjectCache();
-    return page && axObjectCache ? axObjectCache->focusedUIElementForPage(page) : nullptr;
+    return page && axObjectCache ? axObjectCache->focusedObjectForPage(page) : nullptr;
 }
     
 AccessibilitySortDirection AccessibilityObject::sortDirection() const
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to