| 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/EditingUtilities.h" | 5 #include "core/editing/EditingUtilities.h" |
| 6 | 6 |
| 7 #include "core/dom/StaticNodeList.h" | 7 #include "core/dom/StaticNodeList.h" |
| 8 #include "core/editing/EditingTestBase.h" | 8 #include "core/editing/EditingTestBase.h" |
| 9 | 9 |
| 10 namespace blink { | 10 namespace blink { |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 << "Can't merge a element with no attributes and another element with an
attribute."; | 193 << "Can't merge a element with no attributes and another element with an
attribute."; |
| 194 | 194 |
| 195 // We can't use contenteditable attribute to make editability difference | 195 // We can't use contenteditable attribute to make editability difference |
| 196 // because the hasEquivalentAttributes check is done earier. | 196 // because the hasEquivalentAttributes check is done earier. |
| 197 EXPECT_FALSE(areIdenticalElements(*items->item(0), *items->item(1))) | 197 EXPECT_FALSE(areIdenticalElements(*items->item(0), *items->item(1))) |
| 198 << "Can't merge non-editable nodes."; | 198 << "Can't merge non-editable nodes."; |
| 199 | 199 |
| 200 EXPECT_TRUE(areIdenticalElements(*items->item(1), *items->item(3))); | 200 EXPECT_TRUE(areIdenticalElements(*items->item(1), *items->item(3))); |
| 201 } | 201 } |
| 202 | 202 |
| 203 TEST_F(EditingUtilitiesTest, previousPositionOf_Backspace) |
| 204 { |
| 205 // BMP characters. Only one code point should be deleted. |
| 206 setBodyContent("<p id='target'>abc</p>"); |
| 207 Node* node = document().getElementById("target")->firstChild(); |
| 208 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM
oveType::BackwardDeletion)); |
| 209 EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionM
oveType::BackwardDeletion)); |
| 210 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM
oveType::BackwardDeletion)); |
| 211 } |
| 212 |
| 213 TEST_F(EditingUtilitiesTest, previousPositionOf_Backspace_FirstLetter) |
| 214 { |
| 215 |
| 216 setBodyContent("<style>p::first-letter {color:red;}</style><p id='target'>ab
c</p>"); |
| 217 Node* node = document().getElementById("target")->firstChild(); |
| 218 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM
oveType::BackwardDeletion)); |
| 219 EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionM
oveType::BackwardDeletion)); |
| 220 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM
oveType::BackwardDeletion)); |
| 221 |
| 222 setBodyContent("<style>p::first-letter {color:red;}</style><p id='target'>(a
)bc</p>"); |
| 223 node = document().getElementById("target")->firstChild(); |
| 224 EXPECT_EQ(Position(node, 4), previousPositionOf(Position(node, 5), PositionM
oveType::BackwardDeletion)); |
| 225 EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 4), PositionM
oveType::BackwardDeletion)); |
| 226 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM
oveType::BackwardDeletion)); |
| 227 EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionM
oveType::BackwardDeletion)); |
| 228 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM
oveType::BackwardDeletion)); |
| 229 } |
| 230 |
| 231 TEST_F(EditingUtilitiesTest, previousPositionOf_Backspace_TextTransform) |
| 232 { |
| 233 // Uppercase of ß will be transformed to SS. |
| 234 setBodyContent("<style>p {text-transform:uppercase}</style><p id='target'>&#
x00DF;abc</p>"); |
| 235 Node* node = document().getElementById("target")->firstChild(); |
| 236 EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 4), PositionM
oveType::BackwardDeletion)); |
| 237 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM
oveType::BackwardDeletion)); |
| 238 EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionM
oveType::BackwardDeletion)); |
| 239 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM
oveType::BackwardDeletion)); |
| 240 } |
| 241 |
| 242 TEST_F(EditingUtilitiesTest, previousPositionOf_Backspace_SurrogatePairs) |
| 243 { |
| 244 // Supplementary plane characters. Only one code point should be deleted. |
| 245 // 👁 is EYE. |
| 246 setBodyContent("<p id='target'>👁👁👁</p>"); |
| 247 Node* node = document().getElementById("target")->firstChild(); |
| 248 EXPECT_EQ(Position(node, 4), previousPositionOf(Position(node, 6), PositionM
oveType::BackwardDeletion)); |
| 249 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 4), PositionM
oveType::BackwardDeletion)); |
| 250 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 2), PositionM
oveType::BackwardDeletion)); |
| 251 |
| 252 // BMP and Supplementary plane case. |
| 253 setBodyContent("<p id='target'>👁a👁a</p>"); |
| 254 node = document().getElementById("target")->firstChild(); |
| 255 EXPECT_EQ(Position(node, 5), previousPositionOf(Position(node, 6), PositionM
oveType::BackwardDeletion)); |
| 256 EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 5), PositionM
oveType::BackwardDeletion)); |
| 257 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM
oveType::BackwardDeletion)); |
| 258 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 2), PositionM
oveType::BackwardDeletion)); |
| 259 |
| 260 // Edge case: broken surrogate pairs. |
| 261 setBodyContent("<p id='target'>�</p>"); // � is unpaired lead
surrogate. |
| 262 node = document().getElementById("target")->firstChild(); |
| 263 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM
oveType::BackwardDeletion)); |
| 264 |
| 265 setBodyContent("<p id='target'>👁�👁</p>"); // �
is unpaired lead surrogate. |
| 266 node = document().getElementById("target")->firstChild(); |
| 267 EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 5), PositionM
oveType::BackwardDeletion)); |
| 268 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM
oveType::BackwardDeletion)); |
| 269 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 2), PositionM
oveType::BackwardDeletion)); |
| 270 |
| 271 setBodyContent("<p id='target'>a�a</p>"); // � is unpaired lea
d surrogate. |
| 272 node = document().getElementById("target")->firstChild(); |
| 273 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM
oveType::BackwardDeletion)); |
| 274 EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionM
oveType::BackwardDeletion)); |
| 275 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM
oveType::BackwardDeletion)); |
| 276 |
| 277 setBodyContent("<p id='target'>�</p>"); // � is unpaired trail
surrogate. |
| 278 node = document().getElementById("target")->firstChild(); |
| 279 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM
oveType::BackwardDeletion)); |
| 280 |
| 281 setBodyContent("<p id='target'>👁�👁</p>"); // �
is unpaired trail surrogate. |
| 282 node = document().getElementById("target")->firstChild(); |
| 283 EXPECT_EQ(Position(node, 3), previousPositionOf(Position(node, 5), PositionM
oveType::BackwardDeletion)); |
| 284 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM
oveType::BackwardDeletion)); |
| 285 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 2), PositionM
oveType::BackwardDeletion)); |
| 286 |
| 287 setBodyContent("<p id='target'>a�a</p>"); // � is unpaired tra
il surrogate. |
| 288 node = document().getElementById("target")->firstChild(); |
| 289 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM
oveType::BackwardDeletion)); |
| 290 EXPECT_EQ(Position(node, 1), previousPositionOf(Position(node, 2), PositionM
oveType::BackwardDeletion)); |
| 291 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM
oveType::BackwardDeletion)); |
| 292 |
| 293 // Edge case: specify middle of surrogate pairs. |
| 294 setBodyContent("<p id='target'>👁👁👁</p>"); |
| 295 node = document().getElementById("target")->firstChild(); |
| 296 EXPECT_EQ(Position(node, 4), previousPositionOf(Position(node, 5), PositionM
oveType::BackwardDeletion)); |
| 297 EXPECT_EQ(Position(node, 2), previousPositionOf(Position(node, 3), PositionM
oveType::BackwardDeletion)); |
| 298 EXPECT_EQ(Position(node, 0), previousPositionOf(Position(node, 1), PositionM
oveType::BackwardDeletion)); |
| 299 } |
| 300 |
| 203 } // namespace blink | 301 } // namespace blink |
| OLD | NEW |