OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All r ights reserved. | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All r ights reserved. |
3 * Copyright (C) 2005 Alexey Proskuryakov. | 3 * Copyright (C) 2005 Alexey Proskuryakov. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. 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 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
752 } | 752 } |
753 if (!m_textBox && m_remainingTextBox) { | 753 if (!m_textBox && m_remainingTextBox) { |
754 m_textBox = m_remainingTextBox; | 754 m_textBox = m_remainingTextBox; |
755 m_remainingTextBox = 0; | 755 m_remainingTextBox = 0; |
756 m_firstLetterText = nullptr; | 756 m_firstLetterText = nullptr; |
757 m_offset = 0; | 757 m_offset = 0; |
758 handleTextBox(); | 758 handleTextBox(); |
759 } | 759 } |
760 } | 760 } |
761 | 761 |
762 static inline RenderText* firstRenderTextInFirstLetter(RenderBoxModelObject* fir stLetter) | 762 static RenderObject* firstLetterPseudoElement(RenderObject* fragment) |
763 { | 763 { |
764 if (!firstLetter) | 764 RenderObject* previousSibling = fragment->previousSibling(); |
765 return 0; | 765 if (previousSibling && previousSibling->isPseudoElement() && previousSibling ->node()->isFirstLetterPseudoElement()) |
766 | 766 return previousSibling; |
767 // FIXME: Should this check descendent objects? | 767 return nullptr; |
768 for (RenderObject* current = firstLetter->slowFirstChild(); current; current = current->nextSibling()) { | |
769 if (current->isText()) | |
770 return toRenderText(current); | |
771 } | |
772 return 0; | |
773 } | 768 } |
774 | 769 |
775 void TextIterator::handleTextNodeFirstLetter(RenderTextFragment* renderer) | 770 void TextIterator::handleTextNodeFirstLetter(RenderTextFragment* renderer) |
776 { | 771 { |
777 if (renderer->firstLetter()) { | 772 RenderObject* pseudoElement = firstLetterPseudoElement(renderer); |
esprehn
2014/09/30 09:00:31
Move this into the if (RenderObject* pseudoElement
| |
778 RenderBoxModelObject* r = renderer->firstLetter(); | 773 if (pseudoElement) { |
779 if (r->style()->visibility() != VISIBLE && !m_ignoresStyleVisibility) | 774 if (pseudoElement->style()->visibility() != VISIBLE && !m_ignoresStyleVi sibility) |
780 return; | 775 return; |
781 if (RenderText* firstLetter = firstRenderTextInFirstLetter(r)) { | 776 // First letter pseudo elements only have one child which is the text. |
777 if (RenderObject* firstLetter = pseudoElement->slowFirstChild()) { | |
778 ASSERT(firstLetter->isText()); | |
782 m_handledFirstLetter = true; | 779 m_handledFirstLetter = true; |
783 m_remainingTextBox = m_textBox; | 780 m_remainingTextBox = m_textBox; |
784 m_textBox = firstLetter->firstTextBox(); | 781 m_textBox = toRenderText(firstLetter)->firstTextBox(); |
785 m_sortedTextBoxes.clear(); | 782 m_sortedTextBoxes.clear(); |
786 m_firstLetterText = firstLetter; | 783 m_firstLetterText = toRenderText(firstLetter); |
787 } | 784 } |
788 } | 785 } |
789 m_handledFirstLetter = true; | 786 m_handledFirstLetter = true; |
790 } | 787 } |
791 | 788 |
792 bool TextIterator::handleReplacedElement() | 789 bool TextIterator::handleReplacedElement() |
793 { | 790 { |
794 if (m_fullyClippedStack.top()) | 791 if (m_fullyClippedStack.top()) |
795 return false; | 792 return false; |
796 | 793 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
842 m_lastCharacter = 0; | 839 m_lastCharacter = 0; |
843 | 840 |
844 return true; | 841 return true; |
845 } | 842 } |
846 | 843 |
847 bool TextIterator::hasVisibleTextNode(RenderText* renderer) | 844 bool TextIterator::hasVisibleTextNode(RenderText* renderer) |
848 { | 845 { |
849 if (renderer->style()->visibility() == VISIBLE) | 846 if (renderer->style()->visibility() == VISIBLE) |
850 return true; | 847 return true; |
851 if (renderer->isTextFragment()) { | 848 if (renderer->isTextFragment()) { |
852 RenderTextFragment* fragment = toRenderTextFragment(renderer); | 849 RenderObject* pseudoElement = firstLetterPseudoElement(renderer); |
853 if (fragment->firstLetter() && fragment->firstLetter()->style()->visibil ity() == VISIBLE) | 850 if (pseudoElement && pseudoElement->style()->visibility() == VISIBLE) |
854 return true; | 851 return true; |
855 } | 852 } |
856 return false; | 853 return false; |
857 } | 854 } |
858 | 855 |
859 static bool shouldEmitTabBeforeNode(Node* node) | 856 static bool shouldEmitTabBeforeNode(Node* node) |
860 { | 857 { |
861 RenderObject* r = node->renderer(); | 858 RenderObject* r = node->renderer(); |
862 | 859 |
863 // Table cells are delimited by tabs. | 860 // Table cells are delimited by tabs. |
(...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1519 } | 1516 } |
1520 | 1517 |
1521 if (!m_shouldHandleFirstLetter && offsetAfterFirstLetter < m_offset) { | 1518 if (!m_shouldHandleFirstLetter && offsetAfterFirstLetter < m_offset) { |
1522 m_shouldHandleFirstLetter = true; | 1519 m_shouldHandleFirstLetter = true; |
1523 offsetInNode = offsetAfterFirstLetter; | 1520 offsetInNode = offsetAfterFirstLetter; |
1524 return renderer; | 1521 return renderer; |
1525 } | 1522 } |
1526 | 1523 |
1527 m_shouldHandleFirstLetter = false; | 1524 m_shouldHandleFirstLetter = false; |
1528 offsetInNode = 0; | 1525 offsetInNode = 0; |
1529 RenderText* firstLetterRenderer = firstRenderTextInFirstLetter(fragment->fir stLetter()); | 1526 |
1527 RenderObject* pseudoElement = firstLetterPseudoElement(fragment); | |
1528 ASSERT(pseudoElement && pseudoElement->slowFirstChild()); | |
1529 RenderText* firstLetterRenderer = toRenderText(pseudoElement->slowFirstChild ()); | |
1530 | 1530 |
1531 m_offset = firstLetterRenderer->caretMaxOffset(); | 1531 m_offset = firstLetterRenderer->caretMaxOffset(); |
1532 m_offset += collapsedSpaceLength(firstLetterRenderer, m_offset); | 1532 m_offset += collapsedSpaceLength(firstLetterRenderer, m_offset); |
1533 | 1533 |
1534 return firstLetterRenderer; | 1534 return firstLetterRenderer; |
1535 } | 1535 } |
1536 | 1536 |
1537 bool SimplifiedBackwardsTextIterator::handleReplacedElement() | 1537 bool SimplifiedBackwardsTextIterator::handleReplacedElement() |
1538 { | 1538 { |
1539 unsigned index = m_node->nodeIndex(); | 1539 unsigned index = m_node->nodeIndex(); |
(...skipping 879 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2419 resultEnd = collapseTo; | 2419 resultEnd = collapseTo; |
2420 return; | 2420 return; |
2421 } | 2421 } |
2422 } | 2422 } |
2423 | 2423 |
2424 CharacterIterator computeRangeIterator(inputStart, inputEnd, iteratorFlagsFo rFindPlainText); | 2424 CharacterIterator computeRangeIterator(inputStart, inputEnd, iteratorFlagsFo rFindPlainText); |
2425 calculateCharacterSubrange(computeRangeIterator, matchStart, matchLength, re sultStart, resultEnd); | 2425 calculateCharacterSubrange(computeRangeIterator, matchStart, matchLength, re sultStart, resultEnd); |
2426 } | 2426 } |
2427 | 2427 |
2428 } | 2428 } |
OLD | NEW |