Index: test/harness/utils.py
===================================================================
--- test/harness/utils.py	(revision 2928)
+++ test/harness/utils.py	(working copy)
@@ -5,6 +5,9 @@
 
 # Where to find Dojo tests.
 #
+<<<<<<< .mine
+DojoURLPrefix="http://localhost/apache2-default/dojo-release-0.9.0/dijit/tests/"
+=======
 DojoURLPrefix="http://archive.dojotoolkit.org/dojo-2007-09-20/dojotoolkit/dijit/tests/"
 
 # Where to find our local HTML tests.
@@ -15,3 +18,4 @@
 htmlDir = os.path.abspath(fullPath + "/../../html")
 htmlURLPrefix = "file://" + htmlDir + "/"
 
+>>>>>>> .r2928
Index: test/keystrokes/firefox/dojo_slider.py
===================================================================
--- test/keystrokes/firefox/dojo_slider.py	(revision 2928)
+++ test/keystrokes/firefox/dojo_slider.py	(working copy)
@@ -30,74 +30,114 @@
 sequence.append(PauseAction(3000))
 
 ########################################################################
-# Tab to the first slider.
+# Tab to the first slider.  The following will be presented.
 #
+#  BRAILLE LINE:  '10 Slider'
+#       VISIBLE:  '10 Slider', cursor=1
+# SPEECH OUTPUT: ''
+# SPEECH OUTPUT: 'slider 10'
+#
 sequence.append(KeyComboAction("Tab"))
 sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_SLIDER))
 
+########################################################################
+# Move the first slider.  The following will be presented for each.
+#
+#  BRAILLE LINE:  '10 Slider'
+#       VISIBLE:  '10 Slider', cursor=1
+# SPEECH OUTPUT: '10'
+#
 sequence.append(KeyComboAction("Right"))
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+#  BRAILLE LINE:  '10 Slider'
+#       VISIBLE:  '10 Slider', cursor=1
+# SPEECH OUTPUT: '10'                           
 sequence.append(KeyComboAction("Right"))
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+# BRAILLE LINE:  '11 Slider'
+#      VISIBLE:  '11 Slider', cursor=1
+# SPEECH OUTPUT: '11'                           
 sequence.append(KeyComboAction("Right"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+# BRAILLE LINE:  '11 Slider'
+#      VISIBLE:  '11 Slider', cursor=1
+# SPEECH OUTPUT: '11' 
 sequence.append(KeyComboAction("Right"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+# BRAILLE LINE:  '11 Slider'
+#      VISIBLE:  '11 Slider', cursor=1
+# SPEECH OUTPUT: '11'                           
 sequence.append(KeyComboAction("Right"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+# BRAILLE LINE:  '11 Slider'
+#      VISIBLE:  '11 Slider', cursor=1
+# SPEECH OUTPUT: '11'                             
 sequence.append(KeyComboAction("Left"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+# BRAILLE LINE:  '11 Slider'
+#      VISIBLE:  '11 Slider', cursor=1
+# SPEECH OUTPUT: '11'                             
 sequence.append(KeyComboAction("Left"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+#  BRAILLE LINE:  '10 Slider'
+#       VISIBLE:  '10 Slider', cursor=1
+# SPEECH OUTPUT: '10'                            
 sequence.append(KeyComboAction("Left"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+#  BRAILLE LINE:  '10 Slider'
+#       VISIBLE:  '10 Slider', cursor=1
+# SPEECH OUTPUT: '10'                            
 sequence.append(KeyComboAction("Left"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+#  BRAILLE LINE:  '10 Slider'
+#       VISIBLE:  '10 Slider', cursor=1
+# SPEECH OUTPUT: '10'                           
 sequence.append(KeyComboAction("Left"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
@@ -105,78 +145,121 @@
                            5000))
 
 ########################################################################
-# Tab to the next slider.
+# Tab to the next entry between the sliders.  The following will be presented.
+# [[[Bug?: entry should be labelled for speech]]]
 #
+#  BRAILLE LINE:  'Slider1 Value: 10 $l '
+#       VISIBLE:  'Slider1 Value: 10 $l ', cursor=18
+# SPEECH OUTPUT: ''
+# SPEECH OUTPUT: 'text 10'
+#
 sequence.append(KeyComboAction("Tab"))
+sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
 
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
+########################################################################
+# Tab to the next slider.  The following will be presented.
+#
+#  BRAILLE LINE:  '10 Slider'
+#       VISIBLE:  '10 Slider', cursor=1
+# SPEECH OUTPUT: ''
+# SPEECH OUTPUT: 'slider 10'
+#
 sequence.append(KeyComboAction("Tab"))
+sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_SLIDER))
 
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_SLIDER))
+########################################################################
+# Move the slider.  The following will be presented for each.
+#
+#  BRAILLE LINE:  '20 Slider 20 '
+#       VISIBLE:  '20 Slider 20 ', cursor=1
+# SPEECH OUTPUT: '20'
+#
 sequence.append(KeyComboAction("Up"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+#  BRAILLE LINE:  '30 Slider'
+#       VISIBLE:  '30 Slider', cursor=1
+# SPEECH OUTPUT: '30'                          
 sequence.append(KeyComboAction("Up"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                       
+#  BRAILLE LINE:  '40 Slider'
+#       VISIBLE:  '40 Slider', cursor=1
+# SPEECH OUTPUT: '40' 
 sequence.append(KeyComboAction("Up"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+#  BRAILLE LINE:  '50 Slider'
+#       VISIBLE:  '50 Slider', cursor=1
+# SPEECH OUTPUT: '50'                            
 sequence.append(KeyComboAction("Up"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+#  BRAILLE LINE:  '60 Slider'
+#       VISIBLE:  '60 Slider', cursor=1
+# SPEECH OUTPUT: '60'                            
 sequence.append(KeyComboAction("Up"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+#  BRAILLE LINE:  '50 Slider'
+#       VISIBLE:  '50 Slider', cursor=1
+# SPEECH OUTPUT: '50'                            
 sequence.append(KeyComboAction("Down"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+#  BRAILLE LINE:  '40 Slider'
+#       VISIBLE:  '40 Slider', cursor=1
+# SPEECH OUTPUT: '40'                            
 sequence.append(KeyComboAction("Down"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+#  BRAILLE LINE:  '30 Slider'
+#       VISIBLE:  '30 Slider', cursor=1
+# SPEECH OUTPUT: '30'                            
 sequence.append(KeyComboAction("Down"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
+                           
+#  BRAILLE LINE:  '20 Slider'
+#       VISIBLE:  '20 Slider', cursor=1
+# SPEECH OUTPUT: '20'                            
 sequence.append(KeyComboAction("Down"))
-
 sequence.append(WaitAction("object:property-change:accessible-value",
                            None,
                            None,
                            pyatspi.ROLE_SLIDER,
                            5000))
-sequence.append(KeyComboAction("Down"))
 
 ########################################################################
 # Close the demo
Index: test/keystrokes/firefox/moz_slider.py
===================================================================
--- test/keystrokes/firefox/moz_slider.py	(revision 2928)
+++ test/keystrokes/firefox/moz_slider.py	(working copy)
@@ -25,22 +25,124 @@
 sequence.append(WaitForFocus("Graphical ARIA Slider", acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
 
 ########################################################################
-# Tab to the slider.
+# Tab to the slider.  The following will be presented.
+# [[[Bug?: is Braille output correct?]]]
 #
+#  BRAILLE LINE:  '0 Move slider left Button 10 Slider Move slider right Button 100'
+#       VISIBLE:  '10 Slider Move slider right Butt', cursor=1
+# SPEECH OUTPUT: ''
+# SPEECH OUTPUT: 'slider 10'
+#
 sequence.append(KeyComboAction("Tab"))
 sequence.append(WaitForFocus("My slider", acc_role=pyatspi.ROLE_SLIDER))
 
-
+########################################################################
+# Move the slider.  The following will be presented for each.
+#
+#  BRAILLE LINE:  '0 Move slider left Button 15 Slider Move slider right Button 100'
+#       VISIBLE:  '15 Slider Move slider right Butt', cursor=1
+# SPEECH OUTPUT: '15'
+#
 sequence.append(KeyComboAction("Right"))
+sequence.append(WaitAction("object:property-change:accessible-value",
+                           None,
+                           None,
+                           pyatspi.ROLE_SLIDER,
+                           5000))
+                           
+#  BRAILLE LINE:  '0 Move slider left Button 20 Slider Move slider right Button 100'
+#       VISIBLE:  '20 Slider Move slider right Butt', cursor=1
+# SPEECH OUTPUT: '20'                           
 sequence.append(KeyComboAction("Right"))
+sequence.append(WaitAction("object:property-change:accessible-value",
+                           None,
+                           None,
+                           pyatspi.ROLE_SLIDER,
+                           5000))
+                           
+#  BRAILLE LINE:  '0 Move slider left Button 25 Slider Move slider right Button 100'
+#       VISIBLE:  '25 Slider Move slider right Butt', cursor=1
+# SPEECH OUTPUT: '25'                           
 sequence.append(KeyComboAction("Right"))
+sequence.append(WaitAction("object:property-change:accessible-value",
+                           None,
+                           None,
+                           pyatspi.ROLE_SLIDER,
+                           5000))
+                           
+#  BRAILLE LINE:  '0 Move slider left Button 30 Slider Move slider right Button 100'
+#       VISIBLE:  '30 Slider Move slider right Butt', cursor=1
+# SPEECH OUTPUT: '30'                  
 sequence.append(KeyComboAction("Right"))
+sequence.append(WaitAction("object:property-change:accessible-value",
+                           None,
+                           None,
+                           pyatspi.ROLE_SLIDER,
+                           5000))
+                           
+#  BRAILLE LINE:  '0 Move slider left Button 25 Slider Move slider right Button 100'
+#       VISIBLE:  '25 Slider Move slider right Butt', cursor=1
+# SPEECH OUTPUT: '25'                           
 sequence.append(KeyComboAction("Left"))
+sequence.append(WaitAction("object:property-change:accessible-value",
+                           None,
+                           None,
+                           pyatspi.ROLE_SLIDER,
+                           5000))
+                           
+#  BRAILLE LINE:  '0 Move slider left Button 20 Slider Move slider right Button 100'
+#       VISIBLE:  '20 Slider Move slider right Butt', cursor=1
+# SPEECH OUTPUT: '20'                           
 sequence.append(KeyComboAction("Left"))
+sequence.append(WaitAction("object:property-change:accessible-value",
+                           None,
+                           None,
+                           pyatspi.ROLE_SLIDER,
+                           5000))
+                           
+#  BRAILLE LINE:  '0 Move slider left Button 15 Slider Move slider right Button 100'
+#       VISIBLE:  '15 Slider Move slider right Butt', cursor=1
+# SPEECH OUTPUT: '15'                           
 sequence.append(KeyComboAction("Left"))
+sequence.append(WaitAction("object:property-change:accessible-value",
+                           None,
+                           None,
+                           pyatspi.ROLE_SLIDER,
+                           5000))
+                           
+#  BRAILLE LINE:  '0 Move slider left Button 10 Slider Move slider right Button 100'
+#       VISIBLE:  '10 Slider Move slider right Butt', cursor=1
+# SPEECH OUTPUT: '10'                           
 sequence.append(KeyComboAction("Left"))
+sequence.append(WaitAction("object:property-change:accessible-value",
+                           None,
+                           None,
+                           pyatspi.ROLE_SLIDER,
+                           5000))
+                           
+#  Move the slider with the 'end' key.
+#
+#  BRAILLE LINE:  '0 Move slider left Button 100 Slider Move slider right Button 100'
+#       VISIBLE:  '100 Slider Move slider right But', cursor=1
+# SPEECH OUTPUT: '100'                           
 sequence.append(KeyComboAction("End"))
+sequence.append(WaitAction("object:property-change:accessible-value",
+                           None,
+                           None,
+                           pyatspi.ROLE_SLIDER,
+                           5000))
+                           
+#  Move the slider with the 'home' key.
+#
+#  BRAILLE LINE:  '0 Move slider left Button 0 Slider Move slider right Button 100'
+#       VISIBLE:  '0 Slider Move slider right But', cursor=1
+# SPEECH OUTPUT: '0'                               
 sequence.append(KeyComboAction("Home"))
+sequence.append(WaitAction("object:property-change:accessible-value",
+                           None,
+                           None,
+                           pyatspi.ROLE_SLIDER,
+                           5000))
 
 ########################################################################
 # Close the demo
Index: src/orca/default.py
===================================================================
--- src/orca/default.py	(revision 2928)
+++ src/orca/default.py	(working copy)
@@ -4757,7 +4757,8 @@
             unicodeText = displayedText.decode("UTF-8")
             if unicodeText \
                and (len(unicodeText) == 1) \
-               and (unicodeText[0] == self.EMBEDDED_OBJECT_CHARACTER):
+               and (unicodeText[0] == self.EMBEDDED_OBJECT_CHARACTER) \
+               and obj.childCount > 0:
                 try:
                     displayedText = self.getDisplayedText(obj.child(0))
                 except:
Index: src/orca/Gecko.py
===================================================================
--- src/orca/Gecko.py	(revision 2928)
+++ src/orca/Gecko.py	(working copy)
@@ -5880,6 +5880,8 @@
                                      characterOffset,
                                      characterOffset + 1).decode("UTF-8")
             if character == self.EMBEDDED_OBJECT_CHARACTER:
+                if obj.childCount <= 0:
+                    return [obj,  characterOffset + 1]
                 try:
                     childIndex = self.getChildIndex(obj, characterOffset)
                     return self.findFirstCaretContext(obj.child(childIndex), 0)
@@ -5931,7 +5933,7 @@
         if obj.text and obj.text.characterCount:
             unicodeText = self.getUnicodeText(obj)
             nextOffset = startOffset + 1
-            if nextOffset < len(unicodeText):
+            while nextOffset < len(unicodeText):
                 if unicodeText[nextOffset] != self.EMBEDDED_OBJECT_CHARACTER:
                     return [obj, nextOffset]
                 elif obj.childCount:
@@ -5939,7 +5941,12 @@
                     if child:
                         return self.findNextCaretInOrder(child,
                                                          -1,
-                                                         includeNonText)
+                                                       includeNonText)
+                    else:
+                        nextOffset += 1
+                else:
+                    nextOffset += 1
+
         elif obj.childCount and obj.child(0):
             try:
                 return self.findNextCaretInOrder(obj.child(0),
@@ -6009,15 +6016,20 @@
             if startOffset == -1:
                 startOffset = len(unicodeText)
             previousOffset = startOffset - 1
-            if previousOffset >= 0:
+            while previousOffset >= 0:
                 if unicodeText[previousOffset] \
                     != self.EMBEDDED_OBJECT_CHARACTER:
                     return [obj, previousOffset]
+                elif obj.childCount:
+                    child = obj.child(self.getChildIndex(obj, previousOffset))
+                    if child:
+                        return self.findPreviousCaretInOrder(child,
+                                                             -1,
+                                                             includeNonText)
+                    else:
+                        previousOffset -= 1
                 else:
-                    return self.findPreviousCaretInOrder(
-                        obj.child(self.getChildIndex(obj, previousOffset)),
-                        -1,
-                        includeNonText)
+                    previousOffset -= 1
         elif obj.childCount and obj.child(obj.childCount - 1):
             try:
                 return self.findPreviousCaretInOrder(
@@ -6049,6 +6061,8 @@
                 index = obj.index - 1
                 if index >= 0:
                     try:
+                        if obj.parent.childCount <= 0:
+                            [None, -1]
                         return self.findPreviousCaretInOrder(
                             obj.parent.child(index),
                             -1,
