Support boundingBoxRect and elementRect in AXIsolatedObject.
authorandresg_22@apple.com <andresg_22@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 21 Nov 2019 14:12:58 +0000 (14:12 +0000)
committerandresg_22@apple.com <andresg_22@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 21 Nov 2019 14:12:58 +0000 (14:12 +0000)
https://bugs.webkit.org/show_bug.cgi?id=204431

Reviewed by Chris Fleizach.

- Implementation of boundingBoxRect and elementRect in AXIsolatedObject.
- Templatized rectAttributeValue generalize retrieval of cached rects for different types of rects.

* accessibility/AccessibilityObject.h:
* accessibility/AccessibilityObjectInterface.h:
(WebCore::AXCoreObject::pixelSnappedBoundingBoxRect const): Moved from AccessibilityObject.
(WebCore::AXCoreObject::size const): Moved from AccessibilityObject.
* accessibility/isolatedtree/AXIsolatedTreeNode.cpp:
(WebCore::AXIsolatedObject::initializeAttributeData): Caching of boundingBox and element rects.
(WebCore::AXIsolatedObject::rectAttributeValue const): Templatized version.
* accessibility/isolatedtree/AXIsolatedTreeNode.h:

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

Source/WebCore/ChangeLog
Source/WebCore/accessibility/AccessibilityObject.h
Source/WebCore/accessibility/AccessibilityObjectInterface.h
Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.cpp
Source/WebCore/accessibility/isolatedtree/AXIsolatedTreeNode.h

index b913d50..4450ce6 100644 (file)
@@ -1,3 +1,22 @@
+2019-11-21  Andres Gonzalez  <andresg_22@apple.com>
+
+        Support boundingBoxRect and elementRect in AXIsolatedObject.
+        https://bugs.webkit.org/show_bug.cgi?id=204431
+
+        Reviewed by Chris Fleizach.
+
+        - Implementation of boundingBoxRect and elementRect in AXIsolatedObject.
+        - Templatized rectAttributeValue generalize retrieval of cached rects for different types of rects.
+
+        * accessibility/AccessibilityObject.h:
+        * accessibility/AccessibilityObjectInterface.h:
+        (WebCore::AXCoreObject::pixelSnappedBoundingBoxRect const): Moved from AccessibilityObject.
+        (WebCore::AXCoreObject::size const): Moved from AccessibilityObject.
+        * accessibility/isolatedtree/AXIsolatedTreeNode.cpp:
+        (WebCore::AXIsolatedObject::initializeAttributeData): Caching of boundingBox and element rects.
+        (WebCore::AXIsolatedObject::rectAttributeValue const): Templatized version.
+        * accessibility/isolatedtree/AXIsolatedTreeNode.h:
+
 2019-11-20  Conrad Shultz  <conrad_shultz@apple.com>
 
         Crash at com.apple.WebCore: -[WebRevealHighlight revealContext:drawRectsForItem:]
index fd10179..4cbdf7f 100644 (file)
@@ -440,9 +440,7 @@ public:
     bool supportsPressAction() const override;
     Element* actionElement() const override { return nullptr; }
     LayoutRect boundingBoxRect() const override { return LayoutRect(); }
-    IntRect pixelSnappedBoundingBoxRect() const override { return snappedIntRect(boundingBoxRect()); }
     LayoutRect elementRect() const override = 0;
-    LayoutSize size() const override { return elementRect().size(); }
     IntPoint clickPoint() override;
     static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
     Path elementPath() const override { return Path(); }
index 40bcf09..a2d5e88 100644 (file)
@@ -776,9 +776,9 @@ public:
     virtual bool supportsPressAction() const = 0;
     virtual Element* actionElement() const = 0;
     virtual LayoutRect boundingBoxRect() const = 0;
-    virtual IntRect pixelSnappedBoundingBoxRect() const = 0;
+    IntRect pixelSnappedBoundingBoxRect() const { return snappedIntRect(boundingBoxRect()); }
     virtual LayoutRect elementRect() const = 0;
-    virtual LayoutSize size() const = 0;
+    LayoutSize size() const { return elementRect().size(); }
     virtual IntPoint clickPoint() = 0;
     virtual Path elementPath() const = 0;
     virtual bool supportsPath() const = 0;
index 1a9a573..a2677d4 100644 (file)
@@ -53,6 +53,8 @@ AXIsolatedObject::~AXIsolatedObject() = default;
 
 void AXIsolatedObject::initializeAttributeData(AXCoreObject& object)
 {
+    setProperty(AXPropertyName::BoundingBoxRect, object.boundingBoxRect());
+    setProperty(AXPropertyName::ElementRect, object.elementRect());
     setProperty(AXPropertyName::RoleValue, static_cast<int>(object.roleValue()));
     setProperty(AXPropertyName::RolePlatformString, object.rolePlatformString().isolatedCopy());
     setProperty(AXPropertyName::ARIALandmarkRoleDescription, object.ariaLandmarkRoleDescription().isolatedCopy());
@@ -199,17 +201,13 @@ AXCoreObject* AXIsolatedObject::objectAttributeValue(AXPropertyName propertyName
     return tree()->nodeForID(nodeID).get();
 }
 
-
-FloatRect AXIsolatedObject::rectAttributeValue(AXPropertyName propertyName) const
+template<typename T>
+T AXIsolatedObject::rectAttributeValue(AXPropertyName propertyName) const
 {
     auto value = m_attributeMap.get(propertyName);
     return WTF::switchOn(value,
-        [] (Optional<FloatRect> typedValue) {
-            if (!typedValue)
-                return FloatRect { };
-            return typedValue.value();
-        },
-        [] (auto&) { return FloatRect { }; }
+        [] (T& typedValue) { return typedValue; },
+        [] (auto&) { return T { }; }
     );
 }
 
index b2be645..0efaa49 100644 (file)
@@ -29,8 +29,8 @@
 
 #include "AXIsolatedTree.h"
 #include "AccessibilityObjectInterface.h"
-#include "FloatRect.h"
 #include "IntPoint.h"
+#include "LayoutRect.h"
 #include "Path.h"
 #include <wtf/Forward.h>
 #include <wtf/HashMap.h>
@@ -176,7 +176,7 @@ private:
     bool isVisible() const override { return false; }
     bool isCollapsed() const override { return false; }
     void setIsExpanded(bool) override { }
-    FloatRect relativeFrame() const override { return rectAttributeValue(AXPropertyName::RelativeFrame); }
+    FloatRect relativeFrame() const override { return rectAttributeValue<FloatRect>(AXPropertyName::RelativeFrame); }
     FloatRect convertFrameToSpace(const FloatRect&, AccessibilityConversionSpace) const override { return FloatRect(); }
 
     bool isSelectedOptionActive() const override { return false; }
@@ -356,10 +356,8 @@ private:
     Element* anchorElement() const override { return nullptr; }
     bool supportsPressAction() const override { return false; }
     Element* actionElement() const override { return nullptr; }
-    LayoutRect boundingBoxRect() const override { return LayoutRect(); }
-    IntRect pixelSnappedBoundingBoxRect() const override { return IntRect(); }
-    LayoutRect elementRect() const override { return LayoutRect(); }
-    LayoutSize size() const override { return LayoutSize(); }
+    LayoutRect boundingBoxRect() const override { return rectAttributeValue<LayoutRect>(AXPropertyName::BoundingBoxRect); }
+    LayoutRect elementRect() const override { return rectAttributeValue<LayoutRect>(AXPropertyName::ElementRect); }
     IntPoint clickPoint() override { return IntPoint(); }
     Path elementPath() const override { return Path(); }
     bool supportsPath() const override { return false; }
@@ -639,7 +637,9 @@ private:
 
     enum class AXPropertyName : uint8_t {
         None = 0,
+        BoundingBoxRect,
         Description,
+        ElementRect,
         HelpText,
         IsAccessibilityIgnored,
         IsAnonymousMathOperator,
@@ -702,7 +702,7 @@ private:
     AXIsolatedObject(AXCoreObject&);
     void initializeAttributeData(AXCoreObject&);
 
-    using AttributeValueVariant = Variant<std::nullptr_t, String, bool, int, unsigned, double, Optional<FloatRect>, AXID>;
+    using AttributeValueVariant = Variant<std::nullptr_t, String, bool, int, unsigned, double, LayoutRect, AXID>;
     void setProperty(AXPropertyName, AttributeValueVariant&&, bool shouldRemove = false);
     void setObjectProperty(AXPropertyName, AXCoreObject*);
     
@@ -711,7 +711,7 @@ private:
     int intAttributeValue(AXPropertyName) const;
     unsigned unsignedAttributeValue(AXPropertyName) const;
     double doubleAttributeValue(AXPropertyName) const;
-    FloatRect rectAttributeValue(AXPropertyName) const;
+    template<typename T> T rectAttributeValue(AXPropertyName) const;
     AXCoreObject* objectAttributeValue(AXPropertyName) const;
 
     AXID m_parent;