summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorxji@google.com <xji@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-14 19:48:20 +0000
committerxji@google.com <xji@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-14 19:48:20 +0000
commit052ce6bb5a84022a55d0b3881e6b260d266d08a9 (patch)
treea9358126235a526205f7c00fb627dd5e6f5c7f2e /ui
parent38d7659fd426560410ab1b15a1f8624ae8c93029 (diff)
downloadchromium_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.cc11
-rw-r--r--ui/gfx/render_text_unittest.cc100
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,