[orca] Begin reworking of speech generation for Gecko content



commit 5f3b2638eda39db9b0e59acde5b5500bc8a15f1d
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Sat Sep 6 18:03:54 2014 -0400

    Begin reworking of speech generation for Gecko content

 src/orca/scripts/toolkits/Gecko/script.py          |   46 ++-----
 .../scripts/toolkits/Gecko/script_utilities.py     |   10 ++
 .../scripts/toolkits/Gecko/speech_generator.py     |   55 ++++---
 src/orca/speech_generator.py                       |   28 ++++
 test/keystrokes/firefox/aria_tabcontainer_dojo.py  |    2 +-
 test/keystrokes/firefox/focus_tracking_imagemap.py |   12 +-
 test/keystrokes/firefox/focus_tracking_links.py    |    4 +-
 test/keystrokes/firefox/line_nav_bug_549128.py     |   20 +---
 test/keystrokes/firefox/line_nav_bug_552887a.py    |   12 +--
 test/keystrokes/firefox/line_nav_bug_554616.py     |    7 +-
 test/keystrokes/firefox/line_nav_bug_555055.py     |    8 +-
 test/keystrokes/firefox/line_nav_bug_577239.py     |   14 +-
 .../firefox/line_nav_bugzilla_search_down.py       |   13 +--
 .../firefox/line_nav_bugzilla_search_up.py         |   13 +--
 test/keystrokes/firefox/line_nav_clickables.py     |    2 -
 test/keystrokes/firefox/line_nav_enter_bug.py      |    8 +-
 test/keystrokes/firefox/line_nav_entries.py        |   24 +---
 test/keystrokes/firefox/line_nav_imagemap.py       |  160 +++++++-------------
 test/keystrokes/firefox/line_nav_lists.py          |   46 ++----
 test/keystrokes/firefox/line_nav_nested_tables.py  |   20 +--
 test/keystrokes/firefox/line_nav_simple_form.py    |   14 +-
 test/keystrokes/firefox/line_nav_sun_java.py       |   41 ++----
 .../firefox/line_nav_table_cell_links.py           |   32 +---
 test/keystrokes/firefox/longdesc_12.py             |    4 +-
 test/keystrokes/firefox/longdesc_4.py              |    1 -
 test/keystrokes/firefox/longdesc_5.py              |    1 -
 test/keystrokes/firefox/say_all_bug_511389.py      |    2 -
 test/keystrokes/firefox/say_all_bug_591351_1.py    |    4 +-
 test/keystrokes/firefox/say_all_bugzilla_search.py |    6 +-
 test/keystrokes/firefox/say_all_enter_bug.py       |    5 +-
 test/keystrokes/firefox/say_all_imagemap.py        |   54 ++++----
 test/keystrokes/firefox/say_all_nested_tables.py   |    7 +-
 .../keystrokes/firefox/say_all_table_cell_links.py |    8 -
 33 files changed, 259 insertions(+), 424 deletions(-)
---
diff --git a/src/orca/scripts/toolkits/Gecko/script.py b/src/orca/scripts/toolkits/Gecko/script.py
index 37d2526..dd95fb7 100644
--- a/src/orca/scripts/toolkits/Gecko/script.py
+++ b/src/orca/scripts/toolkits/Gecko/script.py
@@ -2624,45 +2624,12 @@ class Script(default.Script):
 
         utterances = []
         prevObj = None
+        contents = self.utilities.filterContentsForPresentation(contents)
         for content in contents:
             [obj, startOffset, endOffset, string] = content
             string = self.utilities.adjustForRepeats(string)
             role = obj.getRole()
 
-            # If we don't have an object, there's nothing to do. If we have
-            # a string, but it consists solely of spaces, we have nothing to
-            # say. If it's a label for an object in our contents, we'll get
-            # that label via the speech generator for the object.
-            #
-            if not obj \
-               or len(string) and not len(string.strip(" ")) \
-               or self.isLabellingContents(obj, contents):
-                continue
-
-            # TODO - JD: this is a temporary and sad hack borrowed from
-            # clumpUtterances() which is no longer called by speakContents().
-            # Ultimately this sort of crap belongs in a generator (along with
-            # other similiar crap).
-            if string == "\n" and len(contents) == 1 \
-               and _settingsManager.getSetting('speakBlankLines'):
-                string = messages.BLANK
-
-            # Thunderbird now does something goofy with smileys in
-            # email: exposes them as a nested paragraph with a name
-            # consisting of the punctuation used to create the smiley
-            # and an empty accessible text object. This causes us to
-            # speak tutorial info for each smiley. :-( type in text.
-            #
-            elif role == pyatspi.ROLE_PARAGRAPH and not len(string):
-                string = obj.name
-                # We also see goofiness in some pages. That can cause
-                # SayAll by Sentence to spit up. See bug 591351. So
-                # if we still do not have string and if we've got
-                # more than object in contents, let's dump this one.
-                #
-                if len(contents) > 1 and not len(string):
-                    continue
-
             # If we don't have a string, then use the speech generator.
             # Otherwise, we'll want to speak the string and possibly the
             # role.
@@ -2671,7 +2638,7 @@ class Script(default.Script):
                or self.utilities.isEntry(obj) \
                or self.utilities.isPasswordText(obj) \
                or self.utilities.isClickableElement(obj) \
-               or role in [pyatspi.ROLE_PUSH_BUTTON,
+               or role in [pyatspi.ROLE_PUSH_BUTTON, pyatspi.ROLE_IMAGE,
                            pyatspi.ROLE_CHECK_BOX, pyatspi.ROLE_RADIO_BUTTON,
                            pyatspi.ROLE_TOGGLE_BUTTON, pyatspi.ROLE_COMBO_BOX]:
                 rv = self.speechGenerator.generateSpeech(obj)
@@ -2709,6 +2676,9 @@ class Script(default.Script):
 
             prevObj = obj
 
+        if not utterances:
+            utterances = [messages.BLANK, self.voices[settings.DEFAULT_VOICE]]
+
         return utterances
 
     def clumpUtterances(self, utterances):
@@ -2721,7 +2691,11 @@ class Script(default.Script):
 
         clumped = []
 
-        for [element, acss] in utterances:
+        for utterance in utterances:
+            try:
+                [element, acss] = utterance
+            except:
+                continue
             if len(clumped) == 0:
                 clumped = [[element, acss]]
             elif acss == clumped[-1][1] \
diff --git a/src/orca/scripts/toolkits/Gecko/script_utilities.py 
b/src/orca/scripts/toolkits/Gecko/script_utilities.py
index 13873e4..ad92680 100644
--- a/src/orca/scripts/toolkits/Gecko/script_utilities.py
+++ b/src/orca/scripts/toolkits/Gecko/script_utilities.py
@@ -825,6 +825,16 @@ class Utilities(script_utilities.Utilities):
 
         return objects
 
+    def filterContentsForPresentation(self, contents):
+        def _include(x):
+            obj, start, end, string = x
+            if not obj or (string and not string.strip()) \
+               or self._script.isLabellingContents(obj, contents):
+                return False
+            return True
+
+        return list(filter(_include, contents))
+
     def getObjectsFromEOCs(self, obj, offset=None, boundary=None):
         """Expands the current object replacing EMBEDDED_OBJECT_CHARACTERS
         with [obj, startOffset, endOffset, string] tuples.
diff --git a/src/orca/scripts/toolkits/Gecko/speech_generator.py 
b/src/orca/scripts/toolkits/Gecko/speech_generator.py
index 2d854e7..0c9c9b3 100644
--- a/src/orca/scripts/toolkits/Gecko/speech_generator.py
+++ b/src/orca/scripts/toolkits/Gecko/speech_generator.py
@@ -90,7 +90,6 @@ class SpeechGenerator(speech_generator.SpeechGenerator):
                             break
                 if child and child.name:
                     result.append(child.name)
-                if result:
                     result.extend(acss)
 
         else:
@@ -98,6 +97,7 @@ class SpeechGenerator(speech_generator.SpeechGenerator):
                               self, obj, **args))
         if not result and role == pyatspi.ROLE_LIST_ITEM:
             result.append(self._script.utilities.expandEOCs(obj))
+            result.extend(acss)
 
         acss = self.voice(speech_generator.HYPERLINK)
         link = None
@@ -123,14 +123,13 @@ class SpeechGenerator(speech_generator.SpeechGenerator):
         if that description is different from that of the name and
         label.
         """
-        if args.get('role', obj.getRole()) == pyatspi.ROLE_LINK \
-           and obj.parent.getRole() == pyatspi.ROLE_IMAGE:
-            result = self._generateName(obj, **args)
-            result.append(messages.IMAGE_MAP_LINK)
-        else:
-            result = speech_generator.SpeechGenerator.\
-                           _generateDescription(self, obj, **args)
-        return result
+        formatType = args.get('formatType')
+        role = args.get('role', obj.getRole())
+        if role == pyatspi.ROLE_TEXT and formatType != 'basicWhereAmI':
+            return []
+
+        return speech_generator.SpeechGenerator._generateDescription(
+            self, obj, **args)
 
     def _generateLabel(self, obj, **args):
         acss = self.voice(speech_generator.DEFAULT)
@@ -159,6 +158,7 @@ class SpeechGenerator(speech_generator.SpeechGenerator):
             label = self._script.labelInference.infer(obj, focusedOnly)
             if label:
                 result.append(label)
+                result.extend(acss)
 
         # XUL combo boxes don't always have a label for/by
         # relationship.  But, they will make their names be
@@ -168,9 +168,8 @@ class SpeechGenerator(speech_generator.SpeechGenerator):
            and role == pyatspi.ROLE_COMBO_BOX \
            and not self._script.inDocumentContent():
             result.append(obj.name)
-
-        if result:
             result.extend(acss)
+
         return result
 
     def _generateLabelAndName(self, obj, **args):
@@ -192,6 +191,10 @@ class SpeechGenerator(speech_generator.SpeechGenerator):
         return result
 
     def _generateLabelOrName(self, obj, **args):
+        role = args.get('role', obj.getRole())
+        if role == pyatspi.ROLE_TEXT:
+            return []
+
         result = []
         if obj.parent.getRole() == pyatspi.ROLE_AUTOCOMPLETE:
             # This is the main difference between this class and the default
@@ -228,6 +231,7 @@ class SpeechGenerator(speech_generator.SpeechGenerator):
                           pyatspi.ROLE_MENU_ITEM,
                           pyatspi.ROLE_PARAGRAPH,
                           pyatspi.ROLE_SECTION,
+                          pyatspi.ROLE_TEXT,
                           pyatspi.ROLE_UNKNOWN]
         else:
             # We never ever want to speak 'unknown'
@@ -242,32 +246,37 @@ class SpeechGenerator(speech_generator.SpeechGenerator):
 
         if not (role in doNotSpeak):
             if role == pyatspi.ROLE_IMAGE:
+                result.append(self.getLocalizedRoleName(obj, role))
+                result.extend(acss)
                 link = self._script.utilities.ancestorWithRole(
                     obj, [pyatspi.ROLE_LINK], [pyatspi.ROLE_DOCUMENT_FRAME])
                 if link:
                     result.append(self.getLocalizedRoleName(link))
+                    result.extend(acss)
 
-            if role == pyatspi.ROLE_HEADING:
+            elif role == pyatspi.ROLE_HEADING:
                 level = self._script.getHeadingLevel(obj)
                 if level:
                     result.append(object_properties.ROLE_HEADING_LEVEL_SPEECH % {
                         'role': self.getLocalizedRoleName(obj, role),
                         'level': level})
+                    result.extend(acss)
                 else:
                     result.append(self.getLocalizedRoleName(obj, role))
+                    result.extend(acss)
+
+            elif role == pyatspi.ROLE_LINK:
+                if obj.parent.getRole() == pyatspi.ROLE_IMAGE:
+                    result.append(messages.IMAGE_MAP_LINK)
+                    result.extend(acss)
+                else:
+                    result.append(self.getLocalizedRoleName(obj, role))
+                    result.extend(acss)
+                    if obj.childCount and obj[0].getRole() == pyatspi.ROLE_IMAGE:
+                        result.append(self.getLocalizedRoleName(obj[0]))
+                        result.extend(acss)
             else:
                 result.append(self.getLocalizedRoleName(obj, role))
-
-            if result:
-                result.extend(acss)
-
-            if role == pyatspi.ROLE_LINK \
-               and obj.childCount and obj[0].getRole() == pyatspi.ROLE_IMAGE:
-                # If this is a link with a child which is an image, we
-                # want to indicate that.
-                #
-                acss = self.voice(speech_generator.HYPERLINK)
-                result.append(self.getLocalizedRoleName(obj[0]))
                 result.extend(acss)
 
         return result
diff --git a/src/orca/speech_generator.py b/src/orca/speech_generator.py
index 02c6ba1..133fafb 100644
--- a/src/orca/speech_generator.py
+++ b/src/orca/speech_generator.py
@@ -242,6 +242,26 @@ class SpeechGenerator(generator.Generator):
             result.extend(acss)
         return result
 
+    def _generateAvailability(self, obj, **args):
+        if _settingsManager.getSetting('onlySpeakDisplayedText'):
+            return []
+
+        acss = self.voice(SYSTEM)
+        result = generator.Generator._generateAvailability(self, obj, **args)
+        if result:
+            result.extend(acss)
+        return result
+
+    def _generateRequired(self, obj, **args):
+        if _settingsManager.getSetting('onlySpeakDisplayedText'):
+            return []
+
+        acss = self.voice(SYSTEM)
+        result = generator.Generator._generateRequired(self, obj, **args)
+        if result:
+            result.extend(acss)
+        return result
+
     def _generateTextRole(self, obj, **args):
         """A convenience method to prevent the pyatspi.ROLE_PARAGRAPH role
         from being spoken. In the case of a pyatspi.ROLE_PARAGRAPH
@@ -944,6 +964,14 @@ class SpeechGenerator(generator.Generator):
             result.extend(acss)
         return result
 
+    def _generateDisplayedText(self, obj, **args):
+        acss = self.voice(DEFAULT)
+        result = generator.Generator._generateDisplayedText(self, obj, **args)
+        if result:
+            result.extend(acss)
+
+        return result
+
     def _getCharacterAttributes(self,
                                 obj,
                                 text,
diff --git a/test/keystrokes/firefox/aria_tabcontainer_dojo.py 
b/test/keystrokes/firefox/aria_tabcontainer_dojo.py
index 2618338..e193be5 100644
--- a/test/keystrokes/firefox/aria_tabcontainer_dojo.py
+++ b/test/keystrokes/firefox/aria_tabcontainer_dojo.py
@@ -14,7 +14,7 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Tab"))
 sequence.append(utils.AssertPresentationAction(
     "1. Tab to tab list",
-    ["BRAILLE LINE:  'push button push button  Tab 1  Tab 2 Tab 3 Inlined Sub TabContainer Sub TabContainer 
from href SplitContainer from href Embedded layout widgets'",
+    ["BRAILLE LINE:  'push button push button  Tab 1 Tab 2 Tab 3 Inlined Sub TabContainer Sub TabContainer 
from href SplitContainer from href Embedded layout widgets'",
      "     VISIBLE:  'Tab 2 Tab 3 Inlined Sub TabConta', cursor=1",
      "BRAILLE LINE:  'Focus mode'",
      "     VISIBLE:  'Focus mode', cursor=0",
diff --git a/test/keystrokes/firefox/focus_tracking_imagemap.py 
b/test/keystrokes/firefox/focus_tracking_imagemap.py
index fd96da4..83eaf37 100644
--- a/test/keystrokes/firefox/focus_tracking_imagemap.py
+++ b/test/keystrokes/firefox/focus_tracking_imagemap.py
@@ -11,12 +11,10 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Tab"))
 sequence.append(utils.AssertPresentationAction(
     "1. Tab",
-    ["KNOWN ISSUE: This seems a bit redundant/chatty",
-     "BRAILLE LINE:  'Test: z y x w v u t s r q p o n m l k j i h g f e d c b a'",
+    ["BRAILLE LINE:  'Test: z y x w v u t s r q p o n m l k j i h g f e d c b a'",
      "     VISIBLE:  'Test: z y x w v u t s r q p o n ', cursor=0",
      "SPEECH OUTPUT: 'z'",
-     "SPEECH OUTPUT: 'link' voice=hyperlink",
-     "SPEECH OUTPUT: 'z image map link'"]))
+     "SPEECH OUTPUT: 'image map link rect' voice=hyperlink"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Tab"))
@@ -25,8 +23,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'Test: z y x w v u t s r q p o n m l k j i h g f e d c b a'",
      "     VISIBLE:  'Test: z y x w v u t s r q p o n ', cursor=0",
      "SPEECH OUTPUT: 'y'",
-     "SPEECH OUTPUT: 'link' voice=hyperlink",
-     "SPEECH OUTPUT: 'y image map link'"]))
+     "SPEECH OUTPUT: 'image map link rect' voice=hyperlink"]))
 
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyComboAction("Tab"))
@@ -60,8 +57,7 @@ sequence.append(utils.AssertPresentationAction(
      "BRAILLE LINE:  'Test: z y x w v u t s r q p o n m l k j i h g f e d c b a'",
      "     VISIBLE:  'Test: z y x w v u t s r q p o n ', cursor=0",
      "SPEECH OUTPUT: 'a'",
-     "SPEECH OUTPUT: 'link' voice=hyperlink",
-     "SPEECH OUTPUT: 'a image map link'"]))
+     "SPEECH OUTPUT: 'image map link rect' voice=hyperlink"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Tab"))
diff --git a/test/keystrokes/firefox/focus_tracking_links.py b/test/keystrokes/firefox/focus_tracking_links.py
index 643be2a..89f015c 100644
--- a/test/keystrokes/firefox/focus_tracking_links.py
+++ b/test/keystrokes/firefox/focus_tracking_links.py
@@ -26,9 +26,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'Foo'",
      "     VISIBLE:  'Foo', cursor=1",
      "SPEECH OUTPUT: 'Foo'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Tab"))
diff --git a/test/keystrokes/firefox/line_nav_bug_549128.py b/test/keystrokes/firefox/line_nav_bug_549128.py
index 6bf9050..025b0b0 100644
--- a/test/keystrokes/firefox/line_nav_bug_549128.py
+++ b/test/keystrokes/firefox/line_nav_bug_549128.py
@@ -47,9 +47,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'The Ideal Gift Collection'",
      "     VISIBLE:  'The Ideal Gift Collection', cursor=1",
      "SPEECH OUTPUT: 'The Ideal Gift Collection'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -58,7 +56,6 @@ sequence.append(utils.AssertPresentationAction(
     ["KNOWN ISSUE: The new smarts for hacking around Gecko AtkText bugs hasn't yet been given to braille.",
      "BRAILLE LINE:  '\xa0'",
      "     VISIBLE:  '\xa0', cursor=1",
-     "SPEECH OUTPUT: '\xa0'",
      "SPEECH OUTPUT: '2 (5 oz.) Filet Mignons",
      "'"]))
 
@@ -68,7 +65,6 @@ sequence.append(utils.AssertPresentationAction(
     "7. Line Down",
     ["BRAILLE LINE:  '\xa0'",
      "     VISIBLE:  '\xa0', cursor=1",
-     "SPEECH OUTPUT: '\xa0'",
      "SPEECH OUTPUT: '2 (5 oz.) Top Sirloins",
      "'"]))
 
@@ -78,7 +74,6 @@ sequence.append(utils.AssertPresentationAction(
     "8. Line Down",
     ["BRAILLE LINE:  '\xa0'",
      "     VISIBLE:  '\xa0', cursor=1",
-     "SPEECH OUTPUT: '\xa0'",
      "SPEECH OUTPUT: '4 (4 oz.) Foobar Steaks Burgers",
      "'"]))
 
@@ -88,7 +83,6 @@ sequence.append(utils.AssertPresentationAction(
     "9. Line Down",
     ["BRAILLE LINE:  '\xa0'",
      "     VISIBLE:  '\xa0', cursor=1",
-     "SPEECH OUTPUT: '\xa0'",
      "SPEECH OUTPUT: '6 (5.75 oz.) Stuffed Baked Potatoes",
      "'"]))
 
@@ -98,7 +92,6 @@ sequence.append(utils.AssertPresentationAction(
     "10. Line Down",
     ["BRAILLE LINE:  '\xa0'",
      "     VISIBLE:  '\xa0', cursor=1",
-     "SPEECH OUTPUT: '\xa0'",
      "SPEECH OUTPUT: '2 (4.5 oz.) Stuffed Sole with Scallops and Crab",
      "'"]))
 
@@ -108,7 +101,6 @@ sequence.append(utils.AssertPresentationAction(
     "11. Line Down",
     ["BRAILLE LINE:  '\xa0'",
      "     VISIBLE:  '\xa0', cursor=1",
-     "SPEECH OUTPUT: '\xa0'",
      "SPEECH OUTPUT: '1 (6 in.) Chocolate Lover's Cake",
      "'"]))
 
@@ -134,7 +126,6 @@ sequence.append(utils.AssertPresentationAction(
     ["KNOWN ISSUE: The new smarts for hacking around Gecko AtkText bugs hasn't yet been given to braille.",
      "BRAILLE LINE:  '\xa0'",
      "     VISIBLE:  '\xa0', cursor=1",
-     "SPEECH OUTPUT: '\xa0'",
      "SPEECH OUTPUT: '1 (6 in.) Chocolate Lover's Cake",
      "'"]))
 
@@ -144,7 +135,6 @@ sequence.append(utils.AssertPresentationAction(
     "15. Line Up",
     ["BRAILLE LINE:  '\xa0'",
      "     VISIBLE:  '\xa0', cursor=1",
-     "SPEECH OUTPUT: '\xa0'",
      "SPEECH OUTPUT: '2 (4.5 oz.) Stuffed Sole with Scallops and Crab",
      "'"]))
 
@@ -154,7 +144,6 @@ sequence.append(utils.AssertPresentationAction(
     "16. Line Up",
     ["BRAILLE LINE:  '\xa0'",
      "     VISIBLE:  '\xa0', cursor=1",
-     "SPEECH OUTPUT: '\xa0'",
      "SPEECH OUTPUT: '6 (5.75 oz.) Stuffed Baked Potatoes",
      "'"]))
 
@@ -164,7 +153,6 @@ sequence.append(utils.AssertPresentationAction(
     "17. Line Up",
     ["BRAILLE LINE:  '\xa0'",
      "     VISIBLE:  '\xa0', cursor=1",
-     "SPEECH OUTPUT: '\xa0'",
      "SPEECH OUTPUT: '4 (4 oz.) Foobar Steaks Burgers",
      "'"]))
 
@@ -174,7 +162,6 @@ sequence.append(utils.AssertPresentationAction(
     "18. Line Up",
     ["BRAILLE LINE:  '\xa0'",
      "     VISIBLE:  '\xa0', cursor=1",
-     "SPEECH OUTPUT: '\xa0'",
      "SPEECH OUTPUT: '2 (5 oz.) Top Sirloins",
      "'"]))
 
@@ -184,7 +171,6 @@ sequence.append(utils.AssertPresentationAction(
     "19. Line Up",
     ["BRAILLE LINE:  '\xa0'",
      "     VISIBLE:  '\xa0', cursor=1",
-     "SPEECH OUTPUT: '\xa0'",
      "SPEECH OUTPUT: '2 (5 oz.) Filet Mignons",
      "'"]))
 
@@ -195,9 +181,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'The Ideal Gift Collection'",
      "     VISIBLE:  'The Ideal Gift Collection', cursor=1",
      "SPEECH OUTPUT: 'The Ideal Gift Collection'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
diff --git a/test/keystrokes/firefox/line_nav_bug_552887a.py b/test/keystrokes/firefox/line_nav_bug_552887a.py
index 0bfd602..8131217 100644
--- a/test/keystrokes/firefox/line_nav_bug_552887a.py
+++ b/test/keystrokes/firefox/line_nav_bug_552887a.py
@@ -49,13 +49,9 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'The Orca logo image'",
      "     VISIBLE:  'The Orca logo image', cursor=0",
      "SPEECH OUTPUT: 'The Orca logo'",
-     "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: 'image'",
-     "SPEECH OUTPUT: 'Hey, look, it's our logo!'",
-     "SPEECH OUTPUT: '",
-     "'",
      "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: 'image'"]))
+     "SPEECH OUTPUT: 'Hey, look, it's our logo!'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -243,13 +239,9 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'The Orca logo image'",
      "     VISIBLE:  'The Orca logo image', cursor=0",
      "SPEECH OUTPUT: 'The Orca logo'",
-     "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: 'image'",
-     "SPEECH OUTPUT: 'Hey, look, it's our logo!'",
-     "SPEECH OUTPUT: '",
-     "'",
      "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: 'image'"]))
+     "SPEECH OUTPUT: 'Hey, look, it's our logo!'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
diff --git a/test/keystrokes/firefox/line_nav_bug_554616.py b/test/keystrokes/firefox/line_nav_bug_554616.py
index 82532e9..06c0198 100644
--- a/test/keystrokes/firefox/line_nav_bug_554616.py
+++ b/test/keystrokes/firefox/line_nav_bug_554616.py
@@ -7,11 +7,12 @@ import utils
 
 sequence = MacroSequence()
 
-sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(KeyComboAction("Tab"))
+
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Down"))
+sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Line Down",
+    "1. Top of File",
     ["BRAILLE LINE:  'Snapshot version Date (UTC) Download'",
      "     VISIBLE:  'Snapshot version Date (UTC) Down', cursor=1",
      "SPEECH OUTPUT: 'Snapshot version'",
diff --git a/test/keystrokes/firefox/line_nav_bug_555055.py b/test/keystrokes/firefox/line_nav_bug_555055.py
index 2798c1f..869fea0 100644
--- a/test/keystrokes/firefox/line_nav_bug_555055.py
+++ b/test/keystrokes/firefox/line_nav_bug_555055.py
@@ -128,7 +128,7 @@ sequence.append(utils.AssertPresentationAction(
     "15. Line Up",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: '  '"]))
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -160,7 +160,7 @@ sequence.append(utils.AssertPresentationAction(
     "19. Line Up",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: ' '"]))
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -176,7 +176,7 @@ sequence.append(utils.AssertPresentationAction(
     "21. Line Up",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: ' '"]))
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -216,7 +216,7 @@ sequence.append(utils.AssertPresentationAction(
     "26. Line Up",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: ' '"]))
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
diff --git a/test/keystrokes/firefox/line_nav_bug_577239.py b/test/keystrokes/firefox/line_nav_bug_577239.py
index 42040c8..0b56686 100644
--- a/test/keystrokes/firefox/line_nav_bug_577239.py
+++ b/test/keystrokes/firefox/line_nav_bug_577239.py
@@ -131,21 +131,17 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
     "16. Line Up",
-    ["KNOWN ISSUE: Due to a Gecko bug in which we get the wrong line at offset for list items, we are 
presenting this twice on the way up. They have already fixed this bug in Nightly",
-     "BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have This is a list item that spans multiple lines. If Orca can successfully 
read to the end of this list item, it will have'",
+    ["BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have'",
      "     VISIBLE:  '2.This is a list item that spans', cursor=1",
-     "SPEECH OUTPUT: '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have '",
-     "SPEECH OUTPUT: 'This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have '"]))
+     "SPEECH OUTPUT: '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
     "17. Line Up",
-    ["KNOWN ISSUE: Due to a Gecko bug in which we get the wrong line at offset for list items, we are 
presenting this twice on the way up. They have already fixed this bug in Nightly.",
-     "BRAILLE LINE:  '1.This is a short list item. This is a short list item.'",
-     "     VISIBLE:  '1.This is a short list item. Thi', cursor=1",
-     "SPEECH OUTPUT: '1.This is a short list item. '",
-     "SPEECH OUTPUT: 'This is a short list item. '"]))
+    ["BRAILLE LINE:  '1.This is a short list item.'",
+     "     VISIBLE:  '1.This is a short list item.', cursor=1",
+     "SPEECH OUTPUT: '1.This is a short list item. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
diff --git a/test/keystrokes/firefox/line_nav_bugzilla_search_down.py 
b/test/keystrokes/firefox/line_nav_bugzilla_search_down.py
index 6d561f5..5c91efc 100644
--- a/test/keystrokes/firefox/line_nav_bugzilla_search_down.py
+++ b/test/keystrokes/firefox/line_nav_bugzilla_search_down.py
@@ -46,11 +46,9 @@ sequence.append(utils.AssertPresentationAction(
     "2. Line Down",
     ["BRAILLE LINE:  ' Short Bug Search Form Complicated Bug Search Form  '",
      "     VISIBLE:  ' Short Bug Search Form Complicat', cursor=1",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'Short Bug Search Form '",
      "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: 'Complicated Bug Search Form '",
-     "SPEECH OUTPUT: ' '"]))
+     "SPEECH OUTPUT: 'Complicated Bug Search Form '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -542,9 +540,7 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: 'entry'",
      "SPEECH OUTPUT: 'and '",
      "SPEECH OUTPUT: 'entry'",
-     "SPEECH OUTPUT: 'Now'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'Now'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -654,7 +650,6 @@ sequence.append(utils.AssertPresentationAction(
     "63. Line Down",
     ["BRAILLE LINE:  '    < > check box and remember these as my default search options'",
      "     VISIBLE:  '    < > check box and remember t', cursor=1",
-     "SPEECH OUTPUT: '    '",
      "SPEECH OUTPUT: 'check box'",
      "SPEECH OUTPUT: 'not checked'",
      "SPEECH OUTPUT: ' and remember these as my default search options '"]))
@@ -707,10 +702,8 @@ sequence.append(utils.AssertPresentationAction(
      "     VISIBLE:  'And push button       Add anothe', cursor=1",
      "SPEECH OUTPUT: 'And'",
      "SPEECH OUTPUT: 'push button'",
-     "SPEECH OUTPUT: '       '",
      "SPEECH OUTPUT: 'Add another boolean chart'",
-     "SPEECH OUTPUT: 'push button'",
-     "SPEECH OUTPUT: '       '"]))
+     "SPEECH OUTPUT: 'push button'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
diff --git a/test/keystrokes/firefox/line_nav_bugzilla_search_up.py 
b/test/keystrokes/firefox/line_nav_bugzilla_search_up.py
index a97522c..a3f8c1f 100644
--- a/test/keystrokes/firefox/line_nav_bugzilla_search_up.py
+++ b/test/keystrokes/firefox/line_nav_bugzilla_search_up.py
@@ -26,10 +26,8 @@ sequence.append(utils.AssertPresentationAction(
      "     VISIBLE:  'And push button       Add anothe', cursor=1",
      "SPEECH OUTPUT: 'And'",
      "SPEECH OUTPUT: 'push button'",
-     "SPEECH OUTPUT: '       '",
      "SPEECH OUTPUT: 'Add another boolean chart'",
-     "SPEECH OUTPUT: 'push button'",
-     "SPEECH OUTPUT: '       '"]))
+     "SPEECH OUTPUT: 'push button'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -77,7 +75,6 @@ sequence.append(utils.AssertPresentationAction(
     "7. Line Up",
     ["BRAILLE LINE:  '    < > check box and remember these as my default search options'",
      "     VISIBLE:  '    < > check box and remember t', cursor=1",
-     "SPEECH OUTPUT: '    '",
      "SPEECH OUTPUT: 'check box'",
      "SPEECH OUTPUT: 'not checked'",
      "SPEECH OUTPUT: ' and remember these as my default search options '"]))
@@ -193,9 +190,7 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: 'entry'",
      "SPEECH OUTPUT: 'and '",
      "SPEECH OUTPUT: 'entry'",
-     "SPEECH OUTPUT: 'Now'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'Now'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -683,11 +678,9 @@ sequence.append(utils.AssertPresentationAction(
     "68. Line Up",
     ["BRAILLE LINE:  ' Short Bug Search Form Complicated Bug Search Form  '",
      "     VISIBLE:  ' Short Bug Search Form Complicat', cursor=1",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'Short Bug Search Form '",
      "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: 'Complicated Bug Search Form '",
-     "SPEECH OUTPUT: ' '"]))
+     "SPEECH OUTPUT: 'Complicated Bug Search Form '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
diff --git a/test/keystrokes/firefox/line_nav_clickables.py b/test/keystrokes/firefox/line_nav_clickables.py
index 4428387..3a320df 100644
--- a/test/keystrokes/firefox/line_nav_clickables.py
+++ b/test/keystrokes/firefox/line_nav_clickables.py
@@ -44,7 +44,6 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'Clickable span: Click Me. More text.'",
      "     VISIBLE:  'Clickable span: Click Me. More t', cursor=1",
      "SPEECH OUTPUT: 'Clickable span: '",
-     "SPEECH OUTPUT: 'text'",
      "SPEECH OUTPUT: 'Click Me.'",
      "SPEECH OUTPUT: 'clickable'",
      "SPEECH OUTPUT: ' More text.'"]))
@@ -98,7 +97,6 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'Clickable span: Click Me. More text.'",
      "     VISIBLE:  'Clickable span: Click Me. More t', cursor=1",
      "SPEECH OUTPUT: 'Clickable span: '",
-     "SPEECH OUTPUT: 'text'",
      "SPEECH OUTPUT: 'Click Me.'",
      "SPEECH OUTPUT: 'clickable'",
      "SPEECH OUTPUT: ' More text.'"]))
diff --git a/test/keystrokes/firefox/line_nav_enter_bug.py b/test/keystrokes/firefox/line_nav_enter_bug.py
index d1612d3..0e173b1 100644
--- a/test/keystrokes/firefox/line_nav_enter_bug.py
+++ b/test/keystrokes/firefox/line_nav_enter_bug.py
@@ -7,6 +7,8 @@ import utils
 
 sequence = MacroSequence()
 
+sequence.append(KeyComboAction("Tab"))
+
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
@@ -178,7 +180,6 @@ sequence.append(utils.AssertPresentationAction(
     "16. Line Down",
     ["BRAILLE LINE:  ' table cell'",
      "     VISIBLE:  ' table cell', cursor=1",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
@@ -239,7 +240,6 @@ sequence.append(utils.AssertPresentationAction(
     "22. Line Down",
     ["BRAILLE LINE:  ' table cell'",
      "     VISIBLE:  ' table cell', cursor=1",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
@@ -273,7 +273,6 @@ sequence.append(utils.AssertPresentationAction(
     "26. Line Down",
     ["BRAILLE LINE:  ' table cell'",
      "     VISIBLE:  ' table cell', cursor=1",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
@@ -344,7 +343,6 @@ sequence.append(utils.AssertPresentationAction(
     "34. Line Up",
     ["BRAILLE LINE:  ' table cell'",
      "     VISIBLE:  ' table cell', cursor=1",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
@@ -379,7 +377,6 @@ sequence.append(utils.AssertPresentationAction(
     "38. Line Up",
     ["BRAILLE LINE:  ' table cell'",
      "     VISIBLE:  ' table cell', cursor=1",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
@@ -441,7 +438,6 @@ sequence.append(utils.AssertPresentationAction(
     "44. Line Up",
     ["BRAILLE LINE:  ' table cell'",
      "     VISIBLE:  ' table cell', cursor=1",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
diff --git a/test/keystrokes/firefox/line_nav_entries.py b/test/keystrokes/firefox/line_nav_entries.py
index 1c8a6cf..0bcac37 100644
--- a/test/keystrokes/firefox/line_nav_entries.py
+++ b/test/keystrokes/firefox/line_nav_entries.py
@@ -114,9 +114,7 @@ sequence.append(utils.AssertPresentationAction(
     "11. Line Down",
     ["BRAILLE LINE:  ' $l'",
      "     VISIBLE:  ' $l', cursor=0",
-     "SPEECH OUTPUT: 'entry'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -132,9 +130,7 @@ sequence.append(utils.AssertPresentationAction(
     "13. Line Down",
     ["BRAILLE LINE:  ' $l'",
      "     VISIBLE:  ' $l', cursor=0",
-     "SPEECH OUTPUT: 'entry'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -150,9 +146,7 @@ sequence.append(utils.AssertPresentationAction(
     "15. Line Down",
     ["BRAILLE LINE:  ' $l'",
      "     VISIBLE:  ' $l', cursor=0",
-     "SPEECH OUTPUT: 'entry'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -422,9 +416,7 @@ sequence.append(utils.AssertPresentationAction(
     "45. Line Up",
     ["BRAILLE LINE:  ' $l'",
      "     VISIBLE:  ' $l', cursor=0",
-     "SPEECH OUTPUT: 'entry'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -440,9 +432,7 @@ sequence.append(utils.AssertPresentationAction(
     "47. Line Up",
     ["BRAILLE LINE:  ' $l'",
      "     VISIBLE:  ' $l', cursor=0",
-     "SPEECH OUTPUT: 'entry'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -458,9 +448,7 @@ sequence.append(utils.AssertPresentationAction(
     "49. Line Up",
     ["BRAILLE LINE:  ' $l'",
      "     VISIBLE:  ' $l', cursor=0",
-     "SPEECH OUTPUT: 'entry'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
diff --git a/test/keystrokes/firefox/line_nav_imagemap.py b/test/keystrokes/firefox/line_nav_imagemap.py
index f33c288..08a4840 100644
--- a/test/keystrokes/firefox/line_nav_imagemap.py
+++ b/test/keystrokes/firefox/line_nav_imagemap.py
@@ -23,109 +23,83 @@ sequence.append(utils.AssertPresentationAction(
      "     VISIBLE:  'Test: z y x w v u t s r q p o n ', cursor=1",
      "SPEECH OUTPUT: 'Test:'",
      "SPEECH OUTPUT: 'z'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: 'z'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'y'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'y'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'x'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'x'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'w'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'w'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'v'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'v'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'u'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'u'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 't'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 't'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 's'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 's'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'r'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'r'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'q'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'q'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'p'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'p'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'o'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'o'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'n'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'n'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'm'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'm'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'l'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'l'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'k'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'k'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'j'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'j'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'i'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'i'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'h'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'h'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'g'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'g'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'f'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'f'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'e'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'e'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'd'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'd'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'c'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'c'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'b'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'b'",
      "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'a'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: 'a'",
-     "SPEECH OUTPUT: 'image map link'"]))
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'rect'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -143,109 +117,83 @@ sequence.append(utils.AssertPresentationAction(
      "     VISIBLE:  'Test: z y x w v u t s r q p o n ', cursor=1",
      "SPEECH OUTPUT: 'Test:'",
      "SPEECH OUTPUT: 'z'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: 'z'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'y'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'y'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'x'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'x'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'w'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'w'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'v'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'v'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'u'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'u'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 't'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 't'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 's'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 's'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'r'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'r'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'q'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'q'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'p'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'p'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'o'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'o'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'n'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'n'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'm'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'm'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'l'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'l'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'k'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'k'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'j'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'j'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'i'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'i'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'h'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'h'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'g'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'g'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'f'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'f'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'e'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'e'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'd'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'd'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'c'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'c'",
      "SPEECH OUTPUT: 'image map link'",
-     "SPEECH OUTPUT: 'b'",
-     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'b'",
      "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'rect'",
      "SPEECH OUTPUT: 'a'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: 'a'",
-     "SPEECH OUTPUT: 'image map link'"]))
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'rect'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
diff --git a/test/keystrokes/firefox/line_nav_lists.py b/test/keystrokes/firefox/line_nav_lists.py
index 208071d..afe576f 100644
--- a/test/keystrokes/firefox/line_nav_lists.py
+++ b/test/keystrokes/firefox/line_nav_lists.py
@@ -108,31 +108,25 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
     "13. Line Up",
-    ["KNOWN ISSUE: Due to a Gecko bug in which we get the wrong line at offset for list items, we are 
presenting this twice on the way up. They have already fixed this bug in Nightly.",
-     "BRAILLE LINE:  'H.Maybe you prefer Big Letters, Maybe you prefer Big Letters,'",
-     "     VISIBLE:  'H.Maybe you prefer Big Letters, ', cursor=1",
-     "SPEECH OUTPUT: 'H.Maybe you prefer Big Letters,'",
-     "SPEECH OUTPUT: 'Maybe you prefer Big Letters,'"]))
+    ["BRAILLE LINE:  'H.Maybe you prefer Big Letters,'",
+     "     VISIBLE:  'H.Maybe you prefer Big Letters,', cursor=1",
+     "SPEECH OUTPUT: 'H.Maybe you prefer Big Letters,'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
     "14. Line Up",
-    ["KNOWN ISSUE: Due to a Gecko bug in which we get the wrong line at offset for list items, we are 
presenting this twice on the way up. They have already fixed this bug in Nightly.",
-     "BRAILLE LINE:  'g.You might try using letters as well, You might try using letters as well,'",
+    ["BRAILLE LINE:  'g.You might try using letters as well,'",
      "     VISIBLE:  'g.You might try using letters as', cursor=1",
-     "SPEECH OUTPUT: 'g.You might try using letters as well,'",
-     "SPEECH OUTPUT: 'You might try using letters as well,'"]))
+     "SPEECH OUTPUT: 'g.You might try using letters as well,'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
     "15. Line Up",
-    ["KNOWN ISSUE: Due to a Gecko bug in which we get the wrong line at offset for list items, we are 
presenting this twice on the way up. They have already fixed this bug in Nightly.",
-     "BRAILLE LINE:  'VI.And use roman numerals, And use roman numerals,'",
-     "     VISIBLE:  'VI.And use roman numerals, And u', cursor=1",
-     "SPEECH OUTPUT: 'VI.And use roman numerals,'",
-     "SPEECH OUTPUT: 'And use roman numerals,'"]))
+    ["BRAILLE LINE:  'VI.And use roman numerals,'",
+     "     VISIBLE:  'VI.And use roman numerals,', cursor=1",
+     "SPEECH OUTPUT: 'VI.And use roman numerals,'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -146,21 +140,17 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
     "17. Line Up",
-    ["KNOWN ISSUE: Due to a Gecko bug in which we get the wrong line at offset for list items, we are 
presenting this twice on the way up. They have already fixed this bug in Nightly.",
-     "BRAILLE LINE:  '4.and that other thing I keep forgetting. and that other thing I keep forgetting.'",
+    ["BRAILLE LINE:  '4.and that other thing I keep forgetting.'",
      "     VISIBLE:  '4.and that other thing I keep fo', cursor=1",
-     "SPEECH OUTPUT: '4.and that other thing I keep forgetting.'",
-     "SPEECH OUTPUT: 'and that other thing I keep forgetting.'"]))
+     "SPEECH OUTPUT: '4.and that other thing I keep forgetting.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
     "18. Line Up",
-    ["KNOWN ISSUE: Due to a Gecko bug in which we get the wrong line at offset for list items, we are 
presenting this twice on the way up. They have already fixed this bug in Nightly.",
-     "BRAILLE LINE:  '3.look really cool when we carry them around on yellow Post-Itstm. look really cool 
when we carry them around on yellow Post-Itstm.'",
+    ["BRAILLE LINE:  '3.look really cool when we carry them around on yellow Post-Itstm.'",
      "     VISIBLE:  '3.look really cool when we carry', cursor=1",
-     "SPEECH OUTPUT: '3.look really cool when we carry them around on yellow Post-Itstm.'",
-     "SPEECH OUTPUT: 'look really cool when we carry them around on yellow Post-Itstm.'"]))
+     "SPEECH OUTPUT: '3.look really cool when we carry them around on yellow Post-Itstm.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -174,21 +164,17 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
     "20. Line Up",
-    ["KNOWN ISSUE: Due to a Gecko bug in which we get the wrong line at offset for list items, we are 
presenting this twice on the way up. They have already fixed this bug in Nightly.",
-     "BRAILLE LINE:  '2.arrange long and arbitrary lines of text into ordered lists that are pleasing to the 
eye and suggest some arrange long and arbitrary lines of text into ordered lists that are pleasing to the eye 
and suggest some'",
+    ["BRAILLE LINE:  '2.arrange long and arbitrary lines of text into ordered lists that are pleasing to the 
eye and suggest some'",
      "     VISIBLE:  '2.arrange long and arbitrary lin', cursor=1",
-     "SPEECH OUTPUT: '2.arrange long and arbitrary lines of text into ordered lists that are pleasing to the 
eye and suggest some '",
-     "SPEECH OUTPUT: 'arrange long and arbitrary lines of text into ordered lists that are pleasing to the 
eye and suggest some '"]))
+     "SPEECH OUTPUT: '2.arrange long and arbitrary lines of text into ordered lists that are pleasing to the 
eye and suggest some '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
     "21. Line Up",
-    ["KNOWN ISSUE: Due to a Gecko bug in which we get the wrong line at offset for list items, we are 
presenting this twice on the way up. They have already fixed this bug in Nightly.",
-     "BRAILLE LINE:  '1.remember what the heck we are doing each day remember what the heck we are doing 
each day'",
+    ["BRAILLE LINE:  '1.remember what the heck we are doing each day'",
      "     VISIBLE:  '1.remember what the heck we are ', cursor=1",
-     "SPEECH OUTPUT: '1.remember what the heck we are doing each day'",
-     "SPEECH OUTPUT: 'remember what the heck we are doing each day'"]))
+     "SPEECH OUTPUT: '1.remember what the heck we are doing each day'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
diff --git a/test/keystrokes/firefox/line_nav_nested_tables.py 
b/test/keystrokes/firefox/line_nav_nested_tables.py
index 12e7f39..43d5187 100644
--- a/test/keystrokes/firefox/line_nav_nested_tables.py
+++ b/test/keystrokes/firefox/line_nav_nested_tables.py
@@ -14,8 +14,8 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'nested-tables image'",
      "     VISIBLE:  'nested-tables image', cursor=0",
      "SPEECH OUTPUT: 'nested-tables'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: 'image'"]))
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -33,8 +33,7 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: '  .  '",
      "SPEECH OUTPUT: 'Reports'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: ' '"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -214,7 +213,7 @@ sequence.append(utils.AssertPresentationAction(
     "24. line Up",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: ' '"]))
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -279,7 +278,7 @@ sequence.append(utils.AssertPresentationAction(
     "32. line Up",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: ' '"]))
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -295,7 +294,7 @@ sequence.append(utils.AssertPresentationAction(
     "34. line Up",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: '  '"]))
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -329,8 +328,7 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: '  .  '",
      "SPEECH OUTPUT: 'Reports'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: ' '"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -339,8 +337,8 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'nested-tables image'",
      "     VISIBLE:  'nested-tables image', cursor=0",
      "SPEECH OUTPUT: 'nested-tables'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: 'image'"]))
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.AssertionSummaryAction())
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_simple_form.py b/test/keystrokes/firefox/line_nav_simple_form.py
index 22b1752..565856a 100644
--- a/test/keystrokes/firefox/line_nav_simple_form.py
+++ b/test/keystrokes/firefox/line_nav_simple_form.py
@@ -81,7 +81,8 @@ sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "8. line Down",
     ["BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=1"]))
+     "     VISIBLE:  '      $l', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -137,9 +138,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'Dashing picture of Willie Walker image'",
      "     VISIBLE:  'Dashing picture of Willie Walker', cursor=0",
      "SPEECH OUTPUT: 'Dashing picture of Willie Walker'",
-     "SPEECH OUTPUT: 'image'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'image'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -162,9 +161,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'Dashing picture of Willie Walker image'",
      "     VISIBLE:  'Dashing picture of Willie Walker', cursor=0",
      "SPEECH OUTPUT: 'Dashing picture of Willie Walker'",
-     "SPEECH OUTPUT: 'image'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'image'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -218,7 +215,8 @@ sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
     "20. line Up",
     ["BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=1"]))
+     "     VISIBLE:  '      $l', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
diff --git a/test/keystrokes/firefox/line_nav_sun_java.py b/test/keystrokes/firefox/line_nav_sun_java.py
index 16eb986..2887e3b 100644
--- a/test/keystrokes/firefox/line_nav_sun_java.py
+++ b/test/keystrokes/firefox/line_nav_sun_java.py
@@ -20,7 +20,6 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: '\xbb\xa0'",
      "SPEECH OUTPUT: 'search tips'",
      "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '\xa0 '",
      "SPEECH OUTPUT: 'entry'",
      "SPEECH OUTPUT: 'Search'",
      "SPEECH OUTPUT: 'Submit Search'",
@@ -59,7 +58,8 @@ sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "4. Line Down",
     ["BRAILLE LINE:  ''",
-     "     VISIBLE:  '', cursor=0"]))
+     "     VISIBLE:  '', cursor=0",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -111,9 +111,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'System Requirements'",
      "     VISIBLE:  'System Requirements', cursor=1",
      "SPEECH OUTPUT: 'System Requirements'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -122,9 +120,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'JDK Installation Instructions'",
      "     VISIBLE:  'JDK Installation Instructions', cursor=1",
      "SPEECH OUTPUT: 'JDK Installation Instructions'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -132,13 +128,8 @@ sequence.append(utils.AssertPresentationAction(
     "12. Line Down",
     ["BRAILLE LINE:  '\xa0Installation of Self-Extracting Binary'",
      "     VISIBLE:  '\xa0Installation of Self-Extracting', cursor=1",
-     "SPEECH OUTPUT: '\xa0'",
-     "SPEECH OUTPUT: '\xa0'",
-     "SPEECH OUTPUT: '\xa0'",
      "SPEECH OUTPUT: 'Installation of Self-Extracting Binary'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -146,11 +137,8 @@ sequence.append(utils.AssertPresentationAction(
     "13. Line Down",
     ["BRAILLE LINE:  '\xa0\xa0\xa0Installation of RPM File'",
      "     VISIBLE:  '\xa0\xa0\xa0Installation of RPM File', cursor=1",
-     "SPEECH OUTPUT: '\xa0\xa0\xa0'",
      "SPEECH OUTPUT: 'Installation of RPM File'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -159,9 +147,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'Java Plugin Browser Registration Instructions'",
      "     VISIBLE:  'Java Plugin Browser Registration', cursor=1",
      "SPEECH OUTPUT: 'Java Plugin Browser Registration Instructions'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -170,9 +156,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'Java Web Start Installation Notes'",
      "     VISIBLE:  'Java Web Start Installation Note', cursor=1",
      "SPEECH OUTPUT: 'Java Web Start Installation Notes'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -334,7 +318,8 @@ sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "33. Line Down",
     ["BRAILLE LINE:  ''",
-     "     VISIBLE:  '', cursor=1"]))
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -358,7 +343,8 @@ sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "36. Line Down",
     ["BRAILLE LINE:  ''",
-     "     VISIBLE:  '', cursor=1"]))
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -382,7 +368,8 @@ sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "39. Line Down",
     ["BRAILLE LINE:  ''",
-     "     VISIBLE:  '', cursor=1"]))
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
diff --git a/test/keystrokes/firefox/line_nav_table_cell_links.py 
b/test/keystrokes/firefox/line_nav_table_cell_links.py
index fbb453a..1a4b277 100644
--- a/test/keystrokes/firefox/line_nav_table_cell_links.py
+++ b/test/keystrokes/firefox/line_nav_table_cell_links.py
@@ -31,9 +31,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  '<!-->'",
      "     VISIBLE:  '<!-->', cursor=1",
      "SPEECH OUTPUT: '<!-->'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -42,9 +40,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  '<!DOCTYPE>'",
      "     VISIBLE:  '<!DOCTYPE>', cursor=1",
      "SPEECH OUTPUT: '<!DOCTYPE>'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -53,9 +49,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  '<a>'",
      "     VISIBLE:  '<a>', cursor=1",
      "SPEECH OUTPUT: '<a>'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -64,9 +58,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  '<abbr>'",
      "     VISIBLE:  '<abbr>', cursor=1",
      "SPEECH OUTPUT: '<abbr>'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -84,9 +76,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  '<abbr>'",
      "     VISIBLE:  '<abbr>', cursor=1",
      "SPEECH OUTPUT: '<abbr>'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -95,9 +85,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  '<a>'",
      "     VISIBLE:  '<a>', cursor=1",
      "SPEECH OUTPUT: '<a>'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -106,9 +94,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  '<!DOCTYPE>'",
      "     VISIBLE:  '<!DOCTYPE>', cursor=1",
      "SPEECH OUTPUT: '<!DOCTYPE>'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
@@ -117,9 +103,7 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  '<!-->'",
      "     VISIBLE:  '<!-->', cursor=1",
      "SPEECH OUTPUT: '<!-->'",
-     "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'"]))
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
diff --git a/test/keystrokes/firefox/longdesc_12.py b/test/keystrokes/firefox/longdesc_12.py
index 22369bf..df8f951 100644
--- a/test/keystrokes/firefox/longdesc_12.py
+++ b/test/keystrokes/firefox/longdesc_12.py
@@ -12,7 +12,7 @@ sequence.append(KeyComboAction("KP_Enter"))
 sequence.append(utils.AssertPresentationAction(
     "1. Where Am I on image",
     ["BRAILLE LINE:  'the image image'",
-     "     VISIBLE:  'the image image', cursor=0",
+     "     VISIBLE:  'the image image', cursor=(0|1)",
      "SPEECH OUTPUT: 'the image'",
      "SPEECH OUTPUT: 'image has long description'"]))
 
@@ -27,7 +27,7 @@ sequence.append(KeyComboAction("KP_Enter"))
 sequence.append(utils.AssertPresentationAction(
     "2. Having selected View Description, do a Where Am I for new location",
     ["BRAILLE LINE:  'Pass h1'",
-     "     VISIBLE:  'Pass h1', cursor=0",
+     "     VISIBLE:  'Pass h1', cursor=(0|1)",
      "SPEECH OUTPUT: 'heading level 1'",
      "SPEECH OUTPUT: 'Pass'"]))
 
diff --git a/test/keystrokes/firefox/longdesc_4.py b/test/keystrokes/firefox/longdesc_4.py
index a73d790..bb34700 100644
--- a/test/keystrokes/firefox/longdesc_4.py
+++ b/test/keystrokes/firefox/longdesc_4.py
@@ -12,7 +12,6 @@ sequence.append(utils.AssertPresentationAction(
     ["KNOWN ISSUE: 'Empty images are exposed to us as text, without AtspiAction, and the Firefox right-click 
menu lacks View Description",
      "BRAILLE LINE:  'the image'",
      "     VISIBLE:  'the image', cursor=0",
-     "SPEECH OUTPUT: 'text'",
      "SPEECH OUTPUT: 'the image'"]))
 
 #sequence.append(PauseAction(3000))
diff --git a/test/keystrokes/firefox/longdesc_5.py b/test/keystrokes/firefox/longdesc_5.py
index a73d790..bb34700 100644
--- a/test/keystrokes/firefox/longdesc_5.py
+++ b/test/keystrokes/firefox/longdesc_5.py
@@ -12,7 +12,6 @@ sequence.append(utils.AssertPresentationAction(
     ["KNOWN ISSUE: 'Empty images are exposed to us as text, without AtspiAction, and the Firefox right-click 
menu lacks View Description",
      "BRAILLE LINE:  'the image'",
      "     VISIBLE:  'the image', cursor=0",
-     "SPEECH OUTPUT: 'text'",
      "SPEECH OUTPUT: 'the image'"]))
 
 #sequence.append(PauseAction(3000))
diff --git a/test/keystrokes/firefox/say_all_bug_511389.py b/test/keystrokes/firefox/say_all_bug_511389.py
index b453964..765112d 100644
--- a/test/keystrokes/firefox/say_all_bug_511389.py
+++ b/test/keystrokes/firefox/say_all_bug_511389.py
@@ -16,8 +16,6 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: ', this is a test.'",
      "SPEECH OUTPUT: 'Foo'",
      "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'",
      "SPEECH OUTPUT: 'Bar'",
      "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: '",
diff --git a/test/keystrokes/firefox/say_all_bug_591351_1.py b/test/keystrokes/firefox/say_all_bug_591351_1.py
index 76478ea..1146ee9 100644
--- a/test/keystrokes/firefox/say_all_bug_591351_1.py
+++ b/test/keystrokes/firefox/say_all_bug_591351_1.py
@@ -14,9 +14,7 @@ sequence.append(utils.AssertPresentationAction(
     ["SPEECH OUTPUT: 'Hello world.",
      "",
      "",
-     " I wonder what a bevezeto is. I should Google that. ",
-     "",
-     " Aha! It is the Hungarian word for \"Introduction\". Here is some '",
+     " I wonder what a bevezeto is. I should Google that. Aha! It is the Hungarian word for 
\"Introduction\". Here is some '",
      "SPEECH OUTPUT: 'proof link'",
      "SPEECH OUTPUT: '. I really think we need to get Attila to teach the Orca team some Hungarian. Maybe 
one (really easy) phrase per bug comment. separator'",
      "SPEECH OUTPUT: 'Foo link'"]))
diff --git a/test/keystrokes/firefox/say_all_bugzilla_search.py 
b/test/keystrokes/firefox/say_all_bugzilla_search.py
index 361802f..cf7be6c 100644
--- a/test/keystrokes/firefox/say_all_bugzilla_search.py
+++ b/test/keystrokes/firefox/say_all_bugzilla_search.py
@@ -40,11 +40,9 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: 'Logged In joanmarie diggs gmail com | '",
      "SPEECH OUTPUT: 'Log Out'",
      "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'Short Bug Search Form '",
      "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: 'Complicated Bug Search Form'",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'Give me some help'",
      "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: ' (reloads page.)'",
@@ -156,7 +154,7 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: 'GNOME target: Unspecified multi-select List with 12 items'",
      "SPEECH OUTPUT: 'Sort results by: Reuse same sort as last time combo box'",
      "SPEECH OUTPUT: 'Search push button'",
-     "SPEECH OUTPUT: '    check box not checked  and remember these as my default search options'",
+     "SPEECH OUTPUT: 'check box not checked  and remember these as my default search options'",
      "SPEECH OUTPUT: 'separator'",
      "SPEECH OUTPUT: 'Advanced Searching Using Boolean Charts:'",
      "SPEECH OUTPUT: 'check box not checked'",
@@ -165,7 +163,7 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: '--- combo box entry'",
      "SPEECH OUTPUT: 'Or push button'",
      "SPEECH OUTPUT: 'And push button'",
-     "SPEECH OUTPUT: '       Add another boolean chart push button       '",
+     "SPEECH OUTPUT: 'Add another boolean chart push button'",
      "SPEECH OUTPUT: 'separator'",
      "SPEECH OUTPUT: 'Saved Searches: '",
      "SPEECH OUTPUT: 'My Bugs and Patches'",
diff --git a/test/keystrokes/firefox/say_all_enter_bug.py b/test/keystrokes/firefox/say_all_enter_bug.py
index 67997e9..725b765 100644
--- a/test/keystrokes/firefox/say_all_enter_bug.py
+++ b/test/keystrokes/firefox/say_all_enter_bug.py
@@ -64,7 +64,6 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: ':'",
      "SPEECH OUTPUT: 'Component: braille List with 5 items'",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'blank'",
      "SPEECH OUTPUT: 'GNOME version'",
      "SPEECH OUTPUT: 'link'",
@@ -78,13 +77,11 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: ':'",
      "SPEECH OUTPUT: 'normal combo box'",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'blank'",
      "SPEECH OUTPUT: 'Summary:'",
      "SPEECH OUTPUT: 'entry'",
      "SPEECH OUTPUT: 'Description:'",
      "SPEECH OUTPUT: 'entry'",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'blank'",
      "SPEECH OUTPUT: 'Optional Fields'",
      "SPEECH OUTPUT: 'Cc:'",
@@ -99,7 +96,7 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: 'entry'",
      "SPEECH OUTPUT: 'blank'",
      "SPEECH OUTPUT: 'Commit push button'",
-     "SPEECH OUTPUT: '      Remember values as bookmarkable template push button'",
+     "SPEECH OUTPUT: 'Remember values as bookmarkable template push button'",
      "SPEECH OUTPUT: 'blank'",
      "SPEECH OUTPUT: '",
      "We've made a guess at your operating system. Please check it and, if we got it wrong, email bugmaster 
gnome org '",
diff --git a/test/keystrokes/firefox/say_all_imagemap.py b/test/keystrokes/firefox/say_all_imagemap.py
index 9e95356..4c4e69f 100644
--- a/test/keystrokes/firefox/say_all_imagemap.py
+++ b/test/keystrokes/firefox/say_all_imagemap.py
@@ -14,36 +14,36 @@ sequence.append(utils.AssertPresentationAction(
     ["KNOWN ISSUE: Due to a test-timing, flakiness issue we do not always speak the urls for the last 
imagemap links",
      "SPEECH OUTPUT: 'This looks like A to Z, but it's really Z to A.'",
      "SPEECH OUTPUT: 'Test:'",
-     "SPEECH OUTPUT: 'z link z image map link'",
-     "SPEECH OUTPUT: 'y link y image map link'",
-     "SPEECH OUTPUT: 'x link x image map link'",
-     "SPEECH OUTPUT: 'w link w image map link'",
-     "SPEECH OUTPUT: 'v link v image map link'",
-     "SPEECH OUTPUT: 'u link u image map link'",
-     "SPEECH OUTPUT: 't link t image map link'",
-     "SPEECH OUTPUT: 's link s image map link'",
-     "SPEECH OUTPUT: 'r link r image map link'",
-     "SPEECH OUTPUT: 'q link q image map link'",
-     "SPEECH OUTPUT: 'p link p image map link'",
-     "SPEECH OUTPUT: 'o link o image map link'",
-     "SPEECH OUTPUT: 'n link n image map link'",
-     "SPEECH OUTPUT: 'm link m image map link'",
-     "SPEECH OUTPUT: 'l link l image map link'",
-     "SPEECH OUTPUT: 'k link k image map link'",
-     "SPEECH OUTPUT: 'j link j image map link'",
-     "SPEECH OUTPUT: 'i link i image map link'",
-     "SPEECH OUTPUT: 'h link h image map link'",
-     "SPEECH OUTPUT: 'g link g image map link'",
-     "SPEECH OUTPUT: 'f link f image map link'",
-     "SPEECH OUTPUT: 'e link e image map link'",
-     "SPEECH OUTPUT: 'd link d image map link'",
-     "SPEECH OUTPUT: 'c link c image map link'",
-     "SPEECH OUTPUT: 'b link b image map link'",
-     "SPEECH OUTPUT: 'a link a image map link'",
+     "SPEECH OUTPUT: 'z image map link rect'",
+     "SPEECH OUTPUT: 'y image map link rect'",
+     "SPEECH OUTPUT: 'x image map link rect'",
+     "SPEECH OUTPUT: 'w image map link rect'",
+     "SPEECH OUTPUT: 'v image map link rect'",
+     "SPEECH OUTPUT: 'u image map link rect'",
+     "SPEECH OUTPUT: 't image map link rect'",
+     "SPEECH OUTPUT: 's image map link rect'",
+     "SPEECH OUTPUT: 'r image map link rect'",
+     "SPEECH OUTPUT: 'q image map link rect'",
+     "SPEECH OUTPUT: 'p image map link rect'",
+     "SPEECH OUTPUT: 'o image map link rect'",
+     "SPEECH OUTPUT: 'n image map link rect'",
+     "SPEECH OUTPUT: 'm image map link rect'",
+     "SPEECH OUTPUT: 'l image map link rect'",
+     "SPEECH OUTPUT: 'k image map link rect'",
+     "SPEECH OUTPUT: 'j image map link rect'",
+     "SPEECH OUTPUT: 'i image map link rect'",
+     "SPEECH OUTPUT: 'h image map link rect'",
+     "SPEECH OUTPUT: 'g image map link rect'",
+     "SPEECH OUTPUT: 'f image map link rect'",
+     "SPEECH OUTPUT: 'e image map link rect'",
+     "SPEECH OUTPUT: 'd image map link rect'",
+     "SPEECH OUTPUT: 'c image map link rect'",
+     "SPEECH OUTPUT: 'b image map link rect'",
+     "SPEECH OUTPUT: 'a image map link rect'",
      "SPEECH OUTPUT: 'Here is some text.'",
      "SPEECH OUTPUT: 'Safeway had some interesting (and problematic) image maps. I didn't steal the images, 
but if you tab and look at the status bar, you should be able to see the URI for each region. We should also 
be speaking and brailling it correctly now -- at least as best as we can given what they gave us.'",
      "SPEECH OUTPUT: 'blank'",
-     "SPEECH OUTPUT: 'wk09_frozenmovie link image'",
+     "SPEECH OUTPUT: 'wk09_frozenmovie image link'",
      "SPEECH OUTPUT: 'image'",
      "SPEECH OUTPUT: 'blank'",
      "SPEECH OUTPUT: 'blank'",
diff --git a/test/keystrokes/firefox/say_all_nested_tables.py 
b/test/keystrokes/firefox/say_all_nested_tables.py
index 2254c4a..6edf9f0 100644
--- a/test/keystrokes/firefox/say_all_nested_tables.py
+++ b/test/keystrokes/firefox/say_all_nested_tables.py
@@ -11,7 +11,7 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_Add"))
 sequence.append(utils.AssertPresentationAction(
     "1. KP_Add to do a SayAll",
-    ["SPEECH OUTPUT: 'nested-tables link image'",
+    ["SPEECH OUTPUT: 'nested-tables image link'",
      "SPEECH OUTPUT: 'Campus'",
      "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: '  .  '",
@@ -23,11 +23,9 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: '  .  '",
      "SPEECH OUTPUT: 'Reports'",
      "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'Your Learning Plan'",
-     "SPEECH OUTPUT: 'Below is a list of the courses that make up your learning plan.  '",
+     "SPEECH OUTPUT: 'Below is a list of the courses that make up your learning plan.'",
      "SPEECH OUTPUT: 'UNIX 2007'",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'blank'",
      "SPEECH OUTPUT: 'Take Course'",
      "SPEECH OUTPUT: 'link'",
@@ -36,7 +34,6 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: 'You have completed 87 of the 87 modules in this course.'",
      "SPEECH OUTPUT: 'separator'",
      "SPEECH OUTPUT: 'SQL Plus'",
-     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'blank'",
      "SPEECH OUTPUT: 'Take Course'",
      "SPEECH OUTPUT: 'link'",
diff --git a/test/keystrokes/firefox/say_all_table_cell_links.py 
b/test/keystrokes/firefox/say_all_table_cell_links.py
index b028776..86d70c7 100644
--- a/test/keystrokes/firefox/say_all_table_cell_links.py
+++ b/test/keystrokes/firefox/say_all_table_cell_links.py
@@ -17,20 +17,12 @@ sequence.append(utils.AssertPresentationAction(
      "'",
      "SPEECH OUTPUT: '<!-->'",
      "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'",
      "SPEECH OUTPUT: '<!DOCTYPE>'",
      "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'",
      "SPEECH OUTPUT: '<a>'",
      "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'",
      "SPEECH OUTPUT: '<abbr>'",
      "SPEECH OUTPUT: 'link'",
-     "SPEECH OUTPUT: '",
-     "'",
      "SPEECH OUTPUT: '<acronym>'",
      "SPEECH OUTPUT: 'link'"]))
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]