From: Joogab Yun Date: Fri, 5 Apr 2019 00:19:26 +0000 (+0900) Subject: Check the pair of tag. X-Git-Tag: dali_1.4.16~2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=55472b6932c7f888d3c707431f2fe990b3b8ab14 Check the pair of tag. * A crash occurs if markup is used incorrectly. ex) these samples will crash. * label.SetProperty( TextLabel::Property::TEXT, "10:01:49" ); - is correct expression. * label.SetProperty( TextLabel::Property::TEXT, "10:01:49" ); Change-Id: I380d0209dabbd35756f9a0b3829fc4a7f31da7d9 --- diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp index 96fcb63..8328b7e 100755 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp @@ -395,8 +395,18 @@ int UtcDaliToolkitTextLabelSetPropertyP(void) label.SetProperty( TextLabel::Property::TEXT, "MarkupText" ); DALI_TEST_EQUALS( label.GetProperty( TextLabel::Property::TEXT ), std::string("MarkupText"), TEST_LOCATION ); - application.SendNotification(); - application.Render(); + // Check for incomplete marks. + label.SetProperty( TextLabel::Property::TEXT, "MarkupText" ); + DALI_TEST_EQUALS( label.GetProperty( TextLabel::Property::TEXT ), std::string("MarkupText"), TEST_LOCATION ); + try + { + application.SendNotification(); + application.Render(); + } + catch( ... ) + { + tet_result(TET_FAIL); + } // Check autoscroll properties const int SCROLL_SPEED = 80; diff --git a/dali-toolkit/internal/text/markup-processor.cpp b/dali-toolkit/internal/text/markup-processor.cpp index 4565b9d..dac4f92 100755 --- a/dali-toolkit/internal/text/markup-processor.cpp +++ b/dali-toolkit/internal/text/markup-processor.cpp @@ -503,6 +503,12 @@ void ProcessMarkupString( const std::string& markupString, MarkupProcessData& ma StyleStack::RunIndex colorRunIndex = 0u; StyleStack::RunIndex fontRunIndex = 0u; + // check tag reference + int colorTagReference = 0u; + int fontTagReference = 0u; + int iTagReference = 0u; + int bTagReference = 0u; + // Give an initial default value to the model's vectors. markupProcessData.colorRuns.Reserve( DEFAULT_VECTOR_SIZE ); markupProcessData.fontRuns.Reserve( DEFAULT_VECTOR_SIZE ); @@ -542,12 +548,19 @@ void ProcessMarkupString( const std::string& markupString, MarkupProcessData& ma // Point the next color run. ++colorRunIndex; + + // Increase reference + ++colorTagReference; } else { - // Pop the top of the stack and set the number of characters of the run. - ColorRun& colorRun = *( markupProcessData.colorRuns.Begin() + styleStack.Pop() ); - colorRun.characterRun.numberOfCharacters = characterIndex - colorRun.characterRun.characterIndex; + if( colorTagReference > 0 ) + { + // Pop the top of the stack and set the number of characters of the run. + ColorRun& colorRun = *( markupProcessData.colorRuns.Begin() + styleStack.Pop() ); + colorRun.characterRun.numberOfCharacters = characterIndex - colorRun.characterRun.characterIndex; + --colorTagReference; + } } } // else if( TokenComparison( XHTML_I_TAG, tag.buffer, tag.length ) ) @@ -571,12 +584,19 @@ void ProcessMarkupString( const std::string& markupString, MarkupProcessData& ma // Point the next free font run. ++fontRunIndex; + + // Increase reference + ++iTagReference; } else { - // Pop the top of the stack and set the number of characters of the run. - FontDescriptionRun& fontRun = *( markupProcessData.fontRuns.Begin() + styleStack.Pop() ); - fontRun.characterRun.numberOfCharacters = characterIndex - fontRun.characterRun.characterIndex; + if( iTagReference > 0 ) + { + // Pop the top of the stack and set the number of characters of the run. + FontDescriptionRun& fontRun = *( markupProcessData.fontRuns.Begin() + styleStack.Pop() ); + fontRun.characterRun.numberOfCharacters = characterIndex - fontRun.characterRun.characterIndex; + --iTagReference; + } } } // else if( TokenComparison( XHTML_U_TAG, tag.buffer, tag.length ) ) @@ -611,12 +631,19 @@ void ProcessMarkupString( const std::string& markupString, MarkupProcessData& ma // Point the next free font run. ++fontRunIndex; + + // Increase reference + ++bTagReference; } else { - // Pop the top of the stack and set the number of characters of the run. - FontDescriptionRun& fontRun = *( markupProcessData.fontRuns.Begin() + styleStack.Pop() ); - fontRun.characterRun.numberOfCharacters = characterIndex - fontRun.characterRun.characterIndex; + if( bTagReference > 0 ) + { + // Pop the top of the stack and set the number of characters of the run. + FontDescriptionRun& fontRun = *( markupProcessData.fontRuns.Begin() + styleStack.Pop() ); + fontRun.characterRun.numberOfCharacters = characterIndex - fontRun.characterRun.characterIndex; + --bTagReference; + } } } // else if( TokenComparison( XHTML_FONT_TAG, tag.buffer, tag.length ) ) @@ -640,12 +667,19 @@ void ProcessMarkupString( const std::string& markupString, MarkupProcessData& ma // Point the next free font run. ++fontRunIndex; + + // Increase reference + ++fontTagReference; } else { - // Pop the top of the stack and set the number of characters of the run. - FontDescriptionRun& fontRun = *( markupProcessData.fontRuns.Begin() + styleStack.Pop() ); - fontRun.characterRun.numberOfCharacters = characterIndex - fontRun.characterRun.characterIndex; + if( fontTagReference > 0 ) + { + // Pop the top of the stack and set the number of characters of the run. + FontDescriptionRun& fontRun = *( markupProcessData.fontRuns.Begin() + styleStack.Pop() ); + fontRun.characterRun.numberOfCharacters = characterIndex - fontRun.characterRun.characterIndex; + --fontTagReference; + } } } // else if( TokenComparison( XHTML_SHADOW_TAG, tag.buffer, tag.length ) )