Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(342)

Side by Side Diff: Source/core/editing/TextIterator.cpp

Issue 571603003: Convert first letter into a pseudo element. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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())
Julien - ping for review 2014/10/06 17:47:33 Isn't the previousSibling->isPseudoElement() call
dsinclair 2014/10/07 19:36:21 No. I don't know if I have a node() unless I know
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());
Julien - ping for review 2014/10/06 17:47:33 This ASSERT is redundant with the toRenderText bel
dsinclair 2014/10/07 19:36:21 Done.
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698