accessible/src/xul/XULSliderAccessible.cpp

branch
TOR_BUG_9701
changeset 8
97036ab72558
equal deleted inserted replaced
-1:000000000000 0:807777bda8e3
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 #include "XULSliderAccessible.h"
7
8 #include "nsAccessibilityService.h"
9 #include "Role.h"
10 #include "States.h"
11
12 #include "nsIFrame.h"
13 #include "mozilla/dom/Element.h"
14 #include "mozilla/FloatingPoint.h"
15
16 using namespace mozilla::a11y;
17
18 ////////////////////////////////////////////////////////////////////////////////
19 // XULSliderAccessible
20 ////////////////////////////////////////////////////////////////////////////////
21
22 XULSliderAccessible::
23 XULSliderAccessible(nsIContent* aContent, DocAccessible* aDoc) :
24 AccessibleWrap(aContent, aDoc)
25 {
26 mStateFlags |= eHasNumericValue;
27 }
28
29 // Accessible
30
31 role
32 XULSliderAccessible::NativeRole()
33 {
34 return roles::SLIDER;
35 }
36
37 uint64_t
38 XULSliderAccessible::NativeInteractiveState() const
39 {
40 if (NativelyUnavailable())
41 return states::UNAVAILABLE;
42
43 nsIContent* sliderElm = GetSliderElement();
44 if (sliderElm) {
45 nsIFrame* frame = sliderElm->GetPrimaryFrame();
46 if (frame && frame->IsFocusable())
47 return states::FOCUSABLE;
48 }
49
50 return 0;
51 }
52
53 bool
54 XULSliderAccessible::NativelyUnavailable() const
55 {
56 return mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::disabled,
57 nsGkAtoms::_true, eCaseMatters);
58 }
59
60 // nsIAccessible
61
62 void
63 XULSliderAccessible::Value(nsString& aValue)
64 {
65 GetSliderAttr(nsGkAtoms::curpos, aValue);
66 }
67
68 uint8_t
69 XULSliderAccessible::ActionCount()
70 {
71 return 1;
72 }
73
74 NS_IMETHODIMP
75 XULSliderAccessible::GetActionName(uint8_t aIndex, nsAString& aName)
76 {
77 aName.Truncate();
78
79 NS_ENSURE_ARG(aIndex == 0);
80
81 aName.AssignLiteral("activate");
82 return NS_OK;
83 }
84
85 NS_IMETHODIMP
86 XULSliderAccessible::DoAction(uint8_t aIndex)
87 {
88 NS_ENSURE_ARG(aIndex == 0);
89
90 nsIContent* sliderElm = GetSliderElement();
91 if (sliderElm)
92 DoCommand(sliderElm);
93
94 return NS_OK;
95 }
96
97 double
98 XULSliderAccessible::MaxValue() const
99 {
100 double value = AccessibleWrap::MaxValue();
101 return IsNaN(value) ? GetSliderAttr(nsGkAtoms::maxpos) : value;
102 }
103
104 double
105 XULSliderAccessible::MinValue() const
106 {
107 double value = AccessibleWrap::MinValue();
108 return IsNaN(value) ? GetSliderAttr(nsGkAtoms::minpos) : value;
109 }
110
111 double
112 XULSliderAccessible::Step() const
113 {
114 double value = AccessibleWrap::Step();
115 return IsNaN(value) ? GetSliderAttr(nsGkAtoms::increment) : value;
116 }
117
118 double
119 XULSliderAccessible::CurValue() const
120 {
121 double value = AccessibleWrap::CurValue();
122 return IsNaN(value) ? GetSliderAttr(nsGkAtoms::curpos) : value;
123 }
124
125 bool
126 XULSliderAccessible::SetCurValue(double aValue)
127 {
128 if (AccessibleWrap::SetCurValue(aValue))
129 return true;
130
131 return SetSliderAttr(nsGkAtoms::curpos, aValue);
132 }
133
134 bool
135 XULSliderAccessible::CanHaveAnonChildren()
136 {
137 // Do not allow anonymous xul:slider be accessible.
138 return false;
139 }
140
141 // Utils
142
143 nsIContent*
144 XULSliderAccessible::GetSliderElement() const
145 {
146 if (!mSliderNode) {
147 // XXX: we depend on anonymous content.
148 mSliderNode = mContent->OwnerDoc()->
149 GetAnonymousElementByAttribute(mContent, nsGkAtoms::anonid,
150 NS_LITERAL_STRING("slider"));
151 }
152
153 return mSliderNode;
154 }
155
156 nsresult
157 XULSliderAccessible::GetSliderAttr(nsIAtom* aName, nsAString& aValue) const
158 {
159 aValue.Truncate();
160
161 if (IsDefunct())
162 return NS_ERROR_FAILURE;
163
164 nsIContent* sliderElm = GetSliderElement();
165 if (sliderElm)
166 sliderElm->GetAttr(kNameSpaceID_None, aName, aValue);
167
168 return NS_OK;
169 }
170
171 nsresult
172 XULSliderAccessible::SetSliderAttr(nsIAtom* aName, const nsAString& aValue)
173 {
174 if (IsDefunct())
175 return NS_ERROR_FAILURE;
176
177 nsIContent* sliderElm = GetSliderElement();
178 if (sliderElm)
179 sliderElm->SetAttr(kNameSpaceID_None, aName, aValue, true);
180
181 return NS_OK;
182 }
183
184 double
185 XULSliderAccessible::GetSliderAttr(nsIAtom* aName) const
186 {
187 nsAutoString attrValue;
188 nsresult rv = GetSliderAttr(aName, attrValue);
189 if (NS_FAILED(rv))
190 return UnspecifiedNaN<double>();
191
192 nsresult error = NS_OK;
193 double value = attrValue.ToDouble(&error);
194 return NS_FAILED(error) ? UnspecifiedNaN<double>() : value;
195 }
196
197 bool
198 XULSliderAccessible::SetSliderAttr(nsIAtom* aName, double aValue)
199 {
200 nsAutoString value;
201 value.AppendFloat(aValue);
202
203 return NS_SUCCEEDED(SetSliderAttr(aName, value));
204 }
205
206
207 ////////////////////////////////////////////////////////////////////////////////
208 // XULThumbAccessible
209 ////////////////////////////////////////////////////////////////////////////////
210
211 XULThumbAccessible::
212 XULThumbAccessible(nsIContent* aContent, DocAccessible* aDoc) :
213 AccessibleWrap(aContent, aDoc)
214 {
215 }
216
217 ////////////////////////////////////////////////////////////////////////////////
218 // XULThumbAccessible: Accessible
219
220 role
221 XULThumbAccessible::NativeRole()
222 {
223 return roles::INDICATOR;
224 }
225

mercurial