OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/VisibleUnits.h" | 5 #include "core/editing/VisibleUnits.h" |
6 | 6 |
7 #include <ostream> // NOLINT | 7 #include <ostream> // NOLINT |
8 #include "bindings/core/v8/V8BindingForTesting.h" | 8 #include "bindings/core/v8/V8BindingForTesting.h" |
9 #include "core/dom/Text.h" | 9 #include "core/dom/Text.h" |
10 #include "core/editing/EditingTestBase.h" | 10 #include "core/editing/EditingTestBase.h" |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 actual.inline_box); | 293 actual.inline_box); |
294 } | 294 } |
295 | 295 |
296 // http://crbug.com/716093 | 296 // http://crbug.com/716093 |
297 TEST_F(VisibleUnitsTest, ComputeInlineBoxPositionMixedEditable) { | 297 TEST_F(VisibleUnitsTest, ComputeInlineBoxPositionMixedEditable) { |
298 SetBodyContent( | 298 SetBodyContent( |
299 "<div contenteditable id=sample>abc<input contenteditable=false></div>"); | 299 "<div contenteditable id=sample>abc<input contenteditable=false></div>"); |
300 Element* const sample = GetDocument().getElementById("sample"); | 300 Element* const sample = GetDocument().getElementById("sample"); |
301 | 301 |
302 const InlineBoxPosition& actual = ComputeInlineBoxPosition( | 302 const InlineBoxPosition& actual = ComputeInlineBoxPosition( |
303 Position::LastPositionInNode(sample), TextAffinity::kDownstream); | 303 Position::LastPositionInNode(*sample), TextAffinity::kDownstream); |
304 // Should not be in infinite-loop | 304 // Should not be in infinite-loop |
305 EXPECT_EQ(nullptr, actual.inline_box); | 305 EXPECT_EQ(nullptr, actual.inline_box); |
306 EXPECT_EQ(0, actual.offset_in_box); | 306 EXPECT_EQ(0, actual.offset_in_box); |
307 } | 307 } |
308 | 308 |
309 TEST_F(VisibleUnitsTest, endOfDocument) { | 309 TEST_F(VisibleUnitsTest, endOfDocument) { |
310 const char* body_content = "<a id=host><b id=one>1</b><b id=two>22</b></a>"; | 310 const char* body_content = "<a id=host><b id=one>1</b><b id=two>22</b></a>"; |
311 const char* shadow_content = | 311 const char* shadow_content = |
312 "<p><content select=#two></content></p><p><content " | 312 "<p><content select=#two></content></p><p><content " |
313 "select=#one></content></p>"; | 313 "select=#one></content></p>"; |
(...skipping 919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1233 TEST_F(VisibleUnitsTest, mostBackwardCaretPositionAfterAnchor) { | 1233 TEST_F(VisibleUnitsTest, mostBackwardCaretPositionAfterAnchor) { |
1234 const char* body_content = | 1234 const char* body_content = |
1235 "<p id='host'><b id='one'>1</b></p><b id='two'>22</b>"; | 1235 "<p id='host'><b id='one'>1</b></p><b id='two'>22</b>"; |
1236 const char* shadow_content = | 1236 const char* shadow_content = |
1237 "<b id='two'>22</b><content select=#one></content><b id='three'>333</b>"; | 1237 "<b id='two'>22</b><content select=#one></content><b id='three'>333</b>"; |
1238 SetBodyContent(body_content); | 1238 SetBodyContent(body_content); |
1239 SetShadowContent(shadow_content, "host"); | 1239 SetShadowContent(shadow_content, "host"); |
1240 | 1240 |
1241 Element* host = GetDocument().getElementById("host"); | 1241 Element* host = GetDocument().getElementById("host"); |
1242 | 1242 |
1243 EXPECT_EQ(Position::LastPositionInNode(host), | 1243 EXPECT_EQ(Position::LastPositionInNode(*host), |
1244 MostForwardCaretPosition(Position::AfterNode(*host))); | 1244 MostForwardCaretPosition(Position::AfterNode(*host))); |
1245 EXPECT_EQ(PositionInFlatTree::LastPositionInNode(host), | 1245 EXPECT_EQ(PositionInFlatTree::LastPositionInNode(*host), |
1246 MostForwardCaretPosition(PositionInFlatTree::AfterNode(*host))); | 1246 MostForwardCaretPosition(PositionInFlatTree::AfterNode(*host))); |
1247 } | 1247 } |
1248 | 1248 |
1249 TEST_F(VisibleUnitsTest, mostBackwardCaretPositionFirstLetter) { | 1249 TEST_F(VisibleUnitsTest, mostBackwardCaretPositionFirstLetter) { |
1250 // Note: first-letter pseudo element contains letter and punctuations. | 1250 // Note: first-letter pseudo element contains letter and punctuations. |
1251 const char* body_content = | 1251 const char* body_content = |
1252 "<style>p:first-letter {color:red;}</style><p id=sample> (2)45 </p>"; | 1252 "<style>p:first-letter {color:red;}</style><p id=sample> (2)45 </p>"; |
1253 SetBodyContent(body_content); | 1253 SetBodyContent(body_content); |
1254 | 1254 |
1255 Node* sample = GetDocument().getElementById("sample")->firstChild(); | 1255 Node* sample = GetDocument().getElementById("sample")->firstChild(); |
1256 | 1256 |
1257 EXPECT_EQ(Position(sample->parentNode(), 0), | 1257 EXPECT_EQ(Position(sample->parentNode(), 0), |
1258 MostBackwardCaretPosition(Position(sample, 0))); | 1258 MostBackwardCaretPosition(Position(sample, 0))); |
1259 EXPECT_EQ(Position(sample->parentNode(), 0), | 1259 EXPECT_EQ(Position(sample->parentNode(), 0), |
1260 MostBackwardCaretPosition(Position(sample, 1))); | 1260 MostBackwardCaretPosition(Position(sample, 1))); |
1261 EXPECT_EQ(Position(sample, 2), | 1261 EXPECT_EQ(Position(sample, 2), |
1262 MostBackwardCaretPosition(Position(sample, 2))); | 1262 MostBackwardCaretPosition(Position(sample, 2))); |
1263 EXPECT_EQ(Position(sample, 3), | 1263 EXPECT_EQ(Position(sample, 3), |
1264 MostBackwardCaretPosition(Position(sample, 3))); | 1264 MostBackwardCaretPosition(Position(sample, 3))); |
1265 EXPECT_EQ(Position(sample, 4), | 1265 EXPECT_EQ(Position(sample, 4), |
1266 MostBackwardCaretPosition(Position(sample, 4))); | 1266 MostBackwardCaretPosition(Position(sample, 4))); |
1267 EXPECT_EQ(Position(sample, 5), | 1267 EXPECT_EQ(Position(sample, 5), |
1268 MostBackwardCaretPosition(Position(sample, 5))); | 1268 MostBackwardCaretPosition(Position(sample, 5))); |
1269 EXPECT_EQ(Position(sample, 6), | 1269 EXPECT_EQ(Position(sample, 6), |
1270 MostBackwardCaretPosition(Position(sample, 6))); | 1270 MostBackwardCaretPosition(Position(sample, 6))); |
1271 EXPECT_EQ(Position(sample, 6), | 1271 EXPECT_EQ(Position(sample, 6), |
1272 MostBackwardCaretPosition(Position(sample, 7))); | 1272 MostBackwardCaretPosition(Position(sample, 7))); |
1273 EXPECT_EQ(Position(sample, 6), | 1273 EXPECT_EQ(Position(sample, 6), |
1274 MostBackwardCaretPosition( | 1274 MostBackwardCaretPosition( |
1275 Position::LastPositionInNode(sample->parentNode()))); | 1275 Position::LastPositionInNode(*sample->parentNode()))); |
1276 EXPECT_EQ( | 1276 EXPECT_EQ( |
1277 Position(sample, 6), | 1277 Position(sample, 6), |
1278 MostBackwardCaretPosition(Position::AfterNode(*sample->parentNode()))); | 1278 MostBackwardCaretPosition(Position::AfterNode(*sample->parentNode()))); |
1279 EXPECT_EQ(Position::LastPositionInNode(GetDocument().body()), | 1279 EXPECT_EQ(Position::LastPositionInNode(*GetDocument().body()), |
1280 MostBackwardCaretPosition( | 1280 MostBackwardCaretPosition( |
1281 Position::LastPositionInNode(GetDocument().body()))); | 1281 Position::LastPositionInNode(*GetDocument().body()))); |
1282 } | 1282 } |
1283 | 1283 |
1284 TEST_F(VisibleUnitsTest, mostBackwardCaretPositionFirstLetterSplit) { | 1284 TEST_F(VisibleUnitsTest, mostBackwardCaretPositionFirstLetterSplit) { |
1285 V8TestingScope scope; | 1285 V8TestingScope scope; |
1286 | 1286 |
1287 const char* body_content = | 1287 const char* body_content = |
1288 "<style>p:first-letter {color:red;}</style><p id=sample>abc</p>"; | 1288 "<style>p:first-letter {color:red;}</style><p id=sample>abc</p>"; |
1289 SetBodyContent(body_content); | 1289 SetBodyContent(body_content); |
1290 | 1290 |
1291 Node* sample = GetDocument().getElementById("sample"); | 1291 Node* sample = GetDocument().getElementById("sample"); |
1292 Node* first_letter = sample->firstChild(); | 1292 Node* first_letter = sample->firstChild(); |
1293 // Split "abc" into "a" "bc" | 1293 // Split "abc" into "a" "bc" |
1294 Text* remaining = ToText(first_letter)->splitText(1, ASSERT_NO_EXCEPTION); | 1294 Text* remaining = ToText(first_letter)->splitText(1, ASSERT_NO_EXCEPTION); |
1295 UpdateAllLifecyclePhases(); | 1295 UpdateAllLifecyclePhases(); |
1296 | 1296 |
1297 EXPECT_EQ(Position(sample, 0), | 1297 EXPECT_EQ(Position(sample, 0), |
1298 MostBackwardCaretPosition(Position(first_letter, 0))); | 1298 MostBackwardCaretPosition(Position(first_letter, 0))); |
1299 EXPECT_EQ(Position(first_letter, 1), | 1299 EXPECT_EQ(Position(first_letter, 1), |
1300 MostBackwardCaretPosition(Position(first_letter, 1))); | 1300 MostBackwardCaretPosition(Position(first_letter, 1))); |
1301 EXPECT_EQ(Position(first_letter, 1), | 1301 EXPECT_EQ(Position(first_letter, 1), |
1302 MostBackwardCaretPosition(Position(remaining, 0))); | 1302 MostBackwardCaretPosition(Position(remaining, 0))); |
1303 EXPECT_EQ(Position(remaining, 1), | 1303 EXPECT_EQ(Position(remaining, 1), |
1304 MostBackwardCaretPosition(Position(remaining, 1))); | 1304 MostBackwardCaretPosition(Position(remaining, 1))); |
1305 EXPECT_EQ(Position(remaining, 2), | 1305 EXPECT_EQ(Position(remaining, 2), |
1306 MostBackwardCaretPosition(Position(remaining, 2))); | 1306 MostBackwardCaretPosition(Position(remaining, 2))); |
1307 EXPECT_EQ(Position(remaining, 2), | 1307 EXPECT_EQ(Position(remaining, 2), |
1308 MostBackwardCaretPosition(Position::LastPositionInNode(sample))); | 1308 MostBackwardCaretPosition(Position::LastPositionInNode(*sample))); |
1309 EXPECT_EQ(Position(remaining, 2), | 1309 EXPECT_EQ(Position(remaining, 2), |
1310 MostBackwardCaretPosition(Position::AfterNode(*sample))); | 1310 MostBackwardCaretPosition(Position::AfterNode(*sample))); |
1311 } | 1311 } |
1312 | 1312 |
1313 TEST_F(VisibleUnitsTest, mostForwardCaretPositionAfterAnchor) { | 1313 TEST_F(VisibleUnitsTest, mostForwardCaretPositionAfterAnchor) { |
1314 const char* body_content = "<p id='host'><b id='one'>1</b></p>"; | 1314 const char* body_content = "<p id='host'><b id='one'>1</b></p>"; |
1315 const char* shadow_content = | 1315 const char* shadow_content = |
1316 "<b id='two'>22</b><content select=#one></content><b id='three'>333</b>"; | 1316 "<b id='two'>22</b><content select=#one></content><b id='three'>333</b>"; |
1317 SetBodyContent(body_content); | 1317 SetBodyContent(body_content); |
1318 ShadowRoot* shadow_root = SetShadowContent(shadow_content, "host"); | 1318 ShadowRoot* shadow_root = SetShadowContent(shadow_content, "host"); |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1518 const char* body_content = "<p id='sample'>00</p>"; | 1518 const char* body_content = "<p id='sample'>00</p>"; |
1519 SetBodyContent(body_content); | 1519 SetBodyContent(body_content); |
1520 Element* sample = GetDocument().getElementById("sample"); | 1520 Element* sample = GetDocument().getElementById("sample"); |
1521 | 1521 |
1522 EXPECT_FALSE(RendersInDifferentPosition(Position(), Position())); | 1522 EXPECT_FALSE(RendersInDifferentPosition(Position(), Position())); |
1523 EXPECT_FALSE( | 1523 EXPECT_FALSE( |
1524 RendersInDifferentPosition(Position(), Position::AfterNode(*sample))) | 1524 RendersInDifferentPosition(Position(), Position::AfterNode(*sample))) |
1525 << "if one of position is null, the reuslt is false."; | 1525 << "if one of position is null, the reuslt is false."; |
1526 EXPECT_FALSE(RendersInDifferentPosition(Position::AfterNode(*sample), | 1526 EXPECT_FALSE(RendersInDifferentPosition(Position::AfterNode(*sample), |
1527 Position(sample, 1))); | 1527 Position(sample, 1))); |
1528 EXPECT_FALSE(RendersInDifferentPosition(Position::LastPositionInNode(sample), | 1528 EXPECT_FALSE(RendersInDifferentPosition(Position::LastPositionInNode(*sample), |
1529 Position(sample, 1))); | 1529 Position(sample, 1))); |
1530 } | 1530 } |
1531 | 1531 |
1532 TEST_F(VisibleUnitsTest, rendersInDifferentPositionAfterAnchorWithHidden) { | 1532 TEST_F(VisibleUnitsTest, rendersInDifferentPositionAfterAnchorWithHidden) { |
1533 const char* body_content = | 1533 const char* body_content = |
1534 "<p><span id=one>11</span><span id=two style='display:none'> " | 1534 "<p><span id=one>11</span><span id=two style='display:none'> " |
1535 "</span></p>"; | 1535 "</span></p>"; |
1536 SetBodyContent(body_content); | 1536 SetBodyContent(body_content); |
1537 Element* one = GetDocument().getElementById("one"); | 1537 Element* one = GetDocument().getElementById("one"); |
1538 Element* two = GetDocument().getElementById("two"); | 1538 Element* two = GetDocument().getElementById("two"); |
1539 | 1539 |
1540 EXPECT_TRUE(RendersInDifferentPosition(Position::LastPositionInNode(one), | 1540 EXPECT_TRUE(RendersInDifferentPosition(Position::LastPositionInNode(*one), |
1541 Position(two, 0))) | 1541 Position(two, 0))) |
1542 << "two doesn't have layout object"; | 1542 << "two doesn't have layout object"; |
1543 } | 1543 } |
1544 | 1544 |
1545 TEST_F(VisibleUnitsTest, | 1545 TEST_F(VisibleUnitsTest, |
1546 rendersInDifferentPositionAfterAnchorWithDifferentLayoutObjects) { | 1546 rendersInDifferentPositionAfterAnchorWithDifferentLayoutObjects) { |
1547 const char* body_content = | 1547 const char* body_content = |
1548 "<p><span id=one>11</span><span id=two> </span></p>"; | 1548 "<p><span id=one>11</span><span id=two> </span></p>"; |
1549 SetBodyContent(body_content); | 1549 SetBodyContent(body_content); |
1550 Element* one = GetDocument().getElementById("one"); | 1550 Element* one = GetDocument().getElementById("one"); |
1551 Element* two = GetDocument().getElementById("two"); | 1551 Element* two = GetDocument().getElementById("two"); |
1552 | 1552 |
1553 EXPECT_FALSE(RendersInDifferentPosition(Position::LastPositionInNode(one), | 1553 EXPECT_FALSE(RendersInDifferentPosition(Position::LastPositionInNode(*one), |
1554 Position(two, 0))); | 1554 Position(two, 0))); |
1555 EXPECT_FALSE(RendersInDifferentPosition(Position::LastPositionInNode(one), | 1555 EXPECT_FALSE(RendersInDifferentPosition(Position::LastPositionInNode(*one), |
1556 Position(two, 1))) | 1556 Position(two, 1))) |
1557 << "width of two is zero since contents is collapsed whitespaces"; | 1557 << "width of two is zero since contents is collapsed whitespaces"; |
1558 } | 1558 } |
1559 | 1559 |
1560 TEST_F(VisibleUnitsTest, renderedOffset) { | 1560 TEST_F(VisibleUnitsTest, renderedOffset) { |
1561 const char* body_content = | 1561 const char* body_content = |
1562 "<div contenteditable><span id='sample1'>1</span><span " | 1562 "<div contenteditable><span id='sample1'>1</span><span " |
1563 "id='sample2'>22</span></div>"; | 1563 "id='sample2'>22</span></div>"; |
1564 SetBodyContent(body_content); | 1564 SetBodyContent(body_content); |
1565 Element* sample1 = GetDocument().getElementById("sample1"); | 1565 Element* sample1 = GetDocument().getElementById("sample1"); |
1566 Element* sample2 = GetDocument().getElementById("sample2"); | 1566 Element* sample2 = GetDocument().getElementById("sample2"); |
1567 | 1567 |
1568 EXPECT_FALSE( | 1568 EXPECT_FALSE( |
1569 RendersInDifferentPosition(Position::AfterNode(*sample1->firstChild()), | 1569 RendersInDifferentPosition(Position::AfterNode(*sample1->firstChild()), |
1570 Position(sample2->firstChild(), 0))); | 1570 Position(sample2->firstChild(), 0))); |
1571 EXPECT_FALSE(RendersInDifferentPosition( | 1571 EXPECT_FALSE(RendersInDifferentPosition( |
1572 Position::LastPositionInNode(sample1->firstChild()), | 1572 Position::LastPositionInNode(*sample1->firstChild()), |
1573 Position(sample2->firstChild(), 0))); | 1573 Position(sample2->firstChild(), 0))); |
1574 } | 1574 } |
1575 | 1575 |
1576 TEST_F(VisibleUnitsTest, startOfDocument) { | 1576 TEST_F(VisibleUnitsTest, startOfDocument) { |
1577 const char* body_content = "<a id=host><b id=one>1</b><b id=two>22</b></a>"; | 1577 const char* body_content = "<a id=host><b id=one>1</b><b id=two>22</b></a>"; |
1578 const char* shadow_content = | 1578 const char* shadow_content = |
1579 "<p><content select=#two></content></p><p><content " | 1579 "<p><content select=#two></content></p><p><content " |
1580 "select=#one></content></p>"; | 1580 "select=#one></content></p>"; |
1581 SetBodyContent(body_content); | 1581 SetBodyContent(body_content); |
1582 SetShadowContent(shadow_content, "host"); | 1582 SetShadowContent(shadow_content, "host"); |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1912 TEST_F(VisibleUnitsTest, | 1912 TEST_F(VisibleUnitsTest, |
1913 PreviousRootInlineBoxCandidatePositionWithDisplayNone) { | 1913 PreviousRootInlineBoxCandidatePositionWithDisplayNone) { |
1914 SetBodyContent( | 1914 SetBodyContent( |
1915 "<div contenteditable>" | 1915 "<div contenteditable>" |
1916 "<div id=one>one abc</div>" | 1916 "<div id=one>one abc</div>" |
1917 "<div id=two>two <b id=none style=display:none>def</b> ghi</div>" | 1917 "<div id=two>two <b id=none style=display:none>def</b> ghi</div>" |
1918 "</div>"); | 1918 "</div>"); |
1919 Element* const one = GetDocument().getElementById("one"); | 1919 Element* const one = GetDocument().getElementById("one"); |
1920 Element* const two = GetDocument().getElementById("two"); | 1920 Element* const two = GetDocument().getElementById("two"); |
1921 const VisiblePosition& visible_position = | 1921 const VisiblePosition& visible_position = |
1922 CreateVisiblePosition(Position::LastPositionInNode(two)); | 1922 CreateVisiblePosition(Position::LastPositionInNode(*two)); |
1923 EXPECT_EQ(Position(one->firstChild(), 7), | 1923 EXPECT_EQ(Position(one->firstChild(), 7), |
1924 PreviousRootInlineBoxCandidatePosition( | 1924 PreviousRootInlineBoxCandidatePosition( |
1925 two->lastChild(), visible_position, kContentIsEditable)); | 1925 two->lastChild(), visible_position, kContentIsEditable)); |
1926 } | 1926 } |
1927 | 1927 |
1928 } // namespace blink | 1928 } // namespace blink |
OLD | NEW |