⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 285859 in webkit


Ignore:
Timestamp:
Nov 16, 2021, 6:38:18 AM (5 years ago)
Author:
commit-queue@webkit.org
Message:

AX: Stop returning AccessibilityUIElements backed by a null pointer
https://bugs.webkit.org/show_bug.cgi?id=233138

Patch by Tyler Wilcock <Tyler Wilcock> on 2021-11-16
Reviewed by Andres Gonzalez.

Prior to this patch, some callers of AccessibilityUIElement::create
passed null ids, resulting in a seemingly valid AccessibilityUIElement
that is actually backed by a null pointer. This makes writing tests harder,
since you can't rely on common operations like !myElement to do the right thing.

With this patch, we add a RELEASE_ASSERT to
AccessibilityUIElement::create requiring the passed pointer to be
valid. This patch also fixes up some callsites where we could (and did) pass null pointers.

  • WebKitTestRunner/InjectedBundle/atk/AccessibilityControllerAtk.cpp:

(WTR::AccessibilityController::focusedElement):

  • WebKitTestRunner/InjectedBundle/win/AccessibilityControllerWin.cpp:

(WTR::AccessibilityController::focusedElement):

  • WebKitTestRunner/InjectedBundle/AccessibilityController.cpp:

(WTR::AccessibilityController::focusedElement):
Return RefPtr instead of Ref, since it's possible that no element is
focused.

  • WebKitTestRunner/InjectedBundle/AccessibilityController.h:
  • WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp:

(WTR::AccessibilityUIElement::create):
Add RELEASE_ASSERT() to verify passed pointer is valid.

  • WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:

(WTR::AccessibilityUIElement::focusedElement const):
(WTR::AccessibilityUIElement::uiElementForSearchPredicate):

  • WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.mm:

(-[AccessibilityNotificationHandler _notificationReceived:]):

  • WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:

(WTR::AccessibilityUIElement::uiElementAttributeValue const):
(WTR::AccessibilityUIElement::uiElementForSearchPredicate):
(WTR::AccessibilityUIElement::cellForColumnAndRow):
(WTR::AccessibilityUIElement::horizontalScrollbar const):
(WTR::AccessibilityUIElement::verticalScrollbar const):
Don't call AccessibilityUIElement::create with null pointers.

Location:
trunk/Tools
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r285819 r285859  
     12021-11-16  Tyler Wilcock  <tyler_w@apple.com>
     2
     3        AX: Stop returning AccessibilityUIElements backed by a null pointer
     4        https://bugs.webkit.org/show_bug.cgi?id=233138
     5
     6        Reviewed by Andres Gonzalez.
     7
     8        Prior to this patch, some callers of AccessibilityUIElement::create
     9        passed null `id`s, resulting in a seemingly valid AccessibilityUIElement
     10        that is actually backed by a null pointer. This makes writing tests harder,
     11        since you can't rely on common operations like `!myElement` to do the right thing.
     12
     13        With this patch, we add a RELEASE_ASSERT to
     14        AccessibilityUIElement::create requiring the passed pointer to be
     15        valid. This patch also fixes up some callsites where we could (and did) pass null pointers.
     16
     17        * WebKitTestRunner/InjectedBundle/atk/AccessibilityControllerAtk.cpp:
     18        (WTR::AccessibilityController::focusedElement):
     19        * WebKitTestRunner/InjectedBundle/win/AccessibilityControllerWin.cpp:
     20        (WTR::AccessibilityController::focusedElement):
     21        * WebKitTestRunner/InjectedBundle/AccessibilityController.cpp:
     22        (WTR::AccessibilityController::focusedElement):
     23        Return RefPtr instead of Ref, since it's possible that no element is
     24        focused.
     25
     26        * WebKitTestRunner/InjectedBundle/AccessibilityController.h:
     27        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp:
     28        (WTR::AccessibilityUIElement::create):
     29        Add RELEASE_ASSERT() to verify passed pointer is valid.
     30
     31        * WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:
     32        (WTR::AccessibilityUIElement::focusedElement const):
     33        (WTR::AccessibilityUIElement::uiElementForSearchPredicate):
     34        * WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.mm:
     35        (-[AccessibilityNotificationHandler _notificationReceived:]):
     36        * WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:
     37        (WTR::AccessibilityUIElement::uiElementAttributeValue const):
     38        (WTR::AccessibilityUIElement::uiElementForSearchPredicate):
     39        (WTR::AccessibilityUIElement::cellForColumnAndRow):
     40        (WTR::AccessibilityUIElement::horizontalScrollbar const):
     41        (WTR::AccessibilityUIElement::verticalScrollbar const):
     42        Don't call AccessibilityUIElement::create with null pointers.
     43
    1442021-11-15  Michael Catanzaro  <mcatanzaro@gnome.org>
    245
  • trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.cpp

    r285671 r285859  
    9191}
    9292
    93 Ref<AccessibilityUIElement> AccessibilityController::focusedElement()
     93RefPtr<AccessibilityUIElement> AccessibilityController::focusedElement()
    9494{
    9595    auto page = InjectedBundle::singleton().page()->page();
    9696    auto root = static_cast<PlatformUIElement>(WKAccessibilityRootObject(page));
    9797    auto rootElement = AccessibilityUIElement::create(root);
    98     if (auto focusedElement = rootElement->focusedElement())
    99         return *focusedElement;
    100     return AccessibilityUIElement::create(nullptr);
     98    return rootElement->focusedElement();
    10199}
    102100
  • trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h

    r285671 r285859  
    6464#if HAVE(ACCESSIBILITY)
    6565    Ref<AccessibilityUIElement> rootElement();
    66     Ref<AccessibilityUIElement> focusedElement();
     66    RefPtr<AccessibilityUIElement> focusedElement();
    6767#endif
    6868    RefPtr<AccessibilityUIElement> elementAtPoint(int x, int y);
  • trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp

    r285589 r285859  
    3636Ref<AccessibilityUIElement> AccessibilityUIElement::create(PlatformUIElement uiElement)
    3737{
     38    RELEASE_ASSERT(uiElement);
    3839    return adoptRef(*new AccessibilityUIElement(uiElement));
    3940}
  • trunk/Tools/WebKitTestRunner/InjectedBundle/atk/AccessibilityControllerAtk.cpp

    r282643 r285859  
    113113}
    114114
    115 Ref<AccessibilityUIElement> AccessibilityController::focusedElement()
     115RefPtr<AccessibilityUIElement> AccessibilityController::focusedElement()
    116116{
    117117    WKBundlePageRef page = InjectedBundle::singleton().page()->page();
  • trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm

    r285589 r285859  
    636636RefPtr<AccessibilityUIElement> AccessibilityUIElement::focusedElement() const
    637637{
    638     return AccessibilityUIElement::create([m_element accessibilityFocusedUIElement]);
     638    if (id focusedUIElement = [m_element accessibilityFocusedUIElement])
     639        return AccessibilityUIElement::create(focusedUIElement);
     640    return nullptr;
    639641}
    640642
     
    766768{
    767769    NSDictionary *parameterizedAttribute = searchPredicateParameterizedAttributeForSearchCriteria(context, startElement, isDirectionNext, 5, searchKey, searchText, visibleOnly, immediateDescendantsOnly);
    768     id value = [m_element accessibilityFindMatchingObjects:parameterizedAttribute];
    769     if (![value isKindOfClass:[NSArray class]])
     770    id results = [m_element accessibilityFindMatchingObjects:parameterizedAttribute];
     771    if (![results isKindOfClass:[NSArray class]])
    770772        return nullptr;
    771     for (id element in value) {
     773
     774    for (id element in results) {
    772775        if ([element isAccessibilityElement])
    773776            return AccessibilityUIElement::create(element);
    774777    }
    775     return AccessibilityUIElement::create([value firstObject]);
     778
     779    if (id firstResult = [results firstObject])
     780        return AccessibilityUIElement::create(firstResult);
     781    return nullptr;
    776782}
    777783
  • trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.mm

    r261081 r285859  
    128128        // A global listener gets the element, notification name and userInfo.
    129129        JSValueRef arguments[3];
    130         arguments[0] = toJS(context, WTR::AccessibilityUIElement::create([notification object]).ptr());
     130        id notificationObject = [notification object];
     131        arguments[0] = toJS(context, notificationObject ? WTR::AccessibilityUIElement::create(notificationObject).ptr() : nullptr);
    131132        arguments[1] = notificationNameArgument;
    132133        arguments[2] = userInfoArgument;
  • trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm

    r285677 r285859  
    618618RefPtr<AccessibilityUIElement> AccessibilityUIElement::uiElementAttributeValue(JSStringRef attribute) const
    619619{
    620     auto value = attributeValue([NSString stringWithJSStringRef:attribute]);
    621     return AccessibilityUIElement::create(value.get());
     620    if (auto value = attributeValue([NSString stringWithJSStringRef:attribute]))
     621        return AccessibilityUIElement::create(value.get());
     622    return nullptr;
    622623}
    623624
     
    12421243    BEGIN_AX_OBJC_EXCEPTIONS
    12431244    NSDictionary *parameterizedAttribute = searchPredicateParameterizedAttributeForSearchCriteria(context, startElement, isDirectionNext, 1, searchKey, searchText, visibleOnly, immediateDescendantsOnly);
    1244     id value = [m_element accessibilityAttributeValue:@"AXUIElementsForSearchPredicate" forParameter:parameterizedAttribute];
    1245     if ([value isKindOfClass:[NSArray class]])
    1246         return AccessibilityUIElement::create([value lastObject]);
     1245    id searchResults = [m_element accessibilityAttributeValue:@"AXUIElementsForSearchPredicate" forParameter:parameterizedAttribute];
     1246    if ([searchResults isKindOfClass:[NSArray class]]) {
     1247        if (id lastResult = [searchResults lastObject])
     1248            return AccessibilityUIElement::create(lastResult);
     1249    }
    12471250    END_AX_OBJC_EXCEPTIONS
    12481251   
     
    14111414    NSArray *colRowArray = @[@(col), @(row)];
    14121415    BEGIN_AX_OBJC_EXCEPTIONS
    1413     return AccessibilityUIElement::create([m_element accessibilityAttributeValue:@"AXCellForColumnAndRow" forParameter:colRowArray]);
     1416    if (id cell = [m_element accessibilityAttributeValue:@"AXCellForColumnAndRow" forParameter:colRowArray])
     1417        return AccessibilityUIElement::create(cell);
    14141418    END_AX_OBJC_EXCEPTIONS   
    14151419
     
    14231427
    14241428    BEGIN_AX_OBJC_EXCEPTIONS
    1425     return AccessibilityUIElement::create(attributeValue(NSAccessibilityHorizontalScrollBarAttribute).get());
     1429    if (id scrollbar = attributeValue(NSAccessibilityHorizontalScrollBarAttribute).get())
     1430        return AccessibilityUIElement::create(scrollbar);
    14261431    END_AX_OBJC_EXCEPTIONS   
    14271432
     
    14351440
    14361441    BEGIN_AX_OBJC_EXCEPTIONS
    1437     return AccessibilityUIElement::create(attributeValue(NSAccessibilityVerticalScrollBarAttribute).get());
     1442    if (id scrollbar = attributeValue(NSAccessibilityVerticalScrollBarAttribute).get())
     1443        return AccessibilityUIElement::create(scrollbar);
    14381444    END_AX_OBJC_EXCEPTIONS       
    14391445
  • trunk/Tools/WebKitTestRunner/InjectedBundle/win/AccessibilityControllerWin.cpp

    r277971 r285859  
    6262}
    6363
    64 Ref<AccessibilityUIElement> AccessibilityController::focusedElement()
     64RefPtr<AccessibilityUIElement> AccessibilityController::focusedElement()
    6565{
    6666    notImplemented();
    67     return AccessibilityUIElement::create(nullptr);
     67    return nullptr;
    6868}
    6969
Note: See TracChangeset for help on using the changeset viewer.