Implement AXIsolatedTreeNode::roleDescription.
authorandresg_22@apple.com <andresg_22@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 7 Nov 2019 13:21:57 +0000 (13:21 +0000)
committerandresg_22@apple.com <andresg_22@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 7 Nov 2019 13:21:57 +0000 (13:21 +0000)
https://bugs.webkit.org/show_bug.cgi?id=203863
<rdar://problem/56934443>

Reviewed by Chris Fleizach.

No new tests needed, no new functionality.

AccessibilityObjectWrapper cannot call any of the AX.*Text functions to
retrieve localized role descriptions, because when running on the
secondary thread, those AtomStrings are not accessible. Moreover, some
of the special cases require access to DOM objects that are not
available in the secondary thread. Therefore, added
AXCoreObject::rolePlatformDescription that runs in the main thread to
initialize the corresponding attribute in AXIsolatedTreeNode.
rolePlatformString, createPlatformRoleMap, roleToPlatformString,
ariaLandmarkRoleDescription, are helper functions. The platform
functions allow to customize the behavior of roleDescription in each
platform. The platform overrides are implemented for mac. Other
platforms are pending.

* accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::rolePlatformString const):
(WebCore::AccessibilityObject::rolePlatformDescription const):
(WebCore::AccessibilityObject::ariaLandmarkRoleDescription const):
(WebCore::AccessibilityObject::roleDescription const):
(WebCore::Accessibility::createPlatformRoleMap):
(WebCore::Accessibility::roleToPlatformString):
* accessibility/AccessibilityObject.h:
* accessibility/AccessibilityObjectInterface.h:
* accessibility/isolatedtree/AXIsolatedTreeNode.cpp:
(WebCore::AXIsolatedTreeNode::initializeAttributeData):
* accessibility/isolatedtree/AXIsolatedTreeNode.h:
* accessibility/mac/AccessibilityObjectMac.mm:
(WebCore::AccessibilityObject::rolePlatformString const):
(WebCore::AccessibilityObject::rolePlatformDescription const):
(WebCore::Accessibility::createPlatformRoleMap):
* accessibility/mac/WebAccessibilityObjectWrapperBase.mm:
(-[WebAccessibilityObjectWrapperBase accessibilityObject]):
(-[WebAccessibilityObjectWrapperBase ariaLandmarkRoleDescription]): Implementation moved to AccessibilityObject.
* accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper role]): Special cases moved to rolePlatformString.
(-[WebAccessibilityObjectWrapper roleDescription]):
(createAccessibilityRoleMap): Deleted, became Accessibility::createPlatformRoleMap.
(roleValueToNSString): Deleted, became Accessibility::roleToPlatformString.
* platform/LocalizedStrings.cpp:
(WebCore::AXARIAContentGroupText):
(WebCore::AXHorizontalRuleDescriptionText):
(WebCore::AXMarkText):
* platform/LocalizedStrings.h:
* platform/cocoa/LocalizedStringsCocoa.mm:
(WebCore::AXARIAContentGroupText): Deleted, moved to LocalizedStrings.cpp.
(WebCore::AXHorizontalRuleDescriptionText): Deleted, moved to LocalizedStrings.cpp.
(WebCore::AXMarkText): Deleted, moved to LocalizedStrings.cpp.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@252181 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
Source/WebCore/ChangeLog
Source/WebCore/accessibility/AccessibilityObject.cpp
Source/WebCore/accessibility/AccessibilityObject.h
Source/WebCore/accessibility/AccessibilityObjectInterface.h
Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.cpp
Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.h
Source/WebCore/accessibility/mac/AccessibilityObjectMac.mm
Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.mm
Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm
Source/WebCore/platform/LocalizedStrings.cpp
Source/WebCore/platform/LocalizedStrings.h
Source/WebCore/platform/cocoa/LocalizedStringsCocoa.mm

index c9bbf02..8f5a4e8 100644 (file)
@@ -1,3 +1,60 @@
+2019-11-07  Andres Gonzalez  <andresg_22@apple.com>
+
+        Implement AXIsolatedTreeNode::roleDescription.
+        https://bugs.webkit.org/show_bug.cgi?id=203863
+        <rdar://problem/56934443>
+
+        Reviewed by Chris Fleizach.
+
+        No new tests needed, no new functionality.
+
+        AccessibilityObjectWrapper cannot call any of the AX.*Text functions to
+        retrieve localized role descriptions, because when running on the
+        secondary thread, those AtomStrings are not accessible. Moreover, some
+        of the special cases require access to DOM objects that are not
+        available in the secondary thread. Therefore, added
+        AXCoreObject::rolePlatformDescription that runs in the main thread to
+        initialize the corresponding attribute in AXIsolatedTreeNode.
+        rolePlatformString, createPlatformRoleMap, roleToPlatformString,
+        ariaLandmarkRoleDescription, are helper functions. The platform
+        functions allow to customize the behavior of roleDescription in each
+        platform. The platform overrides are implemented for mac. Other
+        platforms are pending.
+
+        * accessibility/AccessibilityObject.cpp:
+        (WebCore::AccessibilityObject::rolePlatformString const):
+        (WebCore::AccessibilityObject::rolePlatformDescription const):
+        (WebCore::AccessibilityObject::ariaLandmarkRoleDescription const):
+        (WebCore::AccessibilityObject::roleDescription const):
+        (WebCore::Accessibility::createPlatformRoleMap):
+        (WebCore::Accessibility::roleToPlatformString):
+        * accessibility/AccessibilityObject.h:
+        * accessibility/AccessibilityObjectInterface.h:
+        * accessibility/isolatedtree/AXIsolatedTreeNode.cpp:
+        (WebCore::AXIsolatedTreeNode::initializeAttributeData):
+        * accessibility/isolatedtree/AXIsolatedTreeNode.h:
+        * accessibility/mac/AccessibilityObjectMac.mm:
+        (WebCore::AccessibilityObject::rolePlatformString const):
+        (WebCore::AccessibilityObject::rolePlatformDescription const):
+        (WebCore::Accessibility::createPlatformRoleMap):
+        * accessibility/mac/WebAccessibilityObjectWrapperBase.mm:
+        (-[WebAccessibilityObjectWrapperBase accessibilityObject]):
+        (-[WebAccessibilityObjectWrapperBase ariaLandmarkRoleDescription]): Implementation moved to AccessibilityObject.
+        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+        (-[WebAccessibilityObjectWrapper role]): Special cases moved to rolePlatformString.
+        (-[WebAccessibilityObjectWrapper roleDescription]):
+        (createAccessibilityRoleMap): Deleted, became Accessibility::createPlatformRoleMap.
+        (roleValueToNSString): Deleted, became Accessibility::roleToPlatformString.
+        * platform/LocalizedStrings.cpp:
+        (WebCore::AXARIAContentGroupText):
+        (WebCore::AXHorizontalRuleDescriptionText):
+        (WebCore::AXMarkText):
+        * platform/LocalizedStrings.h:
+        * platform/cocoa/LocalizedStringsCocoa.mm:
+        (WebCore::AXARIAContentGroupText): Deleted, moved to LocalizedStrings.cpp.
+        (WebCore::AXHorizontalRuleDescriptionText): Deleted, moved to LocalizedStrings.cpp.
+        (WebCore::AXMarkText): Deleted, moved to LocalizedStrings.cpp.
+
 2019-11-07  Chris Lord  <clord@igalia.com>
 
         Indentation in ThreadGlobalData.h is incorrect
index 1ca81e4..461e4bf 100644 (file)
@@ -2601,6 +2601,71 @@ bool AccessibilityObject::hasHighlighting() const
     return false;
 }
 
+#if !PLATFORM(MAC)
+String AccessibilityObject::rolePlatformString() const
+{
+    // FIXME: implement in other platforms.
+    return String();
+}
+
+String AccessibilityObject::rolePlatformDescription() const
+{
+    // FIXME: implement in other platforms.
+    return String();
+}
+#endif
+
+String AccessibilityObject::ariaLandmarkRoleDescription() const
+{
+    switch (roleValue()) {
+    case AccessibilityRole::LandmarkBanner:
+        return AXARIAContentGroupText("ARIALandmarkBanner");
+    case AccessibilityRole::LandmarkComplementary:
+        return AXARIAContentGroupText("ARIALandmarkComplementary");
+    case AccessibilityRole::LandmarkContentInfo:
+        return AXARIAContentGroupText("ARIALandmarkContentInfo");
+    case AccessibilityRole::LandmarkMain:
+        return AXARIAContentGroupText("ARIALandmarkMain");
+    case AccessibilityRole::LandmarkNavigation:
+        return AXARIAContentGroupText("ARIALandmarkNavigation");
+    case AccessibilityRole::LandmarkDocRegion:
+    case AccessibilityRole::LandmarkRegion:
+        return AXARIAContentGroupText("ARIALandmarkRegion");
+    case AccessibilityRole::LandmarkSearch:
+        return AXARIAContentGroupText("ARIALandmarkSearch");
+    case AccessibilityRole::ApplicationAlert:
+        return AXARIAContentGroupText("ARIAApplicationAlert");
+    case AccessibilityRole::ApplicationAlertDialog:
+        return AXARIAContentGroupText("ARIAApplicationAlertDialog");
+    case AccessibilityRole::ApplicationDialog:
+        return AXARIAContentGroupText("ARIAApplicationDialog");
+    case AccessibilityRole::ApplicationLog:
+        return AXARIAContentGroupText("ARIAApplicationLog");
+    case AccessibilityRole::ApplicationMarquee:
+        return AXARIAContentGroupText("ARIAApplicationMarquee");
+    case AccessibilityRole::ApplicationStatus:
+        return AXARIAContentGroupText("ARIAApplicationStatus");
+    case AccessibilityRole::ApplicationTimer:
+        return AXARIAContentGroupText("ARIAApplicationTimer");
+    case AccessibilityRole::Document:
+        return AXARIAContentGroupText("ARIADocument");
+    case AccessibilityRole::DocumentArticle:
+        return AXARIAContentGroupText("ARIADocumentArticle");
+    case AccessibilityRole::DocumentMath:
+        return AXARIAContentGroupText("ARIADocumentMath");
+    case AccessibilityRole::DocumentNote:
+        return AXARIAContentGroupText("ARIADocumentNote");
+    case AccessibilityRole::UserInterfaceTooltip:
+        return AXARIAContentGroupText("ARIAUserInterfaceTooltip");
+    case AccessibilityRole::TabPanel:
+        return AXARIAContentGroupText("ARIATabPanel");
+    case AccessibilityRole::WebApplication:
+        return AXARIAContentGroupText("ARIAWebApplication");
+    default:
+        return String();
+    }
+}
+
 String AccessibilityObject::roleDescription() const
 {
     // aria-roledescription takes precedence over any other rule.
@@ -2608,6 +2673,10 @@ String AccessibilityObject::roleDescription() const
     if (!roleDescription.isEmpty())
         return roleDescription;
 
+    roleDescription = rolePlatformDescription();
+    if (!roleDescription.isEmpty())
+        return roleDescription;
+
     if (roleValue() == AccessibilityRole::Figure)
         return AXFigureText();
 
@@ -3766,4 +3835,19 @@ void AccessibilityObject::setIsIgnoredFromParentDataForChild(AXCoreObject* child
     child->setIsIgnoredFromParentData(result);
 }
 
+namespace Accessibility {
+
+#if !PLATFORM(MAC)
+// FIXME: implement in other platforms.
+PlatformRoleMap createPlatformRoleMap() { return PlatformRoleMap(); }
+#endif
+
+String roleToPlatformString(AccessibilityRole role)
+{
+    static NeverDestroyed<PlatformRoleMap> roleMap = createPlatformRoleMap();
+    return roleMap->get(static_cast<unsigned>(role));
+}
+
+} // namespace Accessibility
+
 } // namespace WebCore
index c96f508..9fa92f8 100644 (file)
@@ -326,7 +326,6 @@ public:
     const AtomString& identifierAttribute() const override;
     const AtomString& linkRelValue() const override;
     void classList(Vector<String>&) const override;
-    String roleDescription() const override;
     AccessibilityCurrentState currentState() const override;
     String currentValue() const override;
     bool supportsCurrent() const override;
@@ -428,6 +427,9 @@ public:
     void colorValue(int& r, int& g, int& b) const override { r = 0; g = 0; b = 0; }
 
     AccessibilityRole roleValue() const override { return m_role; }
+    String rolePlatformString() const override;
+    String roleDescription() const override;
+    String ariaLandmarkRoleDescription() const override;
 
     AXObjectCache* axObjectCache() const override;
     AXID objectID() const override { return m_id; }
@@ -794,6 +796,7 @@ protected:
     static bool isAccessibilityTextSearchMatch(AXCoreObject*, AccessibilitySearchCriteria*);
     static bool objectMatchesSearchCriteriaWithResultLimit(AXCoreObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
     virtual AccessibilityRole buttonRoleType() const;
+    String rolePlatformDescription() const;
     bool isOnScreen() const override;
     bool dispatchTouchEvent();
 
@@ -828,6 +831,15 @@ inline void AccessibilityObject::updateBackingStore() override { }
 
 AccessibilityObject* firstAccessibleObjectFromNode(const Node*, const WTF::Function<bool(const AccessibilityObject&)>& isAccessible);
 
+namespace Accessibility {
+
+using PlatformRoleMap = HashMap<AccessibilityRole, String, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned>>;
+
+PlatformRoleMap createPlatformRoleMap();
+String roleToPlatformString(AccessibilityRole);
+
+} // namespace Accessibility
+
 } // namespace WebCore
 
 #define SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(ToValueTypeName, predicate) \
index 06d012a..40bcf09 100644 (file)
@@ -669,7 +669,6 @@ public:
     virtual const AtomString& identifierAttribute() const = 0;
     virtual const AtomString& linkRelValue() const = 0;
     virtual void classList(Vector<String>&) const = 0;
-    virtual String roleDescription() const = 0;
     virtual AccessibilityCurrentState currentState() const = 0;
     virtual String currentValue() const = 0;
     virtual bool supportsCurrent() const = 0;
@@ -764,6 +763,12 @@ public:
     virtual void colorValue(int& r, int& g, int& b) const = 0;
 
     virtual AccessibilityRole roleValue() const = 0;
+    // Non-localized string associated with the object role.
+    virtual String rolePlatformString() const = 0;
+    // Localized string that describes the object's role.
+    virtual String roleDescription() const = 0;
+    // Localized string that describes ARIA landmark roles.
+    virtual String ariaLandmarkRoleDescription() const = 0;
 
     virtual AXObjectCache* axObjectCache() const = 0;
 
index cae8783..37cfae2 100644 (file)
@@ -54,6 +54,9 @@ AXIsolatedTreeNode::~AXIsolatedTreeNode() = default;
 void AXIsolatedTreeNode::initializeAttributeData(const AXCoreObject& object)
 {
     setProperty(AXPropertyName::RoleValue, static_cast<int>(object.roleValue()));
+    setProperty(AXPropertyName::RolePlatformString, object.rolePlatformString().isolatedCopy());
+    setProperty(AXPropertyName::ARIALandmarkRoleDescription, object.ariaLandmarkRoleDescription().isolatedCopy());
+    setProperty(AXPropertyName::RoleDescription, object.roleDescription().isolatedCopy());
     setProperty(AXPropertyName::IsAttachment, object.isAttachment());
     setProperty(AXPropertyName::IsMediaControlLabel, object.isMediaControlLabel());
     setProperty(AXPropertyName::IsLink, object.isLink());
index 2ce008f..9a4a2ba 100644 (file)
@@ -54,9 +54,14 @@ public:
     AXID objectID() const override { return m_id; }
     void init() override { }
 
+    AccessibilityObjectWrapper* wrapper() const override { return m_wrapper.get(); }
     void detach(AccessibilityDetachmentType, AXObjectCache* = nullptr) override { }
     bool isDetached() const override { return false; }
 
+    void setTreeIdentifier(AXIsolatedTreeID);
+    void setParent(AXID);
+    void appendChild(AXID);
+
 private:
     bool isAccessibilityObject() const override { return false; }
     bool isAccessibilityNodeObject() const override { return false; }
@@ -259,7 +264,6 @@ private:
     const AtomString& identifierAttribute() const override { return nullAtom(); }
     const AtomString& linkRelValue() const override { return nullAtom(); }
     void classList(Vector<String>&) const override { }
-    String roleDescription() const override { return String(); }
     AccessibilityCurrentState currentState() const override { return AccessibilityCurrentState::False; }
     String currentValue() const override { return String(); }
     bool supportsCurrent() const override { return false; }
@@ -343,6 +347,9 @@ private:
     void colorValue(int&, int&, int&) const override { }
 
     AccessibilityRole roleValue() const override { return static_cast<AccessibilityRole>(intAttributeValue(AXPropertyName::RoleValue)); }
+    String rolePlatformString() const override { return stringAttributeValue(AXPropertyName::RolePlatformString); }
+    String roleDescription() const override { return stringAttributeValue(AXPropertyName::RoleDescription); }
+    String ariaLandmarkRoleDescription() const override { return stringAttributeValue(AXPropertyName::ARIALandmarkRoleDescription); }
 
     AXObjectCache* axObjectCache() const override { return nullptr; }
 
@@ -590,7 +597,6 @@ private:
     bool isDOMHidden() const override { return false; }
     bool isHidden() const override { return false; }
 
-    AccessibilityObjectWrapper* wrapper() const override { return m_wrapper.get(); }
     void setWrapper(AccessibilityObjectWrapper* wrapper) override { m_wrapper = wrapper; }
 
     void overrideAttachmentParent(AXCoreObject*) override { }
@@ -631,11 +637,6 @@ private:
     void clearIsIgnoredFromParentData() override { }
     void setIsIgnoredFromParentDataForChild(AXCoreObject*) override { }
 
-    void setTreeIdentifier(AXIsolatedTreeID);
-    AXIsolatedTree* tree() const;
-    void setParent(AXID);
-    void appendChild(AXID);
-
     enum class AXPropertyName : uint8_t {
         None = 0,
         HelpText,
@@ -652,6 +653,9 @@ private:
         Description,
         RelativeFrame,
         RoleValue,
+        RolePlatformString,
+        RoleDescription,
+        ARIALandmarkRoleDescription,
         SpeechHint,
         Title,
     };
@@ -659,6 +663,7 @@ private:
     AXID parent() const { return m_parent; }
 
     AXIsolatedTreeID treeIdentifier() const { return m_treeIdentifier; }
+    AXIsolatedTree* tree() const;
 
     AXIsolatedTreeNode() = default;
     AXIsolatedTreeNode(const AXCoreObject&);
index 2cdbc73..b98f609 100644 (file)
 
 #import "config.h"
 #import "AccessibilityObject.h"
+#import "AccessibilityLabel.h"
+#import "AccessibilityList.h"
 #import "ElementAncestorIterator.h"
 #import "HTMLFieldSetElement.h"
+#import "HTMLInputElement.h"
+#import "LocalizedStrings.h"
 #import "RenderObject.h"
 #import "Settings.h"
 
@@ -128,6 +132,290 @@ void AccessibilityObject::setCaretBrowsingEnabled(bool on)
     frame->settings().setCaretBrowsingEnabled(on);
 }
 
+String AccessibilityObject::rolePlatformString() const
+{
+    AccessibilityRole role = roleValue();
+
+    // If it is a label with just static text or an anonymous math operator, remap role to StaticText.
+    // The mfenced element creates anonymous RenderMathMLOperators with no RenderText
+    // descendants. These anonymous renderers are the only accessible objects
+    // containing the operator.
+    if ((role == AccessibilityRole::Label && is<AccessibilityLabel>(*this) && downcast<AccessibilityLabel>(*this).containsOnlyStaticText())
+        || isAnonymousMathOperator())
+        role = AccessibilityRole::StaticText;
+    else if (role == AccessibilityRole::Canvas && canvasHasFallbackContent())
+        role = AccessibilityRole::Group;
+
+    return Accessibility::roleToPlatformString(role);
+}
+
+String AccessibilityObject::rolePlatformDescription() const
+{
+    AccessibilityRole role = roleValue();
+    NSString *axRole = rolePlatformString();
+
+    if ([axRole isEqualToString:NSAccessibilityGroupRole]) {
+        if (isOutput())
+            return AXOutputText();
+
+        String ariaLandmarkRoleDescription = this->ariaLandmarkRoleDescription();
+        if (!ariaLandmarkRoleDescription.isEmpty())
+            return ariaLandmarkRoleDescription;
+
+        switch (role) {
+        case AccessibilityRole::Audio:
+            return localizedMediaControlElementString("AudioElement");
+        case AccessibilityRole::Definition:
+            return AXDefinitionText();
+        case AccessibilityRole::DescriptionListTerm:
+        case AccessibilityRole::Term:
+            return AXDescriptionListTermText();
+        case AccessibilityRole::DescriptionListDetail:
+            return AXDescriptionListDetailText();
+        case AccessibilityRole::Details:
+            return AXDetailsText();
+        case AccessibilityRole::Feed:
+            return AXFeedText();
+        case AccessibilityRole::Footer:
+            return AXFooterRoleDescriptionText();
+        case AccessibilityRole::Mark:
+            return AXMarkText();
+        case AccessibilityRole::Video:
+            return localizedMediaControlElementString("VideoElement");
+        case AccessibilityRole::GraphicsDocument:
+            return AXARIAContentGroupText(@"ARIADocument");
+        default:
+            return String();
+        }
+    }
+
+    if ([axRole isEqualToString:@"AXWebArea"])
+        return AXWebAreaText();
+
+    if ([axRole isEqualToString:@"AXLink"])
+        return AXLinkText();
+
+    if ([axRole isEqualToString:@"AXListMarker"])
+        return AXListMarkerText();
+
+    if ([axRole isEqualToString:@"AXImageMap"])
+        return AXImageMapText();
+
+    if ([axRole isEqualToString:@"AXHeading"])
+        return AXHeadingText();
+
+    if ([axRole isEqualToString:NSAccessibilityTextFieldRole]) {
+        auto* node = this->node();
+        if (is<HTMLInputElement>(node)) {
+            auto& input = downcast<HTMLInputElement>(*node);
+            if (input.isEmailField())
+                return AXEmailFieldText();
+            if (input.isTelephoneField())
+                return AXTelephoneFieldText();
+            if (input.isURLField())
+                return AXURLFieldText();
+            if (input.isNumberField())
+                return AXNumberFieldText();
+
+            // These input types are not enabled on mac yet, we check the type attribute for now.
+            auto& type = input.attributeWithoutSynchronization(HTMLNames::typeAttr);
+            if (equalLettersIgnoringASCIICase(type, "date"))
+                return AXDateFieldText();
+            if (equalLettersIgnoringASCIICase(type, "time"))
+                return AXTimeFieldText();
+            if (equalLettersIgnoringASCIICase(type, "week"))
+                return AXWeekFieldText();
+            if (equalLettersIgnoringASCIICase(type, "month"))
+                return AXMonthFieldText();
+            if (equalLettersIgnoringASCIICase(type, "datetime-local"))
+                return AXDateTimeFieldText();
+        }
+    }
+
+    if (isFileUploadButton())
+        return AXFileUploadButtonText();
+
+    // Only returning for DL (not UL or OL) because description changed with HTML5 from 'definition list' to
+    // superset 'description list' and does not return the same values in AX API on some OS versions.
+    if (is<AccessibilityList>(*this)) {
+        if (downcast<AccessibilityList>(*this).isDescriptionList())
+            return AXDescriptionListText();
+    }
+
+    if (role == AccessibilityRole::HorizontalRule)
+        return AXHorizontalRuleDescriptionText();
+
+    // AppKit also returns AXTab for the role description for a tab item.
+    if (isTabItem())
+        return NSAccessibilityRoleDescription(@"AXTab", nil);
+
+    if (isSummary())
+        return AXSummaryText();
+
+    return String();
+}
+
+namespace Accessibility {
+
+PlatformRoleMap createPlatformRoleMap()
+{
+    struct RoleEntry {
+        AccessibilityRole value;
+        NSString *string;
+    };
+    static const RoleEntry roles[] = {
+        { AccessibilityRole::Unknown, NSAccessibilityUnknownRole },
+        { AccessibilityRole::Button, NSAccessibilityButtonRole },
+        { AccessibilityRole::RadioButton, NSAccessibilityRadioButtonRole },
+        { AccessibilityRole::CheckBox, NSAccessibilityCheckBoxRole },
+        { AccessibilityRole::Slider, NSAccessibilitySliderRole },
+        { AccessibilityRole::TabGroup, NSAccessibilityTabGroupRole },
+        { AccessibilityRole::TextField, NSAccessibilityTextFieldRole },
+        { AccessibilityRole::StaticText, NSAccessibilityStaticTextRole },
+        { AccessibilityRole::TextArea, NSAccessibilityTextAreaRole },
+        { AccessibilityRole::ScrollArea, NSAccessibilityScrollAreaRole },
+        { AccessibilityRole::PopUpButton, NSAccessibilityPopUpButtonRole },
+        { AccessibilityRole::MenuButton, NSAccessibilityMenuButtonRole },
+        { AccessibilityRole::Table, NSAccessibilityTableRole },
+        { AccessibilityRole::Application, NSAccessibilityApplicationRole },
+        { AccessibilityRole::Group, NSAccessibilityGroupRole },
+        { AccessibilityRole::TextGroup, NSAccessibilityGroupRole },
+        { AccessibilityRole::RadioGroup, NSAccessibilityRadioGroupRole },
+        { AccessibilityRole::List, NSAccessibilityListRole },
+        { AccessibilityRole::Directory, NSAccessibilityListRole },
+        { AccessibilityRole::ScrollBar, NSAccessibilityScrollBarRole },
+        { AccessibilityRole::ValueIndicator, NSAccessibilityValueIndicatorRole },
+        { AccessibilityRole::Image, NSAccessibilityImageRole },
+        { AccessibilityRole::MenuBar, NSAccessibilityMenuBarRole },
+        { AccessibilityRole::Menu, NSAccessibilityMenuRole },
+        { AccessibilityRole::MenuItem, NSAccessibilityMenuItemRole },
+        { AccessibilityRole::MenuItemCheckbox, NSAccessibilityMenuItemRole },
+        { AccessibilityRole::MenuItemRadio, NSAccessibilityMenuItemRole },
+        { AccessibilityRole::Column, NSAccessibilityColumnRole },
+        { AccessibilityRole::Row, NSAccessibilityRowRole },
+        { AccessibilityRole::Toolbar, NSAccessibilityToolbarRole },
+        { AccessibilityRole::BusyIndicator, NSAccessibilityBusyIndicatorRole },
+        { AccessibilityRole::ProgressIndicator, NSAccessibilityProgressIndicatorRole },
+        { AccessibilityRole::Meter, NSAccessibilityLevelIndicatorRole },
+        { AccessibilityRole::Window, NSAccessibilityWindowRole },
+        { AccessibilityRole::Drawer, NSAccessibilityDrawerRole },
+        { AccessibilityRole::SystemWide, NSAccessibilitySystemWideRole },
+        { AccessibilityRole::Outline, NSAccessibilityOutlineRole },
+        { AccessibilityRole::Incrementor, NSAccessibilityIncrementorRole },
+        { AccessibilityRole::Browser, NSAccessibilityBrowserRole },
+        { AccessibilityRole::ComboBox, NSAccessibilityComboBoxRole },
+        { AccessibilityRole::SplitGroup, NSAccessibilitySplitGroupRole },
+        { AccessibilityRole::Splitter, NSAccessibilitySplitterRole },
+        { AccessibilityRole::ColorWell, NSAccessibilityColorWellRole },
+        { AccessibilityRole::GrowArea, NSAccessibilityGrowAreaRole },
+        { AccessibilityRole::Sheet, NSAccessibilitySheetRole },
+        { AccessibilityRole::HelpTag, NSAccessibilityHelpTagRole },
+        { AccessibilityRole::Matte, NSAccessibilityMatteRole },
+        { AccessibilityRole::Ruler, NSAccessibilityRulerRole },
+        { AccessibilityRole::RulerMarker, NSAccessibilityRulerMarkerRole },
+        { AccessibilityRole::Link, NSAccessibilityLinkRole },
+        { AccessibilityRole::DisclosureTriangle, NSAccessibilityDisclosureTriangleRole },
+        { AccessibilityRole::Grid, NSAccessibilityTableRole },
+        { AccessibilityRole::TreeGrid, NSAccessibilityTableRole },
+        { AccessibilityRole::WebCoreLink, NSAccessibilityLinkRole },
+        { AccessibilityRole::ImageMapLink, NSAccessibilityLinkRole },
+        { AccessibilityRole::ImageMap, @"AXImageMap" },
+        { AccessibilityRole::ListMarker, @"AXListMarker" },
+        { AccessibilityRole::WebArea, @"AXWebArea" },
+        { AccessibilityRole::Heading, @"AXHeading" },
+        { AccessibilityRole::ListBox, NSAccessibilityListRole },
+        { AccessibilityRole::ListBoxOption, NSAccessibilityStaticTextRole },
+        { AccessibilityRole::Cell, NSAccessibilityCellRole },
+        { AccessibilityRole::GridCell, NSAccessibilityCellRole },
+        { AccessibilityRole::TableHeaderContainer, NSAccessibilityGroupRole },
+        { AccessibilityRole::ColumnHeader, NSAccessibilityCellRole },
+        { AccessibilityRole::RowHeader, NSAccessibilityCellRole },
+        { AccessibilityRole::Definition, NSAccessibilityGroupRole },
+        { AccessibilityRole::DescriptionListDetail, NSAccessibilityGroupRole },
+        { AccessibilityRole::DescriptionListTerm, NSAccessibilityGroupRole },
+        { AccessibilityRole::Term, NSAccessibilityGroupRole },
+        { AccessibilityRole::DescriptionList, NSAccessibilityListRole },
+        { AccessibilityRole::SliderThumb, NSAccessibilityValueIndicatorRole },
+        { AccessibilityRole::WebApplication, NSAccessibilityGroupRole },
+        { AccessibilityRole::LandmarkBanner, NSAccessibilityGroupRole },
+        { AccessibilityRole::LandmarkComplementary, NSAccessibilityGroupRole },
+        { AccessibilityRole::LandmarkDocRegion, NSAccessibilityGroupRole },
+        { AccessibilityRole::LandmarkContentInfo, NSAccessibilityGroupRole },
+        { AccessibilityRole::LandmarkMain, NSAccessibilityGroupRole },
+        { AccessibilityRole::LandmarkNavigation, NSAccessibilityGroupRole },
+        { AccessibilityRole::LandmarkRegion, NSAccessibilityGroupRole },
+        { AccessibilityRole::LandmarkSearch, NSAccessibilityGroupRole },
+        { AccessibilityRole::ApplicationAlert, NSAccessibilityGroupRole },
+        { AccessibilityRole::ApplicationAlertDialog, NSAccessibilityGroupRole },
+        { AccessibilityRole::ApplicationDialog, NSAccessibilityGroupRole },
+        { AccessibilityRole::ApplicationGroup, NSAccessibilityGroupRole },
+        { AccessibilityRole::ApplicationTextGroup, NSAccessibilityGroupRole },
+        { AccessibilityRole::ApplicationLog, NSAccessibilityGroupRole },
+        { AccessibilityRole::ApplicationMarquee, NSAccessibilityGroupRole },
+        { AccessibilityRole::ApplicationStatus, NSAccessibilityGroupRole },
+        { AccessibilityRole::ApplicationTimer, NSAccessibilityGroupRole },
+        { AccessibilityRole::Document, NSAccessibilityGroupRole },
+        { AccessibilityRole::DocumentArticle, NSAccessibilityGroupRole },
+        { AccessibilityRole::DocumentMath, NSAccessibilityGroupRole },
+        { AccessibilityRole::DocumentNote, NSAccessibilityGroupRole },
+        { AccessibilityRole::UserInterfaceTooltip, NSAccessibilityGroupRole },
+        { AccessibilityRole::Tab, NSAccessibilityRadioButtonRole },
+        { AccessibilityRole::TabList, NSAccessibilityTabGroupRole },
+        { AccessibilityRole::TabPanel, NSAccessibilityGroupRole },
+        { AccessibilityRole::Tree, NSAccessibilityOutlineRole },
+        { AccessibilityRole::TreeItem, NSAccessibilityRowRole },
+        { AccessibilityRole::ListItem, NSAccessibilityGroupRole },
+        { AccessibilityRole::Paragraph, NSAccessibilityGroupRole },
+        { AccessibilityRole::Label, NSAccessibilityGroupRole },
+        { AccessibilityRole::Div, NSAccessibilityGroupRole },
+        { AccessibilityRole::Form, NSAccessibilityGroupRole },
+        { AccessibilityRole::SpinButton, NSAccessibilityIncrementorRole },
+        { AccessibilityRole::Footer, NSAccessibilityGroupRole },
+        { AccessibilityRole::ToggleButton, NSAccessibilityCheckBoxRole },
+        { AccessibilityRole::Canvas, NSAccessibilityImageRole },
+        { AccessibilityRole::SVGRoot, NSAccessibilityGroupRole },
+        { AccessibilityRole::Legend, NSAccessibilityGroupRole },
+        { AccessibilityRole::MathElement, NSAccessibilityGroupRole },
+        { AccessibilityRole::Audio, NSAccessibilityGroupRole },
+        { AccessibilityRole::Video, NSAccessibilityGroupRole },
+        { AccessibilityRole::HorizontalRule, NSAccessibilitySplitterRole },
+        { AccessibilityRole::Blockquote, NSAccessibilityGroupRole },
+        { AccessibilityRole::Switch, NSAccessibilityCheckBoxRole },
+        { AccessibilityRole::SearchField, NSAccessibilityTextFieldRole },
+        { AccessibilityRole::Pre, NSAccessibilityGroupRole },
+        { AccessibilityRole::RubyBase, NSAccessibilityGroupRole },
+        { AccessibilityRole::RubyBlock, NSAccessibilityGroupRole },
+        { AccessibilityRole::RubyInline, NSAccessibilityGroupRole },
+        { AccessibilityRole::RubyRun, NSAccessibilityGroupRole },
+        { AccessibilityRole::RubyText, NSAccessibilityGroupRole },
+        { AccessibilityRole::Details, NSAccessibilityGroupRole },
+        { AccessibilityRole::Summary, NSAccessibilityButtonRole },
+        { AccessibilityRole::SVGTextPath, NSAccessibilityGroupRole },
+        { AccessibilityRole::SVGText, NSAccessibilityGroupRole },
+        { AccessibilityRole::SVGTSpan, NSAccessibilityGroupRole },
+        { AccessibilityRole::Inline, NSAccessibilityGroupRole },
+        { AccessibilityRole::Mark, NSAccessibilityGroupRole },
+        { AccessibilityRole::Time, NSAccessibilityGroupRole },
+        { AccessibilityRole::Feed, NSAccessibilityGroupRole },
+        { AccessibilityRole::Figure, NSAccessibilityGroupRole },
+        { AccessibilityRole::Footnote, NSAccessibilityGroupRole },
+        { AccessibilityRole::GraphicsDocument, NSAccessibilityGroupRole },
+        { AccessibilityRole::GraphicsObject, NSAccessibilityGroupRole },
+        { AccessibilityRole::GraphicsSymbol, NSAccessibilityImageRole },
+        { AccessibilityRole::Caption, NSAccessibilityGroupRole },
+        { AccessibilityRole::Deletion, NSAccessibilityGroupRole },
+        { AccessibilityRole::Insertion, NSAccessibilityGroupRole },
+        { AccessibilityRole::Subscript, NSAccessibilityGroupRole },
+        { AccessibilityRole::Superscript, NSAccessibilityGroupRole },
+    };
+    PlatformRoleMap roleMap;
+    for (auto& role : roles)
+        roleMap.add(static_cast<unsigned>(role.value), role.string);
+    return roleMap;
+}
+
+} // namespace Accessibility
+
 } // WebCore
 
 #endif // ENABLE(ACCESSIBILITY) && PLATFORM(MAC)
index f0fea23..4f9b4d9 100644 (file)
@@ -326,9 +326,6 @@ NSArray *convertToNSArray(const WebCore::AXCoreObject::AccessibilityChildrenVect
 
 - (AXCoreObject*)accessibilityObject
 {
-#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
-    ASSERT(!_AXUIElementRequestServicedBySecondaryAXThread());
-#endif
     return m_object;
 }
 
@@ -472,53 +469,7 @@ static void convertPathToScreenSpaceFunction(PathConversionInfo& conversion, con
 
 - (NSString *)ariaLandmarkRoleDescription
 {
-    switch (_axBackingObject->roleValue()) {
-    case AccessibilityRole::LandmarkBanner:
-        return AXARIAContentGroupText(@"ARIALandmarkBanner");
-    case AccessibilityRole::LandmarkComplementary:
-        return AXARIAContentGroupText(@"ARIALandmarkComplementary");
-    case AccessibilityRole::LandmarkContentInfo:
-        return AXARIAContentGroupText(@"ARIALandmarkContentInfo");
-    case AccessibilityRole::LandmarkMain:
-        return AXARIAContentGroupText(@"ARIALandmarkMain");
-    case AccessibilityRole::LandmarkNavigation:
-        return AXARIAContentGroupText(@"ARIALandmarkNavigation");
-    case AccessibilityRole::LandmarkDocRegion:
-    case AccessibilityRole::LandmarkRegion:
-        return AXARIAContentGroupText(@"ARIALandmarkRegion");
-    case AccessibilityRole::LandmarkSearch:
-        return AXARIAContentGroupText(@"ARIALandmarkSearch");
-    case AccessibilityRole::ApplicationAlert:
-        return AXARIAContentGroupText(@"ARIAApplicationAlert");
-    case AccessibilityRole::ApplicationAlertDialog:
-        return AXARIAContentGroupText(@"ARIAApplicationAlertDialog");
-    case AccessibilityRole::ApplicationDialog:
-        return AXARIAContentGroupText(@"ARIAApplicationDialog");
-    case AccessibilityRole::ApplicationLog:
-        return AXARIAContentGroupText(@"ARIAApplicationLog");
-    case AccessibilityRole::ApplicationMarquee:
-        return AXARIAContentGroupText(@"ARIAApplicationMarquee");
-    case AccessibilityRole::ApplicationStatus:
-        return AXARIAContentGroupText(@"ARIAApplicationStatus");
-    case AccessibilityRole::ApplicationTimer:
-        return AXARIAContentGroupText(@"ARIAApplicationTimer");
-    case AccessibilityRole::Document:
-        return AXARIAContentGroupText(@"ARIADocument");
-    case AccessibilityRole::DocumentArticle:
-        return AXARIAContentGroupText(@"ARIADocumentArticle");
-    case AccessibilityRole::DocumentMath:
-        return AXARIAContentGroupText(@"ARIADocumentMath");
-    case AccessibilityRole::DocumentNote:
-        return AXARIAContentGroupText(@"ARIADocumentNote");
-    case AccessibilityRole::UserInterfaceTooltip:
-        return AXARIAContentGroupText(@"ARIAUserInterfaceTooltip");
-    case AccessibilityRole::TabPanel:
-        return AXARIAContentGroupText(@"ARIATabPanel");
-    case AccessibilityRole::WebApplication:
-        return AXARIAContentGroupText(@"ARIAWebApplication");
-    default:
-        return nil;
-    }
+    return m_object->ariaLandmarkRoleDescription();
 }
 
 - (void)baseAccessibilitySetFocus:(BOOL)focus
index d01f0ec..83b8543 100644 (file)
@@ -2030,192 +2030,15 @@ static void WebTransformCGPathToNSBezierPath(void* info, const CGPathElement *el
     return [NSValue valueWithPoint:NSPointFromCGPoint(cgPoint)];
 }
 
-using AccessibilityRoleMap = HashMap<int, CFStringRef>;
-
-static AccessibilityRoleMap createAccessibilityRoleMap()
-{
-    struct RoleEntry {
-        AccessibilityRole value;
-        __unsafe_unretained NSString *string;
-    };
-    static const RoleEntry roles[] = {
-        { AccessibilityRole::Unknown, NSAccessibilityUnknownRole },
-        { AccessibilityRole::Button, NSAccessibilityButtonRole },
-        { AccessibilityRole::RadioButton, NSAccessibilityRadioButtonRole },
-        { AccessibilityRole::CheckBox, NSAccessibilityCheckBoxRole },
-        { AccessibilityRole::Slider, NSAccessibilitySliderRole },
-        { AccessibilityRole::TabGroup, NSAccessibilityTabGroupRole },
-        { AccessibilityRole::TextField, NSAccessibilityTextFieldRole },
-        { AccessibilityRole::StaticText, NSAccessibilityStaticTextRole },
-        { AccessibilityRole::TextArea, NSAccessibilityTextAreaRole },
-        { AccessibilityRole::ScrollArea, NSAccessibilityScrollAreaRole },
-        { AccessibilityRole::PopUpButton, NSAccessibilityPopUpButtonRole },
-        { AccessibilityRole::MenuButton, NSAccessibilityMenuButtonRole },
-        { AccessibilityRole::Table, NSAccessibilityTableRole },
-        { AccessibilityRole::Application, NSAccessibilityApplicationRole },
-        { AccessibilityRole::Group, NSAccessibilityGroupRole },
-        { AccessibilityRole::TextGroup, NSAccessibilityGroupRole },
-        { AccessibilityRole::RadioGroup, NSAccessibilityRadioGroupRole },
-        { AccessibilityRole::List, NSAccessibilityListRole },
-        { AccessibilityRole::Directory, NSAccessibilityListRole },
-        { AccessibilityRole::ScrollBar, NSAccessibilityScrollBarRole },
-        { AccessibilityRole::ValueIndicator, NSAccessibilityValueIndicatorRole },
-        { AccessibilityRole::Image, NSAccessibilityImageRole },
-        { AccessibilityRole::MenuBar, NSAccessibilityMenuBarRole },
-        { AccessibilityRole::Menu, NSAccessibilityMenuRole },
-        { AccessibilityRole::MenuItem, NSAccessibilityMenuItemRole },
-        { AccessibilityRole::MenuItemCheckbox, NSAccessibilityMenuItemRole },
-        { AccessibilityRole::MenuItemRadio, NSAccessibilityMenuItemRole },
-        { AccessibilityRole::Column, NSAccessibilityColumnRole },
-        { AccessibilityRole::Row, NSAccessibilityRowRole },
-        { AccessibilityRole::Toolbar, NSAccessibilityToolbarRole },
-        { AccessibilityRole::BusyIndicator, NSAccessibilityBusyIndicatorRole },
-        { AccessibilityRole::ProgressIndicator, NSAccessibilityProgressIndicatorRole },
-        { AccessibilityRole::Meter, NSAccessibilityLevelIndicatorRole },
-        { AccessibilityRole::Window, NSAccessibilityWindowRole },
-        { AccessibilityRole::Drawer, NSAccessibilityDrawerRole },
-        { AccessibilityRole::SystemWide, NSAccessibilitySystemWideRole },
-        { AccessibilityRole::Outline, NSAccessibilityOutlineRole },
-        { AccessibilityRole::Incrementor, NSAccessibilityIncrementorRole },
-        { AccessibilityRole::Browser, NSAccessibilityBrowserRole },
-        { AccessibilityRole::ComboBox, NSAccessibilityComboBoxRole },
-        { AccessibilityRole::SplitGroup, NSAccessibilitySplitGroupRole },
-        { AccessibilityRole::Splitter, NSAccessibilitySplitterRole },
-        { AccessibilityRole::ColorWell, NSAccessibilityColorWellRole },
-        { AccessibilityRole::GrowArea, NSAccessibilityGrowAreaRole },
-        { AccessibilityRole::Sheet, NSAccessibilitySheetRole },
-        { AccessibilityRole::HelpTag, NSAccessibilityHelpTagRole },
-        { AccessibilityRole::Matte, NSAccessibilityMatteRole },
-        { AccessibilityRole::Ruler, NSAccessibilityRulerRole },
-        { AccessibilityRole::RulerMarker, NSAccessibilityRulerMarkerRole },
-        { AccessibilityRole::Link, NSAccessibilityLinkRole },
-        { AccessibilityRole::DisclosureTriangle, NSAccessibilityDisclosureTriangleRole },
-        { AccessibilityRole::Grid, NSAccessibilityTableRole },
-        { AccessibilityRole::TreeGrid, NSAccessibilityTableRole },
-        { AccessibilityRole::WebCoreLink, NSAccessibilityLinkRole },
-        { AccessibilityRole::ImageMapLink, NSAccessibilityLinkRole },
-        { AccessibilityRole::ImageMap, @"AXImageMap" },
-        { AccessibilityRole::ListMarker, @"AXListMarker" },
-        { AccessibilityRole::WebArea, @"AXWebArea" },
-        { AccessibilityRole::Heading, @"AXHeading" },
-        { AccessibilityRole::ListBox, NSAccessibilityListRole },
-        { AccessibilityRole::ListBoxOption, NSAccessibilityStaticTextRole },
-        { AccessibilityRole::Cell, NSAccessibilityCellRole },
-        { AccessibilityRole::GridCell, NSAccessibilityCellRole },
-        { AccessibilityRole::TableHeaderContainer, NSAccessibilityGroupRole },
-        { AccessibilityRole::ColumnHeader, NSAccessibilityCellRole },
-        { AccessibilityRole::RowHeader, NSAccessibilityCellRole },
-        { AccessibilityRole::Definition, NSAccessibilityGroupRole },
-        { AccessibilityRole::DescriptionListDetail, NSAccessibilityGroupRole },
-        { AccessibilityRole::DescriptionListTerm, NSAccessibilityGroupRole },
-        { AccessibilityRole::Term, NSAccessibilityGroupRole },
-        { AccessibilityRole::DescriptionList, NSAccessibilityListRole },
-        { AccessibilityRole::SliderThumb, NSAccessibilityValueIndicatorRole },
-        { AccessibilityRole::WebApplication, NSAccessibilityGroupRole },
-        { AccessibilityRole::LandmarkBanner, NSAccessibilityGroupRole },
-        { AccessibilityRole::LandmarkComplementary, NSAccessibilityGroupRole },
-        { AccessibilityRole::LandmarkDocRegion, NSAccessibilityGroupRole },
-        { AccessibilityRole::LandmarkContentInfo, NSAccessibilityGroupRole },
-        { AccessibilityRole::LandmarkMain, NSAccessibilityGroupRole },
-        { AccessibilityRole::LandmarkNavigation, NSAccessibilityGroupRole },
-        { AccessibilityRole::LandmarkRegion, NSAccessibilityGroupRole },
-        { AccessibilityRole::LandmarkSearch, NSAccessibilityGroupRole },
-        { AccessibilityRole::ApplicationAlert, NSAccessibilityGroupRole },
-        { AccessibilityRole::ApplicationAlertDialog, NSAccessibilityGroupRole },
-        { AccessibilityRole::ApplicationDialog, NSAccessibilityGroupRole },
-        { AccessibilityRole::ApplicationGroup, NSAccessibilityGroupRole },
-        { AccessibilityRole::ApplicationTextGroup, NSAccessibilityGroupRole },
-        { AccessibilityRole::ApplicationLog, NSAccessibilityGroupRole },
-        { AccessibilityRole::ApplicationMarquee, NSAccessibilityGroupRole },
-        { AccessibilityRole::ApplicationStatus, NSAccessibilityGroupRole },
-        { AccessibilityRole::ApplicationTimer, NSAccessibilityGroupRole },
-        { AccessibilityRole::Document, NSAccessibilityGroupRole },
-        { AccessibilityRole::DocumentArticle, NSAccessibilityGroupRole },
-        { AccessibilityRole::DocumentMath, NSAccessibilityGroupRole },
-        { AccessibilityRole::DocumentNote, NSAccessibilityGroupRole },
-        { AccessibilityRole::UserInterfaceTooltip, NSAccessibilityGroupRole },
-        { AccessibilityRole::Tab, NSAccessibilityRadioButtonRole },
-        { AccessibilityRole::TabList, NSAccessibilityTabGroupRole },
-        { AccessibilityRole::TabPanel, NSAccessibilityGroupRole },
-        { AccessibilityRole::Tree, NSAccessibilityOutlineRole },
-        { AccessibilityRole::TreeItem, NSAccessibilityRowRole },
-        { AccessibilityRole::ListItem, NSAccessibilityGroupRole },
-        { AccessibilityRole::Paragraph, NSAccessibilityGroupRole },
-        { AccessibilityRole::Label, NSAccessibilityGroupRole },
-        { AccessibilityRole::Div, NSAccessibilityGroupRole },
-        { AccessibilityRole::Form, NSAccessibilityGroupRole },
-        { AccessibilityRole::SpinButton, NSAccessibilityIncrementorRole },
-        { AccessibilityRole::Footer, NSAccessibilityGroupRole },
-        { AccessibilityRole::ToggleButton, NSAccessibilityCheckBoxRole },
-        { AccessibilityRole::Canvas, NSAccessibilityImageRole },
-        { AccessibilityRole::SVGRoot, NSAccessibilityGroupRole },
-        { AccessibilityRole::Legend, NSAccessibilityGroupRole },
-        { AccessibilityRole::MathElement, NSAccessibilityGroupRole },
-        { AccessibilityRole::Audio, NSAccessibilityGroupRole },
-        { AccessibilityRole::Video, NSAccessibilityGroupRole },
-        { AccessibilityRole::HorizontalRule, NSAccessibilitySplitterRole },
-        { AccessibilityRole::Blockquote, NSAccessibilityGroupRole },
-        { AccessibilityRole::Switch, NSAccessibilityCheckBoxRole },
-        { AccessibilityRole::SearchField, NSAccessibilityTextFieldRole },
-        { AccessibilityRole::Pre, NSAccessibilityGroupRole },
-        { AccessibilityRole::RubyBase, NSAccessibilityGroupRole },
-        { AccessibilityRole::RubyBlock, NSAccessibilityGroupRole },
-        { AccessibilityRole::RubyInline, NSAccessibilityGroupRole },
-        { AccessibilityRole::RubyRun, NSAccessibilityGroupRole },
-        { AccessibilityRole::RubyText, NSAccessibilityGroupRole },
-        { AccessibilityRole::Details, NSAccessibilityGroupRole },
-        { AccessibilityRole::Summary, NSAccessibilityButtonRole },
-        { AccessibilityRole::SVGTextPath, NSAccessibilityGroupRole },
-        { AccessibilityRole::SVGText, NSAccessibilityGroupRole },
-        { AccessibilityRole::SVGTSpan, NSAccessibilityGroupRole },
-        { AccessibilityRole::Inline, NSAccessibilityGroupRole },
-        { AccessibilityRole::Mark, NSAccessibilityGroupRole },
-        { AccessibilityRole::Time, NSAccessibilityGroupRole },
-        { AccessibilityRole::Feed, NSAccessibilityGroupRole },
-        { AccessibilityRole::Figure, NSAccessibilityGroupRole },
-        { AccessibilityRole::Footnote, NSAccessibilityGroupRole },
-        { AccessibilityRole::GraphicsDocument, NSAccessibilityGroupRole },
-        { AccessibilityRole::GraphicsObject, NSAccessibilityGroupRole },
-        { AccessibilityRole::GraphicsSymbol, NSAccessibilityImageRole },
-        { AccessibilityRole::Caption, NSAccessibilityGroupRole },
-        { AccessibilityRole::Deletion, NSAccessibilityGroupRole },
-        { AccessibilityRole::Insertion, NSAccessibilityGroupRole },
-        { AccessibilityRole::Subscript, NSAccessibilityGroupRole },
-        { AccessibilityRole::Superscript, NSAccessibilityGroupRole },
-    };
-    AccessibilityRoleMap roleMap;
-    for (auto& role : roles)
-        roleMap.add(static_cast<int>(role.value), (__bridge CFStringRef)role.string);
-    return roleMap;
-}
-
-static NSString *roleValueToNSString(AccessibilityRole value)
-{
-    static NeverDestroyed<AccessibilityRoleMap> roleMap = createAccessibilityRoleMap();
-    return (__bridge NSString *)roleMap.get().get(static_cast<int>(value));
-}
-
 - (NSString*)role
 {
     ALLOW_DEPRECATED_DECLARATIONS_BEGIN
     if (_axBackingObject->isAttachment())
         return [[self attachmentView] accessibilityAttributeValue:NSAccessibilityRoleAttribute];
     ALLOW_DEPRECATED_DECLARATIONS_END
-    AccessibilityRole role = _axBackingObject->roleValue();
-
-    if (role == AccessibilityRole::Label && is<AccessibilityLabel>(*m_object) && downcast<AccessibilityLabel>(*m_object).containsOnlyStaticText())
-        role = AccessibilityRole::StaticText;
 
-    // The mfenced element creates anonymous RenderMathMLOperators with no RenderText
-    // descendants. Because these anonymous renderers are the only accessible objects
-    // containing the operator, assign AccessibilityRole::StaticText.
-    if (m_object->isAnonymousMathOperator())
-        role = AccessibilityRole::StaticText;
-
-    if (role == AccessibilityRole::Canvas && m_object->canvasHasFallbackContent())
-        role = AccessibilityRole::Group;
-    NSString* string = roleValueToNSString(role);
-    if (string != nil)
+    NSString *string = m_object->rolePlatformString();
+    if (string.length)
         return string;
     return NSAccessibilityUnknownRole;
 }
@@ -2444,115 +2267,15 @@ ALLOW_DEPRECATED_DECLARATIONS_END
         return [[self attachmentView] accessibilityAttributeValue:NSAccessibilityRoleDescriptionAttribute];
     ALLOW_DEPRECATED_DECLARATIONS_END
 
-    const AtomString& overrideRoleDescription = m_object->roleDescription();
-    if (!overrideRoleDescription.isNull() && !overrideRoleDescription.isEmpty())
-        return overrideRoleDescription;
-    
-    NSString* axRole = [self role];
-    
-    if ([axRole isEqualToString:NSAccessibilityGroupRole]) {
-        
-        if (m_object->isOutput())
-            return AXOutputText();
-        
-        NSString *ariaLandmarkRoleDescription = [self ariaLandmarkRoleDescription];
-        if (ariaLandmarkRoleDescription)
-            return ariaLandmarkRoleDescription;
-        
-        switch (m_object->roleValue()) {
-        case AccessibilityRole::Audio:
-            return localizedMediaControlElementString("AudioElement");
-        case AccessibilityRole::Definition:
-            return AXDefinitionText();
-        case AccessibilityRole::DescriptionListTerm:
-        case AccessibilityRole::Term:
-            return AXDescriptionListTermText();
-        case AccessibilityRole::DescriptionListDetail:
-            return AXDescriptionListDetailText();
-        case AccessibilityRole::Details:
-            return AXDetailsText();
-        case AccessibilityRole::Feed:
-            return AXFeedText();
-        case AccessibilityRole::Footer:
-            return AXFooterRoleDescriptionText();
-        case AccessibilityRole::Mark:
-            return AXMarkText();
-        case AccessibilityRole::Video:
-            return localizedMediaControlElementString("VideoElement");
-        case AccessibilityRole::GraphicsDocument:
-            return AXARIAContentGroupText(@"ARIADocument");
-        default:
-            return NSAccessibilityRoleDescription(NSAccessibilityGroupRole, [self subrole]);
-        }
-    }
-    
-    if ([axRole isEqualToString:@"AXWebArea"])
-        return AXWebAreaText();
-    
-    if ([axRole isEqualToString:@"AXLink"])
-        return AXLinkText();
-    
-    if ([axRole isEqualToString:@"AXListMarker"])
-        return AXListMarkerText();
-    
-    if ([axRole isEqualToString:@"AXImageMap"])
-        return AXImageMapText();
-    
-    if ([axRole isEqualToString:@"AXHeading"])
-        return AXHeadingText();
-    
-    if ([axRole isEqualToString:NSAccessibilityTextFieldRole]) {
-        auto* node = m_object->node();
-        if (is<HTMLInputElement>(node)) {
-            auto& input = downcast<HTMLInputElement>(*node);
-            if (input.isEmailField())
-                return AXEmailFieldText();
-            if (input.isTelephoneField())
-                return AXTelephoneFieldText();
-            if (input.isURLField())
-                return AXURLFieldText();
-            if (input.isNumberField())
-                return AXNumberFieldText();
-            
-            // These input types are not enabled on mac yet, we check the type attribute for now.
-            auto& type = input.attributeWithoutSynchronization(typeAttr);
-            if (equalLettersIgnoringASCIICase(type, "date"))
-                return AXDateFieldText();
-            if (equalLettersIgnoringASCIICase(type, "time"))
-                return AXTimeFieldText();
-            if (equalLettersIgnoringASCIICase(type, "week"))
-                return AXWeekFieldText();
-            if (equalLettersIgnoringASCIICase(type, "month"))
-                return AXMonthFieldText();
-            if (equalLettersIgnoringASCIICase(type, "datetime-local"))
-                return AXDateTimeFieldText();
-        }
-    }
-    
-    if (_axBackingObject->isFileUploadButton())
-        return AXFileUploadButtonText();
-    
-    // Only returning for DL (not UL or OL) because description changed with HTML5 from 'definition list' to
-    // superset 'description list' and does not return the same values in AX API on some OS versions. 
-    if (is<AccessibilityList>(*m_object)) {
-        if (downcast<AccessibilityList>(*m_object).isDescriptionList())
-            return AXDescriptionListText();
-    }
-    
-    if (m_object->roleValue() == AccessibilityRole::HorizontalRule)
-        return AXHorizontalRuleDescriptionText();
-    
-    // AppKit also returns AXTab for the role description for a tab item.
-    if (m_object->isTabItem())
-        return NSAccessibilityRoleDescription(@"AXTab", nil);
-    
-    if (m_object->isSummary())
-        return AXSummaryText();
-    
-    // We should try the system default role description for all other roles.
+    String roleDescription = m_object->roleDescription();
+    if (!roleDescription.isEmpty())
+        return roleDescription;
+
+    NSString *axRole = m_object->rolePlatformString();
+    // Fallback to the system default role description.
     // If we get the same string back, then as a last resort, return unknown.
-    NSStringdefaultRoleDescription = NSAccessibilityRoleDescription(axRole, [self subrole]);
-    
+    NSString *defaultRoleDescription = NSAccessibilityRoleDescription(axRole, [self subrole]);
+
     // On earlier Mac versions (Lion), using a non-standard subrole would result in a role description
     // being returned that looked like AXRole:AXSubrole. To make all platforms have the same role descriptions
     // we should fallback on a role description ignoring the subrole in these cases.
index 770f40b..e23556a 100644 (file)
@@ -580,6 +580,63 @@ String AXWeekFieldText()
     return WEB_UI_STRING("week and year field", "accessibility role description for a time field.");
 }
 
+String AXARIAContentGroupText(const String& ariaType)
+{
+    if (ariaType == "ARIAApplicationAlert")
+        return WEB_UI_STRING("alert", "An ARIA accessibility group that acts as an alert.");
+    if (ariaType == "ARIAApplicationAlertDialog")
+        return WEB_UI_STRING("web alert dialog", "An ARIA accessibility group that acts as an alert dialog.");
+    if (ariaType == "ARIAApplicationDialog")
+        return WEB_UI_STRING("web dialog", "An ARIA accessibility group that acts as an dialog.");
+    if (ariaType == "ARIAApplicationLog")
+        return WEB_UI_STRING("log", "An ARIA accessibility group that acts as a console log.");
+    if (ariaType == "ARIAApplicationMarquee")
+        return WEB_UI_STRING("marquee", "An ARIA accessibility group that acts as a marquee.");
+    if (ariaType == "ARIAApplicationStatus")
+        return WEB_UI_STRING("application status", "An ARIA accessibility group that acts as a status update.");
+    if (ariaType == "ARIAApplicationTimer")
+        return WEB_UI_STRING("timer", "An ARIA accessibility group that acts as an updating timer.");
+    if (ariaType == "ARIADocument")
+        return WEB_UI_STRING("document", "An ARIA accessibility group that acts as a document.");
+    if (ariaType == "ARIADocumentArticle")
+        return WEB_UI_STRING("article", "An ARIA accessibility group that acts as an article.");
+    if (ariaType == "ARIADocumentNote")
+        return WEB_UI_STRING("note", "An ARIA accessibility group that acts as a note in a document.");
+    if (ariaType == "ARIAWebApplication")
+        return WEB_UI_STRING("web application", "An ARIA accessibility group that acts as an application.");
+    if (ariaType == "ARIALandmarkBanner")
+        return WEB_UI_STRING("banner", "An ARIA accessibility group that acts as a banner.");
+    if (ariaType == "ARIALandmarkComplementary")
+        return WEB_UI_STRING("complementary", "An ARIA accessibility group that acts as a region of complementary information.");
+    if (ariaType == "ARIALandmarkContentInfo")
+        return WEB_UI_STRING("content information", "An ARIA accessibility group that contains content.");
+    if (ariaType == "ARIALandmarkMain")
+        return WEB_UI_STRING("main", "An ARIA accessibility group that is the main portion of the website.");
+    if (ariaType == "ARIALandmarkNavigation")
+        return WEB_UI_STRING("navigation", "An ARIA accessibility group that contains the main navigation elements of a website.");
+    if (ariaType == "ARIALandmarkRegion")
+        return WEB_UI_STRING("region", "An ARIA accessibility group that acts as a distinct region in a document.");
+    if (ariaType == "ARIALandmarkSearch")
+        return WEB_UI_STRING("search", "An ARIA accessibility group that contains a search feature of a website.");
+    if (ariaType == "ARIAUserInterfaceTooltip")
+        return WEB_UI_STRING("tooltip", "An ARIA accessibility group that acts as a tooltip.");
+    if (ariaType == "ARIATabPanel")
+        return WEB_UI_STRING("tab panel", "An ARIA accessibility group that contains the content of a tab.");
+    if (ariaType == "ARIADocumentMath")
+        return WEB_UI_STRING("math", "An ARIA accessibility group that contains mathematical symbols.");
+    return String();
+}
+
+String AXHorizontalRuleDescriptionText()
+{
+    return WEB_UI_STRING("separator", "accessibility role description for a horizontal rule [<hr>]");
+}
+
+String AXMarkText()
+{
+    return WEB_UI_STRING("highlighted", "accessibility role description for a mark element");
+}
+
 String AXButtonActionVerb()
 {
     return WEB_UI_STRING("press", "Verb stating the action that will occur when a button is pressed, as used by accessibility");
index 94a0d63..3e33164 100644 (file)
@@ -186,7 +186,10 @@ namespace WebCore {
     String AXMonthFieldText();
     String AXNumberFieldText();
     String AXWeekFieldText();
-    
+    String AXARIAContentGroupText(const String& ariaType);
+    String AXHorizontalRuleDescriptionText();
+    String AXMarkText();
+
     String AXButtonActionVerb();
     String AXRadioButtonActionVerb();
     String AXTextFieldActionVerb();
@@ -203,9 +206,6 @@ namespace WebCore {
     String weekFormatInLDML();
 #endif
 #if PLATFORM(COCOA)
-    String AXARIAContentGroupText(const String& ariaType);
-    String AXHorizontalRuleDescriptionText();
-    String AXMarkText();
 #if ENABLE(METER_ELEMENT)
     String AXMeterGaugeRegionOptimumText();
     String AXMeterGaugeRegionSuboptimalText();
index 3b79b6c..9851f43 100644 (file)
@@ -181,63 +181,6 @@ String contextMenuItemTagExitVideoEnhancedFullscreen()
 #endif
 #endif // ENABLE(CONTEXT_MENUS)
 
-String AXARIAContentGroupText(const String& ariaType)
-{
-    if (ariaType == "ARIAApplicationAlert")
-        return WEB_UI_STRING("alert", "An ARIA accessibility group that acts as an alert.");
-    if (ariaType == "ARIAApplicationAlertDialog")
-        return WEB_UI_STRING("web alert dialog", "An ARIA accessibility group that acts as an alert dialog.");
-    if (ariaType == "ARIAApplicationDialog")
-        return WEB_UI_STRING("web dialog", "An ARIA accessibility group that acts as an dialog.");
-    if (ariaType == "ARIAApplicationLog")
-        return WEB_UI_STRING("log", "An ARIA accessibility group that acts as a console log.");
-    if (ariaType == "ARIAApplicationMarquee")
-        return WEB_UI_STRING("marquee", "An ARIA accessibility group that acts as a marquee.");
-    if (ariaType == "ARIAApplicationStatus")
-        return WEB_UI_STRING("application status", "An ARIA accessibility group that acts as a status update.");
-    if (ariaType == "ARIAApplicationTimer")
-        return WEB_UI_STRING("timer", "An ARIA accessibility group that acts as an updating timer.");
-    if (ariaType == "ARIADocument")
-        return WEB_UI_STRING("document", "An ARIA accessibility group that acts as a document.");
-    if (ariaType == "ARIADocumentArticle")
-        return WEB_UI_STRING("article", "An ARIA accessibility group that acts as an article.");
-    if (ariaType == "ARIADocumentNote")
-        return WEB_UI_STRING("note", "An ARIA accessibility group that acts as a note in a document.");
-    if (ariaType == "ARIAWebApplication")
-        return WEB_UI_STRING("web application", "An ARIA accessibility group that acts as an application.");
-    if (ariaType == "ARIALandmarkBanner")
-        return WEB_UI_STRING("banner", "An ARIA accessibility group that acts as a banner.");
-    if (ariaType == "ARIALandmarkComplementary")
-        return WEB_UI_STRING("complementary", "An ARIA accessibility group that acts as a region of complementary information.");
-    if (ariaType == "ARIALandmarkContentInfo")
-        return WEB_UI_STRING("content information", "An ARIA accessibility group that contains content.");
-    if (ariaType == "ARIALandmarkMain")
-        return WEB_UI_STRING("main", "An ARIA accessibility group that is the main portion of the website.");
-    if (ariaType == "ARIALandmarkNavigation")
-        return WEB_UI_STRING("navigation", "An ARIA accessibility group that contains the main navigation elements of a website.");
-    if (ariaType == "ARIALandmarkRegion")
-        return WEB_UI_STRING("region", "An ARIA accessibility group that acts as a distinct region in a document.");
-    if (ariaType == "ARIALandmarkSearch")
-        return WEB_UI_STRING("search", "An ARIA accessibility group that contains a search feature of a website.");
-    if (ariaType == "ARIAUserInterfaceTooltip")
-        return WEB_UI_STRING("tooltip", "An ARIA accessibility group that acts as a tooltip.");
-    if (ariaType == "ARIATabPanel")
-        return WEB_UI_STRING("tab panel", "An ARIA accessibility group that contains the content of a tab.");
-    if (ariaType == "ARIADocumentMath")
-        return WEB_UI_STRING("math", "An ARIA accessibility group that contains mathematical symbols.");
-    return String();
-}
-
-String AXHorizontalRuleDescriptionText()
-{
-    return WEB_UI_STRING("separator", "accessibility role description for a horizontal rule [<hr>]");
-}
-
-String AXMarkText()
-{
-    return WEB_UI_STRING("highlighted", "accessibility role description for a mark element");
-}
-
 #if ENABLE(METER_ELEMENT)
 String AXMeterGaugeRegionOptimumText()
 {