Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(221)

Side by Side Diff: third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp

Issue 2692093003: Rewrite DocumentMarkerController to use SynchronousMutationObserver (Closed)
Patch Set: Fx tests to match current behavior of master Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/editing/InputMethodController.h" 5 #include "core/editing/InputMethodController.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include "core/dom/Document.h" 8 #include "core/dom/Document.h"
9 #include "core/dom/Element.h" 9 #include "core/dom/Element.h"
10 #include "core/dom/Range.h" 10 #include "core/dom/Range.h"
(...skipping 1467 matching lines...) Expand 10 before | Expand all | Expand 10 after
1478 Vector<CompositionUnderline> emptyUnderlines; 1478 Vector<CompositionUnderline> emptyUnderlines;
1479 controller().setCompositionFromExistingText(emptyUnderlines, 0, 7); 1479 controller().setCompositionFromExistingText(emptyUnderlines, 0, 7);
1480 controller().commitText(String(""), emptyUnderlines, 0); 1480 controller().commitText(String(""), emptyUnderlines, 0);
1481 1481
1482 // Delete "blah" 1482 // Delete "blah"
1483 controller().setCompositionFromExistingText(emptyUnderlines, 6, 10); 1483 controller().setCompositionFromExistingText(emptyUnderlines, 6, 10);
1484 controller().commitText(String(""), emptyUnderlines, 0); 1484 controller().commitText(String(""), emptyUnderlines, 0);
1485 1485
1486 ASSERT_STREQ("&nbsp;text&nbsp;", div->innerHTML().utf8().data()); 1486 ASSERT_STREQ("&nbsp;text&nbsp;", div->innerHTML().utf8().data());
1487 1487
1488 // Check that the marker was split when the space at the beginning was 1488 // Check that the marker is still attached to " text" and includes the space
1489 // converted to an nbsp 1489 // before "text" but not the space after
1490 EXPECT_EQ(2u, document().markers().markers().size()); 1490 EXPECT_EQ(1u, document().markers().markers().size());
1491 ASSERT_STREQ( 1491 ASSERT_STREQ(
1492 "\xC2\xA0", // UTF-8 for an nbsp 1492 "\xC2\xA0text",
1493 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data()); 1493 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1494 ASSERT_STREQ(
1495 "text",
1496 getMarkedText(document().markers(), div->firstChild(), 1).utf8().data());
1497 } 1494 }
1498 1495
1499 TEST_F(InputMethodControllerTest, WhitespaceFixupAroundMarker3) { 1496 TEST_F(InputMethodControllerTest, WhitespaceFixupAroundMarker3) {
1500 Element* div = insertHTMLElement( 1497 Element* div = insertHTMLElement(
1501 "<div id='sample' contenteditable>Initial text blah</div>", "sample"); 1498 "<div id='sample' contenteditable>Initial text blah</div>", "sample");
1502 1499
1503 // Add marker under "text " (use TextMatch since Composition markers don't 1500 // Add marker under "text " (use TextMatch since Composition markers don't
1504 // persist across editing operations) 1501 // persist across editing operations)
1505 EphemeralRange markerRange = PlainTextRange(8, 13).createRange(*div); 1502 EphemeralRange markerRange = PlainTextRange(8, 13).createRange(*div);
1506 document().markers().addMarker(markerRange.startPosition(), 1503 document().markers().addMarker(markerRange.startPosition(),
1507 markerRange.endPosition(), 1504 markerRange.endPosition(),
1508 DocumentMarker::TextMatch); 1505 DocumentMarker::TextMatch);
1509 // Delete "Initial" 1506 // Delete "Initial"
1510 Vector<CompositionUnderline> emptyUnderlines; 1507 Vector<CompositionUnderline> emptyUnderlines;
1511 controller().setCompositionFromExistingText(emptyUnderlines, 0, 7); 1508 controller().setCompositionFromExistingText(emptyUnderlines, 0, 7);
1512 controller().commitText(String(""), emptyUnderlines, 0); 1509 controller().commitText(String(""), emptyUnderlines, 0);
1513 1510
1514 // Delete "blah" 1511 // Delete "blah"
1515 controller().setCompositionFromExistingText(emptyUnderlines, 6, 10); 1512 controller().setCompositionFromExistingText(emptyUnderlines, 6, 10);
1516 controller().commitText(String(""), emptyUnderlines, 0); 1513 controller().commitText(String(""), emptyUnderlines, 0);
1517 1514
1518 ASSERT_STREQ("&nbsp;text&nbsp;", div->innerHTML().utf8().data()); 1515 ASSERT_STREQ("&nbsp;text&nbsp;", div->innerHTML().utf8().data());
1519 1516
1520 // Check that the marker was split when the space at the end was 1517 // Check that the marker is still attached to "text " and includes the space
1521 // converted to an nbsp 1518 // after "text" but not the space before
1522 EXPECT_EQ(2u, document().markers().markers().size()); 1519 EXPECT_EQ(1u, document().markers().markers().size());
1523 ASSERT_STREQ( 1520 ASSERT_STREQ(
1524 "text", 1521 "text\xC2\xA0",
1525 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data()); 1522 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1526 ASSERT_STREQ(
1527 "\xC2\xA0", // UTF-8 for an nbsp
1528 getMarkedText(document().markers(), div->firstChild(), 1).utf8().data());
1529 } 1523 }
1530 1524
1531 TEST_F(InputMethodControllerTest, WhitespaceFixupAroundMarker4) { 1525 TEST_F(InputMethodControllerTest, WhitespaceFixupAroundMarker4) {
1532 Element* div = insertHTMLElement( 1526 Element* div = insertHTMLElement(
1533 "<div id='sample' contenteditable>Initial text blah</div>", "sample"); 1527 "<div id='sample' contenteditable>Initial text blah</div>", "sample");
1534 1528
1535 // Add marker under " text " (use TextMatch since Composition markers don't 1529 // Add marker under " text " (use TextMatch since Composition markers don't
1536 // persist across editing operations) 1530 // persist across editing operations)
1537 EphemeralRange markerRange = PlainTextRange(7, 13).createRange(*div); 1531 EphemeralRange markerRange = PlainTextRange(7, 13).createRange(*div);
1538 document().markers().addMarker(markerRange.startPosition(), 1532 document().markers().addMarker(markerRange.startPosition(),
1539 markerRange.endPosition(), 1533 markerRange.endPosition(),
1540 DocumentMarker::TextMatch); 1534 DocumentMarker::TextMatch);
1541 1535
1542 // Delete "Initial" 1536 // Delete "Initial"
1543 Vector<CompositionUnderline> emptyUnderlines; 1537 Vector<CompositionUnderline> emptyUnderlines;
1544 controller().setCompositionFromExistingText(emptyUnderlines, 0, 7); 1538 controller().setCompositionFromExistingText(emptyUnderlines, 0, 7);
1545 controller().commitText(String(""), emptyUnderlines, 0); 1539 controller().commitText(String(""), emptyUnderlines, 0);
1546 1540
1547 // Delete "blah" 1541 // Delete "blah"
1548 controller().setCompositionFromExistingText(emptyUnderlines, 6, 10); 1542 controller().setCompositionFromExistingText(emptyUnderlines, 6, 10);
1549 controller().commitText(String(""), emptyUnderlines, 0); 1543 controller().commitText(String(""), emptyUnderlines, 0);
1550 1544
1551 ASSERT_STREQ("&nbsp;text&nbsp;", div->innerHTML().utf8().data()); 1545 ASSERT_STREQ("&nbsp;text&nbsp;", div->innerHTML().utf8().data());
1552 1546
1553 // Check that the marker was split into three pieces when the two spaces were 1547 // Check that the marker is still attached to " text " and includes both the
1554 // converted to nbsps 1548 // space before "text" and the space after
1555 EXPECT_EQ(3u, document().markers().markers().size()); 1549 EXPECT_EQ(1u, document().markers().markers().size());
1556 ASSERT_STREQ( 1550 ASSERT_STREQ(
1557 "\xC2\xA0", // UTF-8 for an nbsp 1551 "\xC2\xA0text\xC2\xA0",
1558 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data()); 1552 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1559 ASSERT_STREQ(
1560 "text",
1561 getMarkedText(document().markers(), div->firstChild(), 1).utf8().data());
1562 ASSERT_STREQ(
1563 "\xC2\xA0", // UTF-8 for an nbsp
1564 getMarkedText(document().markers(), div->firstChild(), 2).utf8().data());
1565 } 1553 }
1566 1554
1567 TEST_F(InputMethodControllerTest, ReplaceStartOfMarker) { 1555 TEST_F(InputMethodControllerTest, ReplaceStartOfMarker) {
1568 Element* div = insertHTMLElement( 1556 Element* div = insertHTMLElement(
1569 "<div id='sample' contenteditable>Initial text</div>", "sample"); 1557 "<div id='sample' contenteditable>Initial text</div>", "sample");
1570 1558
1571 // Add marker under "Initial text" 1559 // Add marker under "Initial text"
1572 EphemeralRange markerRange = PlainTextRange(0, 12).createRange(*div); 1560 EphemeralRange markerRange = PlainTextRange(0, 12).createRange(*div);
1573 document().markers().addMarker(markerRange.startPosition(), 1561 document().markers().addMarker(markerRange.startPosition(),
1574 markerRange.endPosition(), 1562 markerRange.endPosition(),
1575 DocumentMarker::TextMatch); 1563 DocumentMarker::TextMatch);
1576 1564
1577 // Replace "Initial" with "Original" 1565 // Replace "Initial" with "Original"
1578 Vector<CompositionUnderline> emptyUnderlines; 1566 Vector<CompositionUnderline> emptyUnderlines;
1579 controller().setCompositionFromExistingText(emptyUnderlines, 0, 7); 1567 controller().setCompositionFromExistingText(emptyUnderlines, 0, 7);
1580 controller().commitText(String("Original"), emptyUnderlines, 0); 1568 controller().commitText(String("Original"), emptyUnderlines, 0);
1581 1569
1582 ASSERT_STREQ("Original text", div->innerHTML().utf8().data()); 1570 ASSERT_STREQ("Original text", div->innerHTML().utf8().data());
1583 1571
1584 // Verify marker is under "al text" 1572 // Verify marker is under "Original text"
1585 // ("Initial" and "Original" have "al" as a common suffix)
1586 EXPECT_EQ(1u, document().markers().markers().size()); 1573 EXPECT_EQ(1u, document().markers().markers().size());
1587 ASSERT_STREQ( 1574 ASSERT_STREQ(
1588 "al text", 1575 "Original text",
1589 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data()); 1576 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1590 } 1577 }
1591 1578
1592 TEST_F(InputMethodControllerTest, ReplaceBeforeAndAfterStartOfMarker) { 1579 TEST_F(InputMethodControllerTest, ReplaceBeforeAndAfterStartOfMarker) {
1593 Element* div = insertHTMLElement( 1580 Element* div = insertHTMLElement(
1594 "<div id='sample' contenteditable>This is some initial text</div>", 1581 "<div id='sample' contenteditable>This is some initial text</div>",
1595 "sample"); 1582 "sample");
1596 1583
1597 // Add marker under "initial text" 1584 // Add marker under "initial text"
1598 EphemeralRange markerRange = PlainTextRange(13, 25).createRange(*div); 1585 EphemeralRange markerRange = PlainTextRange(13, 25).createRange(*div);
(...skipping 25 matching lines...) Expand all
1624 markerRange.endPosition(), 1611 markerRange.endPosition(),
1625 DocumentMarker::TextMatch); 1612 DocumentMarker::TextMatch);
1626 1613
1627 // Replace "text" with "string" 1614 // Replace "text" with "string"
1628 Vector<CompositionUnderline> emptyUnderlines; 1615 Vector<CompositionUnderline> emptyUnderlines;
1629 controller().setCompositionFromExistingText(emptyUnderlines, 8, 12); 1616 controller().setCompositionFromExistingText(emptyUnderlines, 8, 12);
1630 controller().commitText(String("string"), emptyUnderlines, 0); 1617 controller().commitText(String("string"), emptyUnderlines, 0);
1631 1618
1632 ASSERT_STREQ("Initial string", div->innerHTML().utf8().data()); 1619 ASSERT_STREQ("Initial string", div->innerHTML().utf8().data());
1633 1620
1634 // Verify marker is under "Initial " 1621 // Verify marker is under "Initial string"
1635 EXPECT_EQ(1u, document().markers().markers().size()); 1622 EXPECT_EQ(1u, document().markers().markers().size());
1636 ASSERT_STREQ( 1623 ASSERT_STREQ(
1637 "Initial ", 1624 "Initial string",
1638 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data()); 1625 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1639 } 1626 }
1640 1627
1641 TEST_F(InputMethodControllerTest, ReplaceBeforeAndAfterEndOfMarker) { 1628 TEST_F(InputMethodControllerTest, ReplaceBeforeAndAfterEndOfMarker) {
1642 Element* div = insertHTMLElement( 1629 Element* div = insertHTMLElement(
1643 "<div id='sample' contenteditable>This is some initial text</div>", 1630 "<div id='sample' contenteditable>This is some initial text</div>",
1644 "sample"); 1631 "sample");
1645 1632
1646 // Add marker under "some initial" 1633 // Add marker under "some initial"
1647 EphemeralRange markerRange = PlainTextRange(8, 20).createRange(*div); 1634 EphemeralRange markerRange = PlainTextRange(8, 20).createRange(*div);
(...skipping 25 matching lines...) Expand all
1673 markerRange.endPosition(), 1660 markerRange.endPosition(),
1674 DocumentMarker::TextMatch); 1661 DocumentMarker::TextMatch);
1675 1662
1676 // Replace "text" with "string" 1663 // Replace "text" with "string"
1677 Vector<CompositionUnderline> emptyUnderlines; 1664 Vector<CompositionUnderline> emptyUnderlines;
1678 controller().setCompositionFromExistingText(emptyUnderlines, 8, 12); 1665 controller().setCompositionFromExistingText(emptyUnderlines, 8, 12);
1679 controller().commitText(String("string"), emptyUnderlines, 0); 1666 controller().commitText(String("string"), emptyUnderlines, 0);
1680 1667
1681 ASSERT_STREQ("Initial string", div->innerHTML().utf8().data()); 1668 ASSERT_STREQ("Initial string", div->innerHTML().utf8().data());
1682 1669
1683 // Verify marker was removed 1670 // Verify marker is under "string"
1684 EXPECT_EQ(0u, document().markers().markers().size()); 1671 EXPECT_EQ(1u, document().markers().markers().size());
1672 ASSERT_STREQ(
1673 "string",
1674 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1685 } 1675 }
1686 1676
1687 TEST_F(InputMethodControllerTest, ReplaceTextWithMarkerAtBeginning) { 1677 TEST_F(InputMethodControllerTest, ReplaceTextWithMarkerAtBeginning) {
1688 Element* div = insertHTMLElement( 1678 Element* div = insertHTMLElement(
1689 "<div id='sample' contenteditable>Initial text</div>", "sample"); 1679 "<div id='sample' contenteditable>Initial text</div>", "sample");
1690 1680
1691 // Add marker under "Initial" 1681 // Add marker under "Initial"
1692 EphemeralRange markerRange = PlainTextRange(0, 7).createRange(*div); 1682 EphemeralRange markerRange = PlainTextRange(0, 7).createRange(*div);
1693 document().markers().addMarker(markerRange.startPosition(), 1683 document().markers().addMarker(markerRange.startPosition(),
1694 markerRange.endPosition(), 1684 markerRange.endPosition(),
(...skipping 29 matching lines...) Expand all
1724 controller().setCompositionFromExistingText(emptyUnderlines, 0, 12); 1714 controller().setCompositionFromExistingText(emptyUnderlines, 0, 12);
1725 controller().commitText(String("New string"), emptyUnderlines, 0); 1715 controller().commitText(String("New string"), emptyUnderlines, 0);
1726 1716
1727 ASSERT_STREQ("New string", div->innerHTML().utf8().data()); 1717 ASSERT_STREQ("New string", div->innerHTML().utf8().data());
1728 1718
1729 // Verify marker was removed 1719 // Verify marker was removed
1730 EXPECT_EQ(0u, document().markers().markers().size()); 1720 EXPECT_EQ(0u, document().markers().markers().size());
1731 } 1721 }
1732 1722
1733 } // namespace blink 1723 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698