Title: [270393] trunk/Source/WebCore
Revision
270393
Author
[email protected]
Date
2020-12-03 06:08:10 -0800 (Thu, 03 Dec 2020)

Log Message

Fix for crash handling NSAccessibilityInsertionPointLineNumberAttribute for text fields in isolated tree mode.
https://bugs.webkit.org/show_bug.cgi?id=219477

Reviewed by Chris Fleizach.

Tests:
accessibility/content-editable-as-textarea.html
accessibility/mac/content-editable-range-properties.html

- Implemented AXIsolatedObject::selectionStart/End, selectedText, visiblePositionForIndex.
- Handler of the NSAccessibilityInsertionPointLineNumberAttribute
request now dispatches to the main thread the calls that involve
VisiblePositions.
- This change fixes the above mentioned layout tests in isolated tree mode.

* accessibility/AccessibilityObjectInterface.h:
* accessibility/isolatedtree/AXIsolatedObject.cpp:
(WebCore::AXIsolatedObject::selectionStart const):
(WebCore::AXIsolatedObject::selectionEnd const):
(WebCore::AXIsolatedObject::selectedText const):
(WebCore::AXIsolatedObject::visiblePositionForIndex const):
* accessibility/isolatedtree/AXIsolatedObject.h:
* accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (270392 => 270393)


--- trunk/Source/WebCore/ChangeLog	2020-12-03 11:09:49 UTC (rev 270392)
+++ trunk/Source/WebCore/ChangeLog	2020-12-03 14:08:10 UTC (rev 270393)
@@ -1,3 +1,30 @@
+2020-12-03  Andres Gonzalez  <[email protected]>
+
+        Fix for crash handling NSAccessibilityInsertionPointLineNumberAttribute for text fields in isolated tree mode.
+        https://bugs.webkit.org/show_bug.cgi?id=219477
+
+        Reviewed by Chris Fleizach.
+
+        Tests:
+        accessibility/content-editable-as-textarea.html
+        accessibility/mac/content-editable-range-properties.html
+
+        - Implemented AXIsolatedObject::selectionStart/End, selectedText, visiblePositionForIndex.
+        - Handler of the NSAccessibilityInsertionPointLineNumberAttribute
+        request now dispatches to the main thread the calls that involve
+        VisiblePositions.
+        - This change fixes the above mentioned layout tests in isolated tree mode.
+
+        * accessibility/AccessibilityObjectInterface.h:
+        * accessibility/isolatedtree/AXIsolatedObject.cpp:
+        (WebCore::AXIsolatedObject::selectionStart const):
+        (WebCore::AXIsolatedObject::selectionEnd const):
+        (WebCore::AXIsolatedObject::selectedText const):
+        (WebCore::AXIsolatedObject::visiblePositionForIndex const):
+        * accessibility/isolatedtree/AXIsolatedObject.h:
+        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+        (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
+
 2020-12-03  Tim Horton  <[email protected]>
 
         GPU Process: Sandbox violations under IOSurface::maximumSize in the Web Content process

Modified: trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h (270392 => 270393)


--- trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h	2020-12-03 11:09:49 UTC (rev 270392)
+++ trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h	2020-12-03 14:08:10 UTC (rev 270393)
@@ -1169,6 +1169,7 @@
 
     virtual TextIteratorBehavior textIteratorBehaviorForTextRange() const = 0;
     virtual PlainTextRange selectedTextRange() const = 0;
+    // FIXME: why do we need the following two methods if we already have selectedTextRange?
     virtual unsigned selectionStart() const = 0;
     virtual unsigned selectionEnd() const = 0;
 

Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp (270392 => 270393)


--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp	2020-12-03 11:09:49 UTC (rev 270392)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp	2020-12-03 14:08:10 UTC (rev 270393)
@@ -1282,6 +1282,33 @@
     return axObject ? axObject->elementRange() : WTF::nullopt;
 }
 
+unsigned AXIsolatedObject::selectionStart() const
+{
+    return Accessibility::retrieveValueFromMainThread<unsigned>([this] () -> unsigned {
+        if (auto* object = associatedAXObject())
+            return object->selectionStart();
+        return 0;
+    });
+}
+
+unsigned AXIsolatedObject::selectionEnd() const
+{
+    return Accessibility::retrieveValueFromMainThread<unsigned>([this] () -> unsigned {
+        if (auto* object = associatedAXObject())
+            return object->selectionEnd();
+        return 0;
+    });
+}
+
+String AXIsolatedObject::selectedText() const
+{
+    return Accessibility::retrieveValueFromMainThread<String>([this] () -> String {
+        if (auto* object = associatedAXObject())
+            return object->selectedText().isolatedCopy();
+        return { };
+    });
+}
+
 VisiblePositionRange AXIsolatedObject::visiblePositionRange() const
 {
     ASSERT(isMainThread());
@@ -1366,6 +1393,13 @@
     return axObject ? axObject->lineRangeForPosition(position) : VisiblePositionRange();
 }
 
+VisiblePosition AXIsolatedObject::visiblePositionForIndex(unsigned index, bool lastIndexOK) const
+{
+    ASSERT(isMainThread());
+    auto* axObject = associatedAXObject();
+    return axObject ? axObject->visiblePositionForIndex(index, lastIndexOK) : VisiblePosition();
+}
+
 int AXIsolatedObject::lineForPosition(const VisiblePosition& position) const
 {
     ASSERT(isMainThread());

Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h (270392 => 270393)


--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h	2020-12-03 11:09:49 UTC (rev 270392)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h	2020-12-03 14:08:10 UTC (rev 270393)
@@ -382,9 +382,9 @@
     void setSelectedVisiblePositionRange(const VisiblePositionRange&) const override;
 
     // TODO: Text ranges and selection.
-    unsigned selectionStart() const override { return 0; }
-    unsigned selectionEnd() const override { return 0; }
-    String selectedText() const override { return String(); }
+    unsigned selectionStart() const override;
+    unsigned selectionEnd() const override;
+    String selectedText() const override;
     VisiblePositionRange visiblePositionRange() const override;
     VisiblePositionRange visiblePositionRangeForLine(unsigned) const override;
     Optional<SimpleRange> elementRange() const override;
@@ -415,7 +415,7 @@
     VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const override { return VisiblePosition(); }
     VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const override { return VisiblePosition(); }
     VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const override { return VisiblePosition(); }
-    VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const override { return VisiblePosition(); }
+    VisiblePosition visiblePositionForIndex(unsigned, bool lastIndexOK) const override;
     VisiblePosition visiblePositionForIndex(int) const override { return VisiblePosition(); }
     int indexForVisiblePosition(const VisiblePosition&) const override { return 0; }
     AXCoreObject* accessibilityObjectForPosition(const VisiblePosition&) const override { return nullptr; }

Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm (270392 => 270393)


--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm	2020-12-03 11:09:49 UTC (rev 270392)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm	2020-12-03 14:08:10 UTC (rev 270393)
@@ -2407,16 +2407,20 @@
             if (backingObject->isPasswordField() || backingObject->selectionEnd() > 0)
                 return nil;
 
-            auto *focusedObject = backingObject->focusedUIElement();
+            auto* focusedObject = backingObject->focusedUIElement();
             if (focusedObject != backingObject)
                 return nil;
 
-            VisiblePosition focusedPosition = focusedObject->visiblePositionForIndex(focusedObject->selectionStart(), true);
-            int lineNumber = backingObject->lineForPosition(focusedPosition);
-            if (lineNumber < 0)
-                return nil;
+            int lineNumber = Accessibility::retrieveValueFromMainThread<int>([protectedSelf = retainPtr(self)] () -> int {
+                auto* backingObject = protectedSelf.get().axBackingObject;
+                if (!backingObject)
+                    return -1;
 
-            return @(lineNumber);
+                auto focusedPosition = backingObject->visiblePositionForIndex(backingObject->selectionStart(), true);
+                return backingObject->lineForPosition(focusedPosition);
+            });
+
+            return lineNumber >= 0 ? @(lineNumber) : nil;
         }
     }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to