Index: src/orca/default.py
===================================================================
--- src/orca/default.py	(revision 2348)
+++ src/orca/default.py	(working copy)
@@ -4040,22 +4040,19 @@
 
         return self._unicodeCurrencySymbols
 
-    def getDisplayedLabel(self, object):
-        """If there is an object labelling the given object, return the
-        text being displayed for the object labelling this object.
-        Otherwise, return None.
+    def findDisplayedLabel(self, object):
+        """Return a list of the objects that are labelling this object.
 
         Argument:
         - object: the object in question
 
-        Returns the string of the object labelling this object, or None
-        if there is nothing of interest here.
+        Returns a list of the objects that are labelling this object.
         """
 
         # For some reason, some objects are labelled by the same thing
         # more than once.  Go figure, but we need to check for this.
         #
-        label = None
+        label = []
         relations = object.relations
         allTargets = []
 
@@ -4075,7 +4072,7 @@
                                                        relation.getTarget(i))
                     if not target in allTargets:
                         allTargets.append(target)
-                        label = self.appendString(label, self.getDisplayedText(target))
+                        label.append(target)
 
         # [[[TODO: HACK - we've discovered oddness in hierarchies such as
         # the gedit Edit->Preferences dialog.  In this dialog, we have
@@ -4095,7 +4092,7 @@
         # Finally, we are searching the hierarchy of embedded components for
         # children that are labels.]]]
         #
-        if not label:
+        if not len(label):
             potentialLabels = []
             useLabel = False
             if (object.role == rolenames.ROLE_EMBEDDED):
@@ -4152,12 +4149,29 @@
                             pass
 
             if useLabel and len(potentialLabels):
-                label = ""
-                for potentialLabel in potentialLabels:
-                    label += (potentialLabel.name + " ")
+                label = potentialLabels
 
         return label
 
+    def getDisplayedLabel(self, object):
+        """If there is an object labelling the given object, return the
+        text being displayed for the object labelling this object.
+        Otherwise, return None.
+
+        Argument:
+        - object: the object in question
+
+        Returns the string of the object labelling this object, or None
+        if there is nothing of interest here.
+        """
+
+        string = None
+        labels = self.findDisplayedLabel(object)
+        for label in labels:
+            string = self.appendString(string, self.getDisplayedText(label))
+
+        return string
+
     def __getDisplayedTextInComboBox(self, combo):
 
         """Returns the text being displayed in a combo box.  If nothing is
Index: src/orca/Gecko.py
===================================================================
--- src/orca/Gecko.py	(revision 2348)
+++ src/orca/Gecko.py	(working copy)
@@ -1,3 +1,4 @@
+
 # Orca
 #
 # Copyright 2005-2007 Sun Microsystems Inc.
@@ -539,7 +540,7 @@
         # we'll fall back to the accessible name.
         #
         label = self._script.getDisplayedLabel(obj)
-        if not label:
+        if not label and not self._script.inDocumentContent():
             label = obj.name
 
         if not already_focused and label:
@@ -2091,6 +2092,43 @@
 
         return True
 
+    def getDisplayedLabel(self, obj):
+        """If there is an object labelling the given object, return the
+        text being displayed for the object labelling this object.
+        Otherwise, return None.  Overridden here to handle instances
+        of bogus labels and form fields where a lack of labels necessitates
+        our attempt to guess the text that is functioning as a label.
+
+        Argument:
+        - obj: the object in question
+
+        Returns the string of the object labelling this object, or None
+        if there is nothing of interest here.
+        """
+
+        string = None
+        labels = self.findDisplayedLabel(obj)
+        for label in labels:
+            # Check to see if the official labels are valid.
+            #
+            bogus = False
+            if obj.role == rolenames.ROLE_COMBO_BOX and \
+               self.inDocumentContent():
+                # Bogus case #1:
+                # <label></label> surrounding the entire combo box which
+                # makes the entire combo box's contents serve as the label.
+                # We can identify this case because the child of the label
+                # is the combo box. See bug #428114.
+                #
+                if label.childCount and \
+                   label.child(0).role == rolenames.ROLE_COMBO_BOX:
+                    bogus = True
+
+            if not bogus:
+                string = self.appendString(string, self.getDisplayedText(label))
+
+        return string
+    
     def onCaretMoved(self, event):
         """Caret movement in Gecko is somewhat unreliable and
         unpredictable, but we need to handle it.  When we detect caret
