Index: src/orca/scripts/toolkits/Gecko/script.py
===================================================================
--- src/orca/scripts/toolkits/Gecko/script.py	(revision 4304)
+++ src/orca/scripts/toolkits/Gecko/script.py	(working copy)
@@ -198,6 +198,80 @@
         #
         self._currentFrame = None
 
+        # All of the text attributes available for presentation to the
+        # user. This is necessary because the attributes used by Gecko
+        # are different from the default set.
+        #
+        self.allTextAttributes = \
+            "background-color:; color:; font-family:; font-size:; " \
+            "font-style:normal; font-weight:400; language:none; " \
+            "text-line-through-style:; text-align:start; text-indent:0px; " \
+            "text-underline-style:; text-position:baseline; " \
+            "invalid:none; writing-mode:lr; static:false;"
+
+        # The default set of text attributes to present to the user. This
+        # is necessary because the attributes used by Gecko are different
+        # from the default set.
+        #
+        self.enabledBrailledTextAttributes = \
+          "font-size:; font-family:; font-weight:400; text-indent:0px; " \
+          "text-underline-style:none; text-align:start; " \
+          "text-line-through-style:none; font-style:normal; invalid:none;"
+        self.enabledSpokenTextAttributes = \
+          "font-size:; font-family:; font-weight:400; text-indent:0px; " \
+          "text-underline-style:none; text-align:start; " \
+          "text-line-through-style:none; font-style:normal; invalid:none;"
+
+        # A dictionary of Gecko-style attribute names and their equivalent/
+        # expected names. This is necessary so that we can present the
+        # attributes to the user in a consistent fashion across apps and
+        # toolkits.
+        #
+        self.attributeNamesDict = {
+            "font-weight"             : "weight",
+            "font-family"             : "family-name",
+            "font-style"              : "style",
+            "text-align"              : "justification",
+            "text-indent"             : "indent",
+            "font-size"               : "size",
+            "background-color"        : "bg-color",
+            "color"                   : "fg-color",
+            "text-line-through-style" : "strikethrough",
+            "text-underline-style"    : "underline",
+            "text-position"           : "vertical-align",
+            "writing-mode"            : "direction"}
+
+        # We need to save our special attributes so that we can revert to
+        # the default text attributes when giving up focus to another app
+        # and restore them upon return.
+        #
+        self.savedEnabledBrailledTextAttributes = None
+        self.savedEnabledSpokenTextAttributes = None
+        self.savedAllTextAttributes = None
+
+    def activate(self):
+        """Called when this script is activated."""
+        self.savedEnabledBrailledTextAttributes = \
+            settings.enabledBrailledTextAttributes
+        settings.enabledBrailledTextAttributes = \
+            self.enabledBrailledTextAttributes
+
+        self.savedEnabledSpokenTextAttributes = \
+            settings.enabledSpokenTextAttributes
+        settings.enabledSpokenTextAttributes = \
+            self.enabledSpokenTextAttributes
+
+        self.savedAllTextAttributes = settings.allTextAttributes
+        settings.allTextAttributes = self.allTextAttributes
+
+    def deactivate(self):
+        """Called when this script is deactivated."""
+        settings.enabledBrailledTextAttributes = \
+            self.savedEnabledBrailledTextAttributes
+        settings.enabledSpokenTextAttributes = \
+            self.savedEnabledSpokenTextAttributes
+        settings.allTextAttributes = self.savedAllTextAttributes
+
     def getWhereAmI(self):
         """Returns the "where am I" class for this script.
         """
Index: src/orca/app_gui_prefs.py
===================================================================
--- src/orca/app_gui_prefs.py	(revision 4305)
+++ src/orca/app_gui_prefs.py	(working copy)
@@ -135,6 +135,21 @@
         ftp = focus_tracking_presenter.FocusTrackingPresenter()
         ftp.loadAppSettings(self.appScript)
 
+    def _getAppNameForAttribute(self, attributeName):
+        """Converts the given Atk attribute name into the application's
+        equivalent. This is necessary because an application or toolkit
+        (e.g. Gecko) might invent entirely new names for the same text
+        attributes.
+
+        Arguments:
+        - attribName: The name of the text attribute
+
+        Returns the application's equivalent name if found or attribName
+        otherwise.
+        """
+
+        return self.appScript.getAppNameForAttribute(attributeName)
+
     def _markModified(self):
         """ Mark as modified the user application specific custom key bindings:
         """
Index: src/orca/default.py
===================================================================
--- src/orca/default.py	(revision 4304)
+++ src/orca/default.py	(working copy)
@@ -114,6 +114,11 @@
 
         self.lastSelectedMenu = None
 
+        # A dictionary of non-standardly-named text attributes and their
+        # Atk equivalents.
+        #
+        self.attributeNamesDict = {}
+
     def setupInputEventHandlers(self):
         """Defines InputEventHandler fields for this script that can be
         called by the key and braille bindings."""
@@ -4279,6 +4284,38 @@
 
         return True
 
+    def getAtkNameForAttribute(self, attribName):
+        """Converts the given attribute name into the Atk equivalent. This
+        is necessary because an application or toolkit (e.g. Gecko) might
+        invent entirely new names for the same attributes.
+
+        Arguments:
+        - attribName: The name of the text attribute
+
+        Returns the Atk equivalent name if found or attribName otherwise.
+        """
+
+        return self.attributeNamesDict.get(attribName, attribName)
+
+    def getAppNameForAttribute(self, attribName):
+        """Converts the given Atk attribute name into the application's
+        equivalent. This is necessary because an application or toolkit
+        (e.g. Gecko) might invent entirely new names for the same text
+        attributes.
+
+        Arguments:
+        - attribName: The name of the text attribute
+
+        Returns the application's equivalent name if found or attribName
+        otherwise.
+        """
+
+        for key, value in self.attributeNamesDict.items():
+            if value == attribName:
+                return key
+
+        return attribName
+
     def textAttrsToDictionary(self, tokenString):
         """Converts a string of text attribute tokens of the form
         <key>:<value>; into a dictionary of keys and values.
@@ -4316,14 +4353,17 @@
         for key in keys:
             localizedKey = text_attribute_names.getTextAttributeName(key)
             if key in attributes:
+                line = ""
                 attribute = attributes[key]
                 localizedValue = \
                     text_attribute_names.getTextAttributeName(attribute)
                 if attribute:
+                    key = self.getAtkNameForAttribute(key)
                     # If it's the 'weight' attribute and greater than 400, just
                     # speak it as bold, otherwise speak the weight.
                     #
-                    if key == "weight" and int(attribute) > 400:
+                    if key == "weight" \
+                       and (attribute == "bold" or int(attribute) > 400):
                         # Translators: bold as in the font sense.
                         #
                         line = _("bold")
@@ -4347,10 +4387,8 @@
                                             "%s %s pixels",
                                             int(attribute)) % \
                                                 (localizedKey, localizedValue)
-                        else:
-                            line = localizedKey + " " + localizedValue
-                    else:
-                        line = localizedKey + " " + localizedValue
+
+                    line = line or (localizedKey + " " + localizedValue)
                     speech.speak(line)
 
     def readCharAttributes(self, inputEvent=None):
@@ -7528,7 +7566,7 @@
         try:
             return dict(
                 map(lambda pair: pair.strip().split(':'),
-                    dict_string.strip(';').split(';')))
+                    dict_string.strip('; ').split(';')))
         except ValueError:
             return {}
 
Index: src/orca/text_attribute_names.py
===================================================================
--- src/orca/text_attribute_names.py	(revision 4305)
+++ src/orca/text_attribute_names.py	(working copy)
@@ -27,6 +27,7 @@
 __license__   = "LGPL"
 
 from orca_i18n import Q_        # to provide qualified translatable strings
+import orca_state
 
 # Translators: this is a structure to assist in the generation of
 # localized strings for the various text attributes. 
@@ -145,6 +146,14 @@
 #
 _textAttributeTable["indent"] = Q_("textattr|indent")
 
+# Translators: this attribute specifies there is something "wrong" with
+# the text, such as it being a misspelled word. See:
+# https://developer.mozilla.org/en/Accessibility/AT-APIs/Gecko/TextAttrs
+#
+# ONLY TRANSLATE THE PART AFTER THE PIPE CHARACTER |
+#
+_textAttributeTable["invalid"] = Q_("textattr|invalid")
+
 # Translators: this attribute specifies whether the text is invisible.
 # It will be a "true" or "false" value.
 # See
@@ -878,6 +887,14 @@
 #
 _textAttributeTable["tb"] = Q_("textattr|tb")
 
+# Translators: this is one of the text attribute values for the following
+# text attributes: "invalid". It is an indication that the text is not
+# spelled correctly. See:
+# https://developer.mozilla.org/en/Accessibility/AT-APIs/Gecko/TextAttrs
+#
+# ONLY TRANSLATE THE PART AFTER THE PIPE CHARACTER |
+#
+_textAttributeTable["spelling"] = Q_("textattr|spelling")
 
 def getTextAttributeKey(localizedTextAttr):
     """Given a localized text attribute, return the original text 
@@ -912,6 +929,11 @@
     if isinstance(textAttr, unicode):
         textAttr = textAttr.encode("UTF-8")
 
+    # Normalize the name to an Atk name before attempting to look it up.
+    #
+    if orca_state.activeScript:
+        textAttr = orca_state.activeScript.getAtkNameForAttribute(textAttr)
+
     try:
         return _textAttributeTable[textAttr]
     except:
Index: src/orca/orca_gui_prefs.py
===================================================================
--- src/orca/orca_gui_prefs.py	(revision 4304)
+++ src/orca/orca_gui_prefs.py	(working copy)
@@ -960,6 +960,21 @@
 
         view.set_model(model)
 
+    def _getAppNameForAttribute(self, attributeName):
+        """Converts the given Atk attribute name into the application's
+        equivalent. This is necessary because an application or toolkit
+        (e.g. Gecko) might invent entirely new names for the same text
+        attributes.
+
+        Arguments:
+        - attribName: The name of the text attribute
+
+        Returns the application's equivalent name if found or attribName
+        otherwise.
+        """
+
+        return attributeName
+
     def _updateTextDictEntry(self):
         """The user has updated the text attribute list in some way. Update
         the "enabledSpokenTextAttributes" and "enabledBrailledTextAttributes"
@@ -974,6 +989,12 @@
         for path in range(0, noRows):
             localizedKey = model[path][NAME]
             key = text_attribute_names.getTextAttributeKey(localizedKey)
+
+            # Convert the normalized, Atk attribute name back into what
+            # the app/toolkit uses.
+            #
+            key = self._getAppNameForAttribute(key)
+
             localizedValue = model[path][VALUE]
             value = text_attribute_names.getTextAttributeKey(localizedValue)
 
@@ -1082,7 +1103,7 @@
         [allAttrList, allAttrDict] = \
                 defScript.textAttrsToDictionary(settings.allTextAttributes)
         for i in range(0, len(allAttrList)):
-            thisIter = model.append()
+            thisIter = model.append()            
             localizedKey = \
                 text_attribute_names.getTextAttributeName(allAttrList[i])
             localizedValue = \
