OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012, Google Inc. All rights reserved. | 2 * Copyright (C) 2012, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 builder.append(' '); | 121 builder.append(' '); |
122 } | 122 } |
123 return builder.toString(); | 123 return builder.toString(); |
124 } | 124 } |
125 | 125 |
126 void AXNodeObject::alterSliderValue(bool increase) | 126 void AXNodeObject::alterSliderValue(bool increase) |
127 { | 127 { |
128 if (roleValue() != SliderRole) | 128 if (roleValue() != SliderRole) |
129 return; | 129 return; |
130 | 130 |
131 if (!getAttribute(stepAttr).isEmpty()) | 131 float value = valueForRange(); |
132 changeValueByStep(increase); | 132 float step = stepValueForRange(); |
133 else | 133 |
134 changeValueByPercent(increase ? 5 : -5); | 134 value += increase ? step : -step; |
| 135 |
| 136 setValue(String::number(value)); |
| 137 axObjectCache()->postNotification(node(), AXObjectCacheImpl::AXValueChanged)
; |
135 } | 138 } |
136 | 139 |
137 String AXNodeObject::ariaAccessibilityDescription() const | 140 String AXNodeObject::ariaAccessibilityDescription() const |
138 { | 141 { |
139 String ariaLabeledBy = ariaLabeledByAttribute(); | 142 String ariaLabeledBy = ariaLabeledByAttribute(); |
140 if (!ariaLabeledBy.isEmpty()) | 143 if (!ariaLabeledBy.isEmpty()) |
141 return ariaLabeledBy; | 144 return ariaLabeledBy; |
142 | 145 |
143 const AtomicString& ariaLabel = getAttribute(aria_labelAttr); | 146 const AtomicString& ariaLabel = getAttribute(aria_labelAttr); |
144 if (!ariaLabel.isEmpty()) | 147 if (!ariaLabel.isEmpty()) |
145 return ariaLabel; | 148 return ariaLabel; |
146 | 149 |
147 return String(); | 150 return String(); |
148 } | 151 } |
149 | 152 |
150 | 153 |
151 void AXNodeObject::ariaLabeledByElements(WillBeHeapVector<RawPtrWillBeMember<Ele
ment>>& elements) const | 154 void AXNodeObject::ariaLabeledByElements(WillBeHeapVector<RawPtrWillBeMember<Ele
ment>>& elements) const |
152 { | 155 { |
153 elementsFromAttribute(elements, aria_labeledbyAttr); | 156 elementsFromAttribute(elements, aria_labeledbyAttr); |
154 if (!elements.size()) | 157 if (!elements.size()) |
155 elementsFromAttribute(elements, aria_labelledbyAttr); | 158 elementsFromAttribute(elements, aria_labelledbyAttr); |
156 } | 159 } |
157 | 160 |
158 void AXNodeObject::changeValueByStep(bool increase) | |
159 { | |
160 float step = stepValueForRange(); | |
161 float value = valueForRange(); | |
162 | |
163 value += increase ? step : -step; | |
164 | |
165 setValue(String::number(value)); | |
166 | |
167 axObjectCache()->postNotification(node(), AXObjectCacheImpl::AXValueChanged)
; | |
168 } | |
169 | |
170 bool AXNodeObject::computeAccessibilityIsIgnored() const | 161 bool AXNodeObject::computeAccessibilityIsIgnored() const |
171 { | 162 { |
172 #if ENABLE(ASSERT) | 163 #if ENABLE(ASSERT) |
173 // Double-check that an AXObject is never accessed before | 164 // Double-check that an AXObject is never accessed before |
174 // it's been initialized. | 165 // it's been initialized. |
175 ASSERT(m_initialized); | 166 ASSERT(m_initialized); |
176 #endif | 167 #endif |
177 | 168 |
178 // If this element is within a parent that cannot have children, it should n
ot be exposed. | 169 // If this element is within a parent that cannot have children, it should n
ot be exposed. |
179 if (isDescendantOfBarrenParent()) | 170 if (isDescendantOfBarrenParent()) |
(...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 bool AXNodeObject::isProgressIndicator() const | 754 bool AXNodeObject::isProgressIndicator() const |
764 { | 755 { |
765 return roleValue() == ProgressIndicatorRole; | 756 return roleValue() == ProgressIndicatorRole; |
766 } | 757 } |
767 | 758 |
768 bool AXNodeObject::isSlider() const | 759 bool AXNodeObject::isSlider() const |
769 { | 760 { |
770 return roleValue() == SliderRole; | 761 return roleValue() == SliderRole; |
771 } | 762 } |
772 | 763 |
| 764 bool AXNodeObject::isNativeSlider() const |
| 765 { |
| 766 Node* node = this->node(); |
| 767 if (!node) |
| 768 return false; |
| 769 |
| 770 if (!isHTMLInputElement(node)) |
| 771 return false; |
| 772 |
| 773 return toHTMLInputElement(node)->type() == InputTypeNames::range; |
| 774 } |
| 775 |
773 bool AXNodeObject::isChecked() const | 776 bool AXNodeObject::isChecked() const |
774 { | 777 { |
775 Node* node = this->node(); | 778 Node* node = this->node(); |
776 if (!node) | 779 if (!node) |
777 return false; | 780 return false; |
778 | 781 |
779 // First test for native checkedness semantics | 782 // First test for native checkedness semantics |
780 if (isHTMLInputElement(*node)) | 783 if (isHTMLInputElement(*node)) |
781 return toHTMLInputElement(*node).shouldAppearChecked(); | 784 return toHTMLInputElement(*node).shouldAppearChecked(); |
782 | 785 |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1203 return toHTMLMeterElement(*node()).value(); | 1206 return toHTMLMeterElement(*node()).value(); |
1204 | 1207 |
1205 return 0.0; | 1208 return 0.0; |
1206 } | 1209 } |
1207 | 1210 |
1208 float AXNodeObject::maxValueForRange() const | 1211 float AXNodeObject::maxValueForRange() const |
1209 { | 1212 { |
1210 if (hasAttribute(aria_valuemaxAttr)) | 1213 if (hasAttribute(aria_valuemaxAttr)) |
1211 return getAttribute(aria_valuemaxAttr).toFloat(); | 1214 return getAttribute(aria_valuemaxAttr).toFloat(); |
1212 | 1215 |
1213 if (isHTMLInputElement(node())) { | 1216 if (isNativeSlider()) |
1214 HTMLInputElement& input = toHTMLInputElement(*node()); | 1217 return toHTMLInputElement(*node()).maximum(); |
1215 if (input.type() == InputTypeNames::range) | |
1216 return input.maximum(); | |
1217 } | |
1218 | 1218 |
1219 if (isHTMLMeterElement(node())) | 1219 if (isHTMLMeterElement(node())) |
1220 return toHTMLMeterElement(*node()).max(); | 1220 return toHTMLMeterElement(*node()).max(); |
1221 | 1221 |
1222 return 0.0; | 1222 return 0.0; |
1223 } | 1223 } |
1224 | 1224 |
1225 float AXNodeObject::minValueForRange() const | 1225 float AXNodeObject::minValueForRange() const |
1226 { | 1226 { |
1227 if (hasAttribute(aria_valueminAttr)) | 1227 if (hasAttribute(aria_valueminAttr)) |
1228 return getAttribute(aria_valueminAttr).toFloat(); | 1228 return getAttribute(aria_valueminAttr).toFloat(); |
1229 | 1229 |
1230 if (isHTMLInputElement(node())) { | 1230 if (isNativeSlider()) |
1231 HTMLInputElement& input = toHTMLInputElement(*node()); | 1231 return toHTMLInputElement(*node()).minimum(); |
1232 if (input.type() == InputTypeNames::range) | |
1233 return input.minimum(); | |
1234 } | |
1235 | 1232 |
1236 if (isHTMLMeterElement(node())) | 1233 if (isHTMLMeterElement(node())) |
1237 return toHTMLMeterElement(*node()).min(); | 1234 return toHTMLMeterElement(*node()).min(); |
1238 | 1235 |
1239 return 0.0; | 1236 return 0.0; |
1240 } | 1237 } |
1241 | 1238 |
1242 float AXNodeObject::stepValueForRange() const | 1239 float AXNodeObject::stepValueForRange() const |
1243 { | 1240 { |
1244 return getAttribute(stepAttr).toFloat(); | 1241 if (!isNativeSlider()) |
| 1242 return 0.0; |
| 1243 |
| 1244 Decimal step = toHTMLInputElement(*node()).createStepRange(RejectAny).step()
; |
| 1245 return step.toString().toFloat(); |
1245 } | 1246 } |
1246 | 1247 |
1247 String AXNodeObject::stringValue() const | 1248 String AXNodeObject::stringValue() const |
1248 { | 1249 { |
1249 Node* node = this->node(); | 1250 Node* node = this->node(); |
1250 if (!node) | 1251 if (!node) |
1251 return String(); | 1252 return String(); |
1252 | 1253 |
1253 if (ariaRoleAttribute() == StaticTextRole) { | 1254 if (ariaRoleAttribute() == StaticTextRole) { |
1254 String staticText = text(); | 1255 String staticText = text(); |
(...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2070 WillBeHeapVector<RawPtrWillBeMember<Element>> elements; | 2071 WillBeHeapVector<RawPtrWillBeMember<Element>> elements; |
2071 ariaLabeledByElements(elements); | 2072 ariaLabeledByElements(elements); |
2072 | 2073 |
2073 for (const auto& element : elements) { | 2074 for (const auto& element : elements) { |
2074 RefPtr<AXObject> axElement = axObjectCache()->getOrCreate(element); | 2075 RefPtr<AXObject> axElement = axObjectCache()->getOrCreate(element); |
2075 textOrder.append(AccessibilityText(ariaLabeledBy, AlternativeText, a
xElement)); | 2076 textOrder.append(AccessibilityText(ariaLabeledBy, AlternativeText, a
xElement)); |
2076 } | 2077 } |
2077 } | 2078 } |
2078 } | 2079 } |
2079 | 2080 |
2080 void AXNodeObject::changeValueByPercent(float percentChange) | |
2081 { | |
2082 float range = maxValueForRange() - minValueForRange(); | |
2083 float value = valueForRange(); | |
2084 | |
2085 value += range * (percentChange / 100); | |
2086 setValue(String::number(value)); | |
2087 | |
2088 axObjectCache()->postNotification(node(), AXObjectCacheImpl::AXValueChanged)
; | |
2089 } | |
2090 | |
2091 } // namespace blink | 2081 } // namespace blink |
OLD | NEW |