Source/WebCore/ChangeLog

 12012-09-07 Dominic Mazzoni <dmazzoni@google.com>
 2
 3 AX: ARIA spin button should support range value attributes
 4 https://bugs.webkit.org/show_bug.cgi?id=96076
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Make an ARIA spin button support ARIA range attributes like
 9 aria-valuenow, aria-valuemin, etc. - just like slider, progressbar,
 10 and scrollbar.
 11
 12 Test: accessibility/spinbutton-value.html
 13
 14 * accessibility/AccessibilityObject.h:
 15 (WebCore::AccessibilityObject::isSpinButton):
 16 * accessibility/AccessibilityRenderObject.cpp:
 17 (WebCore::AccessibilityRenderObject::valueDescription):
 18 (WebCore):
 19 (WebCore::AccessibilityRenderObject::isAriaRange):
 20 (WebCore::AccessibilityRenderObject::valueForRange):
 21 (WebCore::AccessibilityRenderObject::maxValueForRange):
 22 (WebCore::AccessibilityRenderObject::minValueForRange):
 23 (WebCore::AccessibilityRenderObject::stringValue):
 24 (WebCore::AccessibilityRenderObject::title):
 25 (WebCore::AccessibilityRenderObject::isGenericFocusableElement):
 26 (WebCore::AccessibilityRenderObject::ariaRoleHasPresentationalChildren):
 27 * accessibility/AccessibilityRenderObject.h:
 28 (AccessibilityRenderObject):
 29 * accessibility/mac/WebAccessibilityObjectWrapper.mm:
 30 (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
 31
1322012-09-06 Patrick Gansterer <paroga@webkit.org>
233
334 Build fix for WinCE after r127801.
127836

Source/WebCore/accessibility/AccessibilityObject.cpp

@@AccessibilitySortDirection Accessibility
15561556
15571557 return SortDirectionNone;
15581558}
 1559
 1560bool AccessibilityObject::supportsRangeValue() const
 1561{
 1562 return isProgressIndicator()
 1563 || isSlider()
 1564 || isScrollbar()
 1565 || isSpinButton();
 1566}
15591567
15601568bool AccessibilityObject::supportsARIAExpanded() const
15611569{
127696

Source/WebCore/accessibility/AccessibilityObject.h

@@public:
366366 virtual bool isMenuList() const { return false; }
367367 virtual bool isMenuListPopup() const { return false; }
368368 virtual bool isMenuListOption() const { return false; }
369  virtual bool isSpinButton() const { return false; }
 369 virtual bool isSpinButton() const { return roleValue() == SpinButtonRole; }
370370 virtual bool isSpinButtonPart() const { return false; }
371371 virtual bool isMockObject() const { return false; }
372372 bool isTextControl() const { return roleValue() == TextAreaRole || roleValue() == TextFieldRole; }

@@public:
461461 bool supportsARIAExpanded() const;
462462 AccessibilitySortDirection sortDirection() const;
463463 virtual bool canvasHasFallbackContent() const { return false; }
 464 bool supportsRangeValue() const;
464465
465466 // ARIA drag and drop
466467 virtual bool supportsARIADropping() const { return false; }
127696

Source/WebCore/accessibility/AccessibilityRenderObject.cpp

@@AccessibilityButtonState AccessibilityRe
11561156
11571157String AccessibilityRenderObject::valueDescription() const
11581158{
1159  // Only sliders and progress bars support value descriptions currently.
1160  if (!isProgressIndicator() && !isSlider())
 1159 if (!isARIARange())
11611160 return String();
11621161
11631162 return getAttribute(aria_valuetextAttr).string();

@@float AccessibilityRenderObject::stepVal
11671166{
11681167 return getAttribute(stepAttr).toFloat();
11691168}
 1169
 1170bool AccessibilityRenderObject::isARIARange() const
 1171{
 1172 return m_ariaRole == ProgressIndicatorRole
 1173 || m_ariaRole == SliderRole
 1174 || m_ariaRole == ScrollBarRole
 1175 || m_ariaRole == SpinButtonRole;
 1176}
11701177
11711178float AccessibilityRenderObject::valueForRange() const
11721179{
1173  if (!isProgressIndicator() && !isSlider() && !isScrollbar())
 1180 if (!isARIARange())
11741181 return 0.0f;
11751182
11761183 return getAttribute(aria_valuenowAttr).toFloat();

@@float AccessibilityRenderObject::valueFo
11781185
11791186float AccessibilityRenderObject::maxValueForRange() const
11801187{
1181  if (!isProgressIndicator() && !isSlider())
 1188 if (!isARIARange())
11821189 return 0.0f;
11831190
11841191 return getAttribute(aria_valuemaxAttr).toFloat();

@@float AccessibilityRenderObject::maxValu
11861193
11871194float AccessibilityRenderObject::minValueForRange() const
11881195{
1189  if (!isProgressIndicator() && !isSlider())
 1196 if (!isARIARange())
11901197 return 0.0f;
11911198
11921199 return getAttribute(aria_valueminAttr).toFloat();

@@String AccessibilityRenderObject::title(
13981405 default:
13991406 break;
14001407 }
1401 
 1408
14021409 if (isHeading() || isLink())
14031410 return textUnderElement();
14041411

@@bool AccessibilityRenderObject::isGeneri
31403147 if (isControl())
31413148 return false;
31423149
 3150 // If it has an aria role, it's not generic.
 3151 if (m_ariaRole != UnknownRole)
 3152 return false;
 3153
31433154 // If the content editable attribute is set on this element, that's the reason
31443155 // it's focusable, and existing logic should handle this case already - so it's not a
31453156 // generic focusable element.

@@bool AccessibilityRenderObject::ariaRole
33763387 case SliderRole:
33773388 case ImageRole:
33783389 case ProgressIndicatorRole:
 3390 case SpinButtonRole:
33793391 // case SeparatorRole:
33803392 return true;
33813393 default:
127696

Source/WebCore/accessibility/AccessibilityRenderObject.h

@@private:
302302 bool isDescendantOfElementType(const QualifiedName& tagName) const;
303303 // This returns true if it's focusable but it's not content editable and it's not a control or ARIA control.
304304 bool isGenericFocusableElement() const;
 305 bool isARIARange() const;
305306
306307 void addTextFieldChildren();
307308 void addImageMapChildren();
127696

Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm

@@- (id)accessibilityAttributeValue:(NSStr
19991999 if ([[[self attachmentView] accessibilityAttributeNames] containsObject:NSAccessibilityValueAttribute])
20002000 return [[self attachmentView] accessibilityAttributeValue:NSAccessibilityValueAttribute];
20012001 }
2002  if (m_object->isProgressIndicator() || m_object->isSlider() || m_object->isScrollbar())
 2002 if (m_object->supportsRangeValue())
20032003 return [NSNumber numberWithFloat:m_object->valueForRange()];
20042004 if (m_object->roleValue() == SliderThumbRole)
20052005 return [NSNumber numberWithFloat:m_object->parentObject()->valueForRange()];
127696

Source/WebKit/chromium/ChangeLog

 12012-09-07 Dominic Mazzoni <dmazzoni@google.com>
 2
 3 AX: ARIA spin button should support range value attributes
 4 https://bugs.webkit.org/show_bug.cgi?id=96076
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Expose supportsRangeValue to simplify Chromium logic for when to
 9 extract a value from a range.
 10
 11 * public/WebAccessibilityObject.h:
 12 (WebAccessibilityObject):
 13 * src/WebAccessibilityObject.cpp:
 14 (WebKit::WebAccessibilityObject::supportsRangeValue):
 15 (WebKit):
 16
1172012-09-06 Sheriff Bot <webkit.review.bot@gmail.com>
218
319 Unreviewed, rolling out r127822.
127839

Source/WebKit/chromium/public/WebAccessibilityObject.h

@@public:
149149 WEBKIT_EXPORT WebAccessibilityObject titleUIElement() const;
150150 WEBKIT_EXPORT WebURL url() const;
151151
 152 WEBKIT_EXPORT bool supportsRangeValue() const;
152153 WEBKIT_EXPORT WebString valueDescription() const;
153154 WEBKIT_EXPORT float valueForRange() const;
154155 WEBKIT_EXPORT float maxValueForRange() const;
127696

Source/WebKit/chromium/src/WebAccessibilityObject.cpp

@@WebURL WebAccessibilityObject::url() con
610610 return m_private->url();
611611}
612612
 613WebString WebAccessibilityObject::supportsRangeValue() const
 614{
 615 if (isDetached())
 616 return WebString();
 617
 618 return m_private->supportsRangeValue();
 619}
 620
613621WebString WebAccessibilityObject::valueDescription() const
614622{
615623 if (isDetached())
127696

Tools/ChangeLog

 12012-09-07 Dominic Mazzoni <dmazzoni@google.com>
 2
 3 New time input needs accessibility
 4 https://bugs.webkit.org/show_bug.cgi?id=96032
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Add support for valueDescription for testing.
 9
 10 * DumpRenderTree/chromium/TestRunner/AccessibilityUIElementChromium.cpp:
 11 (getValueDescription):
 12 (AccessibilityUIElement::AccessibilityUIElement):
 13 (AccessibilityUIElement::valueDescriptionGetterCallback):
 14 * DumpRenderTree/chromium/TestRunner/AccessibilityUIElementChromium.h:
 15 (AccessibilityUIElement):
 16
1172012-09-05 Tony Chang <tony@chromium.org>
218
319 [chromium] Remove dependency on webkit_user_agent
127696

Tools/DumpRenderTree/chromium/TestRunner/AccessibilityUIElementChromium.cpp

@@string getOrientation(const WebAccessibi
251251 return "AXOrientation: AXHorizontalOrientation";
252252}
253253
 254string getValueDescription(const WebAccessibilityObject& object)
 255{
 256 string valueDescription = object.valueDescription().utf8();
 257 return valueDescription.insert(0, "AXValueDescription: ");
 258}
 259
254260string getAttributes(const WebAccessibilityObject& object)
255261{
256262 // FIXME: Concatenate all attributes of the AccessibilityObject.

@@AccessibilityUIElement::AccessibilityUIE
303309 bindProperty("intValue", &AccessibilityUIElement::intValueGetterCallback);
304310 bindProperty("minValue", &AccessibilityUIElement::minValueGetterCallback);
305311 bindProperty("maxValue", &AccessibilityUIElement::maxValueGetterCallback);
 312 bindProperty("valueDescription", &AccessibilityUIElement::valueDescriptionGetterCallback);
306313 bindProperty("childrenCount", &AccessibilityUIElement::childrenCountGetterCallback);
307314 bindProperty("insertionPointLineNumber", &AccessibilityUIElement::insertionPointLineNumberGetterCallback);
308315 bindProperty("selectedTextRange", &AccessibilityUIElement::selectedTextRangeGetterCallback);

@@void AccessibilityUIElement::maxValueGet
452459 result->set(accessibilityObject().maxValueForRange());
453460}
454461
 462void AccessibilityUIElement::valueDescriptionGetterCallback(CppVariant* result)
 463{
 464 result->set(getValueDescription(accessibilityObject()));
 465}
 466
455467void AccessibilityUIElement::childrenCountGetterCallback(CppVariant* result)
456468{
457469 int count = 1; // Root object always has only one child, the WebView.
127696

Tools/DumpRenderTree/chromium/TestRunner/AccessibilityUIElementChromium.h

@@private:
7171 void intValueGetterCallback(CppVariant*);
7272 void minValueGetterCallback(CppVariant*);
7373 void maxValueGetterCallback(CppVariant*);
 74 void valueDescriptionGetterCallback(CppVariant*);
7475 void childrenCountGetterCallback(CppVariant*);
7576 void insertionPointLineNumberGetterCallback(CppVariant*);
7677 void selectedTextRangeGetterCallback(CppVariant*);
127696

LayoutTests/ChangeLog

 12012-09-07 Dominic Mazzoni <dmazzoni@google.com>
 2
 3 AX: ARIA spin button should support range value attributes
 4 https://bugs.webkit.org/show_bug.cgi?id=96076
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Test that an ARIA spin button exposes ARIA range attributes like
 9 aria-valuenow, aria-valuemin, etc.
 10
 11 * accessibility/spinbutton-value-expected.txt: Added.
 12 * accessibility/spinbutton-value.html: Added.
 13
1142012-09-06 Anna Cavender <annacc@chromium.org>
215
316 Rebaselines due to r127831.
127836

LayoutTests/accessibility/spinbutton-value-expected.txt

 1
 242
 3This tests that a spin button supports range value attributes.
 4
 5On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 6
 7
 8PASS endsWith(axSpin.intValue, '5') is true
 9PASS endsWith(axSpin.minValue, '1') is true
 10PASS endsWith(axSpin.maxValue, '9') is true
 11PASS endsWith(axSpin.valueDescription, '5 of 9') is true
 12PASS axSpin.title is axUntitled.title
 13PASS successfullyParsed is true
 14
 15TEST COMPLETE
 16
0

LayoutTests/accessibility/spinbutton-value.html

 1<!DOCTYPE HTML>
 2<html>
 3<body>
 4<script src="../fast/js/resources/js-test-pre.js"></script>
 5
 6<button id="untitled"></button>
 7
 8<div id="spin"
 9 tabindex="0"
 10 role="spinbutton"
 11 aria-valuetext="5 of 9"
 12 aria-valuemin="1"
 13 aria-valuemax="9"
 14 aria-valuenow="5">42</div>
 15
 16<div id="console"></div>
 17<script>
 18description("This tests that a spin button supports range value attributes.")
 19
 20if (window.testRunner && window.accessibilityController) {
 21 window.testRunner.dumpAsText();
 22
 23 function endsWith(str, suffix) {
 24 str = '' + str;
 25 return str.substr(str.length - suffix.length) == suffix;
 26 }
 27
 28 var untitled = document.getElementById('untitled');
 29 untitled.focus();
 30 window.axUntitled = accessibilityController.focusedElement;
 31
 32 var spin = document.getElementById('spin');
 33 spin.focus();
 34 window.axSpin = accessibilityController.focusedElement;
 35
 36 // Test range value attributes.
 37 shouldBe("endsWith(axSpin.intValue, '5')", "true");
 38 shouldBe("endsWith(axSpin.minValue, '1')", "true");
 39 shouldBe("endsWith(axSpin.maxValue, '9')", "true");
 40 shouldBe("endsWith(axSpin.valueDescription, '5 of 9')", "true");
 41
 42 // Make sure the title doesn't come from the inner text. It should just be empty if
 43 // not otherwise specified.
 44 shouldBe("axSpin.title", "axUntitled.title");
 45}
 46
 47</script>
 48
 49<script src="../fast/js/resources/js-test-post.js"></script>
 50</body>
 51</html>
0