| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013, Google Inc. All rights reserved. | 2 * Copyright (c) 2013, Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 iterate<FlatTree>(TextIteratorEntersTextControls)); | 166 iterate<FlatTree>(TextIteratorEntersTextControls)); |
| 167 } | 167 } |
| 168 | 168 |
| 169 TEST_F(TextIteratorTest, NotEnteringShadowTree) { | 169 TEST_F(TextIteratorTest, NotEnteringShadowTree) { |
| 170 static const char* bodyContent = | 170 static const char* bodyContent = |
| 171 "<div>Hello, <span id='host'>text</span> iterator.</div>"; | 171 "<div>Hello, <span id='host'>text</span> iterator.</div>"; |
| 172 static const char* shadowContent = "<span>shadow</span>"; | 172 static const char* shadowContent = "<span>shadow</span>"; |
| 173 setBodyContent(bodyContent); | 173 setBodyContent(bodyContent); |
| 174 createShadowRootForElementWithIDAndSetInnerHTML(document(), "host", | 174 createShadowRootForElementWithIDAndSetInnerHTML(document(), "host", |
| 175 shadowContent); | 175 shadowContent); |
| 176 // TextIterator doesn't emit "text" since its layoutObject is not created. The
shadow tree is ignored. | 176 // TextIterator doesn't emit "text" since its layoutObject is not created. The |
| 177 // shadow tree is ignored. |
| 177 EXPECT_EQ("[Hello, ][ iterator.]", iterate<DOMTree>()); | 178 EXPECT_EQ("[Hello, ][ iterator.]", iterate<DOMTree>()); |
| 178 EXPECT_EQ("[Hello, ][shadow][ iterator.]", iterate<FlatTree>()); | 179 EXPECT_EQ("[Hello, ][shadow][ iterator.]", iterate<FlatTree>()); |
| 179 } | 180 } |
| 180 | 181 |
| 181 TEST_F(TextIteratorTest, NotEnteringShadowTreeWithMultipleShadowTrees) { | 182 TEST_F(TextIteratorTest, NotEnteringShadowTreeWithMultipleShadowTrees) { |
| 182 static const char* bodyContent = | 183 static const char* bodyContent = |
| 183 "<div>Hello, <span id='host'>text</span> iterator.</div>"; | 184 "<div>Hello, <span id='host'>text</span> iterator.</div>"; |
| 184 static const char* shadowContent1 = "<span>first shadow</span>"; | 185 static const char* shadowContent1 = "<span>first shadow</span>"; |
| 185 static const char* shadowContent2 = "<span>second shadow</span>"; | 186 static const char* shadowContent2 = "<span>second shadow</span>"; |
| 186 setBodyContent(bodyContent); | 187 setBodyContent(bodyContent); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 EXPECT_EQ("[Hello, ][shadow ][text][ iterator.]", iterate<FlatTree>()); | 222 EXPECT_EQ("[Hello, ][shadow ][text][ iterator.]", iterate<FlatTree>()); |
| 222 } | 223 } |
| 223 | 224 |
| 224 TEST_F(TextIteratorTest, EnteringShadowTreeWithOption) { | 225 TEST_F(TextIteratorTest, EnteringShadowTreeWithOption) { |
| 225 static const char* bodyContent = | 226 static const char* bodyContent = |
| 226 "<div>Hello, <span id='host'>text</span> iterator.</div>"; | 227 "<div>Hello, <span id='host'>text</span> iterator.</div>"; |
| 227 static const char* shadowContent = "<span>shadow</span>"; | 228 static const char* shadowContent = "<span>shadow</span>"; |
| 228 setBodyContent(bodyContent); | 229 setBodyContent(bodyContent); |
| 229 createShadowRootForElementWithIDAndSetInnerHTML(document(), "host", | 230 createShadowRootForElementWithIDAndSetInnerHTML(document(), "host", |
| 230 shadowContent); | 231 shadowContent); |
| 231 // TextIterator emits "shadow" since TextIteratorEntersOpenShadowRoots is spec
ified. | 232 // TextIterator emits "shadow" since TextIteratorEntersOpenShadowRoots is |
| 233 // specified. |
| 232 EXPECT_EQ("[Hello, ][shadow][ iterator.]", | 234 EXPECT_EQ("[Hello, ][shadow][ iterator.]", |
| 233 iterate<DOMTree>(TextIteratorEntersOpenShadowRoots)); | 235 iterate<DOMTree>(TextIteratorEntersOpenShadowRoots)); |
| 234 EXPECT_EQ("[Hello, ][shadow][ iterator.]", | 236 EXPECT_EQ("[Hello, ][shadow][ iterator.]", |
| 235 iterate<FlatTree>(TextIteratorEntersOpenShadowRoots)); | 237 iterate<FlatTree>(TextIteratorEntersOpenShadowRoots)); |
| 236 } | 238 } |
| 237 | 239 |
| 238 TEST_F(TextIteratorTest, EnteringShadowTreeWithMultipleShadowTreesWithOption) { | 240 TEST_F(TextIteratorTest, EnteringShadowTreeWithMultipleShadowTreesWithOption) { |
| 239 static const char* bodyContent = | 241 static const char* bodyContent = |
| 240 "<div>Hello, <span id='host'>text</span> iterator.</div>"; | 242 "<div>Hello, <span id='host'>text</span> iterator.</div>"; |
| 241 static const char* shadowContent1 = "<span>first shadow</span>"; | 243 static const char* shadowContent1 = "<span>first shadow</span>"; |
| 242 static const char* shadowContent2 = "<span>second shadow</span>"; | 244 static const char* shadowContent2 = "<span>second shadow</span>"; |
| 243 setBodyContent(bodyContent); | 245 setBodyContent(bodyContent); |
| 244 createShadowRootForElementWithIDAndSetInnerHTML(document(), "host", | 246 createShadowRootForElementWithIDAndSetInnerHTML(document(), "host", |
| 245 shadowContent1); | 247 shadowContent1); |
| 246 createShadowRootForElementWithIDAndSetInnerHTML(document(), "host", | 248 createShadowRootForElementWithIDAndSetInnerHTML(document(), "host", |
| 247 shadowContent2); | 249 shadowContent2); |
| 248 // The first isn't emitted because a layoutObject for the first is not created
. | 250 // The first isn't emitted because a layoutObject for the first is not |
| 251 // created. |
| 249 EXPECT_EQ("[Hello, ][second shadow][ iterator.]", | 252 EXPECT_EQ("[Hello, ][second shadow][ iterator.]", |
| 250 iterate<DOMTree>(TextIteratorEntersOpenShadowRoots)); | 253 iterate<DOMTree>(TextIteratorEntersOpenShadowRoots)); |
| 251 EXPECT_EQ("[Hello, ][second shadow][ iterator.]", | 254 EXPECT_EQ("[Hello, ][second shadow][ iterator.]", |
| 252 iterate<FlatTree>(TextIteratorEntersOpenShadowRoots)); | 255 iterate<FlatTree>(TextIteratorEntersOpenShadowRoots)); |
| 253 } | 256 } |
| 254 | 257 |
| 255 TEST_F(TextIteratorTest, EnteringShadowTreeWithNestedShadowTreesWithOption) { | 258 TEST_F(TextIteratorTest, EnteringShadowTreeWithNestedShadowTreesWithOption) { |
| 256 static const char* bodyContent = | 259 static const char* bodyContent = |
| 257 "<div>Hello, <span id='host-in-document'>text</span> iterator.</div>"; | 260 "<div>Hello, <span id='host-in-document'>text</span> iterator.</div>"; |
| 258 static const char* shadowContent1 = | 261 static const char* shadowContent1 = |
| 259 "<span>first <span id='host-in-shadow'>shadow</span></span>"; | 262 "<span>first <span id='host-in-shadow'>shadow</span></span>"; |
| 260 static const char* shadowContent2 = "<span>second shadow</span>"; | 263 static const char* shadowContent2 = "<span>second shadow</span>"; |
| 261 setBodyContent(bodyContent); | 264 setBodyContent(bodyContent); |
| 262 ShadowRoot* shadowRoot1 = createShadowRootForElementWithIDAndSetInnerHTML( | 265 ShadowRoot* shadowRoot1 = createShadowRootForElementWithIDAndSetInnerHTML( |
| 263 document(), "host-in-document", shadowContent1); | 266 document(), "host-in-document", shadowContent1); |
| 264 createShadowRootForElementWithIDAndSetInnerHTML( | 267 createShadowRootForElementWithIDAndSetInnerHTML( |
| 265 *shadowRoot1, "host-in-shadow", shadowContent2); | 268 *shadowRoot1, "host-in-shadow", shadowContent2); |
| 266 EXPECT_EQ("[Hello, ][first ][second shadow][ iterator.]", | 269 EXPECT_EQ("[Hello, ][first ][second shadow][ iterator.]", |
| 267 iterate<DOMTree>(TextIteratorEntersOpenShadowRoots)); | 270 iterate<DOMTree>(TextIteratorEntersOpenShadowRoots)); |
| 268 EXPECT_EQ("[Hello, ][first ][second shadow][ iterator.]", | 271 EXPECT_EQ("[Hello, ][first ][second shadow][ iterator.]", |
| 269 iterate<FlatTree>(TextIteratorEntersOpenShadowRoots)); | 272 iterate<FlatTree>(TextIteratorEntersOpenShadowRoots)); |
| 270 } | 273 } |
| 271 | 274 |
| 272 TEST_F(TextIteratorTest, | 275 TEST_F(TextIteratorTest, |
| 273 EnteringShadowTreeWithContentInsertionPointWithOption) { | 276 EnteringShadowTreeWithContentInsertionPointWithOption) { |
| 274 static const char* bodyContent = | 277 static const char* bodyContent = |
| 275 "<div>Hello, <span id='host'>text</span> iterator.</div>"; | 278 "<div>Hello, <span id='host'>text</span> iterator.</div>"; |
| 276 static const char* shadowContent = | 279 static const char* shadowContent = |
| 277 "<span><content>content</content> shadow</span>"; | 280 "<span><content>content</content> shadow</span>"; |
| 278 // In this case a layoutObject for "text" is created, and emitted AFTER any no
des in the shadow tree. | 281 // In this case a layoutObject for "text" is created, and emitted AFTER any |
| 279 // This order does not match the order of the rendered texts, but at this mome
nt it's the expected behavior. | 282 // nodes in the shadow tree. This order does not match the order of the |
| 280 // FIXME: Fix this. We probably need pure-renderer-based implementation of Tex
tIterator to achieve this. | 283 // rendered texts, but at this moment it's the expected behavior. |
| 284 // FIXME: Fix this. We probably need pure-renderer-based implementation of |
| 285 // TextIterator to achieve this. |
| 281 setBodyContent(bodyContent); | 286 setBodyContent(bodyContent); |
| 282 createShadowRootForElementWithIDAndSetInnerHTML(document(), "host", | 287 createShadowRootForElementWithIDAndSetInnerHTML(document(), "host", |
| 283 shadowContent); | 288 shadowContent); |
| 284 EXPECT_EQ("[Hello, ][ shadow][text][ iterator.]", | 289 EXPECT_EQ("[Hello, ][ shadow][text][ iterator.]", |
| 285 iterate<DOMTree>(TextIteratorEntersOpenShadowRoots)); | 290 iterate<DOMTree>(TextIteratorEntersOpenShadowRoots)); |
| 286 EXPECT_EQ("[Hello, ][text][ shadow][ iterator.]", | 291 EXPECT_EQ("[Hello, ][text][ shadow][ iterator.]", |
| 287 iterate<FlatTree>(TextIteratorEntersOpenShadowRoots)); | 292 iterate<FlatTree>(TextIteratorEntersOpenShadowRoots)); |
| 288 } | 293 } |
| 289 | 294 |
| 290 TEST_F(TextIteratorTest, StartingAtNodeInShadowRoot) { | 295 TEST_F(TextIteratorTest, StartingAtNodeInShadowRoot) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 "<div id='host'>" | 370 "<div id='host'>" |
| 366 "<div>Am I visible?</div>" | 371 "<div>Am I visible?</div>" |
| 367 "</div>"; | 372 "</div>"; |
| 368 static const char* shadowContent = | 373 static const char* shadowContent = |
| 369 "<div style='overflow: hidden; width: 200px; height: 0;'>" | 374 "<div style='overflow: hidden; width: 200px; height: 0;'>" |
| 370 "<content></content>" | 375 "<content></content>" |
| 371 "</div>"; | 376 "</div>"; |
| 372 setBodyContent(bodyContent); | 377 setBodyContent(bodyContent); |
| 373 createShadowRootForElementWithIDAndSetInnerHTML(document(), "host", | 378 createShadowRootForElementWithIDAndSetInnerHTML(document(), "host", |
| 374 shadowContent); | 379 shadowContent); |
| 375 // FIXME: The text below is actually invisible but TextIterator currently thin
ks it's visible. | 380 // FIXME: The text below is actually invisible but TextIterator currently |
| 381 // thinks it's visible. |
| 376 EXPECT_EQ("[\n][Am I visible?]", | 382 EXPECT_EQ("[\n][Am I visible?]", |
| 377 iterate<DOMTree>(TextIteratorEntersOpenShadowRoots)); | 383 iterate<DOMTree>(TextIteratorEntersOpenShadowRoots)); |
| 378 EXPECT_EQ("", iterate<FlatTree>(TextIteratorEntersOpenShadowRoots)); | 384 EXPECT_EQ("", iterate<FlatTree>(TextIteratorEntersOpenShadowRoots)); |
| 379 } | 385 } |
| 380 | 386 |
| 381 TEST_F(TextIteratorTest, IgnoresContainersClipDistributed) { | 387 TEST_F(TextIteratorTest, IgnoresContainersClipDistributed) { |
| 382 static const char* bodyContent = | 388 static const char* bodyContent = |
| 383 "<div id='host' style='overflow: hidden; width: 200px; height: 0;'>" | 389 "<div id='host' style='overflow: hidden; width: 200px; height: 0;'>" |
| 384 "<div>Nobody can find me!</div>" | 390 "<div>Nobody can find me!</div>" |
| 385 "</div>"; | 391 "</div>"; |
| 386 static const char* shadowContent = | 392 static const char* shadowContent = |
| 387 "<div style='position: absolute; width: 200px; height: 200px; top: 0; " | 393 "<div style='position: absolute; width: 200px; height: 200px; top: 0; " |
| 388 "right: 0;'>" | 394 "right: 0;'>" |
| 389 "<content></content>" | 395 "<content></content>" |
| 390 "</div>"; | 396 "</div>"; |
| 391 setBodyContent(bodyContent); | 397 setBodyContent(bodyContent); |
| 392 createShadowRootForElementWithIDAndSetInnerHTML(document(), "host", | 398 createShadowRootForElementWithIDAndSetInnerHTML(document(), "host", |
| 393 shadowContent); | 399 shadowContent); |
| 394 // FIXME: The text below is actually visible but TextIterator currently thinks
it's invisible. | 400 // FIXME: The text below is actually visible but TextIterator currently thinks |
| 401 // it's invisible. |
| 395 // [\n][Nobody can find me!] | 402 // [\n][Nobody can find me!] |
| 396 EXPECT_EQ("", iterate<DOMTree>(TextIteratorEntersOpenShadowRoots)); | 403 EXPECT_EQ("", iterate<DOMTree>(TextIteratorEntersOpenShadowRoots)); |
| 397 EXPECT_EQ("[Nobody can find me!]", | 404 EXPECT_EQ("[Nobody can find me!]", |
| 398 iterate<FlatTree>(TextIteratorEntersOpenShadowRoots)); | 405 iterate<FlatTree>(TextIteratorEntersOpenShadowRoots)); |
| 399 } | 406 } |
| 400 | 407 |
| 401 TEST_F(TextIteratorTest, EmitsReplacementCharForInput) { | 408 TEST_F(TextIteratorTest, EmitsReplacementCharForInput) { |
| 402 static const char* bodyContent = | 409 static const char* bodyContent = |
| 403 "<div contenteditable='true'>" | 410 "<div contenteditable='true'>" |
| 404 "Before" | 411 "Before" |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 setBodyContent( | 634 setBodyContent( |
| 628 "<div style='width: 2em;'><b><i id='foo'>foo </i></b> bar</div>"); | 635 "<div style='width: 2em;'><b><i id='foo'>foo </i></b> bar</div>"); |
| 629 Element* div = document().querySelector("div"); | 636 Element* div = document().querySelector("div"); |
| 630 Position start(document().getElementById("foo")->firstChild(), 0); | 637 Position start(document().getElementById("foo")->firstChild(), 0); |
| 631 Position end(div->lastChild(), 4); | 638 Position end(div->lastChild(), 4); |
| 632 EXPECT_EQ("foo bar", plainText(EphemeralRange(start, end), | 639 EXPECT_EQ("foo bar", plainText(EphemeralRange(start, end), |
| 633 TextIteratorEmitsImageAltText)); | 640 TextIteratorEmitsImageAltText)); |
| 634 } | 641 } |
| 635 | 642 |
| 636 } // namespace blink | 643 } // namespace blink |
| OLD | NEW |