Changeset 286406 in webkit


Ignore:
Timestamp:
Dec 1, 2021 5:11:41 PM (8 months ago)
Author:
Chris Fleizach
Message:

AX: Support accessibility attributes for <model>
https://bugs.webkit.org/show_bug.cgi?id=233620
<rdar://problem/85852073>

Reviewed by Dean Jackson, Andres Gonzalez.

Source/WebCore:

Support accessible names on <model> tag and plumb through ability for the
platform rendered model framework to return accessibility elements.

Test: accessibility/model-element-attributes.html

  • Modules/model-element/HTMLModelElement.cpp:

(WebCore::HTMLModelElement::accessibilityChildren):

  • Modules/model-element/HTMLModelElement.h:
  • Modules/model-element/ModelPlayer.h:
  • Modules/model-element/dummy/DummyModelPlayer.cpp:

(WebCore::DummyModelPlayer::accessibilityChildren):

  • Modules/model-element/dummy/DummyModelPlayer.h:
  • Modules/model-element/scenekit/SceneKitModelPlayer.h:
  • Modules/model-element/scenekit/SceneKitModelPlayer.mm:

(WebCore::SceneKitModelPlayer::accessibilityChildren):

  • accessibility/AccessibilityNodeObject.cpp:

(WebCore::AccessibilityNodeObject::usesAltTagForTextComputation const):
(WebCore::shouldUseAccessibilityObjectInnerText):

  • accessibility/AccessibilityObject.cpp:

(WebCore::AccessibilityObject::modelElementChildren):

  • accessibility/AccessibilityObject.h:
  • accessibility/AccessibilityObjectInterface.h:

(WebCore::accessibilityRoleToString):
(WebCore::AXCoreObject::isModel const):

  • accessibility/AccessibilityRenderObject.cpp:

(WebCore::AccessibilityRenderObject::determineAccessibilityRole):
(WebCore::AccessibilityRenderObject::addChildren):

  • accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:

(-[WebAccessibilityObjectWrapper accessibilityElements]):
(-[WebAccessibilityObjectWrapper determineIsAccessibilityElement]):

  • accessibility/isolatedtree/AXIsolatedObject.cpp:

(WebCore::AXIsolatedObject::modelElementChildren):

  • accessibility/isolatedtree/AXIsolatedObject.h:
  • accessibility/mac/AccessibilityObjectMac.mm:

(WebCore::Accessibility::createPlatformRoleMap):

  • accessibility/mac/WebAccessibilityObjectWrapperMac.mm:

(-[WebAccessibilityObjectWrapper subrole]):
(-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
(-[WebAccessibilityObjectWrapper accessibilityIndexOfChild:]):
(-[WebAccessibilityObjectWrapper accessibilityArrayAttributeCount:]):
(-[WebAccessibilityObjectWrapper accessibilityArrayAttributeValues:index:maxCount:]):

Source/WebKit:

  • WebProcess/Model/ARKitInlinePreviewModelPlayer.h:
  • WebProcess/Model/ARKitInlinePreviewModelPlayer.mm:

(WebKit::ARKitInlinePreviewModelPlayer::accessibilityChildren):

LayoutTests:

  • accessibility/model-element-attributes.html: Added.
  • platform/gtk/TestExpectations:
  • platform/ios/TestExpectations:
  • platform/mac-wk1/TestExpectations:
  • platform/ios/accessibility/model-element-attributes-expected.txt: Added.
  • platform/mac/accessibility/model-element-attributes-expected.txt: Added.
  • platform/win/TestExpectations:
Location:
trunk
Files:
4 added
26 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r286375 r286406  
     12021-12-01  Chris Fleizach  <cfleizach@apple.com>
     2
     3        AX: Support accessibility attributes for <model>
     4        https://bugs.webkit.org/show_bug.cgi?id=233620
     5        <rdar://problem/85852073>
     6
     7        Reviewed by Dean Jackson, Andres Gonzalez.
     8
     9        * accessibility/model-element-attributes.html: Added.
     10        * platform/gtk/TestExpectations:
     11        * platform/ios/TestExpectations:
     12        * platform/mac-wk1/TestExpectations:
     13        * platform/ios/accessibility/model-element-attributes-expected.txt: Added.
     14        * platform/mac/accessibility/model-element-attributes-expected.txt: Added.
     15        * platform/win/TestExpectations:
     16
    1172021-12-01  Lauro Moura  <lmoura@igalia.com>
    218
  • trunk/LayoutTests/platform/gtk/TestExpectations

    r286089 r286406  
    135135webkit.org/b/223862 accessibility/gtk/text-for-range-table-cells.html [ Failure ]
    136136webkit.org/b/223862 accessibility/gtk/text-for-range-with-link.html [ Failure ]
     137accessibility/model-element-attributes.html [ Skip ]
    137138
    138139# canvas
  • trunk/LayoutTests/platform/ios/TestExpectations

    r286146 r286406  
    21212121accessibility/visible-character-range.html [ Pass ]
    21222122accessibility/ancestor-computation.html [ Pass ]
     2123accessibility/model-element-attributes.html [ Pass ]
    21232124
    21242125# Enable "aria-current" tests for iOS.
  • trunk/LayoutTests/platform/mac-wk1/TestExpectations

    r286328 r286406  
    603603# Skip due to lack of DumpRenderTree `AccessibilityUIElement::stringDescriptionOfAttributeValue` implementation.
    604604accessibility/visible-character-range.html [ Skip ]
     605accessibility/model-element-attributes.html [ Skip ]
    605606
    606607# <rdar://problem/26050923> The result is probably still a pass, but we don't have a way
  • trunk/LayoutTests/platform/win/TestExpectations

    r286165 r286406  
    280280accessibility/img-no-alt-not-ignored-with-title.html [ Skip ]
    281281accessibility/visible-character-range.html [ Skip ]
     282accessibility/model-element-attributes.html [ Skip ]
    282283
    283284# Need to implement AccessibilityUIElement::hasDocumentRoleAncestor(), AccessibilityUIElement::hasWebApplicationAncestor(),
  • trunk/Source/WebCore/ChangeLog

    r286404 r286406  
     12021-12-01  Chris Fleizach  <cfleizach@apple.com>
     2
     3        AX: Support accessibility attributes for <model>
     4        https://bugs.webkit.org/show_bug.cgi?id=233620
     5        <rdar://problem/85852073>
     6
     7        Reviewed by Dean Jackson, Andres Gonzalez.
     8
     9        Support accessible names on <model> tag and plumb through ability for the
     10        platform rendered model framework to return accessibility elements.
     11
     12        Test: accessibility/model-element-attributes.html
     13
     14        * Modules/model-element/HTMLModelElement.cpp:
     15        (WebCore::HTMLModelElement::accessibilityChildren):
     16        * Modules/model-element/HTMLModelElement.h:
     17        * Modules/model-element/ModelPlayer.h:
     18        * Modules/model-element/dummy/DummyModelPlayer.cpp:
     19        (WebCore::DummyModelPlayer::accessibilityChildren):
     20        * Modules/model-element/dummy/DummyModelPlayer.h:
     21        * Modules/model-element/scenekit/SceneKitModelPlayer.h:
     22        * Modules/model-element/scenekit/SceneKitModelPlayer.mm:
     23        (WebCore::SceneKitModelPlayer::accessibilityChildren):
     24        * accessibility/AccessibilityNodeObject.cpp:
     25        (WebCore::AccessibilityNodeObject::usesAltTagForTextComputation const):
     26        (WebCore::shouldUseAccessibilityObjectInnerText):
     27        * accessibility/AccessibilityObject.cpp:
     28        (WebCore::AccessibilityObject::modelElementChildren):
     29        * accessibility/AccessibilityObject.h:
     30        * accessibility/AccessibilityObjectInterface.h:
     31        (WebCore::accessibilityRoleToString):
     32        (WebCore::AXCoreObject::isModel const):
     33        * accessibility/AccessibilityRenderObject.cpp:
     34        (WebCore::AccessibilityRenderObject::determineAccessibilityRole):
     35        (WebCore::AccessibilityRenderObject::addChildren):
     36        * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
     37        (-[WebAccessibilityObjectWrapper accessibilityElements]):
     38        (-[WebAccessibilityObjectWrapper determineIsAccessibilityElement]):
     39        * accessibility/isolatedtree/AXIsolatedObject.cpp:
     40        (WebCore::AXIsolatedObject::modelElementChildren):
     41        * accessibility/isolatedtree/AXIsolatedObject.h:
     42        * accessibility/mac/AccessibilityObjectMac.mm:
     43        (WebCore::Accessibility::createPlatformRoleMap):
     44        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
     45        (-[WebAccessibilityObjectWrapper subrole]):
     46        (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
     47        (-[WebAccessibilityObjectWrapper accessibilityIndexOfChild:]):
     48        (-[WebAccessibilityObjectWrapper accessibilityArrayAttributeCount:]):
     49        (-[WebAccessibilityObjectWrapper accessibilityArrayAttributeValues:index:maxCount:]):
     50
    1512021-12-01  Myles C. Maxfield  <mmaxfield@apple.com>
    252
  • trunk/Source/WebCore/Modules/model-element/HTMLModelElement.cpp

    r286317 r286406  
    553553}
    554554
     555#if PLATFORM(COCOA)
     556Vector<RetainPtr<id>> HTMLModelElement::accessibilityChildren()
     557{
     558    if (!m_modelPlayer)
     559        return { };
     560    return m_modelPlayer->accessibilityChildren();
     561}
     562#endif
     563
    555564}
    556565
  • trunk/Source/WebCore/Modules/model-element/HTMLModelElement.h

    r286317 r286406  
    9898    bool isDraggableIgnoringAttributes() const final { return true; }
    9999
     100#if PLATFORM(COCOA)
     101    Vector<RetainPtr<id>> accessibilityChildren();
     102#endif
     103   
    100104private:
    101105    HTMLModelElement(const QualifiedName&, Document&);
  • trunk/Source/WebCore/Modules/model-element/ModelPlayer.h

    r286317 r286406  
    6363    virtual void isMuted(CompletionHandler<void(std::optional<bool>&&)>&&) = 0;
    6464    virtual void setIsMuted(bool, CompletionHandler<void(bool success)>&&) = 0;
     65#if PLATFORM(COCOA)
     66    virtual Vector<RetainPtr<id>> accessibilityChildren() = 0;
     67#endif
    6568};
    6669
  • trunk/Source/WebCore/Modules/model-element/dummy/DummyModelPlayer.cpp

    r286317 r286406  
    119119}
    120120
     121#if PLATFORM(COCOA)
     122Vector<RetainPtr<id>> DummyModelPlayer::accessibilityChildren()
     123{
     124    return { };
    121125}
     126#endif
     127
     128}
  • trunk/Source/WebCore/Modules/model-element/dummy/DummyModelPlayer.h

    r286317 r286406  
    6060    void isMuted(CompletionHandler<void(std::optional<bool>&&)>&&) override;
    6161    void setIsMuted(bool, CompletionHandler<void(bool success)>&&) override;
     62#if PLATFORM(COCOA)
     63    Vector<RetainPtr<id>> accessibilityChildren() override;
     64#endif
    6265
    6366    WeakPtr<ModelPlayerClient> m_client;
  • trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.h

    r286317 r286406  
    7474    void isMuted(CompletionHandler<void(std::optional<bool>&&)>&&) override;
    7575    void setIsMuted(bool, CompletionHandler<void(bool success)>&&) override;
     76    Vector<RetainPtr<id>> accessibilityChildren() override;
    7677
    7778    // SceneKitModelLoaderClient overrides.
  • trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.mm

    r286317 r286406  
    3333#import "SceneKitModelLoader.h"
    3434#import <pal/spi/cocoa/SceneKitSPI.h>
     35#import <wtf/cocoa/VectorCocoa.h>
     36
     37static std::optional<RetainPtr<id>> makeVectorElement(const RetainPtr<id>*, id arrayElement)
     38{
     39    return { retainPtr(arrayElement) };
     40}
    3541
    3642namespace WebCore {
     
    171177}
    172178
     179Vector<RetainPtr<id>> SceneKitModelPlayer::accessibilityChildren()
     180{
     181#if PLATFORM(IOS_FAMILY)
     182    NSArray *children = [m_model->defaultScene() accessibilityElements];
     183#else
     184    ALLOW_DEPRECATED_DECLARATIONS_BEGIN
     185    NSArray *children = [m_model->defaultScene() accessibilityAttributeValue:NSAccessibilityChildrenAttribute];
     186    ALLOW_DEPRECATED_DECLARATIONS_END
     187#endif
     188    return makeVector<RetainPtr<id>>(children);
     189}
     190
    173191}
    174192
  • trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp

    r285092 r286406  
    12771277bool AccessibilityNodeObject::usesAltTagForTextComputation() const
    12781278{
    1279     return isImage() || isInputImage() || isNativeImage() || isCanvas() || (node() && node()->hasTagName(imgTag));
     1279    bool usesAltTag = isImage() || isInputImage() || isNativeImage() || isCanvas() || (node() && node()->hasTagName(imgTag));
     1280#if ENABLE(MODEL_ELEMENT)
     1281    usesAltTag |= isModel();
     1282#endif
     1283    return usesAltTag;
    12801284}
    12811285
     
    17561760        return false;
    17571761
     1762#if ENABLE(MODEL_ELEMENT)
     1763    if (obj->isModel())
     1764        return false;
     1765#endif
     1766
    17581767    return true;
    17591768}
  • trunk/Source/WebCore/accessibility/AccessibilityObject.cpp

    r286116 r286406  
    5757#include "HTMLInputElement.h"
    5858#include "HTMLMediaElement.h"
     59#include "HTMLModelElement.h"
    5960#include "HTMLNames.h"
    6061#include "HTMLParserIdioms.h"
     
    13161317    return true;
    13171318}
     1319
     1320#if PLATFORM(COCOA) && ENABLE(MODEL_ELEMENT)
     1321Vector<RetainPtr<id>> AccessibilityObject::modelElementChildren()
     1322{
     1323    Node* node = this->node();
     1324    if (!is<HTMLModelElement>(node))
     1325        return { };
     1326   
     1327    return downcast<HTMLModelElement>(node)->accessibilityChildren();
     1328}
     1329#endif
    13181330
    13191331// Finds a RenderListItem parent give a node.
  • trunk/Source/WebCore/accessibility/AccessibilityObject.h

    r286116 r286406  
    824824    std::optional<SimpleRange> visibleCharacterRange() const override;
    825825
     826#if PLATFORM(COCOA) && ENABLE(MODEL_ELEMENT)
     827    Vector<RetainPtr<id>> modelElementChildren() override;
     828#endif
     829   
    826830protected: // FIXME: Make the data members private.
    827831    bool childrenInitialized() const { return m_childrenInitialized; }
  • trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h

    r286116 r286406  
    201201    MenuListOption,
    202202    Meter,
     203    Model,
    203204    Outline,
    204205    Paragraph,
     
    448449    case AccessibilityRole::Meter:
    449450        return "Meter";
     451    case AccessibilityRole::Model:
     452        return "Model";
    450453    case AccessibilityRole::Outline:
    451454        return "Outline";
     
    957960    bool isSummary() const { return roleValue() == AccessibilityRole::Summary; }
    958961    bool isBlockquote() const { return roleValue() == AccessibilityRole::Blockquote; }
     962#if ENABLE(MODEL_ELEMENT)
     963    bool isModel() const { return roleValue() == AccessibilityRole::Model; }
     964#endif
    959965
    960966    virtual bool isLandmark() const = 0;
     
    15341540    virtual String outerHTML() const = 0;
    15351541
     1542   
     1543#if PLATFORM(COCOA) && ENABLE(MODEL_ELEMENT)
     1544    virtual Vector<RetainPtr<id>> modelElementChildren() = 0;
     1545#endif
     1546   
    15361547private:
    15371548    // Detaches this object from the objects it references and it is referenced by.
  • trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp

    r286392 r286406  
    29552955        return AccessibilityRole::Canvas;
    29562956
     2957#if ENABLE(MODEL_ELEMENT)
     2958    if (node && node->hasTagName(modelTag))
     2959        return AccessibilityRole::Model;
     2960#endif
     2961
    29572962    if (cssBox && cssBox->isRenderView())
    29582963        return AccessibilityRole::WebArea;
     
    35273532    addCanvasChildren();
    35283533    addRemoteSVGChildren();
    3529    
     3534
    35303535#if PLATFORM(COCOA)
    35313536    updateAttachmentViewParents();
  • trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm

    r286116 r286406  
    417417            [array addObject:wrapper];
    418418    }
     419   
     420#if ENABLE(MODEL_ELEMENT)
     421    if (self.axBackingObject->isModel()) {
     422        for (auto child : self.axBackingObject->modelElementChildren())
     423            [array addObject:child.get()];
     424    }
     425#endif
    419426
    420427    return array.autorelease();
     
    10401047    case AccessibilityRole::MenuListPopup:
    10411048    case AccessibilityRole::MenuListOption:
     1049    case AccessibilityRole::Model:
    10421050    case AccessibilityRole::Outline:
    10431051    case AccessibilityRole::Paragraph:
  • trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp

    r286116 r286406  
    14781478}
    14791479
     1480#if PLATFORM(COCOA) && ENABLE(MODEL_ELEMENT)
     1481Vector<RetainPtr<id>> AXIsolatedObject::modelElementChildren()
     1482{
     1483    return Accessibility::retrieveValueFromMainThread<Vector<RetainPtr<id>>>([this] () -> Vector<RetainPtr<id>> {
     1484        if (auto* object = associatedAXObject())
     1485            return object->modelElementChildren();
     1486        return { };
     1487    });
     1488}
     1489#endif
     1490
    14801491FloatRect AXIsolatedObject::unobscuredContentRect() const
    14811492{
  • trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h

    r286116 r286406  
    664664    void setIsIgnoredFromParentDataForChild(AXCoreObject*) override;
    665665
     666#if PLATFORM(COCOA) && ENABLE(MODEL_ELEMENT)
     667    Vector<RetainPtr<id>> modelElementChildren() override;
     668#endif
     669   
    666670    void updateBackingStore() override;
    667671
  • trunk/Source/WebCore/accessibility/mac/AccessibilityObjectMac.mm

    r284335 r286406  
    470470        { AccessibilityRole::Subscript, NSAccessibilityGroupRole },
    471471        { AccessibilityRole::Superscript, NSAccessibilityGroupRole },
     472        { AccessibilityRole::Model, NSAccessibilityGroupRole },
    472473    };
    473474    PlatformRoleMap roleMap;
  • trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm

    r286116 r286406  
    18511851        return @"AXMeter";
    18521852
     1853#if ENABLE(MODEL_ELEMENT)
     1854    if (backingObject->isModel())
     1855        return @"AXModel";
     1856#endif
     1857
    18531858    // Treat any group without exposed children as empty.
    18541859    if ([[self role] isEqual:NSAccessibilityGroupRole] && !backingObject->children().size() && ![[self renderWidgetChildren] count])
     
    21902195
    21912196    if ([attributeName isEqualToString:NSAccessibilityChildrenAttribute] || [attributeName isEqualToString:NSAccessibilityChildrenInNavigationOrderAttribute]) {
     2197#if ENABLE(MODEL_ELEMENT)
     2198        if (backingObject->isModel()) {
     2199            auto modelChildren = backingObject->modelElementChildren();
     2200            if (modelChildren.size()) {
     2201                return createNSArray(modelChildren, [] (auto& child) -> id {
     2202                    return child.get();
     2203                }).autorelease();
     2204            }
     2205        }
     2206#endif
     2207
    21922208        if (!self.childrenVectorSize) {
    21932209            if (NSArray *children = [self renderWidgetChildren])
     
    43354351
    43364352    NSArray *children = self.childrenVectorArray;
    4337     if (!children.count)
    4338         return [[self renderWidgetChildren] indexOfObject:child];
     4353    if (!children.count) {
     4354        if (auto *renderWidgetChildren = [self renderWidgetChildren])
     4355            return [renderWidgetChildren indexOfObject:child];
     4356#if ENABLE(MODEL_ELEMENT)
     4357        if (backingObject->isModel())
     4358            return backingObject->modelElementChildren().find(child);
     4359#endif
     4360    }
    43394361
    43404362    NSUInteger count = [children count];
     
    43664388
    43674389        auto childrenSize = self.childrenVectorSize;
    4368         if (!childrenSize)
    4369             return [[self renderWidgetChildren] count];
    4370 
     4390        if (!childrenSize) {
     4391#if ENABLE(MODEL_ELEMENT)
     4392            if (backingObject->isModel())
     4393                return backingObject->modelElementChildren().size();
     4394#endif
     4395            if (NSArray *renderWidgetChildren = [self renderWidgetChildren])
     4396                return [renderWidgetChildren count];
     4397        }
    43714398        return childrenSize;
    43724399    }
     
    43854412    if ([attribute isEqualToString:NSAccessibilityChildrenAttribute]) {
    43864413        if (!self.childrenVectorSize) {
    4387             NSArray *children = [self renderWidgetChildren];
     4414            NSArray *children = nil;
     4415#if ENABLE(MODEL_ELEMENT)
     4416            if (backingObject->isModel()) {
     4417                children = createNSArray(backingObject->modelElementChildren(), [] (auto& child) -> id {
     4418                    return child.get();
     4419                }).autorelease();
     4420            } else
     4421#endif
     4422                children = [self renderWidgetChildren];
     4423           
    43884424            if (!children)
    43894425                return nil;
  • trunk/Source/WebKit/ChangeLog

    r286402 r286406  
     12021-12-01  Chris Fleizach  <cfleizach@apple.com>
     2
     3        AX: Support accessibility attributes for <model>
     4        https://bugs.webkit.org/show_bug.cgi?id=233620
     5        <rdar://problem/85852073>
     6
     7        Reviewed by Dean Jackson, Andres Gonzalez.
     8
     9        * WebProcess/Model/ARKitInlinePreviewModelPlayer.h:
     10        * WebProcess/Model/ARKitInlinePreviewModelPlayer.mm:
     11        (WebKit::ARKitInlinePreviewModelPlayer::accessibilityChildren):
     12
    1132021-12-01  Alex Christensen  <achristensen@webkit.org>
    214
  • trunk/Source/WebKit/WebProcess/Model/ARKitInlinePreviewModelPlayer.h

    r286317 r286406  
    6666    void isMuted(CompletionHandler<void(std::optional<bool>&&)>&&) override;
    6767    void setIsMuted(bool, CompletionHandler<void(bool success)>&&) override;
     68    Vector<RetainPtr<id>> accessibilityChildren() override;
    6869
    6970    WeakPtr<WebPage> m_page;
  • trunk/Source/WebKit/WebProcess/Model/ARKitInlinePreviewModelPlayer.mm

    r286317 r286406  
    343343}
    344344
     345Vector<RetainPtr<id>> ARKitInlinePreviewModelPlayer::accessibilityChildren()
     346{
     347    // FIXME: https://webkit.org/b/233575 Need to return something to create a remote element connection to the InlinePreviewModel hosted in another process.
     348    return { };
     349}
     350
    345351}
    346352
Note: See TracChangeset for help on using the changeset viewer.