Index: src/orca/Gecko.py
===================================================================
--- src/orca/Gecko.py	(revision 2679)
+++ src/orca/Gecko.py	(working copy)
@@ -551,6 +551,8 @@
              self._getSpeechForLink
         self.speechGenerators[rolenames.ROLE_LIST_ITEM]      = \
              self._getSpeechForListItem
+        self.speechGenerators[rolenames.ROLE_SLIDER]      = \
+             self._getSpeechForSlider
 
     def _getSpeechForObjectRole(self, obj):
         """Prevents some roles from being spoken."""
@@ -1065,7 +1067,69 @@
                              utterances)
 
         return utterances
+        
+    def _getSpeechForSlider(self, obj, already_focused):
+        """Get the speech for a slider.  If the object already
+        had focus, just the value is spoken.
 
+        Arguments:
+        - obj: the slider
+        - already_focused: False if object just received focus
+
+        Returns a list of utterances to be spoken for the object.
+        """
+        
+        value = obj.value
+
+        # OK, this craziness is all about trying to figure out the most
+        # meaningful formatting string for the floating point values.
+        # The number of places to the right of the decimal point should
+        # be set by the minimumIncrement, but the minimumIncrement isn't
+        # always set.  So...we'll default the minimumIncrement to 1/100
+        # of the range.  But, if max == min, then we'll just go for showing
+        # them off to two meaningful digits.
+        #
+        try:
+            minimumIncrement = value.minimumIncrement
+        except:
+            minimumIncrement = 0.0
+
+        if minimumIncrement == 0.0:
+            minimumIncrement = (value.maximumValue - value.minimumValue) \
+                               / 100.0
+
+        try:
+            decimalPlaces = max(0, -math.log10(minimumIncrement))
+        except:
+            try:
+                decimalPlaces = max(0, -math.log10(value.minimumValue))
+            except:
+                try:
+                    decimalPlaces = max(0, -math.log10(value.maximumValue))
+                except:
+                    decimalPlaces = 0
+
+        formatter = "%%.%df" % decimalPlaces
+        valueString = formatter % value.currentValue
+        #minString   = formatter % value.minimumValue
+        #maxString   = formatter % value.maximumValue
+
+        if already_focused:
+            utterances = [valueString]
+        else:
+            utterances = []
+            utterances.extend(self._getSpeechForObjectLabel(obj))
+            utterances.extend(self._getSpeechForObjectRole(obj))
+            utterances.append(valueString)
+            utterances.extend(self._getSpeechForObjectAvailability(obj))
+
+        self._debugGenerator("_getSpeechForSlider",
+                             obj,
+                             already_focused,
+                             utterances)
+
+        return utterances
+
     def getSpeechContext(self, obj, stopAncestor=None):
         """Get the speech that describes the names and role of
         the container hierarchy of the object, stopping at and
@@ -3072,7 +3136,7 @@
                 # See bug #441610 and
                 # https://bugzilla.mozilla.org/show_bug.cgi?id=348901
                 #
-                string = self.appendString(string, label.name)
+                string = self.appendString(string, self.expandEOCs(label))
 
         return string
 
