Changeset 94252 in webkit


Ignore:
Timestamp:
Aug 31, 2011 5:00:12 PM (13 years ago)
Author:
rniwa@webkit.org
Message:

Move text() and textWithHardLineBreaks() from RenderTextControl to HTMLTextFormControlElement
https://bugs.webkit.org/show_bug.cgi?id=67320

Reviewed by Darin Adler.

Source/WebCore:

Moved and renamed RenderText::text and RenderText::textWithHardLineBreaks to
HTMLTextFormControlElement::innerTextValue and HTMLTextFormControlElement::valueWithHardLineBreaks.

  • accessibility/AccessibilityRenderObject.cpp:

(WebCore::AccessibilityRenderObject::text):

  • html/HTMLInputElement.cpp:

(WebCore::HTMLInputElement::subtreeHasChanged):

  • html/HTMLTextAreaElement.cpp:

(WebCore::HTMLTextAreaElement::appendFormData): Calls valueWithHardLineBreaks. It doesn't have to check
the existence of renderer anymore because valueWithHardLineBreaks returns value() when renderer do not
exist unlike RenderText::textWithHardLineBreaks returned emptyString() in such cases. This is the only place
valueWithHardLineBreaks is ever called; but we can't move valueWithHardLineBreaks because it calls
finishText.
(WebCore::HTMLTextAreaElement::handleBeforeTextInsertedEvent):
(WebCore::HTMLTextAreaElement::updateValue):

  • html/HTMLTextFormControlElement.cpp:

(WebCore::HTMLTextFormControlElement::selectedText):
(WebCore::HTMLTextFormControlElement::setInnerTextValue):
(WebCore::finishText): Moved from RenderText.cpp
(WebCore::HTMLTextFormControlElement::innerTextValue): Ditto.
(WebCore::getNextSoftBreak): Ditto.
(WebCore::HTMLTextFormControlElement::valueWithHardLineBreaks): Ditto; this function returns value()
when there are no renderers or root inline boxes instead of emptyString().

  • html/HTMLTextFormControlElement.h:
  • html/NumberInputType.cpp:

(WebCore::NumberInputType::hasUnacceptableValue):

  • html/SearchInputType.cpp:

(WebCore::SearchInputType::startSearchEventTimer):

  • html/TextFieldInputType.cpp:

(WebCore::TextFieldInputType::handleBeforeTextInsertedEvent):

  • rendering/RenderTextControl.cpp:
  • rendering/RenderTextControl.h:

Source/WebKit/qt:

Call HTMLTextFormControlElement::value() instead of RenderText::text()

  • Api/qwebpage.cpp:

(QWebPage::inputMethodQuery):

Location:
trunk/Source
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r94251 r94252  
     12011-08-31  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        Move text() and textWithHardLineBreaks() from RenderTextControl to HTMLTextFormControlElement
     4        https://bugs.webkit.org/show_bug.cgi?id=67320
     5
     6        Reviewed by Darin Adler.
     7
     8        Moved and renamed RenderText::text and RenderText::textWithHardLineBreaks to
     9        HTMLTextFormControlElement::innerTextValue and HTMLTextFormControlElement::valueWithHardLineBreaks.
     10
     11        * accessibility/AccessibilityRenderObject.cpp:
     12        (WebCore::AccessibilityRenderObject::text):
     13        * html/HTMLInputElement.cpp:
     14        (WebCore::HTMLInputElement::subtreeHasChanged):
     15        * html/HTMLTextAreaElement.cpp:
     16        (WebCore::HTMLTextAreaElement::appendFormData): Calls valueWithHardLineBreaks. It doesn't have to check
     17        the existence of renderer anymore because valueWithHardLineBreaks returns value() when renderer do not
     18        exist unlike RenderText::textWithHardLineBreaks returned emptyString() in such cases. This is the only place
     19        valueWithHardLineBreaks is ever called; but we can't move valueWithHardLineBreaks because it calls
     20        finishText.
     21        (WebCore::HTMLTextAreaElement::handleBeforeTextInsertedEvent):
     22        (WebCore::HTMLTextAreaElement::updateValue):
     23        * html/HTMLTextFormControlElement.cpp:
     24        (WebCore::HTMLTextFormControlElement::selectedText):
     25        (WebCore::HTMLTextFormControlElement::setInnerTextValue):
     26        (WebCore::finishText): Moved from RenderText.cpp
     27        (WebCore::HTMLTextFormControlElement::innerTextValue): Ditto.
     28        (WebCore::getNextSoftBreak): Ditto.
     29        (WebCore::HTMLTextFormControlElement::valueWithHardLineBreaks): Ditto; this function returns value()
     30        when there are no renderers or root inline boxes instead of emptyString().
     31        * html/HTMLTextFormControlElement.h:
     32        * html/NumberInputType.cpp:
     33        (WebCore::NumberInputType::hasUnacceptableValue):
     34        * html/SearchInputType.cpp:
     35        (WebCore::SearchInputType::startSearchEventTimer):
     36        * html/TextFieldInputType.cpp:
     37        (WebCore::TextFieldInputType::handleBeforeTextInsertedEvent):
     38        * rendering/RenderTextControl.cpp:
     39        * rendering/RenderTextControl.h:
     40
    1412011-08-31  Jeff Miller  <jeffm@apple.com>
    242
  • trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp

    r94149 r94252  
    19521952    if (!isTextControl() || isPasswordField())
    19531953        return String();
    1954    
    1955     if (isNativeTextControl())
    1956         return toRenderTextControl(m_renderer)->text();
    1957    
     1954
    19581955    Node* node = m_renderer->node();
    19591956    if (!node)
    19601957        return String();
     1958
     1959    if (isNativeTextControl())
     1960        return toRenderTextControl(m_renderer)->textFormControlElement()->value();
     1961
    19611962    if (!node->isElementNode())
    19621963        return String();
  • trunk/Source/WebCore/html/HTMLInputElement.cpp

    r94158 r94252  
    629629    // sanitizeUserInputValue().
    630630    // sanitizeValue() is needed because IME input doesn't dispatch BeforeTextInsertedEvent.
    631     String value = toRenderTextControl(renderer())->text();
     631    String value = innerTextValue();
    632632    if (isAcceptableValue(value))
    633633        setValueFromRenderer(sanitizeValue(convertFromVisibleValue(value)));
  • trunk/Source/WebCore/html/HTMLTextAreaElement.cpp

    r94068 r94252  
    172172    document()->updateLayout();
    173173
    174     // FIXME: It's not acceptable to ignore the HardWrap setting when there is no renderer.
    175     // While we have no evidence this has ever been a practical problem, it would be best to fix it some day.
    176     RenderTextControl* control = toRenderTextControl(renderer());
    177     const String& text = (m_wrap == HardWrap && control) ? control->textWithHardLineBreaks() : value();
     174    const String& text = (m_wrap == HardWrap) ? valueWithHardLineBreaks() : value();
    178175    encoding.appendData(name(), text);
    179176    return true;
     
    254251    unsigned unsignedMaxLength = static_cast<unsigned>(signedMaxLength);
    255252
    256     unsigned currentLength = numGraphemeClusters(toRenderTextControl(renderer())->text());
     253    unsigned currentLength = numGraphemeClusters(innerTextValue());
    257254    // selectionLength represents the selection length of this text field to be
    258255    // removed by this insertion.
     
    290287
    291288    ASSERT(renderer());
    292     m_value = toRenderTextControl(renderer())->text();
     289    m_value = innerTextValue();
    293290    const_cast<HTMLTextAreaElement*>(this)->setFormControlValueMatchesRenderer(true);
    294291    const_cast<HTMLTextAreaElement*>(this)->notifyFormStateChanged();
  • trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp

    r94068 r94252  
    4343#include "RenderTheme.h"
    4444#include "ScriptEventListener.h"
     45#include "Text.h"
    4546#include "TextIterator.h"
    4647#include <wtf/Vector.h>
     48#include <wtf/text/StringBuilder.h>
    4749
    4850namespace WebCore {
     
    187189String HTMLTextFormControlElement::selectedText() const
    188190{
    189     // FIXME: We should be able to extract selected contents even if there were no renderer.
    190     if (!renderer() || renderer()->isTextControl())
     191    if (!isTextFormControl())
    191192        return String();
    192 
    193     RenderTextControl* textControl = toRenderTextControl(renderer());
    194     return textControl->text().substring(selectionStart(), selectionEnd() - selectionStart());
     193    return value().substring(selectionStart(), selectionEnd() - selectionStart());
    195194}
    196195
     
    455454void HTMLTextFormControlElement::setInnerTextValue(const String& value)
    456455{
    457     if (!renderer() || !isTextFormControl())
    458         return;
    459 
    460     RenderTextControl* textControl = toRenderTextControl(renderer());
    461     bool textIsChanged = value != textControl->text();
     456    if (!isTextFormControl())
     457        return;
     458
     459    bool textIsChanged = value != innerTextValue();
    462460    if (textIsChanged || !innerTextElement()->hasChildNodes()) {
    463         if (textIsChanged && document() && AXObjectCache::accessibilityEnabled())
    464             document()->axObjectCache()->postNotification(textControl, AXObjectCache::AXValueChanged, false);
     461        if (textIsChanged && document() && renderer() && AXObjectCache::accessibilityEnabled())
     462            document()->axObjectCache()->postNotification(renderer(), AXObjectCache::AXValueChanged, false);
    465463
    466464        ExceptionCode ec = 0;
     
    477475}
    478476
     477static String finishText(StringBuilder& result)
     478{
     479    // Remove one trailing newline; there's always one that's collapsed out by rendering.
     480    size_t size = result.length();
     481    if (size && result[size - 1] == '\n')
     482        result.resize(--size);
     483    return result.toString();
     484}
     485
     486String HTMLTextFormControlElement::innerTextValue() const
     487{
     488    HTMLElement* innerText = innerTextElement();
     489    if (!innerText || !isTextFormControl())
     490        return emptyString();
     491
     492    StringBuilder result;
     493    for (Node* node = innerText; node; node = node->traverseNextNode(innerText)) {
     494        if (node->hasTagName(brTag))
     495            result.append(newlineCharacter);
     496        else if (node->isTextNode())
     497            result.append(static_cast<Text*>(node)->data());
     498    }
     499    return finishText(result);
     500}
     501
     502static void getNextSoftBreak(RootInlineBox*& line, Node*& breakNode, unsigned& breakOffset)
     503{
     504    RootInlineBox* next;
     505    for (; line; line = next) {
     506        next = line->nextRootBox();
     507        if (next && !line->endsWithBreak()) {
     508            ASSERT(line->lineBreakObj());
     509            breakNode = line->lineBreakObj()->node();
     510            breakOffset = line->lineBreakPos();
     511            line = next;
     512            return;
     513        }
     514    }
     515    breakNode = 0;
     516    breakOffset = 0;
     517}
     518
     519String HTMLTextFormControlElement::valueWithHardLineBreaks() const
     520{
     521    // FIXME: It's not acceptable to ignore the HardWrap setting when there is no renderer.
     522    // While we have no evidence this has ever been a practical problem, it would be best to fix it some day.
     523    HTMLElement* innerText = innerTextElement();
     524    if (!innerText || !isTextFormControl())
     525        return value();
     526
     527    RenderBlock* renderer = toRenderBlock(innerText->renderer());
     528    if (!renderer)
     529        return value();
     530
     531    Node* breakNode;
     532    unsigned breakOffset;
     533    RootInlineBox* line = renderer->firstRootBox();
     534    if (!line)
     535        return value();
     536
     537    getNextSoftBreak(line, breakNode, breakOffset);
     538
     539    StringBuilder result;
     540    for (Node* node = innerText->firstChild(); node; node = node->traverseNextNode(innerText)) {
     541        if (node->hasTagName(brTag))
     542            result.append(newlineCharacter);
     543        else if (node->isTextNode()) {
     544            String data = static_cast<Text*>(node)->data();
     545            unsigned length = data.length();
     546            unsigned position = 0;
     547            while (breakNode == node && breakOffset <= length) {
     548                if (breakOffset > position) {
     549                    result.append(data.characters() + position, breakOffset - position);
     550                    position = breakOffset;
     551                    result.append(newlineCharacter);
     552                }
     553                getNextSoftBreak(line, breakNode, breakOffset);
     554            }
     555            result.append(data.characters() + position, length - position);
     556        }
     557        while (breakNode == node)
     558            getNextSoftBreak(line, breakNode, breakOffset);
     559    }
     560    return finishText(result);
     561}
     562
    479563HTMLTextFormControlElement* enclosingTextFormControl(const Position& position)
    480564{
  • trunk/Source/WebCore/html/HTMLTextFormControlElement.h

    r94068 r94252  
    7878    bool lastChangeWasUserEdit() const;
    7979    void setInnerTextValue(const String&);
     80    String innerTextValue() const;
    8081
    8182protected:
     
    101102
    102103    void setLastChangeWasNotUserEdit() { m_lastChangeWasUserEdit = false; }
     104
     105    String valueWithHardLineBreaks() const;
    103106private:
    104107    int computeSelectionStart() const;
  • trunk/Source/WebCore/html/NumberInputType.cpp

    r92600 r94252  
    319319bool NumberInputType::hasUnacceptableValue()
    320320{
    321     return element()->renderer() && !isAcceptableValue(toRenderTextControl(element()->renderer())->text());
     321    return element()->renderer() && !isAcceptableValue(element()->innerTextValue());
    322322}
    323323
  • trunk/Source/WebCore/html/SearchInputType.cpp

    r91058 r94252  
    129129{
    130130    ASSERT(element()->renderer());
    131     unsigned length = toRenderTextControlSingleLine(element()->renderer())->text().length();
     131    unsigned length = element()->innerTextValue().length();
    132132
    133133    if (!length) {
  • trunk/Source/WebCore/html/TextFieldInputType.cpp

    r91982 r94252  
    293293    // because they can be mismatched by sanitizeValue() in
    294294    // HTMLInputElement::subtreeHasChanged() in some cases.
    295     unsigned oldLength = numGraphemeClusters(toRenderTextControlSingleLine(element()->renderer())->text());
     295    unsigned oldLength = numGraphemeClusters(element()->innerTextValue());
    296296
    297297    // selectionLength represents the selection length of this text field to be
  • trunk/Source/WebCore/rendering/RenderTextControl.cpp

    r94047 r94252  
    2323#include "RenderTextControl.h"
    2424
    25 #include "Editor.h"
    26 #include "Frame.h"
    27 #include "HTMLBRElement.h"
    28 #include "HTMLInputElement.h"
    29 #include "HTMLNames.h"
     25#include "HTMLTextFormControlElement.h"
    3026#include "HitTestResult.h"
    31 #include "Position.h"
    32 #include "RenderLayer.h"
    3327#include "RenderText.h"
    3428#include "ScrollbarTheme.h"
    35 #include "Text.h"
    3629#include "TextIterator.h"
    37 #include <wtf/text/StringBuilder.h>
     30#include "VisiblePosition.h"
    3831#include <wtf/unicode/CharacterNames.h>
    3932
     
    4134
    4235namespace WebCore {
    43 
    44 using namespace HTMLNames;
    4536
    4637// Value chosen by observation.  This can be tweaked.
     
    161152    it.advance(index - 1);
    162153    return VisiblePosition(it.range()->endPosition(), UPSTREAM);
    163 }
    164 
    165 static String finishText(StringBuilder& result)
    166 {
    167     // Remove one trailing newline; there's always one that's collapsed out by rendering.
    168     size_t size = result.length();
    169     if (size && result[size - 1] == '\n')
    170         result.resize(--size);
    171     return result.toString();
    172 }
    173 
    174 String RenderTextControl::text()
    175 {
    176     HTMLElement* innerText = innerTextElement();
    177     if (!innerText)
    178         return emptyString();
    179  
    180     StringBuilder result;
    181     for (Node* node = innerText; node; node = node->traverseNextNode(innerText)) {
    182         if (node->hasTagName(brTag))
    183             result.append(newlineCharacter);
    184         else if (node->isTextNode())
    185             result.append(static_cast<Text*>(node)->data());
    186     }
    187     return finishText(result);
    188 }
    189 
    190 static void getNextSoftBreak(RootInlineBox*& line, Node*& breakNode, unsigned& breakOffset)
    191 {
    192     RootInlineBox* next;
    193     for (; line; line = next) {
    194         next = line->nextRootBox();
    195         if (next && !line->endsWithBreak()) {
    196             ASSERT(line->lineBreakObj());
    197             breakNode = line->lineBreakObj()->node();
    198             breakOffset = line->lineBreakPos();
    199             line = next;
    200             return;
    201         }
    202     }
    203     breakNode = 0;
    204     breakOffset = 0;
    205 }
    206 
    207 String RenderTextControl::textWithHardLineBreaks()
    208 {
    209     HTMLElement* innerText = innerTextElement();
    210     if (!innerText)
    211         return emptyString();
    212 
    213     RenderBlock* renderer = toRenderBlock(innerText->renderer());
    214     if (!renderer)
    215         return emptyString();
    216 
    217     Node* breakNode;
    218     unsigned breakOffset;
    219     RootInlineBox* line = renderer->firstRootBox();
    220     if (!line)
    221         return emptyString();
    222 
    223     getNextSoftBreak(line, breakNode, breakOffset);
    224 
    225     StringBuilder result;
    226     for (Node* node = innerText->firstChild(); node; node = node->traverseNextNode(innerText)) {
    227         if (node->hasTagName(brTag))
    228             result.append(newlineCharacter);
    229         else if (node->isTextNode()) {
    230             String data = static_cast<Text*>(node)->data();
    231             unsigned length = data.length();
    232             unsigned position = 0;
    233             while (breakNode == node && breakOffset <= length) {
    234                 if (breakOffset > position) {
    235                     result.append(data.characters() + position, breakOffset - position);
    236                     position = breakOffset;
    237                     result.append(newlineCharacter);
    238                 }
    239                 getNextSoftBreak(line, breakNode, breakOffset);
    240             }
    241             result.append(data.characters() + position, length - position);
    242         }
    243         while (breakNode == node)
    244             getNextSoftBreak(line, breakNode, breakOffset);
    245     }
    246     return finishText(result);
    247154}
    248155
  • trunk/Source/WebCore/rendering/RenderTextControl.h

    r94047 r94252  
    3535    HTMLTextFormControlElement* textFormControlElement() const;
    3636    virtual PassRefPtr<RenderStyle> createInnerTextStyle(const RenderStyle* startStyle) const = 0;
    37 
    38     String text();
    39     String textWithHardLineBreaks();
    4037
    4138    VisiblePosition visiblePositionForIndex(int index) const;
  • trunk/Source/WebKit/qt/Api/qwebpage.cpp

    r93303 r94252  
    14401440        }
    14411441        case Qt::ImSurroundingText: {
    1442             if (renderTextControl) {
    1443                 QString text = renderTextControl->text();
     1442            if (renderTextControl && renderTextControl->textFormControlElement()) {
     1443                QString text = renderTextControl->textFormControlElement()->value();
    14441444                RefPtr<Range> range = editor->compositionRange();
    14451445                if (range)
     
    14501450        }
    14511451        case Qt::ImCurrentSelection: {
    1452             if (!editor->hasComposition() && renderTextControl) {
     1452            if (!editor->hasComposition() && renderTextControl && renderTextControl->textFormControlElement()) {
    14531453                int start = frame->selection()->start().offsetInContainerNode();
    14541454                int end = frame->selection()->end().offsetInContainerNode();
    14551455                if (end > start)
    1456                     return QVariant(QString(renderTextControl->text()).mid(start, end - start));
     1456                    return QVariant(QString(renderTextControl->textFormControlElement()->value()).mid(start, end - start));
    14571457            }
    14581458            return QVariant();
  • trunk/Source/WebKit/qt/ChangeLog

    r94182 r94252  
     12011-08-31  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        Move text() and textWithHardLineBreaks() from RenderTextControl to HTMLTextFormControlElement
     4        https://bugs.webkit.org/show_bug.cgi?id=67320
     5
     6        Reviewed by Darin Adler.
     7
     8        Call HTMLTextFormControlElement::value() instead of RenderText::text()
     9
     10        * Api/qwebpage.cpp:
     11        (QWebPage::inputMethodQuery):
     12
    1132011-08-31  Caio Marcelo de Oliveira Filho  <caio.oliveira@openbossa.org>
    214
Note: See TracChangeset for help on using the changeset viewer.