     
     /**
      *  @private
+     * 
+     *  If we just received a softKeyboardActivate event in the capture phase,
+     *  we will wait until the bubble phase to call ensureElementPositionIsVisible
+     *  For now, store the caret bounds to be used. 
      */
     private function caretBoundsChangeHandler(event:CaretBoundsChangeEvent):void
     {
         if (event.isDefaultPrevented())
             return;
         
-        // If the soft keyboard is not up yet, then just store the caretBounds
-        // It will be used in the softKeyboardActivateHandler
-        if (!isNaN(oldSoftKeyboardHeight))
-        {
-            ensureElementPositionIsVisible(lastFocusedElement, event.newCaretBounds, false);
-            event.preventDefault();
-        }
-        
-        lastFocusedElementCaretBounds = event.newCaretBounds;
-        
-        
+        event.preventDefault();
+
+        if (captureNextCaretBoundsChange)
+        {
+            lastFocusedElementCaretBounds = event.newCaretBounds;
+            captureNextCaretBoundsChange = false;
+            return;
+        }
+        
+        ensureElementPositionIsVisible(lastFocusedElement, event.newCaretBounds, false);
     }
 }
 

     */
    private var lastFocusedElementCaretBounds:Rectangle;
    
    //--------------------------------------------------------------------------
    //
    //  Properties

    
    /**
     *  @private
     *  Called when the soft keyboard is activated. 
     * 
     *  There are three use cases for Scroller and text component interaction
     * 
     *  A. Pressing a TextInput to open up the soft keyboard
     *  B. Pressing in the middle of a TextArea to open up the soft keyboard
     *  C. Pressing in a text component on a device that doesn't support soft keyboard
     * 
     *  For use case A, lastFocusedElementCaretBounds is never set, so we just
     *  call ensureElementIsVisible on the TextInput
     * 
     *  For use case B, we first get a softKeyboard active event in the 
     *  capture phase. We then receive a caretBoundsChange event from the 
     *  TextArea skin. We store the bounds in lastFocusedElementCaretBounds
     *  and use that value in the call to ensureElementPositionIsVisible in
     *  the softKeyboard activate bubble phase. 
     * 
     *  For use case C, we never receive a soft keyboard activate event, so 
     *  we just listen for caretBoundsChange. 
     */  
    private function softKeyboardActivateHandler(event:SoftKeyboardEvent):void
    {
