| 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); |
| 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 |