| Index: third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
 | 
| diff --git a/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp b/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
 | 
| index 5bdd5061c68838d4d3bd2197ec8cdceb711312ad..33043a74f885bc2668564b4939d0e1b4ce731bd4 100644
 | 
| --- a/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
 | 
| +++ b/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
 | 
| @@ -1545,10 +1545,6 @@ TEST_F(InputMethodControllerTest,
 | 
|                     .Data());
 | 
|  }
 | 
|  
 | 
| -// TODO(rlanday): The behavior tested in the following DocumentMarker tests is
 | 
| -// going to be changed so markers are not split when text they contain is
 | 
| -// deleted
 | 
| -
 | 
|  TEST_F(InputMethodControllerTest,
 | 
|         Marker_WhitespaceFixupAroundMarkerBeginningWithSpace) {
 | 
|    Element* div = InsertHTMLElement(
 | 
| @@ -1569,15 +1565,11 @@ TEST_F(InputMethodControllerTest,
 | 
|    Controller().SetCompositionFromExistingText(empty_underlines, 6, 10);
 | 
|    Controller().CommitText(String(""), empty_underlines, 0);
 | 
|  
 | 
| -  // Check that the marker was split when the space at the beginning was
 | 
| -  // converted to an nbsp
 | 
| -  EXPECT_EQ(2u, GetDocument().Markers().Markers().size());
 | 
| -  EXPECT_STREQ("\xC2\xA0",  // UTF-8 for an nbsp
 | 
| -               GetMarkedText(GetDocument().Markers(), div->FirstChild(), 0)
 | 
| -                   .Utf8()
 | 
| -                   .Data());
 | 
| -  EXPECT_STREQ("text",
 | 
| -               GetMarkedText(GetDocument().Markers(), div->FirstChild(), 1)
 | 
| +  // Check that the marker is still attached to " text" and includes the space
 | 
| +  // before "text" but not the space after
 | 
| +  EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 | 
| +  ASSERT_STREQ("\xC2\xA0text",
 | 
| +               GetMarkedText(GetDocument().Markers(), div->firstChild(), 0)
 | 
|                     .Utf8()
 | 
|                     .Data());
 | 
|  }
 | 
| @@ -1602,15 +1594,11 @@ TEST_F(InputMethodControllerTest,
 | 
|    Controller().SetCompositionFromExistingText(empty_underlines, 6, 10);
 | 
|    Controller().CommitText(String(""), empty_underlines, 0);
 | 
|  
 | 
| -  // Check that the marker was split when the space at the end was
 | 
| -  // converted to an nbsp
 | 
| -  EXPECT_EQ(2u, GetDocument().Markers().Markers().size());
 | 
| -  EXPECT_STREQ("text",
 | 
| -               GetMarkedText(GetDocument().Markers(), div->FirstChild(), 0)
 | 
| -                   .Utf8()
 | 
| -                   .Data());
 | 
| -  EXPECT_STREQ("\xC2\xA0",  // UTF-8 for an nbsp
 | 
| -               GetMarkedText(GetDocument().Markers(), div->FirstChild(), 1)
 | 
| +  // Check that the marker is still attached to "text " and includes the space
 | 
| +  // after "text" but not the space before
 | 
| +  EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 | 
| +  ASSERT_STREQ("text\xC2\xA0",
 | 
| +               GetMarkedText(GetDocument().Markers(), div->firstChild(), 0)
 | 
|                     .Utf8()
 | 
|                     .Data());
 | 
|  }
 | 
| @@ -1636,19 +1624,11 @@ TEST_F(InputMethodControllerTest,
 | 
|    Controller().SetCompositionFromExistingText(empty_underlines, 6, 10);
 | 
|    Controller().CommitText(String(""), empty_underlines, 0);
 | 
|  
 | 
| -  // Check that the marker was split into three pieces when the two spaces were
 | 
| -  // converted to nbsps
 | 
| -  EXPECT_EQ(3u, GetDocument().Markers().Markers().size());
 | 
| -  EXPECT_STREQ("\xC2\xA0",  // UTF-8 for an nbsp
 | 
| -               GetMarkedText(GetDocument().Markers(), div->FirstChild(), 0)
 | 
| -                   .Utf8()
 | 
| -                   .Data());
 | 
| -  EXPECT_STREQ("text",
 | 
| -               GetMarkedText(GetDocument().Markers(), div->FirstChild(), 1)
 | 
| -                   .Utf8()
 | 
| -                   .Data());
 | 
| -  EXPECT_STREQ("\xC2\xA0",  // UTF-8 for an nbsp
 | 
| -               GetMarkedText(GetDocument().Markers(), div->FirstChild(), 2)
 | 
| +  // Check that the marker is still attached to " text " and includes both the
 | 
| +  // space before "text" and the space after
 | 
| +  EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 | 
| +  ASSERT_STREQ("\xC2\xA0text\xC2\xA0",
 | 
| +               GetMarkedText(GetDocument().Markers(), div->firstChild(), 0)
 | 
|                     .Utf8()
 | 
|                     .Data());
 | 
|  }
 | 
| @@ -1668,11 +1648,10 @@ TEST_F(InputMethodControllerTest, Marker_ReplaceStartOfMarker) {
 | 
|    Controller().SetCompositionFromExistingText(empty_underlines, 0, 7);
 | 
|    Controller().CommitText(String("Original"), empty_underlines, 0);
 | 
|  
 | 
| -  // Verify marker is under "al text"
 | 
| -  // ("Initial" and "Original" have "al" as a common suffix)
 | 
| +  // Verify marker is under "Original text"
 | 
|    EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 | 
| -  EXPECT_STREQ("al text",
 | 
| -               GetMarkedText(GetDocument().Markers(), div->FirstChild(), 0)
 | 
| +  ASSERT_STREQ("Original text",
 | 
| +               GetMarkedText(GetDocument().Markers(), div->firstChild(), 0)
 | 
|                     .Utf8()
 | 
|                     .Data());
 | 
|  }
 | 
| @@ -1716,10 +1695,10 @@ TEST_F(InputMethodControllerTest, Marker_ReplaceEndOfMarker) {
 | 
|    Controller().SetCompositionFromExistingText(empty_underlines, 8, 12);
 | 
|    Controller().CommitText(String("string"), empty_underlines, 0);
 | 
|  
 | 
| -  // Verify marker is under "Initial "
 | 
| +  // Verify marker is under "Initial string"
 | 
|    EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 | 
| -  EXPECT_STREQ("Initial ",
 | 
| -               GetMarkedText(GetDocument().Markers(), div->FirstChild(), 0)
 | 
| +  ASSERT_STREQ("Initial string",
 | 
| +               GetMarkedText(GetDocument().Markers(), div->firstChild(), 0)
 | 
|                     .Utf8()
 | 
|                     .Data());
 | 
|  }
 | 
| @@ -1765,8 +1744,12 @@ TEST_F(InputMethodControllerTest, Marker_ReplaceEntireMarker) {
 | 
|    Controller().SetCompositionFromExistingText(empty_underlines, 8, 12);
 | 
|    Controller().CommitText(String("string"), empty_underlines, 0);
 | 
|  
 | 
| -  // Verify marker was removed
 | 
| -  EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
 | 
| +  // Verify marker is under "string"
 | 
| +  EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 | 
| +  ASSERT_STREQ("string",
 | 
| +               GetMarkedText(GetDocument().Markers(), div->firstChild(), 0)
 | 
| +                   .Utf8()
 | 
| +                   .Data());
 | 
|  }
 | 
|  
 | 
|  TEST_F(InputMethodControllerTest, Marker_ReplaceTextWithMarkerAtBeginning) {
 | 
| @@ -1811,4 +1794,174 @@ TEST_F(InputMethodControllerTest, Marker_ReplaceTextWithMarkerAtEnd) {
 | 
|    EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
 | 
|  }
 | 
|  
 | 
| +TEST_F(InputMethodControllerTest, Marker_Deletions) {
 | 
| +  Element* div = InsertHTMLElement(
 | 
| +      "<div id='sample' contenteditable>1111122222333334444455555</div>",
 | 
| +      "sample");
 | 
| +
 | 
| +  EphemeralRange marker_range = PlainTextRange(0, 5).CreateRange(*div);
 | 
| +  GetDocument().Markers().AddMarker(marker_range.StartPosition(),
 | 
| +                                    marker_range.EndPosition(),
 | 
| +                                    DocumentMarker::kTextMatch);
 | 
| +
 | 
| +  marker_range = PlainTextRange(5, 10).CreateRange(*div);
 | 
| +  GetDocument().Markers().AddMarker(marker_range.StartPosition(),
 | 
| +                                    marker_range.EndPosition(),
 | 
| +                                    DocumentMarker::kTextMatch);
 | 
| +
 | 
| +  marker_range = PlainTextRange(10, 15).CreateRange(*div);
 | 
| +  GetDocument().Markers().AddMarker(marker_range.StartPosition(),
 | 
| +                                    marker_range.EndPosition(),
 | 
| +                                    DocumentMarker::kTextMatch);
 | 
| +
 | 
| +  marker_range = PlainTextRange(15, 20).CreateRange(*div);
 | 
| +  GetDocument().Markers().AddMarker(marker_range.StartPosition(),
 | 
| +                                    marker_range.EndPosition(),
 | 
| +                                    DocumentMarker::kTextMatch);
 | 
| +
 | 
| +  marker_range = PlainTextRange(20, 25).CreateRange(*div);
 | 
| +  GetDocument().Markers().AddMarker(marker_range.StartPosition(),
 | 
| +                                    marker_range.EndPosition(),
 | 
| +                                    DocumentMarker::kTextMatch);
 | 
| +
 | 
| +  EXPECT_EQ(5u, GetDocument().Markers().Markers().size());
 | 
| +
 | 
| +  // Delete third marker and portions of second and fourth
 | 
| +  Vector<CompositionUnderline> empty_underlines;
 | 
| +  Controller().SetCompositionFromExistingText(empty_underlines, 8, 17);
 | 
| +  Controller().CommitText(String(""), empty_underlines, 0);
 | 
| +
 | 
| +  // Verify markers were updated correctly
 | 
| +  EXPECT_EQ(4u, GetDocument().Markers().Markers().size());
 | 
| +
 | 
| +  EXPECT_EQ(0u, GetDocument().Markers().Markers()[0]->StartOffset());
 | 
| +  EXPECT_EQ(5u, GetDocument().Markers().Markers()[0]->EndOffset());
 | 
| +
 | 
| +  EXPECT_EQ(5u, GetDocument().Markers().Markers()[1]->StartOffset());
 | 
| +  EXPECT_EQ(8u, GetDocument().Markers().Markers()[1]->EndOffset());
 | 
| +
 | 
| +  EXPECT_EQ(8u, GetDocument().Markers().Markers()[2]->StartOffset());
 | 
| +  EXPECT_EQ(11u, GetDocument().Markers().Markers()[2]->EndOffset());
 | 
| +
 | 
| +  EXPECT_EQ(11u, GetDocument().Markers().Markers()[3]->StartOffset());
 | 
| +  EXPECT_EQ(16u, GetDocument().Markers().Markers()[3]->EndOffset());
 | 
| +}
 | 
| +
 | 
| +TEST_F(InputMethodControllerTest, Marker_DeleteExactlyOnMarker) {
 | 
| +  Element* div = InsertHTMLElement(
 | 
| +      "<div id='sample' contenteditable>1111122222333334444455555</div>",
 | 
| +      "sample");
 | 
| +
 | 
| +  EphemeralRange marker_range = PlainTextRange(5, 10).CreateRange(*div);
 | 
| +  GetDocument().Markers().AddMarker(marker_range.StartPosition(),
 | 
| +                                    marker_range.EndPosition(),
 | 
| +                                    DocumentMarker::kTextMatch);
 | 
| +
 | 
| +  EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 | 
| +
 | 
| +  // Delete exactly on the marker
 | 
| +  Vector<CompositionUnderline> empty_underlines;
 | 
| +  Controller().SetCompositionFromExistingText(empty_underlines, 5, 10);
 | 
| +  Controller().CommitText(String(""), empty_underlines, 0);
 | 
| +  EXPECT_EQ(0u, GetDocument().Markers().Markers().size());
 | 
| +}
 | 
| +
 | 
| +TEST_F(InputMethodControllerTest, Marker_DeleteMiddleOfMarker) {
 | 
| +  Element* div = InsertHTMLElement(
 | 
| +      "<div id='sample' contenteditable>1111122222333334444455555</div>",
 | 
| +      "sample");
 | 
| +
 | 
| +  EphemeralRange marker_range = PlainTextRange(5, 10).CreateRange(*div);
 | 
| +  GetDocument().Markers().AddMarker(marker_range.StartPosition(),
 | 
| +                                    marker_range.EndPosition(),
 | 
| +                                    DocumentMarker::kTextMatch);
 | 
| +
 | 
| +  // Delete middle of marker
 | 
| +  Vector<CompositionUnderline> empty_underlines;
 | 
| +  Controller().SetCompositionFromExistingText(empty_underlines, 6, 9);
 | 
| +  Controller().CommitText(String(""), empty_underlines, 0);
 | 
| +
 | 
| +  EXPECT_EQ(1u, GetDocument().Markers().Markers().size());
 | 
| +
 | 
| +  EXPECT_EQ(5u, GetDocument().Markers().Markers()[0]->StartOffset());
 | 
| +  EXPECT_EQ(7u, GetDocument().Markers().Markers()[0]->EndOffset());
 | 
| +}
 | 
| +
 | 
| +TEST_F(InputMethodControllerTest, Marker_InsertInMarkerInterior) {
 | 
| +  Element* div = InsertHTMLElement(
 | 
| +      "<div id='sample' contenteditable>1111122222333334444455555</div>",
 | 
| +      "sample");
 | 
| +
 | 
| +  EphemeralRange marker_range = PlainTextRange(0, 5).CreateRange(*div);
 | 
| +  GetDocument().Markers().AddMarker(marker_range.StartPosition(),
 | 
| +                                    marker_range.EndPosition(),
 | 
| +                                    DocumentMarker::kTextMatch);
 | 
| +
 | 
| +  marker_range = PlainTextRange(5, 10).CreateRange(*div);
 | 
| +  GetDocument().Markers().AddMarker(marker_range.StartPosition(),
 | 
| +                                    marker_range.EndPosition(),
 | 
| +                                    DocumentMarker::kTextMatch);
 | 
| +
 | 
| +  marker_range = PlainTextRange(10, 15).CreateRange(*div);
 | 
| +  GetDocument().Markers().AddMarker(marker_range.StartPosition(),
 | 
| +                                    marker_range.EndPosition(),
 | 
| +                                    DocumentMarker::kTextMatch);
 | 
| +
 | 
| +  EXPECT_EQ(3u, GetDocument().Markers().Markers().size());
 | 
| +
 | 
| +  // insert in middle of second marker
 | 
| +  Vector<CompositionUnderline> empty_underlines;
 | 
| +  Controller().SetComposition("", empty_underlines, 7, 7);
 | 
| +  Controller().CommitText(String("66666"), empty_underlines, -7);
 | 
| +
 | 
| +  EXPECT_EQ(3u, GetDocument().Markers().Markers().size());
 | 
| +
 | 
| +  EXPECT_EQ(0u, GetDocument().Markers().Markers()[0]->StartOffset());
 | 
| +  EXPECT_EQ(5u, GetDocument().Markers().Markers()[0]->EndOffset());
 | 
| +
 | 
| +  EXPECT_EQ(5u, GetDocument().Markers().Markers()[1]->StartOffset());
 | 
| +  EXPECT_EQ(15u, GetDocument().Markers().Markers()[1]->EndOffset());
 | 
| +
 | 
| +  EXPECT_EQ(15u, GetDocument().Markers().Markers()[2]->StartOffset());
 | 
| +  EXPECT_EQ(20u, GetDocument().Markers().Markers()[2]->EndOffset());
 | 
| +}
 | 
| +
 | 
| +TEST_F(InputMethodControllerTest, Marker_InsertBetweenMarkers) {
 | 
| +  Element* div = InsertHTMLElement(
 | 
| +      "<div id='sample' contenteditable>1111122222333334444455555</div>",
 | 
| +      "sample");
 | 
| +
 | 
| +  EphemeralRange marker_range = PlainTextRange(0, 5).CreateRange(*div);
 | 
| +  GetDocument().Markers().AddMarker(marker_range.StartPosition(),
 | 
| +                                    marker_range.EndPosition(),
 | 
| +                                    DocumentMarker::kTextMatch);
 | 
| +
 | 
| +  marker_range = PlainTextRange(5, 15).CreateRange(*div);
 | 
| +  GetDocument().Markers().AddMarker(marker_range.StartPosition(),
 | 
| +                                    marker_range.EndPosition(),
 | 
| +                                    DocumentMarker::kTextMatch);
 | 
| +
 | 
| +  marker_range = PlainTextRange(15, 20).CreateRange(*div);
 | 
| +  GetDocument().Markers().AddMarker(marker_range.StartPosition(),
 | 
| +                                    marker_range.EndPosition(),
 | 
| +                                    DocumentMarker::kTextMatch);
 | 
| +
 | 
| +  EXPECT_EQ(3u, GetDocument().Markers().Markers().size());
 | 
| +
 | 
| +  Vector<CompositionUnderline> empty_underlines;
 | 
| +  Controller().SetComposition("", empty_underlines, 5, 5);
 | 
| +  Controller().CommitText(String("77777"), empty_underlines, 0);
 | 
| +
 | 
| +  EXPECT_EQ(3u, GetDocument().Markers().Markers().size());
 | 
| +
 | 
| +  EXPECT_EQ(0u, GetDocument().Markers().Markers()[0]->StartOffset());
 | 
| +  EXPECT_EQ(5u, GetDocument().Markers().Markers()[0]->EndOffset());
 | 
| +
 | 
| +  EXPECT_EQ(10u, GetDocument().Markers().Markers()[1]->StartOffset());
 | 
| +  EXPECT_EQ(20u, GetDocument().Markers().Markers()[1]->EndOffset());
 | 
| +
 | 
| +  EXPECT_EQ(20u, GetDocument().Markers().Markers()[2]->StartOffset());
 | 
| +  EXPECT_EQ(25u, GetDocument().Markers().Markers()[2]->EndOffset());
 | 
| +}
 | 
| +
 | 
|  }  // namespace blink
 | 
| 
 |