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);