diff options
author | xji@google.com <xji@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-14 19:48:20 +0000 |
---|---|---|
committer | xji@google.com <xji@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-14 19:48:20 +0000 |
commit | 052ce6bb5a84022a55d0b3881e6b260d266d08a9 (patch) | |
tree | a9358126235a526205f7c00fb627dd5e6f5c7f2e /ui | |
parent | 38d7659fd426560410ab1b15a1f8624ae8c93029 (diff) | |
download | chromium_src-052ce6bb5a84022a55d0b3881e6b260d266d08a9.zip chromium_src-052ce6bb5a84022a55d0b3881e6b260d266d08a9.tar.gz chromium_src-052ce6bb5a84022a55d0b3881e6b260d266d08a9.tar.bz2 |
Fix style_range_.erase() which caused style range not deleted completely and dcheck error.
BUG=99923
TEST=start chrome with new profile and --no-first-run --use-pure-view. type in http://sites.google.com/a/google.com/ several times until autocomplete kicks in. continue typing while with autocomplete, browser should not crash.
Review URL: http://codereview.chromium.org/8252001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@105547 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r-- | ui/gfx/render_text.cc | 11 | ||||
-rw-r--r-- | ui/gfx/render_text_unittest.cc | 100 |
2 files changed, 106 insertions, 5 deletions
diff --git a/ui/gfx/render_text.cc b/ui/gfx/render_text.cc index 6d360b7..f8e58e7 100644 --- a/ui/gfx/render_text.cc +++ b/ui/gfx/render_text.cc @@ -105,13 +105,14 @@ void RenderText::SetText(const string16& text) { StyleRanges::iterator i; for (i = style_ranges_.begin(); i != style_ranges_.end(); i++) { if (i->range.start() >= text_.length()) { - i = style_ranges_.erase(i); - if (i == style_ranges_.end()) - break; - } else if (i->range.end() > text_.length()) { - i->range.set_end(text_.length()); + // Style ranges are sorted and non-overlapping, so all the subsequent + // style ranges should be out of text_.length() as well. + style_ranges_.erase(i, style_ranges_.end()); + break; } } + // Since style ranges are sorted and non-overlapping, if there is a style + // range ends beyond text_.length, it must be the last one. style_ranges_.back().range.set_end(text_.length()); } #ifndef NDEBUG diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc index b66ac2d..c564c60 100644 --- a/ui/gfx/render_text_unittest.cc +++ b/ui/gfx/render_text_unittest.cc @@ -140,6 +140,65 @@ TEST_F(RenderTextTest, ApplyStyleRange) { EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range); EXPECT_FALSE(render_text->style_ranges()[0].underline); EXPECT_FALSE(render_text->style_ranges()[0].strike); + + // Apply new style range that contains the 2nd last old style range. + render_text->SetText(ASCIIToUTF16("abcdefghi")); + underline.range = ui::Range(0, 3); + render_text->ApplyStyleRange(underline); + color.range = ui::Range(3, 6); + render_text->ApplyStyleRange(color); + strike.range = ui::Range(6, 9); + render_text->ApplyStyleRange(strike); + EXPECT_EQ(3U, render_text->style_ranges().size()); + + color.foreground = SK_ColorRED; + color.range = ui::Range(2, 8); + render_text->ApplyStyleRange(color); + EXPECT_EQ(3U, render_text->style_ranges().size()); + EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); + EXPECT_TRUE(render_text->style_ranges()[0].underline); + EXPECT_EQ(ui::Range(2, 8), render_text->style_ranges()[1].range); + EXPECT_EQ(SK_ColorRED, render_text->style_ranges()[1].foreground); + EXPECT_EQ(ui::Range(8, 9), render_text->style_ranges()[2].range); + EXPECT_TRUE(render_text->style_ranges()[2].strike); + + // Apply new style range that contains multiple old style ranges. + render_text->SetText(ASCIIToUTF16("abcdefghiopq")); + underline.range = ui::Range(0, 3); + render_text->ApplyStyleRange(underline); + color.range = ui::Range(3, 6); + render_text->ApplyStyleRange(color); + strike.range = ui::Range(6, 9); + render_text->ApplyStyleRange(strike); + strike_underline.range = ui::Range(9, 12); + render_text->ApplyStyleRange(strike_underline); + EXPECT_EQ(4U, render_text->style_ranges().size()); + + color.foreground = SK_ColorRED; + color.range = ui::Range(2, 10); + render_text->ApplyStyleRange(color); + EXPECT_EQ(3U, render_text->style_ranges().size()); + EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); + EXPECT_TRUE(render_text->style_ranges()[0].underline); + EXPECT_EQ(ui::Range(2, 10), render_text->style_ranges()[1].range); + EXPECT_EQ(SK_ColorRED, render_text->style_ranges()[1].foreground); + EXPECT_EQ(ui::Range(10, 12), render_text->style_ranges()[2].range); + EXPECT_TRUE(render_text->style_ranges()[2].underline); + EXPECT_TRUE(render_text->style_ranges()[2].strike); +} + +static void SetTextWith2ExtraStyles(RenderText* render_text) { + render_text->SetText(ASCIIToUTF16("abcdefghi")); + + gfx::StyleRange strike; + strike.strike = true; + strike.range = ui::Range(0, 3); + render_text->ApplyStyleRange(strike); + + gfx::StyleRange underline; + underline.underline = true; + underline.range = ui::Range(3, 6); + render_text->ApplyStyleRange(underline); } TEST_F(RenderTextTest, StyleRangesAdjust) { @@ -176,6 +235,47 @@ TEST_F(RenderTextTest, StyleRangesAdjust) { EXPECT_EQ(1U, render_text->style_ranges().size()); EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range); EXPECT_FALSE(render_text->style_ranges()[0].strike); + + // Test that ranges are removed correctly if they are outside the range of + // shorter text. + SetTextWith2ExtraStyles(render_text.get()); + EXPECT_EQ(3U, render_text->style_ranges().size()); + + render_text->SetText(ASCIIToUTF16("abcdefg")); + EXPECT_EQ(3U, render_text->style_ranges().size()); + EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); + EXPECT_EQ(ui::Range(3, 6), render_text->style_ranges()[1].range); + EXPECT_EQ(ui::Range(6, 7), render_text->style_ranges()[2].range); + + SetTextWith2ExtraStyles(render_text.get()); + EXPECT_EQ(3U, render_text->style_ranges().size()); + + render_text->SetText(ASCIIToUTF16("abcdef")); + EXPECT_EQ(2U, render_text->style_ranges().size()); + EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); + EXPECT_EQ(ui::Range(3, 6), render_text->style_ranges()[1].range); + + SetTextWith2ExtraStyles(render_text.get()); + EXPECT_EQ(3U, render_text->style_ranges().size()); + + render_text->SetText(ASCIIToUTF16("abcde")); + EXPECT_EQ(2U, render_text->style_ranges().size()); + EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); + EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[1].range); + + SetTextWith2ExtraStyles(render_text.get()); + EXPECT_EQ(3U, render_text->style_ranges().size()); + + render_text->SetText(ASCIIToUTF16("abc")); + EXPECT_EQ(1U, render_text->style_ranges().size()); + EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); + + SetTextWith2ExtraStyles(render_text.get()); + EXPECT_EQ(3U, render_text->style_ranges().size()); + + render_text->SetText(ASCIIToUTF16("a")); + EXPECT_EQ(1U, render_text->style_ranges().size()); + EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range); } void RunMoveCursorLeftRightTest(RenderText* render_text, |