From f17cae08e6841bace7db1ab903d4a5841435a6f4 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Wed, 16 May 2018 20:56:27 +0300 Subject: [PATCH] evas textblock: manage default style properly for new interfaces Summary: Calling efl_canvas_text_style_set() with empty key means setting a default style to object. But, it counldn't store style as default properly. It caused a crash issue from elementary_test. @fix Test Plan: New test case is included. Run test suite. Or, 1. Run elementary_test 2. Find and launch "Image Zoomable animation" test. 3. Close the image test window. 4. See the crash issue. Reviewers: raster, herdsman, jpeg, cedric, zmike Subscribers: zmike Tags: #efl Differential Revision: https://phab.enlightenment.org/D5692 Committer's note: rebased and removed unrelated test. --- src/lib/evas/canvas/evas_object_textblock.c | 9 ++++- src/tests/evas/evas_test_textblock.c | 43 +++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index 9ed2a33918..d1f6123562 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -7295,7 +7295,14 @@ _efl_canvas_text_style_set(Eo *eo_obj, Efl_Canvas_Text_Data *o, const char *key, ts = evas_textblock_style_new(); evas_textblock_style_set(ts, style); ts->key = eina_stringshare_add(key); - o->styles = eina_list_append(o->styles, ts); + + /* If the given key value is NULL, newly created Evas Textblock Style + * has to be assigned to o->style. */ + if (ts->key) + o->styles = eina_list_append(o->styles, ts); + else + o->style = ts; + _textblock_style_generic_set(eo_obj, ts, &tmp); } else if (ts && style) diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index 03e92adb9a..715ec1fd33 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c @@ -4480,6 +4480,48 @@ EFL_START_TEST(evas_textblock_annotation) } EFL_END_TEST; +#define START_EFL_CANVAS_TEXT_TEST() \ + Evas *evas; \ + Eo *txt; \ + Efl_Text_Cursor_Cursor *cur; \ + evas = EVAS_TEST_INIT_EVAS(); \ + evas_font_hinting_set(evas, EVAS_FONT_HINTING_AUTO); \ + txt = efl_add(EFL_CANVAS_TEXT_CLASS, evas); \ + fail_if(!txt); \ + efl_canvas_text_legacy_newline_set(txt, EINA_FALSE); \ + efl_canvas_text_style_set(txt, NULL, style_buf); \ + fail_if(!efl_canvas_text_style_get(txt, NULL) || \ + strcmp(style_buf, efl_canvas_text_style_get(txt, NULL))); \ + cur = efl_text_cursor_new(txt); \ + fail_if(!cur); \ +do \ +{ \ +} \ +while (0) + +#define END_EFL_CANVAS_TEXT_TEST() \ +do \ +{ \ + efl_text_cursor_free(txt, cur); \ + efl_del(txt); \ + evas_free(evas); \ +} \ +while (0) + +EFL_START_TEST(efl_canvas_text_simple) +{ + START_EFL_CANVAS_TEXT_TEST(); + + /* It is simple test for Efl_Canvas_Text. + * The main object is "txt". */ + const char *buf = "This is a
test."; + efl_text_set(txt, buf); + fail_if(strcmp(efl_text_get(txt), buf)); + + END_EFL_CANVAS_TEXT_TEST(); +} +EFL_END_TEST + EFL_START_TEST(efl_canvas_text_cursor) { START_TB_TEST(); @@ -4541,6 +4583,7 @@ void evas_test_textblock(TCase *tc) #endif tcase_add_test(tc, evas_textblock_text_iface); tcase_add_test(tc, evas_textblock_annotation); + tcase_add_test(tc, efl_canvas_text_simple); tcase_add_test(tc, efl_canvas_text_cursor); }