Changeset 65062 in webkit
- Timestamp:
- Aug 10, 2010 3:08:22 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r65061 r65062 1 2010-08-10 Yoshiki Hayashi <yhayashi@google.com> 2 3 Reviewed by Kent Tamura. 4 5 Iterate over :first-letter so that it will be included in innerText. 6 https://bugs.webkit.org/show_bug.cgi?id=39863 7 8 * fast/dom/inner-text-first-letter-expected.txt: Added. 9 * fast/dom/inner-text-first-letter.html: Added. 10 1 11 2010-08-10 Kent Tamura <tkent@chromium.org> 2 12 -
trunk/LayoutTests/fast/css/getComputedStyle/getComputedStyle-with-pseudo-element-expected.txt
r57861 r65062 2 2 3 3 4 orem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.4 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 5 5 6 6 Middle -
trunk/WebCore/ChangeLog
r65061 r65062 1 2010-08-10 Yoshiki Hayashi <yhayashi@google.com> 2 3 Reviewed by Kent Tamura. 4 5 Iterate over :first-letter so that it will be included in innerText. 6 https://bugs.webkit.org/show_bug.cgi?id=39863 7 8 Test: fast/dom/inner-text-first-letter.html 9 10 * editing/TextIterator.cpp: 11 (WebCore::TextIterator::TextIterator): 12 (WebCore::TextIterator::advance): 13 (WebCore::TextIterator::handleTextNode): 14 (WebCore::TextIterator::handleTextBox): 15 (WebCore::TextIterator::emitText): 16 * editing/TextIterator.h: 17 1 18 2010-08-10 Kent Tamura <tkent@chromium.org> 2 19 -
trunk/WebCore/editing/TextIterator.cpp
r64974 r65062 38 38 #include "RenderTableRow.h" 39 39 #include "RenderTextControl.h" 40 #include "RenderTextFragment.h" 40 41 #include "VisiblePosition.h" 41 42 #include "visible_units.h" … … 254 255 , m_textCharacters(0) 255 256 , m_textLength(0) 257 , m_remainingTextBox(0) 258 , m_firstLetterText(0) 256 259 , m_lastCharacter(0) 257 260 , m_emitsCharactersBetweenAllVisiblePositions(false) 258 261 , m_entersTextControls(false) 259 262 , m_emitsTextWithoutTranscoding(false) 263 , m_handledFirstLetter(false) 260 264 { 261 265 } … … 269 273 , m_textCharacters(0) 270 274 , m_textLength(0) 275 , m_remainingTextBox(0) 276 , m_firstLetterText(0) 271 277 , m_emitsCharactersBetweenAllVisiblePositions(behavior & TextIteratorEmitsCharactersBetweenAllVisiblePositions) 272 278 , m_entersTextControls(behavior & TextIteratorEntersTextControls) 273 279 , m_emitsTextWithoutTranscoding(behavior & TextIteratorEmitsTextsWithoutTranscoding) 280 , m_handledFirstLetter(false) 274 281 { 275 282 // FIXME: should support TextIteratorEndsAtEditingBoundary http://webkit.org/b/43609 … … 348 355 } 349 356 357 if (!m_textBox && m_remainingTextBox) { 358 m_textBox = m_remainingTextBox; 359 m_remainingTextBox = 0; 360 m_firstLetterText = 0; 361 m_offset = 0; 362 } 350 363 // handle remembered text box 351 364 if (m_textBox) { … … 421 434 m_handledNode = false; 422 435 m_handledChildren = false; 436 m_handledFirstLetter = false; 437 m_firstLetterText = 0; 423 438 424 439 // how would this ever be? … … 439 454 440 455 RenderText* renderer = toRenderText(m_node->renderer()); 441 if (renderer->style()->visibility() != VISIBLE)442 return false;443 456 444 457 m_lastTextNode = m_node; … … 448 461 if (!renderer->style()->collapseWhiteSpace()) { 449 462 int runStart = m_offset; 450 if (m_lastTextNodeEndedWithCollapsedSpace ) {463 if (m_lastTextNodeEndedWithCollapsedSpace && hasVisibleTextNode(renderer)) { 451 464 emitCharacter(' ', m_node, 0, runStart, runStart); 452 465 return false; 453 466 } 467 if (!m_handledFirstLetter && renderer->isTextFragment()) { 468 handleTextNodeFirstLetter(static_cast<RenderTextFragment*>(renderer)); 469 if (m_firstLetterText) { 470 String firstLetter = m_firstLetterText->text(); 471 emitText(m_node, m_firstLetterText, m_offset, firstLetter.length()); 472 m_firstLetterText = 0; 473 m_textBox = 0; 474 return false; 475 } 476 } 477 if (renderer->style()->visibility() != VISIBLE) 478 return false; 454 479 int strLength = str.length(); 455 480 int end = (m_node == m_endContainer) ? m_endOffset : INT_MAX; … … 464 489 465 490 if (!renderer->firstTextBox() && str.length() > 0) { 491 if (!m_handledFirstLetter && renderer->isTextFragment()) { 492 handleTextNodeFirstLetter(static_cast<RenderTextFragment*>(renderer)); 493 if (m_firstLetterText) { 494 handleTextBox(); 495 return false; 496 } 497 } 498 if (renderer->style()->visibility() != VISIBLE) 499 return false; 466 500 m_lastTextNodeEndedWithCollapsedSpace = true; // entire block is collapsed space 467 501 return true; … … 479 513 480 514 m_textBox = renderer->containsReversedText() ? (m_sortedTextBoxes.isEmpty() ? 0 : m_sortedTextBoxes[0]) : renderer->firstTextBox(); 515 if (!m_handledFirstLetter && renderer->isTextFragment() && !m_offset) 516 handleTextNodeFirstLetter(static_cast<RenderTextFragment*>(renderer)); 481 517 handleTextBox(); 482 518 return true; … … 485 521 void TextIterator::handleTextBox() 486 522 { 487 RenderText* renderer = toRenderText(m_node->renderer()); 523 RenderText* renderer = m_firstLetterText ? m_firstLetterText : toRenderText(m_node->renderer()); 524 if (renderer->style()->visibility() != VISIBLE) { 525 m_textBox = 0; 526 return; 527 } 488 528 String str = renderer->text(); 489 529 int start = m_offset; … … 531 571 532 572 m_offset = subrunEnd; 533 emitText(m_node, r unStart, subrunEnd);573 emitText(m_node, renderer, runStart, subrunEnd); 534 574 } 535 575 … … 553 593 ++m_sortedTextBoxesPosition; 554 594 } 595 if (!m_textBox && m_remainingTextBox) { 596 m_textBox = m_remainingTextBox; 597 m_remainingTextBox = 0; 598 m_firstLetterText = 0; 599 m_offset = 0; 600 handleTextBox(); 601 } 602 } 603 604 void TextIterator::handleTextNodeFirstLetter(RenderTextFragment* renderer) 605 { 606 if (renderer->firstLetter()) { 607 RenderObject* r = renderer->firstLetter(); 608 if (r->style()->visibility() != VISIBLE) 609 return; 610 for (RenderObject *currChild = r->firstChild(); currChild; currChild->nextSibling()) { 611 if (currChild->isText()) { 612 RenderText* firstLetter = toRenderText(currChild); 613 m_handledFirstLetter = true; 614 m_remainingTextBox = m_textBox; 615 m_textBox = firstLetter->firstTextBox(); 616 m_firstLetterText = firstLetter; 617 return; 618 } 619 } 620 } 621 m_handledFirstLetter = true; 555 622 } 556 623 … … 599 666 600 667 return true; 668 } 669 670 bool TextIterator::hasVisibleTextNode(RenderText* renderer) 671 { 672 if (renderer->style()->visibility() == VISIBLE) 673 return true; 674 if (renderer->isTextFragment()) { 675 RenderTextFragment* fragment = static_cast<RenderTextFragment*>(renderer); 676 if (fragment->firstLetter() && fragment->firstLetter()->style()->visibility() == VISIBLE) 677 return true; 678 } 679 return false; 601 680 } 602 681 … … 892 971 } 893 972 894 void TextIterator::emitText(Node* textNode, int textStartOffset, int textEndOffset)895 { 896 RenderText* renderer = toRenderText( m_node->renderer());973 void TextIterator::emitText(Node* textNode, RenderObject* renderObject, int textStartOffset, int textEndOffset) 974 { 975 RenderText* renderer = toRenderText(renderObject); 897 976 m_text = m_emitsTextWithoutTranscoding ? renderer->textWithoutTranscoding() : renderer->text(); 898 977 ASSERT(m_text.characters()); … … 908 987 m_lastTextNodeEndedWithCollapsedSpace = false; 909 988 m_hasEmitted = true; 989 } 990 991 void TextIterator::emitText(Node* textNode, int textStartOffset, int textEndOffset) 992 { 993 emitText(textNode, m_node->renderer(), textStartOffset, textEndOffset); 910 994 } 911 995 -
trunk/WebCore/editing/TextIterator.h
r64974 r65062 33 33 namespace WebCore { 34 34 35 class RenderText; 36 class RenderTextFragment; 37 35 38 // FIXME: Can't really answer this question correctly without knowing the white-space mode. 36 39 // FIXME: Move this somewhere else in the editing directory. It doesn't belong here. … … 104 107 bool handleNonTextNode(); 105 108 void handleTextBox(); 109 void handleTextNodeFirstLetter(RenderTextFragment*); 110 bool hasVisibleTextNode(RenderText*); 106 111 void emitCharacter(UChar, Node* textNode, Node* offsetBaseNode, int textStartOffset, int textEndOffset); 112 void emitText(Node* textNode, RenderObject* renderObject, int textStartOffset, int textEndOffset); 107 113 void emitText(Node* textNode, int textStartOffset, int textEndOffset); 108 114 … … 136 142 bool m_needsAnotherNewline; 137 143 InlineTextBox* m_textBox; 144 // Used when iteration over :first-letter text to save pointer to 145 // remaining text box. 146 InlineTextBox* m_remainingTextBox; 147 // Used to point to RenderText object for :first-letter. 148 RenderText *m_firstLetterText; 138 149 139 150 // Used to do the whitespace collapsing logic. … … 161 172 // Used when we want texts for copying, pasting, and transposing. 162 173 bool m_emitsTextWithoutTranscoding; 174 // Used when deciding text fragment created by :first-letter should be looked into. 175 bool m_handledFirstLetter; 163 176 }; 164 177
Note: See TracChangeset
for help on using the changeset viewer.