Line data Source code
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 : // Accessible
27 :
28 : template<int Max>
29 : role
30 0 : ProgressMeterAccessible<Max>::NativeRole()
31 : {
32 0 : return roles::PROGRESSBAR;
33 : }
34 :
35 : template<int Max>
36 : uint64_t
37 0 : ProgressMeterAccessible<Max>::NativeState()
38 : {
39 0 : uint64_t state = LeafAccessible::NativeState();
40 :
41 : // An undetermined progressbar (i.e. without a value) has a mixed state.
42 0 : nsAutoString attrValue;
43 0 : mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::value, attrValue);
44 :
45 0 : if (attrValue.IsEmpty())
46 0 : state |= states::MIXED;
47 :
48 0 : return state;
49 : }
50 :
51 : ////////////////////////////////////////////////////////////////////////////////
52 : // ProgressMeterAccessible<Max>: Widgets
53 :
54 : template<int Max>
55 : bool
56 0 : ProgressMeterAccessible<Max>::IsWidget() const
57 : {
58 0 : return true;
59 : }
60 :
61 : ////////////////////////////////////////////////////////////////////////////////
62 : // ProgressMeterAccessible<Max>: Value
63 :
64 : template<int Max>
65 : void
66 0 : ProgressMeterAccessible<Max>::Value(nsString& aValue)
67 : {
68 0 : LeafAccessible::Value(aValue);
69 0 : if (!aValue.IsEmpty())
70 0 : return;
71 :
72 0 : double maxValue = MaxValue();
73 0 : if (IsNaN(maxValue) || maxValue == 0)
74 0 : return;
75 :
76 0 : double curValue = CurValue();
77 0 : if (IsNaN(curValue))
78 0 : return;
79 :
80 : // Treat the current value bigger than maximum as 100%.
81 : double percentValue = (curValue < maxValue) ?
82 0 : (curValue / maxValue) * 100 : 100;
83 :
84 0 : aValue.AppendFloat(percentValue);
85 0 : aValue.Append('%');
86 : }
87 :
88 : template<int Max>
89 : double
90 0 : ProgressMeterAccessible<Max>::MaxValue() const
91 : {
92 0 : double value = LeafAccessible::MaxValue();
93 0 : if (!IsNaN(value))
94 0 : return value;
95 :
96 0 : nsAutoString strValue;
97 0 : if (mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::max, strValue)) {
98 0 : nsresult result = NS_OK;
99 0 : value = strValue.ToDouble(&result);
100 0 : if (NS_SUCCEEDED(result))
101 0 : return value;
102 : }
103 :
104 0 : return Max;
105 : }
106 :
107 : template<int Max>
108 : double
109 0 : ProgressMeterAccessible<Max>::MinValue() const
110 : {
111 0 : double value = LeafAccessible::MinValue();
112 0 : return IsNaN(value) ? 0 : value;
113 : }
114 :
115 : template<int Max>
116 : double
117 0 : ProgressMeterAccessible<Max>::Step() const
118 : {
119 0 : double value = LeafAccessible::Step();
120 0 : return IsNaN(value) ? 0 : value;
121 : }
122 :
123 : template<int Max>
124 : double
125 0 : ProgressMeterAccessible<Max>::CurValue() const
126 : {
127 0 : double value = LeafAccessible::CurValue();
128 0 : if (!IsNaN(value))
129 0 : return value;
130 :
131 0 : nsAutoString attrValue;
132 0 : if (!mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::value, attrValue))
133 0 : return UnspecifiedNaN<double>();
134 :
135 0 : nsresult error = NS_OK;
136 0 : value = attrValue.ToDouble(&error);
137 0 : return NS_FAILED(error) ? UnspecifiedNaN<double>() : value;
138 : }
139 :
140 : template<int Max>
141 : bool
142 0 : ProgressMeterAccessible<Max>::SetCurValue(double aValue)
143 : {
144 0 : return false; // progress meters are readonly.
145 : }
146 :
147 : ////////////////////////////////////////////////////////////////////////////////
148 : // RadioButtonAccessible
149 : ////////////////////////////////////////////////////////////////////////////////
150 :
151 0 : RadioButtonAccessible::
152 0 : RadioButtonAccessible(nsIContent* aContent, DocAccessible* aDoc) :
153 0 : LeafAccessible(aContent, aDoc)
154 : {
155 0 : }
156 :
157 : uint8_t
158 0 : RadioButtonAccessible::ActionCount()
159 : {
160 0 : return 1;
161 : }
162 :
163 : void
164 0 : RadioButtonAccessible::ActionNameAt(uint8_t aIndex, nsAString& aName)
165 : {
166 0 : if (aIndex == eAction_Click)
167 0 : aName.AssignLiteral("select");
168 0 : }
169 :
170 : bool
171 0 : RadioButtonAccessible::DoAction(uint8_t aIndex)
172 : {
173 0 : if (aIndex != eAction_Click)
174 0 : return false;
175 :
176 0 : DoCommand();
177 0 : return true;
178 : }
179 :
180 : role
181 0 : RadioButtonAccessible::NativeRole()
182 : {
183 0 : return roles::RADIOBUTTON;
184 : }
185 :
186 : ////////////////////////////////////////////////////////////////////////////////
187 : // RadioButtonAccessible: Widgets
188 :
189 : bool
190 0 : RadioButtonAccessible::IsWidget() const
191 : {
192 0 : return true;
193 : }
|