fix crash when traversing list
authorHyeJin Lee <hyejin79.lee@samsung.com>
Tue, 19 Mar 2013 08:25:13 +0000 (17:25 +0900)
committerGerrit Code Review <gerrit2@kim11>
Tue, 19 Mar 2013 08:27:16 +0000 (17:27 +0900)
Change-Id: I09a08e142fce07ec2ec726c26a8e6a1a4078fc4f

src/ui/animations/FUiAnim_TransactionNode.cpp
src/ui/animations/FUiAnim_TransactionNode.h

index 93d39ab..286f18c 100644 (file)
@@ -742,16 +742,6 @@ _TransactionNode::GetChild(int transactionId) const
        return null;
 }
 
-_TransactionNode*
-_TransactionNode::GetLastChild(void) const
-{
-       int index = GetChildrenCount() - 1;
-
-       SysTryReturn(NID_UI_ANIM, index >= 0, null, E_INVALID_OPERATION, "[E_INVALID_OPERATION] This node has no child.");
-
-       return __children.GetChildAt(index);
-}
-
 result
 _TransactionNode::AddChild(_TransactionNode& child)
 {
@@ -796,19 +786,21 @@ _TransactionNode::RemoveChild(int transactionId)
        }
 }
 
-void
+bool
 _TransactionNode::RemoveChild(_TransactionNode& child)
 {
        if (child.IsInAnimationTick())
        {
                child.ReservedRemove();
+
+               return false;
        }
        else
        {
                result r = __children.Remove(&child);
                delete &child;
 
-               SysTryReturnVoidResult(NID_UI_ANIM, r == E_SUCCESS, r, "[%s] Failed to remove child.", GetErrorMessage(r));
+               return true;
        }
 }
 
@@ -1245,16 +1237,16 @@ _TransactionNode::RemoveChildrenAllAnimations(VisualElement& target)
 {
        RemoveAllAnimations(target);
 
-       int childrenCount = GetChildrenCount();
+       RemoveAllAnimations(target);
 
-       if (childrenCount <= 0)
+       if (GetChildrenCount() <= 0)
        {
                return;
        }
 
        _TransactionNode* pChild = null;
 
-       for (int index = childrenCount-1; index >= 0; index--)
+       for (int index = 0; index < GetChildrenCount(); index++)
        {
                pChild = __children.GetChildAt(index);
 
@@ -1266,7 +1258,10 @@ _TransactionNode::RemoveChildrenAllAnimations(VisualElement& target)
 
                        pChild->NotifyTransactionFinished(false);
 
-                       RemoveChild(*pChild);
+                       if (RemoveChild(*pChild))
+                       {
+                               index--;
+                       }
                }
        }
 }
index 3dd56c0..70dfd8a 100644 (file)
@@ -159,11 +159,10 @@ public:
 
        int GetChildrenCount(void) const;
        _TransactionNode* GetChild(int transactionId) const;
-       _TransactionNode* GetLastChild(void) const;
 
        result AddChild(_TransactionNode& child);
        void RemoveChild(int transactionId);
-       void RemoveChild(_TransactionNode& child);
+       bool RemoveChild(_TransactionNode& child);
 
        void RemoveAll(void);