Index: src/orca/Gecko.py
===================================================================
--- src/orca/Gecko.py	(revision 3336)
+++ src/orca/Gecko.py	(working copy)
@@ -4305,7 +4305,8 @@
             # a call to goNextWord.]]]
             #
             string = text.getText(0, -1)
-            if characterOffset >= len(string):
+            if characterOffset >= len(string) and \
+               obj.getRole() != pyatspi.ROLE_ENTRY:
                 print "YIKES in Gecko.sayCharacter!"
                 characterOffset -= 1
 
@@ -4676,7 +4677,7 @@
             elif caretOffset <= 0:
                 weHandleIt = keyboardEvent.event_string \
                              in ["Up", "Left"]
-            elif caretOffset >= length - 1 \
+            elif caretOffset == length \
                  and not self._autocompleteVisible:
                 weHandleIt = keyboardEvent.event_string \
                              in ["Down", "Right"]
@@ -6002,7 +6003,15 @@
         if text:
             unicodeText = self.getUnicodeText(obj)
             if characterOffset >= len(unicodeText):
-                return [obj, -1]
+                if obj.getRole() != pyatspi.ROLE_ENTRY:
+                    return [obj, -1]
+                else:
+                    # We're at the end of an entry.  If we return -1,
+                    # and then set the caretContext accordingly,
+                    # findNextCaretInOrder() will think we're at the
+                    # beginning and we'll never escape this entry.
+                    #
+                    return [obj, characterOffset]
 
             character = text.getText(characterOffset,
                                      characterOffset + 1).decode("UTF-8")
@@ -7007,6 +7016,11 @@
         if obj:
             if character and character != self.EMBEDDED_OBJECT_CHARACTER:
                 speech.speak(character, self.getACSS(obj, character), False)
+            elif obj.getRole() == pyatspi.ROLE_ENTRY:
+                # Translators: "blank" is a short word to mean the
+                # user has navigated to an empty line.
+                #
+                speech.speak(_("blank"))
             else:
                 # We'll run into this when we hit a component with no
                 # text, such as a checkbox or when we reset the caret to the
