[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-10851-g50815da

cfleizach at apple.com cfleizach at apple.com
Wed Dec 22 18:04:10 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 583ba85b5424f4c5ea5d9836e1aa2068bc97910f
Author: cfleizach at apple.com <cfleizach at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Dec 6 20:37:19 2010 +0000

    HTML5 Slider does not work correctly with VoiceOver
    https://bugs.webkit.org/show_bug.cgi?id=50505
    
    Reviewed by Darin Adler.
    
    Address a few problems with the Mac implementation for the accessibility slider.
        1) The value indicator is not hit testable.
        2) The value indicator does not return an AXValue.
        3) In the slider, the min/max values are not correct when min/max attributes are not present.
        4) When you change the value with the keyboard, it doesn't send out the right notification.
        5) Sliders were returning AXValue and AXTopLevelUIElement attributes twice in their list of attributes.
    
    Test: platform/mac/accessibility/html-slider-indicator.html
    
    WebCore:
    
    * accessibility/AccessibilityObject.cpp:
    (WebCore::AccessibilityObject::getAttribute):
        Use fastGetAttribute on Element, instead of getAttribute.
    * accessibility/AccessibilityObject.h:
    (WebCore::AccessibilityObject::isInputSlider):
    * accessibility/AccessibilityRenderObject.cpp:
    (WebCore::AccessibilityRenderObject::doAccessibilityHitTest):
    * accessibility/AccessibilitySlider.cpp:
    (WebCore::AccessibilitySlider::doAccessibilityHitTest):
    (WebCore::AccessibilitySlider::maxValueForRange):
    (WebCore::AccessibilitySlider::minValueForRange):
    * accessibility/AccessibilitySlider.h:
    (WebCore::AccessibilitySlider::isInputSlider):
    * accessibility/mac/AccessibilityObjectWrapper.mm:
    (-[AccessibilityObjectWrapper accessibilityAttributeNames]):
    (-[AccessibilityObjectWrapper accessibilityAttributeValue:]):
    * html/HTMLInputElement.cpp:
    (WebCore::HTMLInputElement::applyStep):
    
    LayoutTests:
    
    * platform/mac/accessibility/html-slider-indicator-expected.txt: Added.
    * platform/mac/accessibility/html-slider-indicator.html: Added.
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@73388 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index b98ebd3..6eb0783 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,13 @@
+2010-12-06  Chris Fleizach  <cfleizach at apple.com>
+
+        Reviewed by Darin Adler.
+
+        HTML5 Slider does not work correctly with VoiceOver
+        https://bugs.webkit.org/show_bug.cgi?id=50505
+
+        * platform/mac/accessibility/html-slider-indicator-expected.txt: Added.
+        * platform/mac/accessibility/html-slider-indicator.html: Added.
+
 2010-12-06  David Hyatt  <hyatt at apple.com>
 
         Reviewed by Simon Fraser.
diff --git a/LayoutTests/platform/mac/accessibility/html-slider-indicator-expected.txt b/LayoutTests/platform/mac/accessibility/html-slider-indicator-expected.txt
new file mode 100644
index 0000000..7d78073
--- /dev/null
+++ b/LayoutTests/platform/mac/accessibility/html-slider-indicator-expected.txt
@@ -0,0 +1,22 @@
+ALERT: Successfully received AXValueChanged
+ALERT: Successfully received AXValueChanged
+
+This tests that a basic range returns all the correct information for the mac platform.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS range.minValue is 0
+PASS range.maxValue is 100
+PASS range.intValue is 50
+PASS valueIndicator.intValue is 50
+PASS range.intValue is 49
+PASS valueIndicator.intValue is 49
+PASS range.intValue is 50
+PASS valueIndicator.intValue is 50
+PASS valueIndicator.isEqual(hitTestIndicator) is true
+PASS range.isEqual(hitTestRange) is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/platform/mac/accessibility/html-slider-indicator.html b/LayoutTests/platform/mac/accessibility/html-slider-indicator.html
new file mode 100644
index 0000000..7b3e1cd
--- /dev/null
+++ b/LayoutTests/platform/mac/accessibility/html-slider-indicator.html
@@ -0,0 +1,73 @@
+<html>
+<head>
+<link rel="stylesheet" href="../../../fast/js/resources/js-test-style.css">
+<script>
+var successfullyParsed = false;
+</script>
+<script src="../../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body id="body">
+
+<input id="range1" type="range">
+
+<p id="description"></p>
+<div id="console"></div>
+
+<script>
+
+    description("This tests that a basic range returns all the correct information for the mac platform.");
+    
+    var range = 0;
+    var valueChangeCount = 0;
+    function notificationCallback(notification) {
+        if (notification == "AXValueChanged") {
+           alert("Successfully received " + notification);
+           valueChangeCount++;
+        }
+
+        if (valueChangeCount == 2) {
+           range.removeNotificationListener();
+           window.layoutTestController.notifyDone();
+        }
+    }
+
+    if (window.accessibilityController) {
+        window.layoutTestController.waitUntilDone();
+
+        document.getElementById("range1").focus();
+        range = accessibilityController.focusedElement;
+        range.addNotificationListener(notificationCallback);
+
+        // Check that min/max/value return correct default values.
+        shouldBe("range.minValue", "0");
+        shouldBe("range.maxValue", "100");
+        shouldBe("range.intValue", "50");
+
+        // Check the value indicator returns a value.
+        var valueIndicator = range.childAtIndex(0);
+        shouldBe("valueIndicator.intValue", "50");
+        
+        // Check that incrementing/decrementing sends AXValueChange.
+        eventSender.keyDown("leftArrow");
+        shouldBe("range.intValue", "49");
+        shouldBe("valueIndicator.intValue", "49");
+
+        eventSender.keyDown("rightArrow");
+        shouldBe("range.intValue", "50");
+        shouldBe("valueIndicator.intValue", "50");
+
+        // Check that a hit test on the value indicator succeeds.
+        var hitTestIndicator = accessibilityController.elementAtPoint(range.x + range.width/2, range.y + range.height/2);
+        shouldBeTrue("valueIndicator.isEqual(hitTestIndicator)");
+
+        // Check that outside the indicator returns the slider.
+        var hitTestRange = accessibilityController.elementAtPoint(range.x + 1, range.y + range.height/2);
+        shouldBeTrue("range.isEqual(hitTestRange)");
+    }
+
+    successfullyParsed = true;
+</script>
+
+<script src="../../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index defc6da..8c2a544 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,38 @@
+2010-12-06  Chris Fleizach  <cfleizach at apple.com>
+
+        Reviewed by Darin Adler.
+
+        HTML5 Slider does not work correctly with VoiceOver
+        https://bugs.webkit.org/show_bug.cgi?id=50505
+
+        Address a few problems with the Mac implementation for the accessibility slider.
+            1) The value indicator is not hit testable.
+            2) The value indicator does not return an AXValue.
+            3) In the slider, the min/max values are not correct when min/max attributes are not present.
+            4) When you change the value with the keyboard, it doesn't send out the right notification.
+            5) Sliders were returning AXValue and AXTopLevelUIElement attributes twice in their list of attributes.
+ 
+        Test: platform/mac/accessibility/html-slider-indicator.html
+
+        * accessibility/AccessibilityObject.cpp:
+        (WebCore::AccessibilityObject::getAttribute):
+            Use fastGetAttribute on Element, instead of getAttribute.
+        * accessibility/AccessibilityObject.h:
+        (WebCore::AccessibilityObject::isInputSlider):
+        * accessibility/AccessibilityRenderObject.cpp:
+        (WebCore::AccessibilityRenderObject::doAccessibilityHitTest):
+        * accessibility/AccessibilitySlider.cpp:
+        (WebCore::AccessibilitySlider::doAccessibilityHitTest):
+        (WebCore::AccessibilitySlider::maxValueForRange):
+        (WebCore::AccessibilitySlider::minValueForRange):
+        * accessibility/AccessibilitySlider.h:
+        (WebCore::AccessibilitySlider::isInputSlider):
+        * accessibility/mac/AccessibilityObjectWrapper.mm:
+        (-[AccessibilityObjectWrapper accessibilityAttributeNames]):
+        (-[AccessibilityObjectWrapper accessibilityAttributeValue:]):
+        * html/HTMLInputElement.cpp:
+        (WebCore::HTMLInputElement::applyStep):
+
 2010-12-06  David Hyatt  <hyatt at apple.com>
 
         Reviewed by Simon Fraser.
diff --git a/WebCore/accessibility/AccessibilityObject.cpp b/WebCore/accessibility/AccessibilityObject.cpp
index 327a736..4157844 100644
--- a/WebCore/accessibility/AccessibilityObject.cpp
+++ b/WebCore/accessibility/AccessibilityObject.cpp
@@ -847,7 +847,7 @@ const AtomicString& AccessibilityObject::getAttribute(const QualifiedName& attri
         return nullAtom;
     
     Element* element = static_cast<Element*>(elementNode);
-    return element->getAttribute(attribute);
+    return element->fastGetAttribute(attribute);
 }
     
 // Lacking concrete evidence of orientation, horizontal means width > height. vertical is height > width;
diff --git a/WebCore/accessibility/AccessibilityObject.h b/WebCore/accessibility/AccessibilityObject.h
index 85f3e27..77b6a1f 100644
--- a/WebCore/accessibility/AccessibilityObject.h
+++ b/WebCore/accessibility/AccessibilityObject.h
@@ -284,6 +284,7 @@ public:
     virtual bool isInputImage() const { return false; }
     virtual bool isProgressIndicator() const { return false; }
     virtual bool isSlider() const { return false; }
+    virtual bool isInputSlider() const { return false; }
     virtual bool isControl() const { return false; }
     virtual bool isList() const { return false; }
     virtual bool isAccessibilityTable() const { return false; }
diff --git a/WebCore/accessibility/AccessibilityRenderObject.cpp b/WebCore/accessibility/AccessibilityRenderObject.cpp
index b860e07..c3f9920 100644
--- a/WebCore/accessibility/AccessibilityRenderObject.cpp
+++ b/WebCore/accessibility/AccessibilityRenderObject.cpp
@@ -2766,6 +2766,9 @@ AccessibilityObject* AccessibilityRenderObject::doAccessibilityHitTest(const Int
         listBox->updateChildrenIfNecessary();
         return listBox->doAccessibilityHitTest(point);
     }
+    
+    if (result->isInputSlider()) 
+        return result->doAccessibilityHitTest(point);
 
     if (result->accessibilityIsIgnored()) {
         // If this element is the label of a control, a hit test should return the control.
diff --git a/WebCore/accessibility/AccessibilitySlider.cpp b/WebCore/accessibility/AccessibilitySlider.cpp
index e8d1f41..c966ffb 100644
--- a/WebCore/accessibility/AccessibilitySlider.cpp
+++ b/WebCore/accessibility/AccessibilitySlider.cpp
@@ -98,6 +98,17 @@ const AtomicString& AccessibilitySlider::getAttribute(const QualifiedName& attri
 {
     return element()->getAttribute(attribute);
 }
+    
+AccessibilityObject* AccessibilitySlider::doAccessibilityHitTest(const IntPoint& point) const
+{
+    if (m_children.size()) {
+        ASSERT(m_children.size() == 1);
+        if (m_children[0]->elementRect().contains(point))
+            return m_children[0].get();
+    }
+    
+    return axObjectCache()->getOrCreate(m_renderer);
+}
 
 bool AccessibilitySlider::accessibilityIsIgnored() const
 {
@@ -117,12 +128,12 @@ float AccessibilitySlider::valueForRange() const
 
 float AccessibilitySlider::maxValueForRange() const
 {
-    return getAttribute(maxAttr).toFloat();
+    return element()->maximum();
 }
 
 float AccessibilitySlider::minValueForRange() const
 {
-    return getAttribute(minAttr).toFloat();
+    return element()->minimum();
 }
 
 void AccessibilitySlider::setValue(const String& value)
diff --git a/WebCore/accessibility/AccessibilitySlider.h b/WebCore/accessibility/AccessibilitySlider.h
index 461f62b..e5728d3 100644
--- a/WebCore/accessibility/AccessibilitySlider.h
+++ b/WebCore/accessibility/AccessibilitySlider.h
@@ -41,28 +41,29 @@ public:
     static PassRefPtr<AccessibilitySlider> create(RenderObject*);
     virtual ~AccessibilitySlider() { }
 
-    virtual AccessibilityRole roleValue() const { return SliderRole; }
+protected:
+    AccessibilitySlider(RenderObject*);
 
-    virtual bool isSlider() const { return true; }
+private:
+    HTMLInputElement* element() const;
+    virtual bool accessibilityIsIgnored() const;
+    virtual AccessibilityObject* doAccessibilityHitTest(const IntPoint&) const;
 
+    virtual AccessibilityRole roleValue() const { return SliderRole; }    
+    virtual bool isSlider() const { return true; }
+    virtual bool isInputSlider() const { return true; }
+    
     virtual const AccessibilityChildrenVector& children();
     virtual void addChildren();
-
+    
     virtual bool canSetValueAttribute() const { return true; }
     const AtomicString& getAttribute(const QualifiedName& attribute) const;
-
+    
     virtual void setValue(const String&);
     virtual float valueForRange() const;
     virtual float maxValueForRange() const;
     virtual float minValueForRange() const;
-    virtual AccessibilityOrientation orientation() const;
-
-protected:
-    AccessibilitySlider(RenderObject*);
-
-private:
-    HTMLInputElement* element() const;
-    virtual bool accessibilityIsIgnored() const;
+    virtual AccessibilityOrientation orientation() const;    
 };
 
 class AccessibilitySliderThumb : public AccessibilityObject {
diff --git a/WebCore/accessibility/mac/AccessibilityObjectWrapper.mm b/WebCore/accessibility/mac/AccessibilityObjectWrapper.mm
index 9760382..5100bfc 100644
--- a/WebCore/accessibility/mac/AccessibilityObjectWrapper.mm
+++ b/WebCore/accessibility/mac/AccessibilityObjectWrapper.mm
@@ -779,8 +779,6 @@ static WebCoreTextMarkerRange* textMarkerRangeFromVisiblePositions(AXObjectCache
     }
     if (rangeAttrs == nil) {
         tempArray = [[NSMutableArray alloc] initWithArray:attributes];
-        [tempArray addObject:NSAccessibilityTopLevelUIElementAttribute];
-        [tempArray addObject:NSAccessibilityValueAttribute];
         [tempArray addObject:NSAccessibilityMinValueAttribute];
         [tempArray addObject:NSAccessibilityMaxValueAttribute];
         [tempArray addObject:NSAccessibilityOrientationAttribute];
@@ -826,7 +824,6 @@ static WebCoreTextMarkerRange* textMarkerRangeFromVisiblePositions(AXObjectCache
             NSAccessibilityPositionAttribute,
             NSAccessibilitySizeAttribute,
             NSAccessibilityWindowAttribute,
-            NSAccessibilityTopLevelUIElementAttribute,
             NSAccessibilityEnabledAttribute,
             NSAccessibilityFocusedAttribute,
             NSAccessibilityTitleAttribute,
@@ -1538,6 +1535,8 @@ static NSString* roleValueToNSString(AccessibilityRole value)
         }
         if (m_object->isProgressIndicator() || m_object->isSlider() || m_object->isScrollbar())
             return [NSNumber numberWithFloat:m_object->valueForRange()];
+        if (m_object->roleValue() == SliderThumbRole)
+            return [NSNumber numberWithFloat:m_object->parentObject()->valueForRange()];
         if (m_object->isHeading())
             return [NSNumber numberWithInt:m_object->headingLevel()];
         
diff --git a/WebCore/html/HTMLInputElement.cpp b/WebCore/html/HTMLInputElement.cpp
index 263a057..4f9339d 100644
--- a/WebCore/html/HTMLInputElement.cpp
+++ b/WebCore/html/HTMLInputElement.cpp
@@ -376,6 +376,9 @@ void HTMLInputElement::applyStep(double count, ExceptionCode& ec)
     if (newValue > m_inputType->maximum())
         newValue = m_inputType->maximum();
     setValueAsNumber(newValue, ec);
+    
+    if (AXObjectCache::accessibilityEnabled())
+         document()->axObjectCache()->postNotification(renderer(), AXObjectCache::AXValueChanged, true);
 }
 
 void HTMLInputElement::stepUp(int n, ExceptionCode& ec)

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list