Changeset 65062 in webkit


Ignore:
Timestamp:
Aug 10, 2010 3:08:22 AM (14 years ago)
Author:
tkent@chromium.org
Message:

2010-08-10 Yoshiki Hayashi <yhayashi@google.com>

Reviewed by Kent Tamura.

Iterate over :first-letter so that it will be included in innerText.
https://bugs.webkit.org/show_bug.cgi?id=39863

Test: fast/dom/inner-text-first-letter.html

  • editing/TextIterator.cpp: (WebCore::TextIterator::TextIterator): (WebCore::TextIterator::advance): (WebCore::TextIterator::handleTextNode): (WebCore::TextIterator::handleTextBox): (WebCore::TextIterator::emitText):
  • editing/TextIterator.h:

2010-08-10 Yoshiki Hayashi <yhayashi@google.com>

Reviewed by Kent Tamura.

Iterate over :first-letter so that it will be included in innerText.
https://bugs.webkit.org/show_bug.cgi?id=39863

  • fast/dom/inner-text-first-letter-expected.txt: Added.
  • fast/dom/inner-text-first-letter.html: Added.
Location:
trunk
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r65061 r65062  
     12010-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
    1112010-08-10  Kent Tamura  <tkent@chromium.org>
    212
  • trunk/LayoutTests/fast/css/getComputedStyle/getComputedStyle-with-pseudo-element-expected.txt

    r57861 r65062  
    22
    33
    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.
     4Lorem 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.
    55
    66Middle
  • trunk/WebCore/ChangeLog

    r65061 r65062  
     12010-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
    1182010-08-10  Kent Tamura  <tkent@chromium.org>
    219
  • trunk/WebCore/editing/TextIterator.cpp

    r64974 r65062  
    3838#include "RenderTableRow.h"
    3939#include "RenderTextControl.h"
     40#include "RenderTextFragment.h"
    4041#include "VisiblePosition.h"
    4142#include "visible_units.h"
     
    254255    , m_textCharacters(0)
    255256    , m_textLength(0)
     257    , m_remainingTextBox(0)
     258    , m_firstLetterText(0)
    256259    , m_lastCharacter(0)
    257260    , m_emitsCharactersBetweenAllVisiblePositions(false)
    258261    , m_entersTextControls(false)
    259262    , m_emitsTextWithoutTranscoding(false)
     263    , m_handledFirstLetter(false)
    260264{
    261265}
     
    269273    , m_textCharacters(0)
    270274    , m_textLength(0)
     275    , m_remainingTextBox(0)
     276    , m_firstLetterText(0)
    271277    , m_emitsCharactersBetweenAllVisiblePositions(behavior & TextIteratorEmitsCharactersBetweenAllVisiblePositions)
    272278    , m_entersTextControls(behavior & TextIteratorEntersTextControls)
    273279    , m_emitsTextWithoutTranscoding(behavior & TextIteratorEmitsTextsWithoutTranscoding)
     280    , m_handledFirstLetter(false)
    274281{
    275282    // FIXME: should support TextIteratorEndsAtEditingBoundary http://webkit.org/b/43609
     
    348355    }
    349356
     357    if (!m_textBox && m_remainingTextBox) {
     358        m_textBox = m_remainingTextBox;
     359        m_remainingTextBox = 0;
     360        m_firstLetterText = 0;
     361        m_offset = 0;
     362    }
    350363    // handle remembered text box
    351364    if (m_textBox) {
     
    421434        m_handledNode = false;
    422435        m_handledChildren = false;
     436        m_handledFirstLetter = false;
     437        m_firstLetterText = 0;
    423438
    424439        // how would this ever be?
     
    439454
    440455    RenderText* renderer = toRenderText(m_node->renderer());
    441     if (renderer->style()->visibility() != VISIBLE)
    442         return false;
    443456       
    444457    m_lastTextNode = m_node;
     
    448461    if (!renderer->style()->collapseWhiteSpace()) {
    449462        int runStart = m_offset;
    450         if (m_lastTextNodeEndedWithCollapsedSpace) {
     463        if (m_lastTextNodeEndedWithCollapsedSpace && hasVisibleTextNode(renderer)) {
    451464            emitCharacter(' ', m_node, 0, runStart, runStart);
    452465            return false;
    453466        }
     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;
    454479        int strLength = str.length();
    455480        int end = (m_node == m_endContainer) ? m_endOffset : INT_MAX;
     
    464489
    465490    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;
    466500        m_lastTextNodeEndedWithCollapsedSpace = true; // entire block is collapsed space
    467501        return true;
     
    479513   
    480514    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));
    481517    handleTextBox();
    482518    return true;
     
    485521void TextIterator::handleTextBox()
    486522{   
    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    }
    488528    String str = renderer->text();
    489529    int start = m_offset;
     
    531571   
    532572                m_offset = subrunEnd;
    533                 emitText(m_node, runStart, subrunEnd);
     573                emitText(m_node, renderer, runStart, subrunEnd);
    534574            }
    535575
     
    553593            ++m_sortedTextBoxesPosition;
    554594    }
     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
     604void 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;
    555622}
    556623
     
    599666
    600667    return true;
     668}
     669
     670bool 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;
    601680}
    602681
     
    892971}
    893972
    894 void TextIterator::emitText(Node* textNode, int textStartOffset, int textEndOffset)
    895 {
    896     RenderText* renderer = toRenderText(m_node->renderer());
     973void TextIterator::emitText(Node* textNode, RenderObject* renderObject, int textStartOffset, int textEndOffset)
     974{
     975    RenderText* renderer = toRenderText(renderObject);
    897976    m_text = m_emitsTextWithoutTranscoding ? renderer->textWithoutTranscoding() : renderer->text();
    898977    ASSERT(m_text.characters());
     
    908987    m_lastTextNodeEndedWithCollapsedSpace = false;
    909988    m_hasEmitted = true;
     989}
     990
     991void TextIterator::emitText(Node* textNode, int textStartOffset, int textEndOffset)
     992{
     993    emitText(textNode, m_node->renderer(), textStartOffset, textEndOffset);
    910994}
    911995
  • trunk/WebCore/editing/TextIterator.h

    r64974 r65062  
    3333namespace WebCore {
    3434
     35class RenderText;
     36class RenderTextFragment;
     37
    3538// FIXME: Can't really answer this question correctly without knowing the white-space mode.
    3639// FIXME: Move this somewhere else in the editing directory. It doesn't belong here.
     
    104107    bool handleNonTextNode();
    105108    void handleTextBox();
     109    void handleTextNodeFirstLetter(RenderTextFragment*);
     110    bool hasVisibleTextNode(RenderText*);
    106111    void emitCharacter(UChar, Node* textNode, Node* offsetBaseNode, int textStartOffset, int textEndOffset);
     112    void emitText(Node* textNode, RenderObject* renderObject, int textStartOffset, int textEndOffset);
    107113    void emitText(Node* textNode, int textStartOffset, int textEndOffset);
    108114   
     
    136142    bool m_needsAnotherNewline;
    137143    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;
    138149   
    139150    // Used to do the whitespace collapsing logic.
     
    161172    // Used when we want texts for copying, pasting, and transposing.
    162173    bool m_emitsTextWithoutTranscoding;
     174    // Used when deciding text fragment created by :first-letter should be looked into.
     175    bool m_handledFirstLetter;
    163176};
    164177
Note: See TracChangeset for help on using the changeset viewer.