Title: [258356] trunk/Source/WebCore
Revision
258356
Author
[email protected]
Date
2020-03-12 14:12:13 -0700 (Thu, 12 Mar 2020)

Log Message

Cache the ScrollView platformWidget to avoid [WebAccessibilityObjectWrapper scrollViewParent] hitting the main thread too often.
https://bugs.webkit.org/show_bug.cgi?id=209010

Reviewed by Chris Fleizach.

- [WebAccessibilityObjectWrapper scrollViewParent] is called very often
and blocks the AXThread to retrieve a value from the main thread. This
change caches the PlatformWidget for the corresponding ScrollView (an
NSView) to avoid hitting the main thread that often.
- In Addition, made the ScrollView member of AccessibilityScrollView a
WeakPtr instead of a naked pointer.
- Removed an unused lock from AXIsolatedObject and the const qualifier
from the return value of stringAttributeValue which is unnecessary.

* accessibility/AccessibilityObject.h:
* accessibility/AccessibilityObjectInterface.h:
* accessibility/AccessibilityScrollView.cpp:
(WebCore::AccessibilityScrollView::AccessibilityScrollView):
(WebCore::AccessibilityScrollView::platformWidget const):
(WebCore::AccessibilityScrollView::widgetForAttachmentView const):
(WebCore::AccessibilityScrollView::webAreaObject const):
(WebCore::AccessibilityScrollView::documentFrameView const):
(WebCore::AccessibilityScrollView::parentObject const):
(WebCore::AccessibilityScrollView::parentObjectIfExists const):
(WebCore::AccessibilityScrollView::getScrollableAreaIfScrollable const):
* accessibility/AccessibilityScrollView.h:
* accessibility/isolatedtree/AXIsolatedObject.cpp:
(WebCore::AXIsolatedObject::initializeAttributeData):
(WebCore::AXIsolatedObject::stringAttributeValue const):
(WebCore::AXIsolatedObject::platformWidget const):
* accessibility/isolatedtree/AXIsolatedObject.h:
* accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper scrollViewParent]):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (258355 => 258356)


--- trunk/Source/WebCore/ChangeLog	2020-03-12 21:06:33 UTC (rev 258355)
+++ trunk/Source/WebCore/ChangeLog	2020-03-12 21:12:13 UTC (rev 258356)
@@ -1,5 +1,41 @@
 2020-03-12  Andres Gonzalez  <[email protected]>
 
+        Cache the ScrollView platformWidget to avoid [WebAccessibilityObjectWrapper scrollViewParent] hitting the main thread too often.
+        https://bugs.webkit.org/show_bug.cgi?id=209010
+
+        Reviewed by Chris Fleizach.
+
+        - [WebAccessibilityObjectWrapper scrollViewParent] is called very often
+        and blocks the AXThread to retrieve a value from the main thread. This
+        change caches the PlatformWidget for the corresponding ScrollView (an
+        NSView) to avoid hitting the main thread that often.
+        - In Addition, made the ScrollView member of AccessibilityScrollView a
+        WeakPtr instead of a naked pointer.
+        - Removed an unused lock from AXIsolatedObject and the const qualifier
+        from the return value of stringAttributeValue which is unnecessary.
+
+        * accessibility/AccessibilityObject.h:
+        * accessibility/AccessibilityObjectInterface.h:
+        * accessibility/AccessibilityScrollView.cpp:
+        (WebCore::AccessibilityScrollView::AccessibilityScrollView):
+        (WebCore::AccessibilityScrollView::platformWidget const):
+        (WebCore::AccessibilityScrollView::widgetForAttachmentView const):
+        (WebCore::AccessibilityScrollView::webAreaObject const):
+        (WebCore::AccessibilityScrollView::documentFrameView const):
+        (WebCore::AccessibilityScrollView::parentObject const):
+        (WebCore::AccessibilityScrollView::parentObjectIfExists const):
+        (WebCore::AccessibilityScrollView::getScrollableAreaIfScrollable const):
+        * accessibility/AccessibilityScrollView.h:
+        * accessibility/isolatedtree/AXIsolatedObject.cpp:
+        (WebCore::AXIsolatedObject::initializeAttributeData):
+        (WebCore::AXIsolatedObject::stringAttributeValue const):
+        (WebCore::AXIsolatedObject::platformWidget const):
+        * accessibility/isolatedtree/AXIsolatedObject.h:
+        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+        (-[WebAccessibilityObjectWrapper scrollViewParent]):
+
+2020-03-12  Andres Gonzalez  <[email protected]>
+
         Attributes SelectionTextMarkerRange and Start/EndTextMarker need to run on the main thread.
         https://bugs.webkit.org/show_bug.cgi?id=208996
 

Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.h (258355 => 258356)


--- trunk/Source/WebCore/accessibility/AccessibilityObject.h	2020-03-12 21:06:33 UTC (rev 258355)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.h	2020-03-12 21:12:13 UTC (rev 258356)
@@ -442,6 +442,7 @@
     String accessKey() const override { return nullAtom(); }
     String actionVerb() const override;
     Widget* widget() const override { return nullptr; }
+    PlatformWidget platformWidget() const override { return nullptr; }
     Widget* widgetForAttachmentView() const override { return nullptr; }
     Page* page() const override;
     Document* document() const override;

Modified: trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h (258355 => 258356)


--- trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h	2020-03-12 21:06:33 UTC (rev 258355)
+++ trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h	2020-03-12 21:12:13 UTC (rev 258356)
@@ -868,6 +868,7 @@
     virtual String accessKey() const = 0;
     virtual String actionVerb() const = 0;
     virtual Widget* widget() const = 0;
+    virtual PlatformWidget platformWidget() const = 0;
     virtual Widget* widgetForAttachmentView() const = 0;
     virtual Page* page() const = 0;
     virtual Document* document() const = 0;

Modified: trunk/Source/WebCore/accessibility/AccessibilityScrollView.cpp (258355 => 258356)


--- trunk/Source/WebCore/accessibility/AccessibilityScrollView.cpp	2020-03-12 21:06:33 UTC (rev 258355)
+++ trunk/Source/WebCore/accessibility/AccessibilityScrollView.cpp	2020-03-12 21:12:13 UTC (rev 258356)
@@ -38,7 +38,7 @@
 namespace WebCore {
     
 AccessibilityScrollView::AccessibilityScrollView(ScrollView* view)
-    : m_scrollView(view)
+    : m_scrollView(makeWeakPtr(view))
     , m_childrenDirty(false)
 {
 }
@@ -83,9 +83,14 @@
     return m_scrollView && m_scrollView->platformWidget();
 }
 
+PlatformWidget AccessibilityScrollView::platformWidget() const
+{
+    return m_scrollView ? m_scrollView->platformWidget() : nullptr;
+}
+
 Widget* AccessibilityScrollView::widgetForAttachmentView() const
 {
-    return m_scrollView;
+    return m_scrollView.get();
 }
     
 bool AccessibilityScrollView::canSetFocusAttribute() const
@@ -186,9 +191,9 @@
 
 AccessibilityObject* AccessibilityScrollView::webAreaObject() const
 {
-    if (!is<FrameView>(m_scrollView))
+    if (!is<FrameView>(m_scrollView.get()))
         return nullptr;
-    
+
     Document* document = downcast<FrameView>(*m_scrollView).frame().document();
     if (!document || !document->hasLivingRenderTree())
         return nullptr;
@@ -228,15 +233,15 @@
 
 FrameView* AccessibilityScrollView::documentFrameView() const
 {
-    if (!is<FrameView>(m_scrollView))
+    if (!is<FrameView>(m_scrollView.get()))
         return nullptr;
-    
-    return downcast<FrameView>(m_scrollView);
+
+    return downcast<FrameView>(m_scrollView.get());
 }    
 
 AccessibilityObject* AccessibilityScrollView::parentObject() const
 {
-    if (!is<FrameView>(m_scrollView))
+    if (!is<FrameView>(m_scrollView.get()))
         return nullptr;
 
     AXObjectCache* cache = axObjectCache();
@@ -252,23 +257,23 @@
     
 AccessibilityObject* AccessibilityScrollView::parentObjectIfExists() const
 {
-    if (!is<FrameView>(m_scrollView))
+    if (!is<FrameView>(m_scrollView.get()))
         return nullptr;
-    
+
     AXObjectCache* cache = axObjectCache();
     if (!cache)
         return nullptr;
 
-    HTMLFrameOwnerElement* owner = downcast<FrameView>(m_scrollView)->frame().ownerElement();
+    HTMLFrameOwnerElement* owner = downcast<FrameView>(*m_scrollView).frame().ownerElement();
     if (owner && owner->renderer())
         return cache->get(owner);
-    
+
     return nullptr;
 }
 
 ScrollableArea* AccessibilityScrollView::getScrollableAreaIfScrollable() const
 {
-    return m_scrollView;
+    return m_scrollView.get();
 }
 
 void AccessibilityScrollView::scrollTo(const IntPoint& point) const

Modified: trunk/Source/WebCore/accessibility/AccessibilityScrollView.h (258355 => 258356)


--- trunk/Source/WebCore/accessibility/AccessibilityScrollView.h	2020-03-12 21:06:33 UTC (rev 258355)
+++ trunk/Source/WebCore/accessibility/AccessibilityScrollView.h	2020-03-12 21:12:13 UTC (rev 258356)
@@ -37,7 +37,7 @@
 public:
     static Ref<AccessibilityScrollView> create(ScrollView*);
     AccessibilityRole roleValue() const override { return AccessibilityRole::ScrollArea; }
-    ScrollView* scrollView() const override { return m_scrollView; }
+    ScrollView* scrollView() const override { return m_scrollView.get(); }
 
     virtual ~AccessibilityScrollView();
 
@@ -54,6 +54,7 @@
     bool isEnabled() const override { return true; }
     
     bool isAttachment() const override;
+    PlatformWidget platformWidget() const override;
     Widget* widgetForAttachmentView() const override;
     
     AccessibilityObject* scrollBar(AccessibilityOrientation) override;
@@ -76,7 +77,7 @@
     AccessibilityScrollbar* addChildScrollbar(Scrollbar*);
     void removeChildScrollbar(AccessibilityObject*);
     
-    ScrollView* m_scrollView;
+    WeakPtr<ScrollView> m_scrollView;
     RefPtr<AccessibilityObject> m_horizontalScrollbar;
     RefPtr<AccessibilityObject> m_verticalScrollbar;
     bool m_childrenDirty;

Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp (258355 => 258356)


--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp	2020-03-12 21:06:33 UTC (rev 258355)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp	2020-03-12 21:12:13 UTC (rev 258356)
@@ -375,7 +375,10 @@
         setMathscripts(AXPropertyName::MathPrescripts, object);
         setMathscripts(AXPropertyName::MathPostscripts, object);
     }
-    
+
+    if (object.isScrollView())
+        m_platformWidget = object.platformWidget();
+
     if (isRoot) {
         setObjectProperty(AXPropertyName::WebArea, object.webAreaObject());
         setProperty(AXPropertyName::PreventKeyboardDOMEventDispatch, object.preventKeyboardDOMEventDispatch());
@@ -828,7 +831,7 @@
     );
 }
 
-const String AXIsolatedObject::stringAttributeValue(AXPropertyName propertyName) const
+String AXIsolatedObject::stringAttributeValue(AXPropertyName propertyName) const
 {
     auto value = m_attributeMap.get(propertyName);
     return WTF::switchOn(value,
@@ -1560,6 +1563,15 @@
     return nullptr;
 }
 
+PlatformWidget AXIsolatedObject::platformWidget() const
+{
+#if PLATFORM(COCOA)
+    return m_platformWidget.get();
+#else
+    return m_platformWidget;
+#endif
+}
+
 Widget* AXIsolatedObject::widgetForAttachmentView() const
 {
     ASSERT_NOT_REACHED();

Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h (258355 => 258356)


--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h	2020-03-12 21:06:33 UTC (rev 258355)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h	2020-03-12 21:12:13 UTC (rev 258356)
@@ -344,8 +344,9 @@
     void setObjectProperty(AXPropertyName, AXCoreObject*);
     void setObjectVectorProperty(AXPropertyName, const AccessibilityChildrenVector&);
 
+    // FIXME: consolidate all AttributeValue retrieval in a single template method.
     bool boolAttributeValue(AXPropertyName) const;
-    const String stringAttributeValue(AXPropertyName) const;
+    String stringAttributeValue(AXPropertyName) const;
     int intAttributeValue(AXPropertyName) const;
     unsigned unsignedAttributeValue(AXPropertyName) const;
     double doubleAttributeValue(AXPropertyName) const;
@@ -821,6 +822,7 @@
     bool supportsPath() const override { return boolAttributeValue(AXPropertyName::SupportsPath); }
     TextIteratorBehavior textIteratorBehaviorForTextRange() const override;
     Widget* widget() const override;
+    PlatformWidget platformWidget() const override;
     Widget* widgetForAttachmentView() const override;
     Page* page() const override;
     Document* document() const override;
@@ -896,7 +898,12 @@
     Vector<RefPtr<AXCoreObject>> m_children;
 
     HashMap<AXPropertyName, AttributeValueVariant, WTF::IntHash<AXPropertyName>, WTF::StrongEnumHashTraits<AXPropertyName>> m_attributeMap;
-    Lock m_attributeMapLock;
+
+#if PLATFORM(COCOA)
+    RetainPtr<NSView> m_platformWidget;
+#else
+    PlatformWidget m_platformWidget;
+#endif
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm (258355 => 258356)


--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm	2020-03-12 21:06:33 UTC (rev 258355)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm	2020-03-12 21:12:13 UTC (rev 258356)
@@ -2269,25 +2269,19 @@
 
 - (id)scrollViewParent
 {
-    return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {
-        auto* backingObject = protectedSelf.get().axBackingObject;
-        if (!backingObject || !backingObject->isScrollView())
-            return nil;
+    auto* backingObject = self.axBackingObject;
+    if (!backingObject || !backingObject->isScrollView())
+        return nil;
 
-        // If this scroll view provides it's parent object (because it's a sub-frame), then
-        // we should not find the remoteAccessibilityParent.
-        if (backingObject->parentObject())
-            return nil;
+    // If this scroll view provides it's parent object (because it's a sub-frame), then
+    // we should not find the remoteAccessibilityParent.
+    if (backingObject->parentObject())
+        return nil;
 
-        auto* scroll = backingObject->scrollView();
-        if (!scroll)
-            return nil;
+    if (auto platformWidget = backingObject->platformWidget())
+        return NSAccessibilityUnignoredAncestor(platformWidget);
 
-        if (scroll->platformWidget())
-            return NSAccessibilityUnignoredAncestor(scroll->platformWidget());
-
-        return [protectedSelf remoteAccessibilityParentObject];
-    });
+    return [self remoteAccessibilityParentObject];
 }
 
 - (id)windowElement:(NSString*)attributeName
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to