- Revision
- 284266
- Author
- [email protected]
- Date
- 2021-10-15 12:59:32 -0700 (Fri, 15 Oct 2021)
Log Message
Calls to AXCoreObject::widget() have to be dispatch to the main thread in isolated tree mode.
https://bugs.webkit.org/show_bug.cgi?id=231766
<rdar://problem/84271039>
Reviewed by Chris Fleizach.
This patch fixes several dozens of tests that were crashing or timing out in isolated tree mode.
The WebAccessibilityObjectWrapper was calling the widget() method on the
AX thread, which creates problems because this object is not thread
safe and it is created on the main thread. To avoid this problem, we
have to dispatch those calls to the main thread. Since widget() is
called very often now, for every request of the children of a leaf node,
added AXCoreObject::isWidget() to be able to check for it without having
to return the Widget object. The IsWidget property is cached in the
AXIsolatedObject, hence limiting the number of times we have to hit the
main thread.
* accessibility/AccessibilityNodeObject.cpp:
Removed include header that is not used in this cpp.
* accessibility/AccessibilityObject.h:
* accessibility/AccessibilityObjectInterface.h:
* accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::isWidget const):
(WebCore::AccessibilityRenderObject::widget const):
* accessibility/AccessibilityRenderObject.h:
* accessibility/isolatedtree/AXIsolatedObject.cpp:
(WebCore::AXIsolatedObject::initializeAttributeData):
(WebCore::AXIsolatedObject::widget const):
* accessibility/isolatedtree/AXIsolatedObject.h:
* accessibility/isolatedtree/AXIsolatedTree.h:
* accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper renderWidgetChildren]):
(-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
(isMatchingPlugin):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (284265 => 284266)
--- trunk/Source/WebCore/ChangeLog 2021-10-15 19:43:44 UTC (rev 284265)
+++ trunk/Source/WebCore/ChangeLog 2021-10-15 19:59:32 UTC (rev 284266)
@@ -1,3 +1,42 @@
+2021-10-15 Andres Gonzalez <[email protected]>
+
+ Calls to AXCoreObject::widget() have to be dispatch to the main thread in isolated tree mode.
+ https://bugs.webkit.org/show_bug.cgi?id=231766
+ <rdar://problem/84271039>
+
+ Reviewed by Chris Fleizach.
+
+ This patch fixes several dozens of tests that were crashing or timing out in isolated tree mode.
+
+ The WebAccessibilityObjectWrapper was calling the widget() method on the
+ AX thread, which creates problems because this object is not thread
+ safe and it is created on the main thread. To avoid this problem, we
+ have to dispatch those calls to the main thread. Since widget() is
+ called very often now, for every request of the children of a leaf node,
+ added AXCoreObject::isWidget() to be able to check for it without having
+ to return the Widget object. The IsWidget property is cached in the
+ AXIsolatedObject, hence limiting the number of times we have to hit the
+ main thread.
+
+ * accessibility/AccessibilityNodeObject.cpp:
+ Removed include header that is not used in this cpp.
+
+ * accessibility/AccessibilityObject.h:
+ * accessibility/AccessibilityObjectInterface.h:
+ * accessibility/AccessibilityRenderObject.cpp:
+ (WebCore::AccessibilityRenderObject::isWidget const):
+ (WebCore::AccessibilityRenderObject::widget const):
+ * accessibility/AccessibilityRenderObject.h:
+ * accessibility/isolatedtree/AXIsolatedObject.cpp:
+ (WebCore::AXIsolatedObject::initializeAttributeData):
+ (WebCore::AXIsolatedObject::widget const):
+ * accessibility/isolatedtree/AXIsolatedObject.h:
+ * accessibility/isolatedtree/AXIsolatedTree.h:
+ * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+ (-[WebAccessibilityObjectWrapper renderWidgetChildren]):
+ (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
+ (isMatchingPlugin):
+
2021-10-15 BJ Burg <[email protected]>
[Cocoa] Web Inspector: handle Promise objects returned from evaluateScriptInExtensionTab
Modified: trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp (284265 => 284266)
--- trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp 2021-10-15 19:43:44 UTC (rev 284265)
+++ trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp 2021-10-15 19:59:32 UTC (rev 284266)
@@ -74,7 +74,6 @@
#include "TextControlInnerElements.h"
#include "UserGestureIndicator.h"
#include "VisibleUnits.h"
-#include "Widget.h"
#include <wtf/StdLibExtras.h>
#include <wtf/text/StringBuilder.h>
#include <wtf/unicode/CharacterNames.h>
Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.h (284265 => 284266)
--- trunk/Source/WebCore/accessibility/AccessibilityObject.h 2021-10-15 19:43:44 UTC (rev 284265)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.h 2021-10-15 19:59:32 UTC (rev 284266)
@@ -442,13 +442,16 @@
String selectedText() const override { return String(); }
String accessKey() const override { return nullAtom(); }
String actionVerb() const override;
+
+ bool isWidget() const override { return false; }
Widget* widget() const override { return nullptr; }
PlatformWidget platformWidget() const override { return nullptr; }
+ Widget* widgetForAttachmentView() const override { return nullptr; }
+
#if PLATFORM(COCOA)
RemoteAXObjectRef remoteParentObject() const override;
FloatRect convertRectToPlatformSpace(const FloatRect&, AccessibilityConversionSpace) const override;
#endif
- Widget* widgetForAttachmentView() const override { return nullptr; }
Page* page() const override;
Document* document() const override;
FrameView* documentFrameView() const override;
Modified: trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h (284265 => 284266)
--- trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h 2021-10-15 19:43:44 UTC (rev 284265)
+++ trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h 2021-10-15 19:59:32 UTC (rev 284266)
@@ -85,7 +85,6 @@
class QualifiedName;
class RenderObject;
class ScrollView;
-class Widget;
struct AccessibilityText;
struct ScrollRectToVisibleOptions;
@@ -1187,13 +1186,17 @@
virtual String selectedText() const = 0;
virtual String accessKey() const = 0;
virtual String actionVerb() const = 0;
+
+ // Widget support.
+ virtual bool isWidget() const = 0;
virtual Widget* widget() const = 0;
virtual PlatformWidget platformWidget() const = 0;
+ virtual Widget* widgetForAttachmentView() const = 0;
+
#if PLATFORM(COCOA)
virtual RemoteAXObjectRef remoteParentObject() const = 0;
virtual FloatRect convertRectToPlatformSpace(const FloatRect&, AccessibilityConversionSpace) const = 0;
#endif
- virtual Widget* widgetForAttachmentView() const = 0;
virtual Page* page() const = 0;
virtual Document* document() const = 0;
virtual FrameView* documentFrameView() const = 0;
Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp (284265 => 284266)
--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp 2021-10-15 19:43:44 UTC (rev 284265)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp 2021-10-15 19:59:32 UTC (rev 284266)
@@ -2006,11 +2006,14 @@
return &m_renderer->document();
}
+bool AccessibilityRenderObject::isWidget() const
+{
+ return widget();
+}
+
Widget* AccessibilityRenderObject::widget() const
{
- if (!m_renderer || !is<RenderWidget>(*m_renderer))
- return nullptr;
- return downcast<RenderWidget>(*m_renderer).widget();
+ return is<RenderWidget>(m_renderer.get()) ? downcast<RenderWidget>(*m_renderer).widget() : nullptr;
}
AccessibilityObject* AccessibilityRenderObject::accessibilityParentForImageMap(HTMLMapElement* map) const
Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h (284265 => 284266)
--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h 2021-10-15 19:43:44 UTC (rev 284265)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h 2021-10-15 19:59:32 UTC (rev 284266)
@@ -50,8 +50,7 @@
class RenderTextControl;
class RenderView;
class VisibleSelection;
-class Widget;
-
+
class AccessibilityRenderObject : public AccessibilityNodeObject, public CanMakeWeakPtr<AccessibilityRenderObject> {
public:
static Ref<AccessibilityRenderObject> create(RenderObject*);
@@ -136,6 +135,8 @@
String selectedText() const override;
String accessKey() const override;
String actionVerb() const override;
+
+ bool isWidget() const override;
Widget* widget() const override;
Widget* widgetForAttachmentView() const override;
AccessibilityChildrenVector documentLinks() override;
Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp (284265 => 284266)
--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp 2021-10-15 19:43:44 UTC (rev 284265)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp 2021-10-15 19:59:32 UTC (rev 284266)
@@ -418,6 +418,9 @@
setObjectVectorProperty(AXPropertyName::DocumentLinks, object.documentLinks());
}
+ if (object.isWidget())
+ setProperty(AXPropertyName::IsWidget, true);
+
initializePlatformProperties(object, isRoot);
}
@@ -2032,9 +2035,8 @@
Widget* AXIsolatedObject::widget() const
{
- if (auto* object = associatedAXObject())
- return object->widget();
- return nullptr;
+ auto* object = associatedAXObject();
+ return object ? object->widget() : nullptr;
}
PlatformWidget AXIsolatedObject::platformWidget() const
Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h (284265 => 284266)
--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h 2021-10-15 19:43:44 UTC (rev 284265)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h 2021-10-15 19:59:32 UTC (rev 284266)
@@ -584,15 +584,17 @@
Path elementPath() const override { return pathAttributeValue(AXPropertyName::Path); };
bool supportsPath() const override { return boolAttributeValue(AXPropertyName::SupportsPath); }
TextIteratorBehaviors textIteratorBehaviorForTextRange() const override;
+
+ bool isWidget() const override { return boolAttributeValue(AXPropertyName::IsWidget); }
Widget* widget() const override;
PlatformWidget platformWidget() const override;
-
+ Widget* widgetForAttachmentView() const override;
+
HashMap<String, AXEditingStyleValueVariant> resolvedEditingStyles() const override;
#if PLATFORM(COCOA)
RemoteAXObjectRef remoteParentObject() const override;
FloatRect convertRectToPlatformSpace(const FloatRect&, AccessibilityConversionSpace) const override;
#endif
- Widget* widgetForAttachmentView() const override;
Page* page() const override;
Document* document() const override;
FrameView* documentFrameView() const override;
Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h (284265 => 284266)
--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h 2021-10-15 19:43:44 UTC (rev 284265)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h 2021-10-15 19:59:32 UTC (rev 284266)
@@ -228,6 +228,7 @@
IsValueAutofillAvailable,
IsVisible,
IsVisited,
+ IsWidget,
KeyShortcutsValue,
Language,
LayoutCount,
Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm (284265 => 284266)
--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm 2021-10-15 19:43:44 UTC (rev 284265)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm 2021-10-15 19:59:32 UTC (rev 284266)
@@ -1660,16 +1660,24 @@
return objectAttributes;
}
-- (NSArray*)renderWidgetChildren
+- (NSArray *)renderWidgetChildren
{
auto* backingObject = self.axBackingObject;
- if (!backingObject)
+ if (!backingObject || !backingObject->isWidget())
return nil;
- auto* widget = backingObject->widget();
- if (widget && widget->accessibilityObject())
- return @[widget->accessibilityObject()];
+ id child = Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = retainPtr(self)] () -> RetainPtr<id> {
+ auto* backingObject = protectedSelf.get().axBackingObject;
+ if (!backingObject)
+ return nil;
+ auto* widget = backingObject->widget();
+ return widget ? widget->accessibilityObject() : nil;
+ });
+
+ if (child)
+ return @[child];
+
ALLOW_DEPRECATED_DECLARATIONS_BEGIN
return [backingObject->platformWidget() accessibilityAttributeValue:NSAccessibilityChildrenAttribute];
ALLOW_DEPRECATED_DECLARATIONS_END
@@ -2168,10 +2176,9 @@
return parent->wrapper();
}
- if ([attributeName isEqualToString: NSAccessibilityChildrenAttribute] || [attributeName isEqualToString: NSAccessibilityChildrenInNavigationOrderAttribute]) {
+ if ([attributeName isEqualToString:NSAccessibilityChildrenAttribute] || [attributeName isEqualToString:NSAccessibilityChildrenInNavigationOrderAttribute]) {
if (!self.childrenVectorSize) {
- NSArray* children = [self renderWidgetChildren];
- if (children != nil)
+ if (NSArray *children = [self renderWidgetChildren])
return children;
}
@@ -3654,14 +3661,19 @@
});
}
-static BOOL isMatchingPlugin(AXCoreObject* axObject, const AccessibilitySearchCriteria& criteria)
+static bool isMatchingPlugin(AXCoreObject* axObject, const AccessibilitySearchCriteria& criteria)
{
- auto* widget = axObject->widget();
- if (!is<PluginViewBase>(widget))
+ if (!axObject->isWidget())
return false;
- return criteria.searchKeys.contains(AccessibilitySearchKey::AnyType)
- && (!criteria.visibleOnly || downcast<PluginViewBase>(widget)->isVisible());
+ return Accessibility::retrieveValueFromMainThread<bool>([&axObject, &criteria] () -> bool {
+ auto* widget = axObject->widget();
+ if (!is<PluginViewBase>(widget))
+ return false;
+
+ return criteria.searchKeys.contains(AccessibilitySearchKey::AnyType)
+ && (!criteria.visibleOnly || downcast<PluginViewBase>(widget)->isVisible());
+ });
}
ALLOW_DEPRECATED_IMPLEMENTATIONS_BEGIN