AXIsolatedObject support for spin button increment/decrementButton.
authorandresg_22@apple.com <andresg_22@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 18 Dec 2019 21:47:05 +0000 (21:47 +0000)
committerandresg_22@apple.com <andresg_22@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 18 Dec 2019 21:47:05 +0000 (21:47 +0000)
https://bugs.webkit.org/show_bug.cgi?id=205356

Reviewed by Chris Fleizach.

Several LayoutTests exercise this functionality.

- Exposed increment/decrementButton in AXCoreObject in order to
properly support it in AXIsolatedObject.
- Used AXCoreObject::increment/decrementButton in the wrapper instead
of downcasting to an implementation class, which does not work for an
isolated object.
- Implemented AXIsolatedObject::isDetachedFromParent.
- Fixed initialization of AXIsolatedObject::m_parent and m_id.

* accessibility/AccessibilityObject.h:
* accessibility/AccessibilityObjectInterface.h:
* accessibility/AccessibilitySpinButton.h:
* accessibility/isolatedtree/AXIsolatedTreeNode.cpp:
(WebCore::AXIsolatedObject::initializeAttributeData):
(WebCore::AXIsolatedObject::isDetachedFromParent):
(WebCore::AXIsolatedObject::isAccessibilityScrollView const):
* accessibility/isolatedtree/AXIsolatedTreeNode.h:
* accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):

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

Source/WebCore/ChangeLog
Source/WebCore/accessibility/AccessibilityObject.h
Source/WebCore/accessibility/AccessibilityObjectInterface.h
Source/WebCore/accessibility/AccessibilitySpinButton.h
Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.cpp
Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.h
Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm

index 442b92e..02175c7 100644 (file)
@@ -1,3 +1,31 @@
+2019-12-18  Andres Gonzalez  <andresg_22@apple.com>
+
+        AXIsolatedObject support for spin button increment/decrementButton.
+        https://bugs.webkit.org/show_bug.cgi?id=205356
+
+        Reviewed by Chris Fleizach.
+
+        Several LayoutTests exercise this functionality.
+
+        - Exposed increment/decrementButton in AXCoreObject in order to
+        properly support it in AXIsolatedObject.
+        - Used AXCoreObject::increment/decrementButton in the wrapper instead
+        of downcasting to an implementation class, which does not work for an
+        isolated object.
+        - Implemented AXIsolatedObject::isDetachedFromParent.
+        - Fixed initialization of AXIsolatedObject::m_parent and m_id.
+
+        * accessibility/AccessibilityObject.h:
+        * accessibility/AccessibilityObjectInterface.h:
+        * accessibility/AccessibilitySpinButton.h:
+        * accessibility/isolatedtree/AXIsolatedTreeNode.cpp:
+        (WebCore::AXIsolatedObject::initializeAttributeData):
+        (WebCore::AXIsolatedObject::isDetachedFromParent):
+        (WebCore::AXIsolatedObject::isAccessibilityScrollView const):
+        * accessibility/isolatedtree/AXIsolatedTreeNode.h:
+        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+        (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
+
 2019-12-18  Zalan Bujtas  <zalan@apple.com>
 
         [LFC][IFC] LineLayoutContext::m_uncommittedList is not always a continuous list of runs
index 162e7c0..7c5979e 100644 (file)
@@ -164,6 +164,8 @@ public:
     bool isMenuListPopup() const override { return false; }
     bool isMenuListOption() const override { return false; }
     bool isNativeSpinButton() const override { return false; }
+    AXCoreObject* incrementButton() override { return nullptr; }
+    AXCoreObject* decrementButton() override { return nullptr; }
     bool isSpinButtonPart() const override { return false; }
     bool isMockObject() const override { return false; }
     virtual bool isMediaControlLabel() const { return false; }
index ff44f77..419cdae 100644 (file)
@@ -535,9 +535,14 @@ public:
     virtual bool isMenuList() const = 0;
     virtual bool isMenuListPopup() const = 0;
     virtual bool isMenuListOption() const = 0;
+
+    // Native spin buttons.
     bool isSpinButton() const { return roleValue() == AccessibilityRole::SpinButton; }
     virtual bool isNativeSpinButton() const = 0;
+    virtual AXCoreObject* incrementButton() = 0;
+    virtual AXCoreObject* decrementButton() = 0;
     virtual bool isSpinButtonPart() const = 0;
+
     virtual bool isMockObject() const = 0;
     virtual bool isMediaObject() const = 0;
     bool isSwitch() const { return roleValue() == AccessibilityRole::Switch; }
index 1a2dc96..99d0bd4 100644 (file)
@@ -37,8 +37,8 @@ public:
     
     void setSpinButtonElement(SpinButtonElement* spinButton) { m_spinButtonElement = spinButton; }
     
-    AXCoreObject* incrementButton();
-    AXCoreObject* decrementButton();
+    AXCoreObject* incrementButton() override;
+    AXCoreObject* decrementButton() override;
 
     void step(int amount);
     
index f5b0dea..17903f3 100644 (file)
@@ -270,6 +270,9 @@ void AXIsolatedObject::initializeAttributeData(AXCoreObject& object, bool isRoot
     }
     setProperty(AXPropertyName::AccessibilityText, isolatedTexts);
 
+    setObjectProperty(AXPropertyName::DecrementButton, object.decrementButton());
+    setObjectProperty(AXPropertyName::IncrementButton, object.incrementButton());
+
     Vector<String> classList;
     object.classList(classList);
     String combinedClassList;
@@ -425,8 +428,7 @@ const AXCoreObject::AccessibilityChildrenVector& AXIsolatedObject::children(bool
 
 bool AXIsolatedObject::isDetachedFromParent()
 {
-    ASSERT_NOT_REACHED();
-    return false;
+    return parent() == InvalidAXID && tree()->rootNode()->objectID() != m_id;
 }
 
 void AXIsolatedObject::accessibilityText(Vector<AccessibilityText>& texts) const
@@ -757,7 +759,9 @@ bool AXIsolatedObject::isAccessibilityScrollbar() const
 
 bool AXIsolatedObject::isAccessibilityScrollView() const
 {
-    ASSERT_NOT_REACHED();
+    // FIXME: this should be ASSERT_NOT_REACHED, but it is called by
+    // AXObjectCache::rootWebArea, that in turn is called by
+    // AXObjectCache::postTextStateChangePlatformNotification.
     return false;
 }
 
index aea8fc1..6eb31a0 100644 (file)
@@ -112,6 +112,7 @@ private:
         CurrentState,
         CurrentValue,
         DatetimeAttributeValue,
+        DecrementButton,
         Description,
         DocumentEncoding,
         DocumentURI,
@@ -131,6 +132,7 @@ private:
         HorizontalScrollBar,
         IdentifierAttribute,
         InvalidStatus,
+        IncrementButton,
         IsAccessibilityIgnored,
         IsActiveDescendantOfFocusedContainer,
         IsAnonymousMathOperator,
@@ -520,6 +522,8 @@ private:
     bool liveRegionAtomic() const override { return boolAttributeValue(AXPropertyName::LiveRegionAtomic); }
     bool isBusy() const override { return boolAttributeValue(AXPropertyName::IsBusy); }
     bool isInlineText() const override { return boolAttributeValue(AXPropertyName::IsInlineText); }
+    AXCoreObject* incrementButton() override { return objectAttributeValue(AXPropertyName::IncrementButton); }
+    AXCoreObject* decrementButton() override { return objectAttributeValue(AXPropertyName::DecrementButton); }
 
     // Parameterized attribute retrieval.
     Vector<RefPtr<Range>> findTextRanges(AccessibilitySearchTextCriteria const&) const override;
@@ -794,8 +798,8 @@ private:
     void updateBackingStore() override;
     void setWrapper(AccessibilityObjectWrapper* wrapper) override { m_wrapper = wrapper; }
     
-    AXID m_parent;
-    AXID m_id;
+    AXID m_parent { InvalidAXID };
+    AXID m_id { InvalidAXID };
     bool m_initialized { false };
     AXIsolatedTreeID m_treeIdentifier;
     RefPtr<AXIsolatedTree> m_cachedTree;
index becbcfe..6f28617 100644 (file)
@@ -2528,14 +2528,16 @@ ALLOW_DEPRECATED_IMPLEMENTATIONS_END
         return (NSURL*)url;
     }
 
-    // Only native spin buttons have increment and decrement buttons.
-    if (is<AccessibilitySpinButton>(*m_object)) {
-        if ([attributeName isEqualToString:NSAccessibilityIncrementButtonAttribute])
-            return downcast<AccessibilitySpinButton>(*m_object).incrementButton()->wrapper();
-        if ([attributeName isEqualToString:NSAccessibilityDecrementButtonAttribute])
-            return downcast<AccessibilitySpinButton>(*m_object).decrementButton()->wrapper();
+    if ([attributeName isEqualToString:NSAccessibilityIncrementButtonAttribute]) {
+        auto incrementButton = m_object->incrementButton();
+        return incrementButton ? incrementButton->wrapper() : nil;
     }
-    
+
+    if ([attributeName isEqualToString:NSAccessibilityDecrementButtonAttribute]) {
+        auto decrementButton = m_object->decrementButton();
+        return decrementButton ? decrementButton->wrapper() : nil;
+    }
+
     if ([attributeName isEqualToString: @"AXVisited"])
         return [NSNumber numberWithBool: m_object->isVisited()];