From: Paul Wisbey Date: Thu, 12 Apr 2018 16:25:34 +0000 (+0100) Subject: Fix crash issue when SetProperty is called with an invalid type X-Git-Tag: dali_1.3.21~2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-core.git;a=commitdiff_plain;h=b268cf1b012d2cde50be7a371269962ceba63204 Fix crash issue when SetProperty is called with an invalid type Previously this would result in a crash, since the PropertyMetadata would be overwritten with the incorrect type of Property::Value float uRadius( 5.0f ); actor.RegisterProperty( "radius", uRadius ); Property::Value propertyValue; propertyValue = int(1); Property::Index radius = actor.GetPropertyIndex( "radius" ); actor.SetProperty( radius, propertyValue ); The crash happens after attempting to cast to the wrong type of AnimatableProperty in Actor::SetSceneGraphProperty Change-Id: I8d42d190f81ff97cb9667da248911ed5ae6475dc --- diff --git a/automated-tests/src/dali/utc-Dali-Actor.cpp b/automated-tests/src/dali/utc-Dali-Actor.cpp index 9a6f34f..74b6c87 100644 --- a/automated-tests/src/dali/utc-Dali-Actor.cpp +++ b/automated-tests/src/dali/utc-Dali-Actor.cpp @@ -623,6 +623,75 @@ int UtcDaliActorGetParent02(void) END_TEST; } +int UtcDaliActorCustomProperty(void) +{ + TestApplication application; + + Actor actor = Actor::New(); + Stage::GetCurrent().Add( actor ); + + float startValue(1.0f); + Property::Index index = actor.RegisterProperty( "testProperty", startValue ); + DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); + + actor.SetProperty( index, 5.0f ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( actor.GetProperty(index) == 5.0f ); + END_TEST; +} + +int UtcDaliActorCustomPropertyIntToFloat(void) +{ + TestApplication application; + + Actor actor = Actor::New(); + Stage::GetCurrent().Add( actor ); + + float startValue(5.0f); + Property::Index index = actor.RegisterProperty( "testProperty", startValue ); + DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); + + actor.SetProperty( index, int(1) ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( actor.GetProperty(index) == 1.0f ); + END_TEST; +} + +int UtcDaliActorCustomPropertyFloatToInt(void) +{ + TestApplication application; + + Actor actor = Actor::New(); + Stage::GetCurrent().Add( actor ); + + int startValue(5); + Property::Index index = actor.RegisterProperty( "testProperty", startValue ); + DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); + + actor.SetProperty( index, float(1.5) ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( actor.GetProperty(index) == 1 ); + END_TEST; +} + int UtcDaliActorSetParentOrigin(void) { TestApplication application; diff --git a/automated-tests/src/dali/utc-Dali-Handle.cpp b/automated-tests/src/dali/utc-Dali-Handle.cpp index 71b431f..e34cc24 100644 --- a/automated-tests/src/dali/utc-Dali-Handle.cpp +++ b/automated-tests/src/dali/utc-Dali-Handle.cpp @@ -894,6 +894,409 @@ int UtcDaliHandleCustomProperty(void) END_TEST; } +int UtcDaliHandleCustomPropertyNone(void) +{ + TestApplication application; + + Handle handle = Handle::New(); + + Property::Value value( Property::NONE ); + Property::Index index = handle.RegisterProperty( "testProperty", value, Property::READ_WRITE); + + // Negative test i.e. setting a property of type NONE is meaningless + handle.SetProperty( index, 5.0f ); + + DALI_TEST_CHECK( true ); // got here without crashing + + END_TEST; +} + +int UtcDaliHandleCustomPropertyIntToFloat(void) +{ + TestApplication application; + + Handle handle = Handle::New(); + + float startValue(5.0f); + Property::Index index = handle.RegisterProperty( "testProperty", startValue ); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + handle.SetProperty( index, int(1) ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( handle.GetProperty(index) == 1.0f ); + END_TEST; +} + +int UtcDaliHandleCustomPropertyFloatToInt(void) +{ + TestApplication application; + + Handle handle = Handle::New(); + + int startValue(5); + Property::Index index = handle.RegisterProperty( "testProperty", startValue ); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + handle.SetProperty( index, float(1.5) ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( handle.GetProperty(index) == 1 ); + END_TEST; +} + +int UtcDaliHandleCustomPropertyInvalidToRect(void) +{ + TestApplication application; + + Handle handle = Handle::New(); + + Rect startValue(1,2,3,4); + Property::Index index = handle.RegisterProperty( "testProperty", startValue, Property::READ_WRITE); + DALI_TEST_EQUALS( handle.GetProperty< Rect >( index ), startValue, TEST_LOCATION ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_EQUALS( handle.GetProperty< Rect >( index ), startValue, TEST_LOCATION ); + + // Negative test i.e. there is no conversion from float to Rect + handle.SetProperty( index, float(1.5) ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_EQUALS( handle.GetProperty< Rect >( index ), startValue, TEST_LOCATION ); + + // Positive test (sanity check) + Rect endValue(5,6,7,8); + handle.SetProperty( index, endValue ); + DALI_TEST_EQUALS( handle.GetProperty< Rect >( index ), endValue, TEST_LOCATION ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_EQUALS( handle.GetProperty< Rect >( index ), endValue, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliHandleCustomPropertyInvalidToString(void) +{ + TestApplication application; + + Handle handle = Handle::New(); + + std::string startValue( "Libraries gave us power" ); + Property::Index index = handle.RegisterProperty( "testProperty", startValue, Property::READ_WRITE); + DALI_TEST_EQUALS( handle.GetProperty< std::string >( index ), startValue, TEST_LOCATION ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_EQUALS( handle.GetProperty< std::string >( index ), startValue, TEST_LOCATION ); + + // No conversion from Vector3 to std::string, therefore this should be a NOOP + handle.SetProperty( index, Vector3(1,2,3) ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_EQUALS( handle.GetProperty< std::string >( index ), startValue, TEST_LOCATION ); + + // Positive test (sanity check) + std::string endValue( "Then work came and made us free" ); + handle.SetProperty( index, endValue ); + DALI_TEST_EQUALS( handle.GetProperty< std::string >( index ), endValue, TEST_LOCATION ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_EQUALS( handle.GetProperty< std::string >( index ), endValue, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliHandleCustomPropertyInvalidToArray(void) +{ + TestApplication application; + + Handle handle = Handle::New(); + + Property::Value value( Property::ARRAY ); + std::string startValue( "The future teaches you to be alone" ); + value.GetArray()->PushBack( startValue ); + + Property::Index index = handle.RegisterProperty( "testProperty", value, Property::READ_WRITE); + Property::Array check1 = handle.GetProperty< Property::Array >( index ); + DALI_TEST_EQUALS( check1.GetElementAt(0).Get(), startValue, TEST_LOCATION ); + + application.SendNotification(); + application.Render(0); + Property::Array check2 = handle.GetProperty< Property::Array >( index ); + DALI_TEST_EQUALS( check2.GetElementAt(0).Get(), startValue, TEST_LOCATION ); + + // No conversion from int to ARRAY, therefore this should be a NOOP + handle.SetProperty( index, int(2) ); + + application.SendNotification(); + application.Render(0); + Property::Array check3 = handle.GetProperty< Property::Array >( index ); + DALI_TEST_EQUALS( check3.GetElementAt(0).Get(), startValue, TEST_LOCATION ); + + // Positive test (sanity check) + Property::Value value2(Property::ARRAY); + std::string endValue( "The present to be afraid and cold" ); + value2.GetArray()->PushBack( endValue ); + handle.SetProperty( index, value2 ); + + Property::Array check4 = handle.GetProperty< Property::Array >( index ); + DALI_TEST_EQUALS( check4.GetElementAt(0).Get(), endValue, TEST_LOCATION ); + + application.SendNotification(); + application.Render(0); + Property::Array check5 = handle.GetProperty< Property::Array >( index ); + DALI_TEST_EQUALS( check5.GetElementAt(0).Get(), endValue, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliHandleCustomPropertyInvalidToMap(void) +{ + TestApplication application; + + Handle handle = Handle::New(); + + Property::Value value( Property::MAP ); + std::string startValue( "Culture sucks down words" ); + value.GetMap()->Insert( "1", startValue ); + + Property::Index index = handle.RegisterProperty( "testProperty", value, Property::READ_WRITE ); + Property::Value* check1 = handle.GetProperty< Property::Map >( index ).Find("1"); + DALI_TEST_CHECK( NULL != check1 ); + + // No conversion from float to MAP, therefore this should be a NOOP + handle.SetProperty( index, float(3.0) ); + + // Positive test (sanity check) + Property::Value value2( Property::MAP ); + std::string endValue( "Itemise loathing and feed yourself smiles" ); + value.GetMap()->Insert( "1", endValue ); + handle.SetProperty( index, value2 ); + + END_TEST; +} + +int UtcDaliHandleCustomPropertyInvalidToExtents(void) +{ + TestApplication application; + + Handle handle = Handle::New(); + + Extents startValue(1,2,3,4); + Property::Index index = handle.RegisterProperty( "testProperty", startValue, Property::READ_WRITE); + DALI_TEST_EQUALS( handle.GetProperty< Extents >( index ), startValue, TEST_LOCATION ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_EQUALS( handle.GetProperty< Extents >( index ), startValue, TEST_LOCATION ); + + // Negative test i.e. there is no conversion from float to Extents + handle.SetProperty( index, float(1.5) ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_EQUALS( handle.GetProperty< Extents >( index ), startValue, TEST_LOCATION ); + + // Positive test (sanity check) + Extents endValue(5,6,7,8); + handle.SetProperty( index, endValue ); + DALI_TEST_EQUALS( handle.GetProperty< Extents >( index ), endValue, TEST_LOCATION ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_EQUALS( handle.GetProperty< Extents >( index ), endValue, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliHandleCustomPropertyInvalidToBool(void) +{ + TestApplication application; + + Handle handle = Handle::New(); + + bool startValue(true); + Property::Index index = handle.RegisterProperty( "testProperty", startValue, Property::READ_WRITE); + DALI_TEST_EQUALS( handle.GetProperty< bool >( index ), startValue, TEST_LOCATION ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_EQUALS( handle.GetProperty< bool >( index ), startValue, TEST_LOCATION ); + + // Negative test i.e. there is no conversion from float to bool + handle.SetProperty( index, float(0.0) ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_EQUALS( handle.GetProperty< bool >( index ), startValue, TEST_LOCATION ); + + // Positive test (sanity check) + bool endValue(false); + handle.SetProperty( index, endValue ); + DALI_TEST_EQUALS( handle.GetProperty< bool >( index ), endValue, TEST_LOCATION ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_EQUALS( handle.GetProperty< bool >( index ), endValue, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliHandleCustomPropertyInvalidToInt(void) +{ + TestApplication application; + + Handle handle = Handle::New(); + + int startValue(5); + Property::Index index = handle.RegisterProperty( "testProperty", startValue ); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + // Negative test i.e. there is no conversion from Vector3 to int + handle.SetProperty( index, Vector3(1,2,3) ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + END_TEST; +} + +int UtcDaliHandleCustomPropertyInvalidToFloat(void) +{ + TestApplication application; + + Handle handle = Handle::New(); + + float startValue(5.0); + Property::Index index = handle.RegisterProperty( "testProperty", startValue ); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + // Negative test i.e. there is no conversion from Vector3 to float + handle.SetProperty( index, Vector3(1,2,3) ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + END_TEST; +} + +int UtcDaliHandleCustomPropertyInvalidToRotation(void) +{ + TestApplication application; + + Handle handle = Handle::New(); + + Quaternion startValue( Radian(0.785f), Vector3(1.0f, 1.0f, 0.0f)); + Property::Index index = handle.RegisterProperty( "testProperty", startValue ); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + // Negative test i.e. there is no conversion from float to Quaternion + handle.SetProperty( index, float(7.0) ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + // Positive test (sanity check) + Quaternion endValue( Radian(0.785f), Vector3(1.0f, 1.0f, 0.0f)); + handle.SetProperty( index, endValue ); + DALI_TEST_CHECK( handle.GetProperty(index) == endValue ); + + END_TEST; +} + +int UtcDaliHandleCustomPropertyInvalidToMatrix(void) +{ + TestApplication application; + + Handle handle = Handle::New(); + + Quaternion rotation( Radian(0.785f), Vector3(1.0f, 1.0f, 0.0f)); + Matrix startValue(rotation); + Property::Index index = handle.RegisterProperty( "testProperty", startValue ); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + // Negative test i.e. there is no conversion from float to Matrix + handle.SetProperty( index, float(7.0) ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + // Positive test (sanity check) + Quaternion endRotation( Radian(0.785f), Vector3(1.0f, 1.0f, 0.0f)); + Matrix endValue(endRotation); + handle.SetProperty( index, endValue ); + DALI_TEST_CHECK( handle.GetProperty(index) == endValue ); + + END_TEST; +} + +int UtcDaliHandleCustomPropertyInvalidToMatrix3(void) +{ + TestApplication application; + + Handle handle = Handle::New(); + + Matrix3 startValue(11,12,13, + 21,22,23, + 31,32,33); + + Property::Index index = handle.RegisterProperty( "testProperty", startValue ); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + // Negative test i.e. there is no conversion from float to Matrix3 + handle.SetProperty( index, float(7.0) ); + + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( handle.GetProperty(index) == startValue ); + + // Positive test (sanity check) + Matrix3 endValue(31,32,33, + 21,22,23, + 11,12,13); + handle.SetProperty( index, endValue ); + DALI_TEST_CHECK( handle.GetProperty(index) == endValue ); + + END_TEST; +} + int UtcDaliHandleWeightNew(void) { TestApplication application; diff --git a/dali/internal/event/common/property-metadata.cpp b/dali/internal/event/common/property-metadata.cpp index c77a570..8f2f43f 100644 --- a/dali/internal/event/common/property-metadata.cpp +++ b/dali/internal/event/common/property-metadata.cpp @@ -24,6 +24,12 @@ #include #include #include +#include +#include +#include +#include +#include +#include namespace Dali { @@ -53,19 +59,118 @@ void PropertyMetadata::SetPropertyValue( const Property::Value& propertyValue ) switch ( GetType() ) { case Property::NONE: + { + // NOOP + break; + } + case Property::RECTANGLE: + { + Rect convertedValue; + if( propertyValue.Get( convertedValue ) ) + { + value = convertedValue; + } + break; + } + case Property::STRING: + { + std::string convertedValue; + if( propertyValue.Get( convertedValue ) ) + { + value = convertedValue; + } + break; + } + case Property::ARRAY: + { + Property::Array* array = propertyValue.GetArray(); + if( array ) + { + value = *array; + } + break; + } + case Property::MAP: + { + Property::Map* map = propertyValue.GetMap(); + if( map ) + { + value = *map; + } + break; + } + case Property::EXTENTS: + { + Extents convertedValue; + if( propertyValue.Get( convertedValue ) ) + { + value = convertedValue; + } + break; + } + case Property::BOOLEAN: + { + bool convertedValue; + if( propertyValue.Get( convertedValue ) ) + { + value = convertedValue; + } + break; + } + case Property::INTEGER: + { + int convertedValue; + if( propertyValue.Get( convertedValue ) ) + { + value = convertedValue; + } + break; + } + case Property::FLOAT: + { + float convertedValue; + if( propertyValue.Get( convertedValue ) ) + { + value = convertedValue; + } + break; + } + case Property::ROTATION: + { + Quaternion convertedValue; + if( propertyValue.Get( convertedValue ) ) + { + value = convertedValue; + } + break; + } + case Property::MATRIX: + { + Matrix convertedValue; + if( propertyValue.Get( convertedValue ) ) + { + value = convertedValue; + } + break; + } + case Property::MATRIX3: { - value = propertyValue; + Matrix3 convertedValue; + if( propertyValue.Get( convertedValue ) ) + { + value = convertedValue; + } break; }