Source/JavaScriptCore:
[WebKit-https.git] / Source / WebCore / accessibility / isolatedtree / AXIsolatedTreeNode.cpp
1 /*
2  * Copyright (C) 2019 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
27
28 #include "config.h"
29 #include "AXIsolatedTreeNode.h"
30
31 #include "AccessibilityObject.h"
32
33 namespace WebCore {
34
35 AXIsolatedTreeNode::AXIsolatedTreeNode(const AccessibilityObject& object)
36     : m_identifier(object.axObjectID())
37     , m_initialized(false)
38 {
39     ASSERT(isMainThread());
40     initializeAttributeData(object);
41 #if !ASSERT_DISABLED
42     m_initialized = true;
43 #endif
44 }
45
46 Ref<AXIsolatedTreeNode> AXIsolatedTreeNode::create(const AccessibilityObject& object)
47 {
48     return adoptRef(*new AXIsolatedTreeNode(object));
49 }
50
51 AXIsolatedTreeNode::~AXIsolatedTreeNode() = default;
52
53 void AXIsolatedTreeNode::initializeAttributeData(const AccessibilityObject& object)
54 {
55     setProperty(AXPropertyName::RoleValue, static_cast<int>(object.roleValue()));
56     setProperty(AXPropertyName::IsAttachment, object.isAttachment());
57     setProperty(AXPropertyName::IsMediaControlLabel, object.isMediaControlLabel());
58 }
59
60 void AXIsolatedTreeNode::setProperty(AXPropertyName propertyName, AttributeValueVariant&& value, bool shouldRemove)
61 {
62     ASSERT(!m_initialized);
63     ASSERT(isMainThread());
64
65     if (shouldRemove)
66         m_attributeMap.remove(propertyName);
67     else
68         m_attributeMap.set(propertyName, value);
69 }
70
71 void AXIsolatedTreeNode::appendChild(AXID axID)
72 {
73     ASSERT(isMainThread());
74     m_children.append(axID);
75 }
76
77 double AXIsolatedTreeNode::doubleAttributeValue(AXPropertyName propertyName) const
78 {
79     auto value = m_attributeMap.get(propertyName);
80     return WTF::switchOn(value, [&] (double& typedValue) {
81         return typedValue;
82     }, [&] (auto&) {
83         return 0.0;
84     });
85 }
86
87 unsigned AXIsolatedTreeNode::unsignedAttributeValue(AXPropertyName propertyName) const
88 {
89     auto value = m_attributeMap.get(propertyName);
90     return WTF::switchOn(value, [&] (unsigned& typedValue) {
91         return typedValue;
92     }, [&] (auto&) {
93         return 0;
94     });
95 }
96
97 bool AXIsolatedTreeNode::boolAttributeValue(AXPropertyName propertyName) const
98 {
99     auto value = m_attributeMap.get(propertyName);
100     return WTF::switchOn(value, [&] (bool& typedValue) {
101         return typedValue;
102     }, [&] (auto&) {
103         return false;
104     });
105 }
106
107 const String& AXIsolatedTreeNode::stringAttributeValue(AXPropertyName propertyName) const
108 {
109     auto value = m_attributeMap.get(propertyName);
110     return WTF::switchOn(value, [&] (String& typedValue) {
111         return typedValue;
112     }, [&] (auto&) {
113         return nullAtom();
114     });
115 }
116
117 int AXIsolatedTreeNode::intAttributeValue(AXPropertyName propertyName) const
118 {
119     auto value = m_attributeMap.get(propertyName);
120     return WTF::switchOn(value, [&] (int& typedValue) {
121         return typedValue;
122     }, [&] (auto&) {
123         return 0;
124     });
125 }
126     
127 } // namespace WebCore
128
129 #endif // ENABLE((ACCESSIBILITY_ISOLATED_TREE)