Title: [265259] trunk
Revision
265259
Author
cfleiz...@apple.com
Date
2020-08-04 13:55:49 -0700 (Tue, 04 Aug 2020)

Log Message

AX: VoiceOver needs access to font styling at insertion point
https://bugs.webkit.org/show_bug.cgi?id=215129
Source/WebCore:

<rdar://problem/65114972>

Reviewed by Darin Adler.

Give access to relevant font styling properties at the insertion point so that VoiceOver can speak them
when text commands alter styling.

Test: accessibility/mac/resolved-text-editing.html

* accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::resolvedEditingStyles const):
* accessibility/AccessibilityObject.h:
* accessibility/AccessibilityObjectInterface.h:
* accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
(-[WebAccessibilityObjectWrapper _accessibilityResolvedEditingStyles]):
* accessibility/isolatedtree/AXIsolatedObject.cpp:
(WebCore::AXIsolatedObject::resolvedEditingStyles const):
* accessibility/isolatedtree/AXIsolatedObject.h:
* accessibility/mac/WebAccessibilityObjectWrapperBase.h:
* accessibility/mac/WebAccessibilityObjectWrapperBase.mm:
(-[WebAccessibilityObjectWrapperBase baseAccessibilityResolvedEditingStyles]):
* accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper ALLOW_DEPRECATED_IMPLEMENTATIONS_END]):
(-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):

Tools:

Reviewed by Darin Adler.

* WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:
(WTR::AccessibilityUIElement::attributeValueAsync):

LayoutTests:

Reviewed by Darin Adler.

* accessibility/mac/resolved-text-editing-expected.txt: Added.
* accessibility/mac/resolved-text-editing.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (265258 => 265259)


--- trunk/LayoutTests/ChangeLog	2020-08-04 20:50:13 UTC (rev 265258)
+++ trunk/LayoutTests/ChangeLog	2020-08-04 20:55:49 UTC (rev 265259)
@@ -1,3 +1,13 @@
+2020-08-04  Chris Fleizach  <cfleiz...@apple.com>
+
+        AX: VoiceOver needs access to font styling at insertion point
+        https://bugs.webkit.org/show_bug.cgi?id=215129
+
+        Reviewed by Darin Adler.
+
+        * accessibility/mac/resolved-text-editing-expected.txt: Added.
+        * accessibility/mac/resolved-text-editing.html: Added.
+
 2020-08-04  Kate Cheney  <katherine_che...@apple.com>
 
         Add test coverage for handling redirects with App-Bound Domains

Added: trunk/LayoutTests/accessibility/mac/resolved-text-editing-expected.txt (0 => 265259)


--- trunk/LayoutTests/accessibility/mac/resolved-text-editing-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/accessibility/mac/resolved-text-editing-expected.txt	2020-08-04 20:55:49 UTC (rev 265259)
@@ -0,0 +1,16 @@
+a
+This tests that we can retrieve resolved editing styles from the editable text area.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+{
+    bold = 0;
+    fontsize = 6;
+    italic = 1;
+    underline = 0;
+}
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/accessibility/mac/resolved-text-editing.html (0 => 265259)


--- trunk/LayoutTests/accessibility/mac/resolved-text-editing.html	                        (rev 0)
+++ trunk/LayoutTests/accessibility/mac/resolved-text-editing.html	2020-08-04 20:55:49 UTC (rev 265259)
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body id="body">
+
+<div contenteditable id=div></div>
+
+<p id="description"></p>
+<div id="console"></div>
+
+<script>
+
+    description("This tests that we can retrieve resolved editing styles from the editable text area.");
+
+    if (window.accessibilityController) {
+        window.jsTestIsAsync = true;
+        var div = document.getElementById("div");
+        div.focus();
+
+        textInputController.insertText("a");
+        document.execCommand("italic", false)
+        document.execCommand("FontSize", false, 6)
+
+        var axDiv = accessibilityController.accessibleElementById("div");
+        axDiv.attributeValueAsync("AXResolvedEditingStyles", function(value) {
+            debug(value);
+            finishJSTest();
+        });
+    }
+
+</script>
+
+<script src=""
+</body>
+</html>

Modified: trunk/LayoutTests/platform/mac-wk1/TestExpectations (265258 => 265259)


--- trunk/LayoutTests/platform/mac-wk1/TestExpectations	2020-08-04 20:50:13 UTC (rev 265258)
+++ trunk/LayoutTests/platform/mac-wk1/TestExpectations	2020-08-04 20:55:49 UTC (rev 265259)
@@ -678,6 +678,7 @@
 webkit.org/b/184742 accessibility/mac/async-increment-decrement-action.html [ Skip ]
 webkit.org/b/185897 accessibility/mac/set-value-editable-types.html [ Skip ]
 webkit.org/b/193414 accessibility/mac/relative-frame.html [ Skip ]
+webkit.org/b/215129 accessibility/mac/resolved-text-editing.html [ Skip ]
 
 webkit.org/b/182752 accessibility/mac/accessibility-make-first-responder.html [ Skip ]
 

Modified: trunk/Source/WebCore/ChangeLog (265258 => 265259)


--- trunk/Source/WebCore/ChangeLog	2020-08-04 20:50:13 UTC (rev 265258)
+++ trunk/Source/WebCore/ChangeLog	2020-08-04 20:55:49 UTC (rev 265259)
@@ -1,3 +1,32 @@
+2020-08-04  Chris Fleizach  <cfleiz...@apple.com>
+
+        AX: VoiceOver needs access to font styling at insertion point
+        https://bugs.webkit.org/show_bug.cgi?id=215129
+        <rdar://problem/65114972>
+
+        Reviewed by Darin Adler.
+
+        Give access to relevant font styling properties at the insertion point so that VoiceOver can speak them
+        when text commands alter styling.
+
+        Test: accessibility/mac/resolved-text-editing.html
+
+        * accessibility/AccessibilityObject.cpp:
+        (WebCore::AccessibilityObject::resolvedEditingStyles const):
+        * accessibility/AccessibilityObject.h:
+        * accessibility/AccessibilityObjectInterface.h:
+        * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
+        (-[WebAccessibilityObjectWrapper _accessibilityResolvedEditingStyles]):
+        * accessibility/isolatedtree/AXIsolatedObject.cpp:
+        (WebCore::AXIsolatedObject::resolvedEditingStyles const):
+        * accessibility/isolatedtree/AXIsolatedObject.h:
+        * accessibility/mac/WebAccessibilityObjectWrapperBase.h:
+        * accessibility/mac/WebAccessibilityObjectWrapperBase.mm:
+        (-[WebAccessibilityObjectWrapperBase baseAccessibilityResolvedEditingStyles]):
+        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+        (-[WebAccessibilityObjectWrapper ALLOW_DEPRECATED_IMPLEMENTATIONS_END]):
+        (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
+
 2020-08-04  Peng Liu  <peng.l...@apple.com>
 
         REGRESSION (r265019): ASSERTION FAILED: !m_impl || m_impl->wasConstructedOnMainThread() == isMainThread() under WebCore::PlaybackSessionInterfaceAVKit::invalidate()

Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.cpp (265258 => 265259)


--- trunk/Source/WebCore/accessibility/AccessibilityObject.cpp	2020-08-04 20:50:13 UTC (rev 265258)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.cpp	2020-08-04 20:55:49 UTC (rev 265259)
@@ -2767,6 +2767,24 @@
     return AccessibilityButtonState::Off;
 }
 
+HashMap<String, AXEditingStyleValueVariant> AccessibilityObject::resolvedEditingStyles() const
+{
+    auto document = this->document();
+    if (!document)
+        return { };
+    
+    auto selectionStyle = EditingStyle::styleAtSelectionStart(document->selection().selection());
+    if (!selectionStyle)
+        return { };
+
+    HashMap<String, AXEditingStyleValueVariant> styles;
+    styles.add("bold", selectionStyle->hasStyle(CSSPropertyFontWeight, "bold"));
+    styles.add("italic", selectionStyle->hasStyle(CSSPropertyFontStyle, "italic"));
+    styles.add("underline", selectionStyle->hasStyle(CSSPropertyWebkitTextDecorationsInEffect, "underline"));
+    styles.add("fontsize", selectionStyle->legacyFontSize(*document));
+    return styles;
+}
+
 // This is a 1-dimensional scroll offset helper function that's applied
 // separately in the horizontal and vertical directions, because the
 // logic is the same. The goal is to compute the best scroll offset

Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.h (265258 => 265259)


--- trunk/Source/WebCore/accessibility/AccessibilityObject.h	2020-08-04 20:50:13 UTC (rev 265258)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.h	2020-08-04 20:55:49 UTC (rev 265259)
@@ -224,7 +224,8 @@
     void setIsExpanded(bool) override { }
     FloatRect relativeFrame() const override;
     FloatRect convertFrameToSpace(const FloatRect&, AccessibilityConversionSpace) const override;
-
+    HashMap<String, AXEditingStyleValueVariant> resolvedEditingStyles() const override;
+    
     // In a multi-select list, many items can be selected but only one is active at a time.
     bool isSelectedOptionActive() const override { return false; }
 

Modified: trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h (265258 => 265259)


--- trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h	2020-08-04 20:50:13 UTC (rev 265258)
+++ trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h	2020-08-04 20:55:49 UTC (rev 265259)
@@ -33,6 +33,7 @@
 #include "TextIterator.h"
 #include "VisibleSelection.h"
 #include <wtf/RefCounted.h>
+#include <wtf/Variant.h>
 
 #if PLATFORM(WIN)
 #include "AccessibilityObjectWrapperWin.h"
@@ -298,6 +299,8 @@
     VisitedLink,
 };
 
+using AXEditingStyleValueVariant = Variant<String, bool, int>;
+
 struct AccessibilitySearchCriteria {
     AXCoreObject* anchorObject { nullptr };
     AXCoreObject* startObject;
@@ -594,6 +597,8 @@
     bool isTreeItem() const { return roleValue() == AccessibilityRole::TreeItem; }
     bool isScrollbar() const { return roleValue() == AccessibilityRole::ScrollBar; }
     virtual bool isButton() const = 0;
+    
+    virtual HashMap<String, AXEditingStyleValueVariant> resolvedEditingStyles() const = 0;
 
     bool isListItem() const { return roleValue() == AccessibilityRole::ListItem; }
     bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }

Modified: trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm (265258 => 265259)


--- trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm	2020-08-04 20:50:13 UTC (rev 265258)
+++ trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm	2020-08-04 20:55:49 UTC (rev 265259)
@@ -1776,6 +1776,14 @@
     return [[self _accessibilityWebDocumentView] _accessibilityPreviousElementsWithCount:count];
 }
 
+- (NSDictionary<NSString *, id> *)_accessibilityResolvedEditingStyles
+{
+    if (![self _prepareAccessibilityCall])
+        return nil;
+    
+    return [self baseAccessibilityResolvedEditingStyles];
+}
+
 - (BOOL)accessibilityCanSetValue
 {
     if (![self _prepareAccessibilityCall])

Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp (265258 => 265259)


--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp	2020-08-04 20:50:13 UTC (rev 265258)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp	2020-08-04 20:55:49 UTC (rev 265259)
@@ -1176,6 +1176,15 @@
     return false;
 }
 
+HashMap<String, AXEditingStyleValueVariant> AXIsolatedObject::resolvedEditingStyles() const
+{
+    return Accessibility::retrieveValueFromMainThread<HashMap<String, AXEditingStyleValueVariant>>([this] () -> HashMap<String, AXEditingStyleValueVariant> {
+        if (auto* object = associatedAXObject())
+            return object->resolvedEditingStyles();
+        return { };
+    });
+}
+
 bool AXIsolatedObject::isOnScreen() const
 {
     return Accessibility::retrieveValueFromMainThread<bool>([this] () -> bool {

Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h (265258 => 265259)


--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h	2020-08-04 20:50:13 UTC (rev 265258)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h	2020-08-04 20:55:49 UTC (rev 265259)
@@ -840,6 +840,8 @@
     TextIteratorBehavior textIteratorBehaviorForTextRange() const override;
     Widget* widget() const override;
     PlatformWidget platformWidget() const override;
+    
+    HashMap<String, AXEditingStyleValueVariant> resolvedEditingStyles() const override;
 #if PLATFORM(COCOA)
     RemoteAXObjectRef remoteParentObject() const override;
 #endif

Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.h (265258 => 265259)


--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.h	2020-08-04 20:50:13 UTC (rev 265258)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.h	2020-08-04 20:55:49 UTC (rev 265259)
@@ -87,6 +87,8 @@
 - (NSArray *)accessibilityMathPostscriptPairs;
 - (NSArray *)accessibilityMathPrescriptPairs;
 
+- (NSDictionary<NSString *, id> *)baseAccessibilityResolvedEditingStyles;
+
 extern WebCore::AccessibilitySearchCriteria accessibilitySearchCriteriaForSearchPredicateParameterizedAttribute(const NSDictionary *);
 
 extern NSArray *convertToNSArray(const WebCore::AXCoreObject::AccessibilityChildrenVector&);

Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.mm (265258 => 265259)


--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.mm	2020-08-04 20:50:13 UTC (rev 265258)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.mm	2020-08-04 20:55:49 UTC (rev 265259)
@@ -560,6 +560,23 @@
     return convertMathPairsToNSArray(pairs, [self accessibilityPlatformMathSubscriptKey], [self accessibilityPlatformMathSuperscriptKey]);
 }
 
+- (NSDictionary<NSString *, id> *)baseAccessibilityResolvedEditingStyles
+{
+    NSMutableDictionary<NSString *, id> *results = [NSMutableDictionary dictionary];
+    auto editingStyles = self.axBackingObject->resolvedEditingStyles();
+    for (String& key : editingStyles.keys()) {
+        auto value = editingStyles.get(key);
+        id result = WTF::switchOn(value,
+            [] (String& typedValue) -> id { return (NSString *)typedValue; },
+            [] (bool& typedValue) -> id { return @(typedValue); },
+            [] (int& typedValue) -> id { return @(typedValue); },
+            [] (auto&) { return nil; }
+        );
+        results[(NSString *)key] = result;
+    }
+    return results;
+}
+
 // This is set by DRT when it wants to listen for notifications.
 static BOOL accessibilityShouldRepostNotifications;
 + (void)accessibilitySetShouldRepostNotifications:(BOOL)repost

Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm (265258 => 265259)


--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm	2020-08-04 20:50:13 UTC (rev 265258)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm	2020-08-04 20:55:49 UTC (rev 265259)
@@ -3011,6 +3011,9 @@
         return createNSArray(classList).autorelease();
     }
 
+    if ([attributeName isEqualToString:@"AXResolvedEditingStyles"])
+        return [self baseAccessibilityResolvedEditingStyles];
+    
     // This allows us to connect to a plugin that creates a shadow node for editing (like PDFs).
     if ([attributeName isEqualToString:@"_AXAssociatedPluginParent"])
         return [self associatedPluginParent];

Modified: trunk/Tools/ChangeLog (265258 => 265259)


--- trunk/Tools/ChangeLog	2020-08-04 20:50:13 UTC (rev 265258)
+++ trunk/Tools/ChangeLog	2020-08-04 20:55:49 UTC (rev 265259)
@@ -1,3 +1,13 @@
+2020-08-04  Chris Fleizach  <cfleiz...@apple.com>
+
+        AX: VoiceOver needs access to font styling at insertion point
+        https://bugs.webkit.org/show_bug.cgi?id=215129
+
+        Reviewed by Darin Adler.
+
+        * WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:
+        (WTR::AccessibilityUIElement::attributeValueAsync):
+
 2020-08-04  Kate Cheney  <katherine_che...@apple.com>
 
         Add test coverage for handling redirects with App-Bound Domains

Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm (265258 => 265259)


--- trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm	2020-08-04 20:50:13 UTC (rev 265258)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm	2020-08-04 20:55:49 UTC (rev 265259)
@@ -632,7 +632,9 @@
     BEGIN_AX_OBJC_EXCEPTIONS
     s_controller->executeOnAXThread([attribute = retainPtr([NSString stringWithJSStringRef:attribute]), callback = WTFMove(callback), this] () mutable {
         id value = [m_element accessibilityAttributeValue:attribute.get()];
-
+        if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSDictionary class]])
+            value = [value description];
+        
         s_controller->executeOnMainThread([value = retainPtr(value), callback = WTFMove(callback)] () {
             auto mainFrame = WKBundlePageGetMainFrame(InjectedBundle::singleton().page()->page());
             auto context = WKBundleFrameGetJavaScriptContext(mainFrame);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to