accessible/src/generic/FormControlAccessible.cpp

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:52f8301fd1e3
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6 // NOTE: alphabetically ordered
7
8 #include "FormControlAccessible.h"
9 #include "Role.h"
10
11 #include "mozilla/FloatingPoint.h"
12 #include "nsIDOMHTMLFormElement.h"
13 #include "nsIDOMXULElement.h"
14 #include "nsIDOMXULControlElement.h"
15
16 using namespace mozilla::a11y;
17
18 ////////////////////////////////////////////////////////////////////////////////
19 // ProgressMeterAccessible
20 ////////////////////////////////////////////////////////////////////////////////
21
22 template class mozilla::a11y::ProgressMeterAccessible<1>;
23 template class mozilla::a11y::ProgressMeterAccessible<100>;
24
25 ////////////////////////////////////////////////////////////////////////////////
26 // nsISupports
27
28 template<int Max>
29 NS_IMPL_ADDREF_INHERITED(ProgressMeterAccessible<Max>, LeafAccessible)
30
31 template<int Max>
32 NS_IMPL_RELEASE_INHERITED(ProgressMeterAccessible<Max>, LeafAccessible)
33
34 template<int Max>
35 NS_IMPL_QUERY_INTERFACE_INHERITED(ProgressMeterAccessible<Max>,
36 LeafAccessible,
37 nsIAccessibleValue)
38
39 ////////////////////////////////////////////////////////////////////////////////
40 // Accessible
41
42 template<int Max>
43 role
44 ProgressMeterAccessible<Max>::NativeRole()
45 {
46 return roles::PROGRESSBAR;
47 }
48
49 template<int Max>
50 uint64_t
51 ProgressMeterAccessible<Max>::NativeState()
52 {
53 uint64_t state = LeafAccessible::NativeState();
54
55 // An undetermined progressbar (i.e. without a value) has a mixed state.
56 nsAutoString attrValue;
57 mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::value, attrValue);
58
59 if (attrValue.IsEmpty())
60 state |= states::MIXED;
61
62 return state;
63 }
64
65 ////////////////////////////////////////////////////////////////////////////////
66 // ProgressMeterAccessible<Max>: Widgets
67
68 template<int Max>
69 bool
70 ProgressMeterAccessible<Max>::IsWidget() const
71 {
72 return true;
73 }
74
75 ////////////////////////////////////////////////////////////////////////////////
76 // nsIAccessibleValue
77
78 template<int Max>
79 void
80 ProgressMeterAccessible<Max>::Value(nsString& aValue)
81 {
82 LeafAccessible::Value(aValue);
83 if (!aValue.IsEmpty())
84 return;
85
86 double maxValue = MaxValue();
87 if (IsNaN(maxValue) || maxValue == 0)
88 return;
89
90 double curValue = CurValue();
91 if (IsNaN(curValue))
92 return;
93
94 // Treat the current value bigger than maximum as 100%.
95 double percentValue = (curValue < maxValue) ?
96 (curValue / maxValue) * 100 : 100;
97
98 aValue.AppendFloat(percentValue);
99 aValue.AppendLiteral("%");
100 }
101
102 template<int Max>
103 double
104 ProgressMeterAccessible<Max>::MaxValue() const
105 {
106 double value = LeafAccessible::MaxValue();
107 if (!IsNaN(value))
108 return value;
109
110 nsAutoString strValue;
111 if (mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::max, strValue)) {
112 nsresult result = NS_OK;
113 value = strValue.ToDouble(&result);
114 if (NS_SUCCEEDED(result))
115 return value;
116 }
117
118 return Max;
119 }
120
121 template<int Max>
122 double
123 ProgressMeterAccessible<Max>::MinValue() const
124 {
125 double value = LeafAccessible::MinValue();
126 return IsNaN(value) ? 0 : value;
127 }
128
129 template<int Max>
130 double
131 ProgressMeterAccessible<Max>::Step() const
132 {
133 double value = LeafAccessible::Step();
134 return IsNaN(value) ? 0 : value;
135 }
136
137 template<int Max>
138 double
139 ProgressMeterAccessible<Max>::CurValue() const
140 {
141 double value = LeafAccessible::CurValue();
142 if (!IsNaN(value))
143 return value;
144
145 nsAutoString attrValue;
146 if (!mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::value, attrValue))
147 return UnspecifiedNaN<double>();
148
149 nsresult error = NS_OK;
150 value = attrValue.ToDouble(&error);
151 return NS_FAILED(error) ? UnspecifiedNaN<double>() : value;
152 }
153
154 template<int Max>
155 bool
156 ProgressMeterAccessible<Max>::SetCurValue(double aValue)
157 {
158 return false; // progress meters are readonly.
159 }
160
161 ////////////////////////////////////////////////////////////////////////////////
162 // RadioButtonAccessible
163 ////////////////////////////////////////////////////////////////////////////////
164
165 RadioButtonAccessible::
166 RadioButtonAccessible(nsIContent* aContent, DocAccessible* aDoc) :
167 LeafAccessible(aContent, aDoc)
168 {
169 }
170
171 uint8_t
172 RadioButtonAccessible::ActionCount()
173 {
174 return 1;
175 }
176
177 NS_IMETHODIMP
178 RadioButtonAccessible::GetActionName(uint8_t aIndex, nsAString& aName)
179 {
180 if (aIndex == eAction_Click) {
181 aName.AssignLiteral("select");
182 return NS_OK;
183 }
184 return NS_ERROR_INVALID_ARG;
185 }
186
187 NS_IMETHODIMP
188 RadioButtonAccessible::DoAction(uint8_t aIndex)
189 {
190 if (aIndex != eAction_Click)
191 return NS_ERROR_INVALID_ARG;
192
193 DoCommand();
194 return NS_OK;
195 }
196
197 role
198 RadioButtonAccessible::NativeRole()
199 {
200 return roles::RADIOBUTTON;
201 }
202
203 ////////////////////////////////////////////////////////////////////////////////
204 // RadioButtonAccessible: Widgets
205
206 bool
207 RadioButtonAccessible::IsWidget() const
208 {
209 return true;
210 }

mercurial