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

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

Issue 2692093003: Rewrite DocumentMarkerController to use SynchronousMutationObserver (Closed)
Patch Set: Respond to comments, add TODO for offset bug 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 "core/dom/Document.h" 7 #include "core/dom/Document.h"
8 #include "core/dom/Element.h" 8 #include "core/dom/Element.h"
9 #include "core/dom/Range.h" 9 #include "core/dom/Range.h"
10 #include "core/editing/Editor.h" 10 #include "core/editing/Editor.h"
(...skipping 1272 matching lines...) Expand 10 before | Expand all | Expand 10 after
1283 1283
1284 // Make sure that caret is still at the end of the inserted text. 1284 // Make sure that caret is still at the end of the inserted text.
1285 EXPECT_FALSE(controller().hasComposition()); 1285 EXPECT_FALSE(controller().hasComposition());
1286 EXPECT_EQ(7, frame() 1286 EXPECT_EQ(7, frame()
1287 .selection() 1287 .selection()
1288 .computeVisibleSelectionInDOMTreeDeprecated() 1288 .computeVisibleSelectionInDOMTreeDeprecated()
1289 .start() 1289 .start()
1290 .computeOffsetInContainerNode()); 1290 .computeOffsetInContainerNode());
1291 } 1291 }
1292 1292
1293 static String getMarkedText(DocumentMarkerController& documentMarkerController,
yosin_UTC9 2017/02/28 01:29:37 Could you move IMCTest changes into separate CL to
1294 Node* node,
1295 int markerIndex) {
1296 DocumentMarker* marker = documentMarkerController.markers()[markerIndex];
1297 return node->textContent().substring(
1298 marker->startOffset(), marker->endOffset() - marker->startOffset());
1299 }
1300
1301 // TODO(crbug.com/696652): setCompositionFromExistingText() is counting the
yosin_UTC9 2017/02/28 01:29:37 I would like to discuss this issue in crbug.com/69
1302 // offsets funny in the next few tests because the string starts with a space.
1303 // The 5, 9 offsets will need to be changed to 6, 10 once this is fixed
1304
1305 TEST_F(InputMethodControllerTest, WhitespaceFixupAroundMarker) {
1306 Element* div = insertHTMLElement(
1307 "<div id='sample' contenteditable>Initial text blah</div>", "sample");
1308
1309 // Add marker under "text" (use TextMatch since Composition markers don't
1310 // persist across editing operations)
1311 EphemeralRange markerRange = PlainTextRange(8, 12).createRange(*div);
1312 document().markers().addMarker(markerRange.startPosition(),
1313 markerRange.endPosition(),
1314 DocumentMarker::TextMatch);
1315 // Delete "Initial"
1316 Vector<CompositionUnderline> emptyUnderlines;
1317 controller().setCompositionFromExistingText(emptyUnderlines, 0, 7);
1318 controller().commitText(String(""), emptyUnderlines, 0);
1319
1320 // Delete "blah"
1321 controller().setCompositionFromExistingText(emptyUnderlines, 5, 9);
1322 controller().commitText(String(""), emptyUnderlines, 0);
1323
1324 ASSERT_STREQ(" text ", div->innerHTML().utf8().data());
1325
1326 // Check that the marker is still attached to "text" and doesn't include
1327 // either space around it
1328 EXPECT_EQ(1u, document().markers().markersFor(div->firstChild()).size());
1329 ASSERT_STREQ(
1330 "text",
1331 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1332 }
1333
1334 TEST_F(InputMethodControllerTest, WhitespaceFixupAroundMarker2) {
1335 Element* div = insertHTMLElement(
1336 "<div id='sample' contenteditable>Initial text blah</div>", "sample");
1337
1338 // Add marker under " text" (use TextMatch since Composition markers don't
1339 // persist across editing operations)
1340 EphemeralRange markerRange = PlainTextRange(7, 12).createRange(*div);
1341 document().markers().addMarker(markerRange.startPosition(),
1342 markerRange.endPosition(),
1343 DocumentMarker::TextMatch);
1344 // Delete "Initial"
1345 Vector<CompositionUnderline> emptyUnderlines;
1346 controller().setCompositionFromExistingText(emptyUnderlines, 0, 7);
1347 controller().commitText(String(""), emptyUnderlines, 0);
1348
1349 // Delete "blah"
1350 controller().setCompositionFromExistingText(emptyUnderlines, 5, 9);
1351 controller().commitText(String(""), emptyUnderlines, 0);
1352
1353 ASSERT_STREQ(" text ", div->innerHTML().utf8().data());
1354
1355 // before "text" but not the space after
1356 EXPECT_EQ(1u, document().markers().markers().size());
1357 ASSERT_STREQ(
1358 " text",
1359 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1360 }
1361
1362 TEST_F(InputMethodControllerTest, WhitespaceFixupAroundMarker3) {
1363 Element* div = insertHTMLElement(
1364 "<div id='sample' contenteditable>Initial text blah</div>", "sample");
1365
1366 // Add marker under "text " (use TextMatch since Composition markers don't
1367 // persist across editing operations)
1368 EphemeralRange markerRange = PlainTextRange(8, 13).createRange(*div);
1369 document().markers().addMarker(markerRange.startPosition(),
1370 markerRange.endPosition(),
1371 DocumentMarker::TextMatch);
1372 // Delete "Initial"
1373 Vector<CompositionUnderline> emptyUnderlines;
1374 controller().setCompositionFromExistingText(emptyUnderlines, 0, 7);
1375 controller().commitText(String(""), emptyUnderlines, 0);
1376
1377 // Delete "blah"
1378 controller().setCompositionFromExistingText(emptyUnderlines, 5, 9);
1379 controller().commitText(String(""), emptyUnderlines, 0);
1380
1381 ASSERT_STREQ(" text ", div->innerHTML().utf8().data());
1382
1383 // Check that the marker is still attached to "text " and includes the space
1384 // after "text" but not the space before
1385 EXPECT_EQ(1u, document().markers().markers().size());
1386 ASSERT_STREQ(
1387 "text ",
1388 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1389 }
1390
1391 TEST_F(InputMethodControllerTest, WhitespaceFixupAroundMarker4) {
1392 Element* div = insertHTMLElement(
1393 "<div id='sample' contenteditable>Initial text blah</div>", "sample");
1394
1395 // Add marker under " text " (use TextMatch since Composition markers don't
1396 // persist across editing operations)
1397 EphemeralRange markerRange = PlainTextRange(7, 13).createRange(*div);
1398 document().markers().addMarker(markerRange.startPosition(),
1399 markerRange.endPosition(),
1400 DocumentMarker::TextMatch);
1401
1402 // Delete "Initial"
1403 Vector<CompositionUnderline> emptyUnderlines;
1404 controller().setCompositionFromExistingText(emptyUnderlines, 0, 7);
1405 controller().commitText(String(""), emptyUnderlines, 0);
1406
1407 // Delete "blah"
1408 controller().setCompositionFromExistingText(emptyUnderlines, 5, 9);
1409 controller().commitText(String(""), emptyUnderlines, 0);
1410
1411 ASSERT_STREQ(" text ", div->innerHTML().utf8().data());
1412
1413 // Check that the marker is still attached to " text " and includes both the
1414 // space before "text" and the space after
1415 EXPECT_EQ(1u, document().markers().markers().size());
1416 ASSERT_STREQ(
1417 " text ",
1418 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1419 }
1420
1421 TEST_F(InputMethodControllerTest, ReplaceStartOfMarker) {
1422 Element* div = insertHTMLElement(
1423 "<div id='sample' contenteditable>Initial text</div>", "sample");
1424
1425 // Add marker under "Initial text"
1426 EphemeralRange markerRange = PlainTextRange(0, 12).createRange(*div);
1427 document().markers().addMarker(markerRange.startPosition(),
1428 markerRange.endPosition(),
1429 DocumentMarker::TextMatch);
1430
1431 // Replace "Initial" with "Original"
1432 Vector<CompositionUnderline> emptyUnderlines;
1433 controller().setCompositionFromExistingText(emptyUnderlines, 0, 7);
1434 controller().commitText(String("Original"), emptyUnderlines, 0);
1435
1436 ASSERT_STREQ("Original text", div->innerHTML().utf8().data());
1437
1438 // Verify marker is under "Original text"
1439 EXPECT_EQ(1u, document().markers().markers().size());
1440 ASSERT_STREQ(
1441 "Original text",
1442 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1443 }
1444
1445 TEST_F(InputMethodControllerTest, ReplaceBeforeAndAfterStartOfMarker) {
1446 Element* div = insertHTMLElement(
1447 "<div id='sample' contenteditable>This is some initial text</div>",
1448 "sample");
1449
1450 // Add marker under "initial text"
1451 EphemeralRange markerRange = PlainTextRange(13, 25).createRange(*div);
1452 document().markers().addMarker(markerRange.startPosition(),
1453 markerRange.endPosition(),
1454 DocumentMarker::TextMatch);
1455
1456 // Replace "some initial" with "boring"
1457 Vector<CompositionUnderline> emptyUnderlines;
1458 controller().setCompositionFromExistingText(emptyUnderlines, 8, 20);
1459 controller().commitText(String("boring"), emptyUnderlines, 0);
1460
1461 ASSERT_STREQ("This is boring text", div->innerHTML().utf8().data());
1462
1463 // Verify marker is under " text"
1464 EXPECT_EQ(1u, document().markers().markers().size());
1465 ASSERT_STREQ(
1466 " text",
1467 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1468 }
1469
1470 TEST_F(InputMethodControllerTest, ReplaceEndOfMarker) {
1471 Element* div = insertHTMLElement(
1472 "<div id='sample' contenteditable>Initial text</div>", "sample");
1473
1474 // Add marker under "Initial text"
1475 EphemeralRange markerRange = PlainTextRange(0, 12).createRange(*div);
1476 document().markers().addMarker(markerRange.startPosition(),
1477 markerRange.endPosition(),
1478 DocumentMarker::TextMatch);
1479
1480 // Replace "text" with "string"
1481 Vector<CompositionUnderline> emptyUnderlines;
1482 controller().setCompositionFromExistingText(emptyUnderlines, 8, 12);
1483 controller().commitText(String("string"), emptyUnderlines, 0);
1484
1485 ASSERT_STREQ("Initial string", div->innerHTML().utf8().data());
1486
1487 // Verify marker is under "Initial string"
1488 EXPECT_EQ(1u, document().markers().markers().size());
1489 ASSERT_STREQ(
1490 "Initial string",
1491 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1492 }
1493
1494 TEST_F(InputMethodControllerTest, ReplaceBeforeAndAfterEndOfMarker) {
1495 Element* div = insertHTMLElement(
1496 "<div id='sample' contenteditable>This is some initial text</div>",
1497 "sample");
1498
1499 // Add marker under "some initial"
1500 EphemeralRange markerRange = PlainTextRange(8, 20).createRange(*div);
1501 document().markers().addMarker(markerRange.startPosition(),
1502 markerRange.endPosition(),
1503 DocumentMarker::TextMatch);
1504
1505 // Replace "initial text" with "content"
1506 Vector<CompositionUnderline> emptyUnderlines;
1507 controller().setCompositionFromExistingText(emptyUnderlines, 13, 25);
1508 controller().commitText(String("content"), emptyUnderlines, 0);
1509
1510 ASSERT_STREQ("This is some content", div->innerHTML().utf8().data());
1511
1512 // Verify marker is under "some "
1513 EXPECT_EQ(1u, document().markers().markers().size());
1514 ASSERT_STREQ(
1515 "some ",
1516 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1517 }
1518
1519 TEST_F(InputMethodControllerTest, ReplaceEntireMarker) {
1520 Element* div = insertHTMLElement(
1521 "<div id='sample' contenteditable>Initial text</div>", "sample");
1522
1523 // Add marker under "text"
1524 EphemeralRange markerRange = PlainTextRange(8, 12).createRange(*div);
1525 document().markers().addMarker(markerRange.startPosition(),
1526 markerRange.endPosition(),
1527 DocumentMarker::TextMatch);
1528
1529 // Replace "text" with "string"
1530 Vector<CompositionUnderline> emptyUnderlines;
1531 controller().setCompositionFromExistingText(emptyUnderlines, 8, 12);
1532 controller().commitText(String("string"), emptyUnderlines, 0);
1533
1534 ASSERT_STREQ("Initial string", div->innerHTML().utf8().data());
1535
1536 // Verify marker is under "string"
1537 EXPECT_EQ(1u, document().markers().markers().size());
1538 ASSERT_STREQ(
1539 "string",
1540 getMarkedText(document().markers(), div->firstChild(), 0).utf8().data());
1541 }
1542
1543 TEST_F(InputMethodControllerTest, ReplaceTextWithMarkerAtBeginning) {
1544 Element* div = insertHTMLElement(
1545 "<div id='sample' contenteditable>Initial text</div>", "sample");
1546
1547 // Add marker under "Initial"
1548 EphemeralRange markerRange = PlainTextRange(0, 7).createRange(*div);
1549 document().markers().addMarker(markerRange.startPosition(),
1550 markerRange.endPosition(),
1551 DocumentMarker::TextMatch);
1552
1553 EXPECT_EQ(1u, document().markers().markers().size());
1554
1555 // Replace "Initial text" with "New string"
1556 Vector<CompositionUnderline> emptyUnderlines;
1557 controller().setCompositionFromExistingText(emptyUnderlines, 0, 12);
1558 controller().commitText(String("New string"), emptyUnderlines, 0);
1559
1560 ASSERT_STREQ("New string", div->innerHTML().utf8().data());
1561
1562 // Verify marker was removed
1563 EXPECT_EQ(0u, document().markers().markers().size());
1564 }
1565
1566 TEST_F(InputMethodControllerTest, ReplaceTextWithMarkerAtEnd) {
1567 Element* div = insertHTMLElement(
1568 "<div id='sample' contenteditable>Initial text</div>", "sample");
1569
1570 // Add marker under "text"
1571 EphemeralRange markerRange = PlainTextRange(8, 12).createRange(*div);
1572 document().markers().addMarker(markerRange.startPosition(),
1573 markerRange.endPosition(),
1574 DocumentMarker::TextMatch);
1575
1576 EXPECT_EQ(1u, document().markers().markers().size());
1577
1578 // Replace "Initial text" with "New string"
1579 Vector<CompositionUnderline> emptyUnderlines;
1580 controller().setCompositionFromExistingText(emptyUnderlines, 0, 12);
1581 controller().commitText(String("New string"), emptyUnderlines, 0);
1582
1583 ASSERT_STREQ("New string", div->innerHTML().utf8().data());
1584
1585 // Verify marker was removed
1586 EXPECT_EQ(0u, document().markers().markers().size());
1587 }
1588
1293 } // namespace blink 1589 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698