Index: src/orca/Gecko.py
===================================================================
--- src/orca/Gecko.py	(revision 2978)
+++ src/orca/Gecko.py	(working copy)
@@ -5986,15 +5986,6 @@
         if self.isSameObject(obj, documentFrame):
             return [None, -1]
 
-        # If we've found a list item in an HTML form, the caret had been
-        # just before the list.  Set obj to the parent list so we can
-        # maneuver around it rather than wander into it.
-        #
-        if obj.role == rolenames.ROLE_LIST_ITEM \
-           and (obj.state.count(atspi.Accessibility.STATE_FOCUSABLE) \
-                or self.isAriaWidget()):
-            obj = obj.parent
-
         while obj.parent and obj != obj.parent:
             characterOffsetInParent = self.getCharacterOffsetInParent(obj)
             if characterOffsetInParent >= 0:
@@ -6084,15 +6075,6 @@
         if self.isSameObject(obj, documentFrame):
             return [None, -1]
 
-        # If we've found a list item in an HTML form, the caret had been
-        # just after the list.  Set obj to the parent list so we can
-        # maneuver around it rather than wander into it.
-        #
-        if obj.role == rolenames.ROLE_LIST_ITEM \
-           and (obj.state.count(atspi.Accessibility.STATE_FOCUSABLE) \
-                 or self.isAriaWidget()):
-            obj = obj.parent
-
         while obj.parent and obj != obj.parent:
             characterOffsetInParent = self.getCharacterOffsetInParent(obj)
             if characterOffsetInParent >= 0:
@@ -6915,11 +6897,12 @@
         given object."""
         character = self.getCharacterAtOffset(obj, characterOffset)
         if obj:
-            if character:
+            if character and character != self.EMBEDDED_OBJECT_CHARACTER:
                 speech.speak(character, self.getACSS(obj, character), False)
             else:
                 # We'll run into this when we hit a component with no
-                # text, such as a checkbox.  In these cases, we'll
+                # text, such as a checkbox or when we reset the caret to the
+                # parent's characterOffset (lists).  In these cases, we'll
                 # just speak the entire component.
                 #
                 utterances = self.speechGenerator.getSpeech(obj, False)
@@ -6965,8 +6948,9 @@
         #
         if obj.role == rolenames.ROLE_LIST \
            and obj.state.count(atspi.Accessibility.STATE_FOCUSABLE):
-            [obj, characterOffset] = self.findPreviousCaretInOrder(obj=obj,
-                                     includeNonText=False)
+            characterOffset = self.getCharacterOffsetInParent(obj)
+            obj = obj.parent
+            self.setCaretContext(obj, characterOffset)
 
         # Reset focus if need be.
         #
@@ -7026,7 +7010,7 @@
         while obj:
             [obj, characterOffset] = self.findNextCaretInOrder(obj,
                                                                characterOffset)
-            if obj and obj.state.count(atspi.Accessibility.STATE_SHOWING):
+            if obj and obj.state.count(atspi.Accessibility.STATE_VISIBLE):
                 break
         if obj:
             self.setCaretPosition(obj, characterOffset)
@@ -7044,7 +7028,7 @@
         while obj:
             [obj, characterOffset] = self.findPreviousCaretInOrder(
                 obj, characterOffset)
-            if obj and obj.state.count(atspi.Accessibility.STATE_SHOWING):
+            if obj and obj.state.count(atspi.Accessibility.STATE_VISIBLE):
                 break
 
         if obj:
