Index: src/orca/where_am_I.py
===================================================================
--- src/orca/where_am_I.py	(revision 3232)
+++ src/orca/where_am_I.py	(working copy)
@@ -70,6 +70,7 @@
            \n  label=%s \
            \n  name=%s \
            \n  role=%s \
+           \n  description=%s \
            \n  mnemonics=%s \
            \n  parent label= %s \
            \n  parent name=%s \
@@ -79,6 +80,7 @@
             (self._getObjLabel(obj),
              self._getObjName(obj),
              obj.getRoleName(),
+             self._getObjDescription(obj),
              self._script.getAcceleratorAndShortcut(obj),
              self._getObjLabel(obj.parent),
              self._getObjName(obj.parent),
@@ -149,6 +151,7 @@
         2. role
         3. state
         4. mnemonic (i.e. Alt plus the underlined letter), if any
+        5. description, if any
         """
 
         utterances = []
@@ -170,6 +173,10 @@
         text = self._getObjMnemonic(obj)
         utterances.append(text)
 
+        text = self._getObjDescription(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "check box utterances=%s" \
                       % utterances)
         speech.speakUtterances(utterances)
@@ -184,6 +191,7 @@
         4. state
         5. relative position
         6. mnemonic (i.e. Alt plus the underlined letter), if any
+        7. description, if any
         """
 
         utterances = []
@@ -218,6 +226,10 @@
         text = self._getObjMnemonic(obj)
         utterances.append(text)
 
+        text = self._getObjDescription(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "radio button utterances=%s" % \
                       utterances)
         speech.speakUtterances(utterances)
@@ -231,6 +243,7 @@
         3. current value
         4. relative position
         5. mnemonic (i.e. Alt plus the underlined letter), if any
+        6. description, if any
         """
 
         utterances = []
@@ -250,6 +263,10 @@
         text = self._getObjMnemonic(obj)
         utterances.append(text)
 
+        text = self._getObjDescription(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "combo box utterances=%s" % \
                       utterances)
         speech.speakUtterances(utterances)
@@ -262,6 +279,7 @@
         2. role
         3. current value
         4. mnemonic (i.e. Alt plus the underlined letter), if any
+        5. description, if any
         """
 
         utterances = []
@@ -277,6 +295,10 @@
         text = self._getObjMnemonic(obj)
         utterances.append(text)
 
+        text = self._getObjDescription(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "spin button utterances=%s" % \
                       utterances)
         speech.speakUtterances(utterances)
@@ -288,6 +310,7 @@
         1. label
         2. role
         3. mnemonic (i.e. Alt plus the underlined letter), if any
+        4. description, if any
         """
 
         utterances = []
@@ -300,6 +323,10 @@
         text = self._getObjMnemonic(obj)
         utterances.append(text)
 
+        text = self._getObjDescription(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "push button utterances=%s" % \
                       utterances)
         speech.speakUtterances(utterances)
@@ -313,6 +340,7 @@
         3. value
         4. percentage (if possible)
         5. mnemonic (i.e. Alt plus the underlined letter), if any
+        6. description, if any
         """
 
         utterances = []
@@ -331,6 +359,10 @@
         text = self._getObjMnemonic(obj)
         utterances.append(text)
 
+        text = self._getObjDescription(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "slider utterances=%s" % \
                       utterances)
         speech.speakUtterances(utterances)
@@ -345,6 +377,7 @@
         accelerator key, if any
         3. relative position
         4. mnemonic (i.e. Alt plus the underlined letter), if any
+        5. description, if any
         """
 
         utterances = []
@@ -403,6 +436,10 @@
         
         utterances.append(text)
 
+        text = self._getObjDescription(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "menu item utterances=%s" % \
                       utterances)
         speech.speakUtterances(utterances)
@@ -415,6 +452,7 @@
         2. label + 'page'
         3. relative position
         4. mnemonic (i.e. Alt plus the underlined letter), if any
+        5. description, if any
         """
 
         utterances = []
@@ -433,6 +471,10 @@
         text = self._getObjMnemonic(obj)
         utterances.append(text)
 
+        text = self._getObjDescription(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "page utterances=%s" % \
                       utterances)
         speech.speakUtterances(utterances)
@@ -450,6 +492,7 @@
             by 'selected' (single press)
             C. if the current line is blank/empty, 'blank'
         4. mnemonic (i.e. Alt plus the underlined letter), if any
+        5. description, if any
 
         Gaim, gedit, OpenOffice Writer and Terminal
         """
@@ -493,6 +536,10 @@
         text = self._getObjMnemonic(obj)
         utterances.append(text)
 
+        text = self._getObjDescription(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "text utterances=%s" % \
                       utterances)
         speech.speakUtterances(utterances)
@@ -507,6 +554,7 @@
         4. relative position
         5. if expandable/collapsible: expanded/collapsed
         6. if applicable, the level
+        7. description, if any
 
         Nautilus and Gaim
         """
@@ -585,6 +633,10 @@
             #
             utterances.append(_("tree level %d") % (level + 1))
 
+        text = self._getObjDescription(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "third table cell utterances=%s" % \
                       utterances)
         speech.speakUtterances(utterances)
@@ -598,6 +650,7 @@
         4. relative position
         5. if expandable/collapsible: expanded/collapsed
         6. if applicable, the level
+        7. description, if any
         """
 
         utterances = []
@@ -645,6 +698,10 @@
             #
             utterances.append(_("tree level %d") % (level + 1))
 
+        text = self._getObjDescription(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "list item utterances=%s" % \
                       utterances)
         speech.speakUtterances(utterances)
@@ -659,6 +716,7 @@
         """Speak the contents of the pane containing this icon. The
         number of icons in the pane is spoken. Plus the total number of
         selected icons. Plus the name of each of the selected icons.
+        Finally, the description (if any) is spoken.
 
         Arguments:
         - obj: the icon object that currently has focus.
@@ -690,6 +748,10 @@
                               (totalSelectedItems, childCount)
         utterances.append(itemString)
 
+        text = self._getObjDescription(obj)
+        if text:
+            utterances.append(text)
+
         if doubleClick:
             for i in range(0, len(selectedItems)):
                 utterances.append(self._getObjLabelAndName(selectedItems[i]))
@@ -698,7 +760,8 @@
         
     def _speakLink(self, obj, doubleClick):
         """Speaks information about a link including protocol, domain 
-        comparisons and size of file if possible
+        comparisons and size of file if possible. If the link has an
+        associated title, it is spoken as well.
         
         Arguments:
         - obj: the icon object that currently has focus.
@@ -760,11 +823,18 @@
                 else:
                     domainoutput = _('different site')
 
-        speech.speakUtterances([linkoutput, domainoutput, sizeoutput])
+        # speak the link description/title if one is present. 
+        description = self._getObjDescription(obj)
+
+        speech.speakUtterances([linkoutput,
+                                domainoutput,
+                                sizeoutput,
+                                description])
       
     def __extractSize(self, uri):
         '''
-        Get the http header for a given uri and try to extract the size (Content-length).
+        Get the http header for a given uri and try to extract the size
+        (Content-length).
         '''
         try:
             x = urllib2.urlopen(uri)
@@ -807,6 +877,11 @@
 
         text = rolenames.getSpeechForRoleName(obj)
         utterances.append(text)
+
+        text = self._getObjDescription(obj)
+        if text:
+            utterances.append(text)
+
         speech.speakUtterances(utterances)
 
     def _getObjName(self, obj):
@@ -863,6 +938,21 @@
 
         return text.strip()
 
+    def _getObjDescription(self, obj):
+        """Returns the object's description if it is not the same as
+        the object's name or label.
+        """
+
+        text = ""
+        description = obj.description
+        name = self._getObjName(obj)
+        label = self._getObjLabel(obj)
+
+        if description and not description in [name, label]:
+            text = description.strip()
+
+        return text
+
     def _getGroupLabel(self, obj):
         """Returns the label for a group of components.
         """
