Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
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/. */
6 // NOTE: alphabetically ordered
8 #include "FormControlAccessible.h"
9 #include "Role.h"
11 #include "mozilla/FloatingPoint.h"
12 #include "nsIDOMHTMLFormElement.h"
13 #include "nsIDOMXULElement.h"
14 #include "nsIDOMXULControlElement.h"
16 using namespace mozilla::a11y;
18 ////////////////////////////////////////////////////////////////////////////////
19 // ProgressMeterAccessible
20 ////////////////////////////////////////////////////////////////////////////////
22 template class mozilla::a11y::ProgressMeterAccessible<1>;
23 template class mozilla::a11y::ProgressMeterAccessible<100>;
25 ////////////////////////////////////////////////////////////////////////////////
26 // nsISupports
28 template<int Max>
29 NS_IMPL_ADDREF_INHERITED(ProgressMeterAccessible<Max>, LeafAccessible)
31 template<int Max>
32 NS_IMPL_RELEASE_INHERITED(ProgressMeterAccessible<Max>, LeafAccessible)
34 template<int Max>
35 NS_IMPL_QUERY_INTERFACE_INHERITED(ProgressMeterAccessible<Max>,
36 LeafAccessible,
37 nsIAccessibleValue)
39 ////////////////////////////////////////////////////////////////////////////////
40 // Accessible
42 template<int Max>
43 role
44 ProgressMeterAccessible<Max>::NativeRole()
45 {
46 return roles::PROGRESSBAR;
47 }
49 template<int Max>
50 uint64_t
51 ProgressMeterAccessible<Max>::NativeState()
52 {
53 uint64_t state = LeafAccessible::NativeState();
55 // An undetermined progressbar (i.e. without a value) has a mixed state.
56 nsAutoString attrValue;
57 mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::value, attrValue);
59 if (attrValue.IsEmpty())
60 state |= states::MIXED;
62 return state;
63 }
65 ////////////////////////////////////////////////////////////////////////////////
66 // ProgressMeterAccessible<Max>: Widgets
68 template<int Max>
69 bool
70 ProgressMeterAccessible<Max>::IsWidget() const
71 {
72 return true;
73 }
75 ////////////////////////////////////////////////////////////////////////////////
76 // nsIAccessibleValue
78 template<int Max>
79 void
80 ProgressMeterAccessible<Max>::Value(nsString& aValue)
81 {
82 LeafAccessible::Value(aValue);
83 if (!aValue.IsEmpty())
84 return;
86 double maxValue = MaxValue();
87 if (IsNaN(maxValue) || maxValue == 0)
88 return;
90 double curValue = CurValue();
91 if (IsNaN(curValue))
92 return;
94 // Treat the current value bigger than maximum as 100%.
95 double percentValue = (curValue < maxValue) ?
96 (curValue / maxValue) * 100 : 100;
98 aValue.AppendFloat(percentValue);
99 aValue.AppendLiteral("%");
100 }
102 template<int Max>
103 double
104 ProgressMeterAccessible<Max>::MaxValue() const
105 {
106 double value = LeafAccessible::MaxValue();
107 if (!IsNaN(value))
108 return value;
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 }
118 return Max;
119 }
121 template<int Max>
122 double
123 ProgressMeterAccessible<Max>::MinValue() const
124 {
125 double value = LeafAccessible::MinValue();
126 return IsNaN(value) ? 0 : value;
127 }
129 template<int Max>
130 double
131 ProgressMeterAccessible<Max>::Step() const
132 {
133 double value = LeafAccessible::Step();
134 return IsNaN(value) ? 0 : value;
135 }
137 template<int Max>
138 double
139 ProgressMeterAccessible<Max>::CurValue() const
140 {
141 double value = LeafAccessible::CurValue();
142 if (!IsNaN(value))
143 return value;
145 nsAutoString attrValue;
146 if (!mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::value, attrValue))
147 return UnspecifiedNaN<double>();
149 nsresult error = NS_OK;
150 value = attrValue.ToDouble(&error);
151 return NS_FAILED(error) ? UnspecifiedNaN<double>() : value;
152 }
154 template<int Max>
155 bool
156 ProgressMeterAccessible<Max>::SetCurValue(double aValue)
157 {
158 return false; // progress meters are readonly.
159 }
161 ////////////////////////////////////////////////////////////////////////////////
162 // RadioButtonAccessible
163 ////////////////////////////////////////////////////////////////////////////////
165 RadioButtonAccessible::
166 RadioButtonAccessible(nsIContent* aContent, DocAccessible* aDoc) :
167 LeafAccessible(aContent, aDoc)
168 {
169 }
171 uint8_t
172 RadioButtonAccessible::ActionCount()
173 {
174 return 1;
175 }
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 }
187 NS_IMETHODIMP
188 RadioButtonAccessible::DoAction(uint8_t aIndex)
189 {
190 if (aIndex != eAction_Click)
191 return NS_ERROR_INVALID_ARG;
193 DoCommand();
194 return NS_OK;
195 }
197 role
198 RadioButtonAccessible::NativeRole()
199 {
200 return roles::RADIOBUTTON;
201 }
203 ////////////////////////////////////////////////////////////////////////////////
204 // RadioButtonAccessible: Widgets
206 bool
207 RadioButtonAccessible::IsWidget() const
208 {
209 return true;
210 }